[MVC模式][C3P0数据库连接池][JDBC+Servlet+JSP][一个Servlet处理多种请求]实现学生信息管理系统的CRUD功能

1 篇文章 0 订阅

简介

这是一个简单的学生信息管理系统,实现学生信息增删改查功能、学生信息模糊查询功能、错误信息提示功能;数据库连接采用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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值