周末拿最近学习的知识 (JDBC, Servlet, JSP) 做一个小案例, 本来周末就应该整理笔记的, 但是打球也不能耽误啊, 所以只好赶着在今天下班的时间, 做下记录.

技术准备

Java 基础知识, JavaEE 基础

tomcat, servlet, jsp(EL + JSTL)

web前端的基础知识

html, css, javascript基础 + Jquery 基础

关系型数据库

使用 SpringJDBC 操作 mysql

开发工具

IDEA, JDK8.0

需求分析

使用 mysql 来存储学生信息

页面上完成学生数据的展示, 可进行学生信息的增删改差, 然后支持上一页, 下一页操作, 以及学生信息查询.

实现

一. 表结构设计

创建数据库: student

将编码设置为 utf-8, 便于存取中文

drop database if exists student;

create database student default charset=utf8;

创建表: student

create table student(

id int unsigned primary key auto_increment not null,

student_id varchar(20) not null unique COMMENT '学号',

name varchar(20) not null,

gender varchar(5),

birthday date,

address varchar(50),

qq varchar(20),

email varchar(50)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

设置student_id的原因是因为学号可能会改变, 而主键 id 无法修改.

二. 创建JavaEE项目, 导入 jar 包

项目结构图如下:

三. 准备前端页面 (原型设计)

在项目中就是前端的 html 代码, 这一步也非常的重要.

首页以列表的形式展示学生信息

新增 和 修改信息页面, 这两个页面应该长的很像

如果把新增和修改看成一个页面, 那么一共就两个页面 ~

学生信息列表

添加学生页面

编辑学生页面

四. src目录层次结构

代码模块的划分:

实体类: student (就一张学生表, 所以对应的实体类只有一个)

数据访问对象: dao (操作学生对象的 StudentDao)

逻辑处理: Servlet (学生信息列表展示, 新增, 修改, 删除学生信息)

工具类: JDBCDruidUtils (封装了 SpringJDBC 对数据库的操作)

单元测试: test

在 src 目录下创建代码的层次结构:

五. 具体代码逻辑实现

student 实体类

package com.student.entity;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class Student {

private int id;

private String studentId;

private String name;

private String gender;

private Date birthday;

private String address;

private String qq;

// setter and getter , 日期类型需要额外转换下

public String getBirthday() {

SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");

return formater.format(this.birthday);

}

public void setBirthday(String birthday) {

SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");

Date date = null;

try {

date = formater.parse(birthday);

} catch (ParseException e) {

e.printStackTrace();

}

this.birthday = date;

}

}

JDBCDruidUtils 连接池:

package com.student.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Properties;

/**

* JDBCDruidUtils 工具类

*/

public class JDBCDruidUtils {

private static DataSource ds = null;

static {

try {

// 加载配置文件

Properties pro = new Properties();

// 获取 src 路径下的文件 --> ClassLoader

ClassLoader cl = JDBCDruidUtils.class.getClassLoader();

InputStream is = cl.getResourceAsStream("druid.properties");

pro.load(is);

// 通过工厂函数 获取 数据库连接池 (传入配置文件)

ds = DruidDataSourceFactory.createDataSource(pro);

} catch (Exception e) {

e.printStackTrace();

}

}

// 获取连接池对象

public static DataSource getDataSource(){

return ds;

}

// 获取连接对象

public static Connection getConnection() throws SQLException {

return ds.getConnection();

}

}

druid.properties 配置文件

driverClassName=com.mysql.jdbc.Driver

# useUnicode表示允许使用自定义的Unicode

url=jdbc:mysql://192.168.0.115:3306/JDBC?useUnicode=true&characterEncoding=utf8

username=username

password=password

initialSize=5

maxActive=10

maxWait=3000

studentDao

DAO (Data Access Object) 数据库访问, 就是对数据库的操作进行封装, 让 servlet 里边看不到 JDBC 的代码

package com.student.dao;

import com.student.entity.Student;

import com.student.utils.JDBCDruidUtils;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

/**

* student 对象相关的操作方法

*/

public class StudentDao {

// 获取 JdbcTemplate 对象

private static JdbcTemplate template = new JdbcTemplate(JDBCDruidUtils.getDataSource());

/**

* 获取 JdbcTemplate 对象, 将学生信息写入到数据库中

*/

public static int createStudent(Student student){

String createSql = "insert into student values(?,?,?,?,?,?,?,?);";

int num = StudentDao.template.update(createSql, student.getId(), student.getStudentId(), student.getName(),

student.getGender(), student.getBirthday(), student.getAddress(), student.getQq(), student.getEmail());

return num;

}

/**

* 通过id查询学生

* @param id

* @return

*/

public static Student queryStudentById(String id){

String querySql = "select * from student where id = ?";

Student student = StudentDao.template.queryForObject(querySql, new BeanPropertyRowMapper(Student.class), id);

return student;

}

/**

* 更新 学生信息

* @param student

* @return

*/

public static int updateStudent(Student student){

String updateSql = "update student set gender = ?, birthday = ?, address = ?," +

"qq = ?, email = ? where id = ?;";

int num = StudentDao.template.update(updateSql, student.getGender(), student.getBirthday(), student.getAddress(),

student.getQq(), student.getEmail(), student.getId());

return num;

}

/**

* 删除学生信息

* @param id

* @return

*/

public static int deleteStudentById(String id){

String deleteSql = "delete from student where id = ?";

int num = StudentDao.template.update(deleteSql, id);

return num;

}

}

学生列表展示

package com.student.servlet;

import com.student.utils.JDBCDruidUtils;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;

import java.io.IOException;

import java.util.List;

import java.util.Map;

@WebServlet("/list")

public class ReadList extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 不用获取参数, 所以不用设置流的编码

// 获取 JdbcTemplate 对象

DataSource ds = JDBCDruidUtils.getDataSource();

JdbcTemplate template = new JdbcTemplate(ds);

// 查询结果, 将结果集封装为 ReadList 集合

// String querySql = "select * from student limit 0, 3";

String querySql = "select * from student";

java.util.List> studentList = template.queryForList(querySql);

// 将学生对象列表存储到 request 对象域中

request.setAttribute("studentList", studentList);

// 转发到 list 页面

request.getRequestDispatcher("/list.jsp").forward(request, response);

}

}

jsp 页面

学生信息管理系统

td, th {

text-align: center;

}

学生信息列表

--%>

序号学号姓名性别生日地址QQ邮箱操作

--%>

${s.count}${student.student_id}${student.name}${student.gender}${student.birthday}${student.address}${student.qq}${student.email}修改

删除

添加联系人

function deleteStudent(id){

//用户安全提示

if(confirm("您确定要删除吗?")){

//访问路径

location.href="${pageContext.request.contextPath}/delete?id="+id;

location.submit();

}

}

新增一条学生信息

先返回新增学生信息的 jsp 页面, 然后用户在键入信息之后, 提交表单到后端处理.

package com.student.servlet;

import com.student.dao.StudentDao;

import com.student.entity.Student;

import java.io.IOException;

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet("/create")

public class Create extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取参数, 设置流的编码

request.setCharacterEncoding("utf-8");

// 将参数封装到 map 集合中 (使用JavaBeanUtils工具)

Map map = request.getParameterMap();

Student student = StudentDao.mapToStudent(map);

// 获取 JdbcTemplate 对象, 将学生信息写入到数据库中

int num = StudentDao.create(student);

// 重定向到 list 页面

response.sendRedirect(request.getContextPath() + "/list");

}

}

jsp 页面

添加学生信息

添加学生信息页面

学号:

姓名:

性别:

生日:

地址:

QQ:

Email:

//给返回按钮添加单击事件, 返回上一个页面

document.getElementById("getBack").onclick = function(){

window.history.back(-1);

};

更新学生信息

get 方法中返回编辑学生信息的 jsp 页面, 填充当前学生的信息

post 方法对用户提交的 form 表单, 对学生信息进行更新

package com.student.servlet;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.util.Map;

import com.student.dao.StudentDao;

import com.student.entity.Student;

import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet("/update")

public class Update extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取参数, 设置流的编码

request.setCharacterEncoding("utf-8");

// 将参数封装到 map 集合中 (使用JavaBeanUtils工具)

Map map = request.getParameterMap();

Student student = new Student();

try {

BeanUtils.populate(student, map);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

// 获取 JdbcTemplate 对象, 将学生信息更新到数据库中

int num = StudentDao.updateStudent(student);

System.out.println("更新成功, num: " + num);

// 重定向到 list 页面

response.sendRedirect(request.getContextPath() + "/list");

}

// 返回带有 student 信息的修改页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取student的 id

String id = request.getParameter("id");

Student student = StudentDao.queryStudentById(id);

// 将需要修改的学生信息放到 request 域对象中

request.setAttribute("student", student);

// 请求转发到 update.jsp 页面

request.getRequestDispatcher("/update.jsp").forward(request, response);

}

}

jsp页面

修改学生信息

修改学生信息

学号:

姓名:

性别:

生日:

地址:

QQ:

Email:

--%>

//给返回按钮添加单击事件, 返回上一个页面

document.getElementById("getBack").onclick = function(){

window.history.back(-1);

};

删除学生信息

写到这里, 删除的逻辑就非常简单了, 需要注意的是, 删除的时候, 需要给用户弹框确认, 这部分涉及到前端 js 的一个知识点.

function deleteStudent(id){

//用户安全提示

if(confirm("您确定要删除吗?")){ location.href="${pageContext.request.contextPath}/delete?id="+id; location.submit();

}

}

package com.student.servlet;

import com.student.dao.StudentDao;

import com.student.entity.Student;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet("/delete")

public class Delete extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取student的 id

String id = request.getParameter("id");

int num = StudentDao.deleteStudentById(id);

System.out.println("删除学生信息, num: " + num);

// 重定向到 list 页面

response.sendRedirect(request.getContextPath() + "/list");

}

}

案例总结

一共花了 6 个小时左右的时间, 后端的逻辑处理不算复杂, 知识点忘记了可以看下前边学习的笔记, 总的来说还算顺利.

前端的页面布局是资料里边找的模板, 然后改了一些, 能够配合后端的 api 进行数据交互, 然后运用 jsp 中的 EL 表达式和 JSTL 标签进行展示, 没有涉及到一些很难的内容.

这是一个前后端不分离的案例, 和之前学习的 python flask 项目里边的 jinja2 模板引擎非常的相似, 例如大胡子语法( {{}} ), 控制代码块( if else, for 循环 ), 过滤器, 模板继承等内容, 有之前的项目经验, 理解起来也比较的容易.

案例改进

写到这里, 还是一个非常粗糙的案例, 可以优化的点有:

新增, 修改学生信息时对参数进行校验,

按学号, 姓名, 性别进行检索,

分页查询,

批量删除,

登录功能,

权限管理 (分管理员, 普通用户等, 普通用户没有删除功能)

后边有时间再持续优化 ~ (也许就这么一说, haha)

ending ~

python学生信息管理系统项目总结_学生信息管理系统案例小结相关推荐

  1. HTML5期末大作业_影视网站设计——_指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:影视网站设计--"指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常 ...

  2. HTML5期末大作业:影视网站设计——“指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:影视网站设计--"指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常 ...

  3. 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述

    基于 B/S 模式的成绩管理系统文献综述 1 .本课题研究的重要性和意义 目前,在学校里,随着高校规模的不断扩大和招生人数的不断增加,需要处理大量的 学生数据信息,越来越多的学校都需要自己的学生信息管 ...

  4. 快递信息管理系统源代码c++_学生信息管理系统C语言版

    C语言学生信息管理系统包括以下功能: 1.学生信息的整体注册 2.学生信息的修改 3.学生成绩信息的录入 4.学生信息的添加 5.恢复误删的学生信息 6.学生信息的删除 7.密码修改保存函数 8.学生 ...

  5. python学生管理系统设计实验报告_学生成绩管理系统实验报告(新鲜出炉)

    C语言课程设计报告 源码下载方式 关注微信公众号 跨时代的jay 回复 学生成绩管理系统 为大家提供一些帮助! 获取链接后复制到浏览器即可下载 课题题目: 学生信息管理系统 班 级: 信卓11801 ...

  6. 学生成绩管理系统实验报告_学生成绩管理系统设计

    1.题目与要求 1.1问题提出 设计学生成绩管理系统,有N个学生,每个学生的数据包含学号(不重复).姓名.三门课的成绩及平均成绩,试设计一学生成绩管理系统 1.2本系统涉及的知识点 结构体数组.结构体 ...

  7. javaweb宿舍管理系统源码_宿舍信息管理系统展示

    宿舍信息管理系统 今天整理学习笔记的时候发现了自己当时学SSM框架的时候写了一个简单的Javaweb宿舍信息管理系统,虽然现在看来写的不是很好,但今日写此文章也算是纪念自己的第一个SSM小项目了,话不 ...

  8. ssm旅游管理系统项目介绍_基于jsp的网络相册管理系统的设计与实现

    好程序设计擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON(DJANGO/FLASK).THINKPHP.C#.安卓.微信小程序.MYSQL.SQLSERVER等,欢迎咨询 每天都要 ...

  9. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

最新文章

  1. memcache windows64 位安装
  2. 使用AppCompat项目模版
  3. 企业微信推送消息延迟_iPhone手机微信推送消息总是延迟怎么办?
  4. 大话数据结构:平衡二叉排序树
  5. win7rc 序列号- 10/21之前
  6. 长江存储发布PCle4.0 固态硬盘致态TiPro7000,顺序读取7400MB/s
  7. RT-Thread--线程管理
  8. TensorFlow 教程 --教程--2.2 数据准备
  9. string字符串数字自增_常见的字符串操作
  10. NetCore MiddleWare 注意事项
  11. Sql根据不同条件统计总数
  12. php实现邀请好友,新版php获取MSN好友列表,邀请MSN好友
  13. 我的专业我的梦作文计算机,我的创新我的梦优秀作文
  14. godaddy安装nginx证书
  15. Python项目文件引用问题:ImportError: attempted relative import with no known parent package
  16. 大数据课程作业(一)
  17. google正在等待cnd.bootcss.com的响应
  18. 第一天前端学习的内容和心得
  19. 黑盒圆桌派 | 如何巧用事件营销以“己”博“众”?
  20. 金融行业中的AI、IB、VC和PE分别代表什么

热门文章

  1. 解决 Request Entity Too Large问题
  2. 浅谈XSS跨站脚本攻击
  3. oracle查看历史oracle database数据库版本并下载
  4. Linux系统重设开机秘码-------忘记linux开机密码
  5. oracle中12560,Oracle ORA-12560解决方法
  6. android studio运行时报错AVD Nexus_5X_API_P is already running解决办法
  7. 证券投资学原理(韩德宗 朱晋)知识点
  8. PS制作立体效果——圆环
  9. 既然不能独自养家糊口,的确就不应该去抱怨发牢骚
  10. 计算机控制闪光灯,并联控制式自动调光闪光灯 - 最全的照相机闪光灯电路图大全(十款照相机闪光灯电路图详解)...