简介
这是一个简单的学生信息管理系统,实现学生信息增删改查功能、学生信息模糊查询功能、错误信息提示功能;数据库连接采用C3P0连接池技术;JSP页面信息的动态输出采用JSTL+EL表达式相结合进行输出,其中JSTL对逻辑进行处理,EL负责展示数据。
注:项目最后会附源码以及相关js文件。使用eclipse的伙计们,导代码的时候要注意,我是用idea写的,工程结构和路径可能会和它有一点点的差异,想了解这俩工程结构具体有啥差异的小伙伴们可以参考尚硅谷java基础课程,大概在第404课左右。
对了!还有访问路径一定要记得修改。
功能分析
学生信息管理系统-学生信息的增删改查功能结构图如下图所示。
对象数据库表设计以及bean类实现
学生信息E-R图
学生信息表
根据E-R图可以设计学生信息表如下:
对应bean类
package caztc.brg.StuMassage.entity;
import java.util.Date;
/**
*
* 学生类
* @author Ling
* @create 2021-05-08 17:16
*/
public class Student {
private Integer id; //编号
private String name; //学生姓名
private double score; //学生成绩
private Date birthday; //出生日期
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Student(Integer id, String name, double score, Date birthday) {
this.id = id;
this.name = name;
this.score = score;
this.birthday = birthday;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", score=" + score +
", birthday=" + birthday +
'}';
}
}
功能设计与实现
工程目录
整体功能流程设计以及一个Servlet处理多种请求的代码架构
整体功能流程设计图
该系统的增删改查功能都集中在StudentServlet中,StudentServlet的get()和post()方法都可以接受前端传来的method值以及所携带的参数。StudentServlet识别是哪一种请求,并将method值方法以及所携带参数传入该方法,get()或post()方法识别method值,选择对应的case,通过case调用StudentRepositoryDao的方法进而对数据进行操作,再将操作结果返回给JSP前端;其中每个页面都有指令信息,如果出现错误就会跳转到error.jsp页面,并显示错误信息。这就是该系统的整体流程设计。
一个Servlet处理多种请求的代码架构
package caztc.brg.StuMassage.action;
import caztc.brg.StuMassage.dao.StudentRepositoryDao;
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 java.io.IOException;
/**
* 学生信息的 serlvet
* @author Ling
* @create 2021-05-08 17:23
*/
//映射
@WebServlet("/student")
public class StudentServlet extends HttpServlet {
//new 一个操作类
private StudentRepositoryDao studentRepositoryDao = new StudentRepositoryDao();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method =req.getParameter("method");
while(method == null){
method = "select";
}
switch (method){
case "select":
// 获取视图和数据
//查询全部学生信息
break;
case "deleteById":
//通过id删除学生信息
break;
case "UpdatefindById":
//获取到要修改的 ID 以便于 根据 ID 进行修改数据
break;
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method =req.getParameter("method");
while(method == null){
method = "add";
}
switch (method){
case "add":
//增加学生信息
break;
case "update":
//修改学生信息
break;
case "findById":
//根据ID查找学生信息
break;
case "selectByNa":
//模糊查询
break;
}
}
}
- 注意:上述为一个Servlet处理多个请求的代码,具体情况根据自己写的进行调整,之后再介绍逐个功能时将只说明每个case里的代码。
数据库连接池C3P0的实现
java类
package caztc.brg.StuMassage.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* C3P0工具类
* @author Ling
* @create 2021-05-08 17:19
*/
public class C3P0Tools {
private static DataSource dataSource;
static {
dataSource = new ComboPooledDataSource();
}
/**
* 获取 connection 连接
* @return connection
*/
public static Connection getConnection(){
Connection connection = null;
//创建C3P0
try {
connection = dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
/**
* 释放资源
* @param connection
* @param preparedStatement
* @param resultSet
*/
public static void Release(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
try {
if(connection != null) {
connection.close();
}
if(preparedStatement != null){
preparedStatement.close();
}
if(resultSet != null){
resultSet.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
XML文件
一定要注意将XML文件放在根目录下,且命名必须为c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password"></property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">20</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">25</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
</default-config>
</c3p0-config>
过滤器
因为请求和响应可能存在乱码问题,所以加一个过滤器过滤乱码。本过滤器使用注解的方式实现对指定的类进行过滤。
package caztc.brg.StuMassage.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 过滤器
* @author Ling
* @create 2021-05-08 17:25
*/
//注解与Servlet类注解相同
@WebFilter("/student")
public class StudentFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
查询功能
查询全部学生信息
流程图
代码实现
JSP页面
- 注意,JSP页面的逻辑控制和数据显示都是由JSTL和EL表达式来完成的,之后的JSP页面不再赘述。
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>成绩</th>
<th>出生日期</th>
<th>操作</th>
</tr>
<c:forEach var="student" items="${list}" >
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.score}</td>
<td>${student.birthday}</td>
<td>
<a href="/JFH/student?method=deleteById&id=${student.id}">删除</a>
<a href="/JFH/student?method=UpdatefindById&id=${student.id}">修改</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
StudentServlet类对应的部分代码
String method =req.getParameter("method");
while(method == null){
method = "select";
}
switch (method){
case "select":
// 获取视图和数据
List<Student> list = studentRepositoryDao.SelectStudentTable();
req.setAttribute("list",list);
req.getRequestDispatcher("index.jsp").forward(req,resp);
break;
}
StudentRepositoryDao类对应的方法
/**
* 查询学生信息
* @return 学生类型列表
*/
public List<Student> SelectStudentTable(){
List<Student> list = new ArrayList();
try {
connection = C3P0Tools.getConnection();
String sql = "select * from massage";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
Student stu = null;
while(resultSet.next()){
Integer id = resultSet.getInt(1);
String name = resultSet.getString(2);
Double score = resultSet.getDouble(3);
Date birthday = resultSet.getDate(4);
stu = new Student(id,name,score,birthday);
list.add(stu);
}
}catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
C3P0Tools.Release(connection,preparedStatement,resultSet);
}
return list;
}
根据ID查询学生信息
流程图
代码实现
JSP页面
select.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
通过编号查询:
<form method="post" action="/JFH/student">
编号:<input name="id" type="text"><br>
<input type="hidden" name="method" value="findById">
<input type="submit" value="查询">
</form>
<br>
</body>
</html>
selectByID.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>成绩</th>
<th>出生日期</th>
<th>操作</th>
</tr>
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.score}</td>
<td>${student.birthday}</td>
<td>
<a href="/JFH/student?method=deleteById&id=${student.id}">删除</a>
<a href="/JFH/student?method=UpdatefindById&id=${student.id}">修改</a>
</td>
</tr>
</table>
</body>
</html>
StudentServlet类对应的部分代码
String method =req.getParameter("method");
case "findById":
String strid = req.getParameter("id");
strid = req.getParameter("id");
id = Integer.parseInt(strid);
req.setAttribute("student", studentRepositoryDao.findById(id));
System.out.println(studentRepositoryDao.findById(id));
req.getRequestDispatcher("selectByID.jsp").forward(req,resp);
break;
StudentRepositoryDao类对应的方法
/**
* 通过id查找学生
* @param id
* @return
*/
public Student findById(Integer id){
Student stu = null ;
try {
connection = C3P0Tools.getConnection();
String sql = "select * from massage where id = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,id);
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
Integer id2 = resultSet.getInt(1);
String name = resultSet.getString(2);
Double score = resultSet.getDouble(3);
Date birthday = resultSet.getDate(4);
stu = new Student(id2,name,score,birthday);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
C3P0Tools.Release(connection,preparedStatement,resultSet);
}
return stu;
}
模糊查询
流程图
代码实现
JSP页面
select.jsp
- 注意:通过ID查询和模糊查询是设计在一个页面上的,所以都是select.jsp,只是拆开展示了。
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
模糊查询:
<form method="post" action="/JFH/student">
编号:<input name="ByNa" type="text"><br>
<input type="hidden" name="method" value="selectByNa">
<input type="submit" value="查询">
</form>
</body>
</html>
selectByNA.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>成绩</th>
<th>出生日期</th>
<th>操作</th>
</tr>
<c:forEach var="student" items="${stuID_list}" >
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.score}</td>
<td>${student.birthday}</td>
<td>
<a href="/JFH/student?method=deleteById&id=${student.id}">删除</a>
<a href="/JFH/student?method=UpdatefindById&id=${student.id}">修改</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
StudentServlet类对应的部分代码
String method =req.getParameter("method");
case "selectByNa":
String str = req.getParameter("ByNa");
List<Student> stuID_list = studentRepositoryDao.selectByN(str);
System.out.println(stuID_list);
req.setAttribute("stuID_list",stuID_list);
req.getRequestDispatcher("selectByNa.jsp").forward(req,resp);
break;
StudentRepositoryDao类对应的方法
/**
* 模糊查询,查询姓名中带'str'的学生
* @param str
* @return 查询姓名中带'str'的学生列表
*/
public List<Student> selectByN(String str){
List<Student> studentList = new ArrayList<>();
try {
connection = C3P0Tools.getConnection();
String sql="select * from massage where name like concat('%',?,'%')";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,str);
resultSet = preparedStatement.executeQuery();
Student stu = null;
while(resultSet.next()){
Integer id = resultSet.getInt(1);
String name = resultSet.getString(2);
Double score = resultSet.getDouble(3);
Date birthday = resultSet.getDate(4);
stu = new Student(id,name,score,birthday);
studentList.add(stu);
}
return studentList;
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
C3P0Tools.Release(connection,preparedStatement,resultSet);
}
return null;
}
增加功能
流程图
代码实现
JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title</title>
<script type="text/javascript" src="js/Calendar3.js"></script>
</head>
<body>
<form action="/JFH/student" method="post" name="regForm">
姓名:<input type="text" name="name"/><br/>
成绩:<input type="text" name="score"/><br/>
出生日期:<input name="birthday" type="text" id="control_date" size="10"
maxlength="10" onclick="new Calendar().show(this);" readonly="readonly"/><br/>
<%-- 需要把操作名称传过去
用 type="hidden" 把这一操作 隐藏起来
--%>
<input type="hidden" name="method" value="add">
<input type="submit" value="提交"/>
</form>
</body>
</html>
StudentServlet类对应的部分代码
String method =req.getParameter("method");
while(method == null){
method = "add";
}
case "add":
String stuName = req.getParameter("name");
String strScore = req.getParameter("score");
String birthday = req.getParameter("birthday");
Double score = Double.parseDouble(strScore);
studentRepositoryDao.add(stuName,score,birthday);
resp.sendRedirect("/JFH/student");
break;
StudentRepositoryDao类对应的方法
/**
* 增加学生
* @param name
* @param score
*/
public void add(String name,Double score,String birthday){
try {
connection = C3P0Tools.getConnection();
String sql = "insert into massage(name,score,birthday) values(?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setDouble(2,score);
preparedStatement.setDate(3, java.sql.Date.valueOf(birthday));
preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
C3P0Tools.Release(connection,preparedStatement,null);
}
}
- 注意:下述修改和删除功能都没有设置特定的JSP页面,这两个操作都写在了展示学生信息的页面,以超链接的形式应用,只有修改学生信息时有一个“中转”界面。具体页面代码可以参考最后分享的源码。
修改功能
流程图
代码实现
StudentServlet类对应的部分代码
①StudentServlet类获取id并返回当前id信息对应的代码段
String method =req.getParameter("method");
case "UpdatefindById":
//获取到要修改的 ID 以便于 根据 ID 进行修改数据
strid = req.getParameter("id");
id = Integer.parseInt(strid);
req.setAttribute("student", studentRepositoryDao.findById(id));
System.out.println(studentRepositoryDao.findById(id));
req.getRequestDispatcher("update.jsp").forward(req,resp);
break;
②StudentServlet类获取用户修改信息并将修改的信息存入数据库的代码段
String method =req.getParameter("method");
case "update":
String strId = req.getParameter("id");
Integer id = Integer.parseInt(strId);
stuName = req.getParameter("name");
strScore = req.getParameter("score");
score = Double.parseDouble(strScore);
studentRepositoryDao.update(id,stuName,score);
resp.sendRedirect("/JFH/student");
break;
StudentRepositoryDao类对应的方法
①StudentRepositoryDao类获取对应id的信息的代码段(就是通过ID查找学生信息的方法,这里不再赘述)
②StudentRepositoryDao类修改学生信息对应的代码段
/**
* 通过 id 更新学生信息
* @param id
* @param name
* @param score
*/
public void update(Integer id,String name,Double score){
try {
connection = C3P0Tools.getConnection();
String sql = "update massage set name = ? ,score = ? where id =?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setDouble(2,score);
preparedStatement.setInt(3,id);
preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
C3P0Tools.Release(connection,preparedStatement,null);
}
}
删除功能
流程图
代码实现
StudentServlet类对应的部分代码
String method =req.getParameter("method");
case "deleteById":
String strid = req.getParameter("id");
Integer id = Integer.parseInt(strid);
studentRepositoryDao.delect(id);
resp.sendRedirect("/JFH/student");
break;
StudentRepositoryDao类对应的方法
/**
* 通过id删除学生
* @param id
*/
public void delect(Integer id){
try {
connection = C3P0Tools.getConnection();
String sql = "delete from massage where id = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,id);
preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
C3P0Tools.Release(connection,preparedStatement,null);
}
}
终
至此,本项目的架构与功能实现已经解释完,项目源码以及JS文件会以百度网盘的形式分享给大家,如有疑问可以私信,随时欢迎交流学习!
资料分享
https://github.com/YueLingXi/CSDNExp/tree/other1