JavaWeb学习笔记(14.5)__Servlet_JSP_JDBC 综合案例

Servlet_JSP_JDBC 综合案例

案例描述: 通过Servlet,JSP,JDBC实现简单的 学生成绩管理系统,即可以查看所有学生的成绩,新添加学生的成绩,删除和修改学生的成绩。

注: 本案例注重于实现交互,并没有对页面进行美化

注: 本案例基于B站UP主:楠哥教你学Java 的课程《Java Web从入门到实战【完整版】》进行整理补充,本文章仅用于个人学习交流使用。

1.界面展示

1.学生信息展示页面

注: 在浏览器地址栏输入 loacalhost:8080/student 访问,如果访问 loacalhost:8080/index.jsp 会只显示视图,没有数据。因为访问 /student 经过了Servlet处理,连接了数据库,而直接访问 /index.jsp 则没有。
在这里插入图片描述
2.学生信息添加页面

注: 需要在浏览器地址栏输入 loacalhost:8080/add.jsp 访问,因为案例做的比较简单,没有实现跳转。信息成功添加之后会自动跳转到学生信息展示页面。
在这里插入图片描述
3.学生信息修改页面

注: 编号是只读的,无法修改,信息成功修改之后会自动跳转到学生信息展示页面。

在这里插入图片描述

2.功能演示

1.初始数据库
在这里插入图片描述
2.浏览学生信息展示页面
在这里插入图片描述
3.添加学生信息
在这里插入图片描述
添加成功:

编号自动加一,因为之前测试写过一个34的,这次加一后成为35

日期是随便生成的,不用特别在意。
在这里插入图片描述
4.修改学生信息
在这里插入图片描述
修改成功
在这里插入图片描述
5.删除学生信息

删除成功
在这里插入图片描述
6.最后的数据库
在这里插入图片描述

3.源代码

代码目录结构:
在这里插入图片描述
1.实体类 Student.java

封装了一个 student 实体对象

package com.lut.entity;

import java.util.Date;

public class Student {
    private Integer id;
    private String name;
    private Integer score;
    private Date brithday;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", score=" + score +
                ", brithday=" + brithday +
                '}';
    }

    public Student(Integer id, String name, Integer score, Date brithday) {
        this.id = id;
        this.name = name;
        this.score = score;
        this.brithday = brithday;
    }

    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 Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    public Date getBrithday() {
        return brithday;
    }

    public void setBrithday(Date brithday) {
        this.brithday = brithday;
    }
}

2.数据处理:StudentRespository.java

数据持久层,建立了与数据库的连接,并通过SQL语句修改/查询数据库。主要定义了 查询/添加/删除/修改 的方法。

package com.lut.repository;

import com.lut.entity.Student;
import com.lut.util.JDBCTools;

import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

//数据持久层,查询数据
public class StudentRespository {
    //查询的方法
    public List<Student> findALL(){
        List<Student> list=new ArrayList<>();
        //定义在外面,里面赋值,为了扩大作用域,能够在finally里面关掉
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        try{
            connection= JDBCTools.getConnection();
            String sql="select * from test.student";
            preparedStatement=connection.prepareStatement(sql);
            resultSet=preparedStatement.executeQuery();
            Student student=null;
            while (resultSet.next()){
                Integer id=resultSet.getInt(1);
                String name=resultSet.getString(2);
                Integer score=resultSet.getInt(3);
                Date date=resultSet.getDate(4);
                student=new Student(id,name,score,date);
                list.add(student);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,preparedStatement,resultSet);
        }

        return list;
    }


    //添加的方法
    public void add(String name,Integer score){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        try{
            connection= JDBCTools.getConnection();
            String sql="insert into test.student(name, score, brithday) values (?,?,?)";
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setString(1,name);
            preparedStatement.setInt(2,score);
            preparedStatement.setDate(3,new java.sql.Date(1));
            preparedStatement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,preparedStatement,null);
        }

    }

    //删除的方法
    public void deleteById(Integer id){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        try {
            connection=JDBCTools.getConnection();
            String sql="delete from test.student where id=?";
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setInt(1,id);
            preparedStatement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,preparedStatement,null);
        }
    }


    //获取Id的方法,通过Id定位
    public Student findById(Integer id){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        Student student=null;
        try {
            connection=JDBCTools.getConnection();
            String sql="select * from test.student 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);
                Integer score=resultSet.getInt(3);
                Date date=resultSet.getDate(4);
                student=new Student(id2,name,score,date);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,preparedStatement,resultSet);
        }
        return student;
    }


    //修改的方法
    public void update(Integer id,String name,Integer score){
        System.out.println("调用修改的方法");
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        try{
            connection= JDBCTools.getConnection();
            String sql="update test.student set name=?,score=? where id=?";
            preparedStatement=connection.prepareStatement(sql);
            System.out.println("执行SQL");
            preparedStatement.setString(1,name);
            preparedStatement.setInt(2,score);
            preparedStatement.setInt(3,id);
            preparedStatement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,preparedStatement,null);
        }

    }

    //main函数,测试用
    public static void main(String[] args) {
        StudentRespository studentRespository=new StudentRespository();
        System.out.println(studentRespository.findALL());
    }
}

3.工具类:JDBCTools.java

将经常用到的代码块进行封装,定义为一个方法,要使用该代码时只需要调用该方法即可。主要有:数据库驱动,与数据连接,释放连接的资源等。

package com.lut.util;

import java.sql.*;

public class JDBCTools {
    //工具包

    private static Connection connection;
    private static String url = "jdbc:mysql://localhost:3306/test? useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
    private static String user="root";
    private static String password="123456";

    static {
        //静态代码块只执行一次
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        //定义为静态方法,其他类就可以直接通过 类名.方法名 调用,不用再创建对象
        //静态方法里面,所有的成员也必须都是静态的...?
        try{
            connection=DriverManager.getConnection(url,user,password);
        }catch (SQLException e){
            e.printStackTrace();
        }
        return connection;
    }

    public static void release(Connection connection, Statement statement, ResultSet resultSet){
       try{
           if (connection!=null){
               connection.close();
           }
           if (statement!=null){
               statement.close();
           }
           if (resultSet!=null){
               resultSet.close();
           }
       }catch (SQLException e){
           e.printStackTrace();
       }
    }

}

4.服务类:StudentServlet.java

获取页面的请求,并调用相关的方法对请求进行处理,最后将处理好的信息返回到页面上。

package com.lut.servlet;

import com.lut.entity.Student;
import com.lut.repository.StudentRespository;

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;
import java.util.List;

@WebServlet("/student")
public class StudentServlet extends HttpServlet {

    StudentRespository studentRespository;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String method=req.getParameter("method");
        System.out.println("获取method"+method);
        studentRespository=new StudentRespository();
        switch (method){
            case "add":
                String name=req.getParameter("name");
                String scorestr=req.getParameter("score");
                Integer score=Integer.parseInt(scorestr);
                studentRespository.add(name,score);
                resp.sendRedirect("/student");
                break;
            case "update":
                String idstr=req.getParameter("id");
                Integer id=Integer.parseInt(idstr);
                String name2=req.getParameter("name");
                String scorestr2=req.getParameter("score");
                score=Integer.parseInt(scorestr2);
                studentRespository.update(id,name2,score);
                resp.sendRedirect("/student");
                break;
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method=req.getParameter("method");
        if (method==null){
            method="findAll";
        }
        switch (method){
            case "findAll":
                //返回视图+数据
                studentRespository=new StudentRespository();
                List<Student> list=studentRespository.findALL();
                req.setAttribute("list",list);
                req.getRequestDispatcher("index.jsp").forward(req,resp);
                break;
            case "deleteByID":
                String idstr=req.getParameter("id");
                Integer id=Integer.parseInt(idstr);
                studentRespository.deleteById(id);
                resp.sendRedirect("/student");
                break;
            case "findById":
                String idstr2=req.getParameter("id");
                Integer id2=Integer.parseInt(idstr2);
                req.setAttribute("student",studentRespository.findById(id2));
                req.getRequestDispatcher("update.jsp").forward(req,resp);
                break;
        }


    }
}

5.信息展示界面:index.jsp

将 Servlet 处理好的信息展示出来。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<h1>学生管理系统</h1>
<table>
  <tr>
    <th>编号</th>
    <th>姓名</th>
    <th>成绩</th>
    <th>注册日期</th>
  </tr>
  <c:forEach items="${list}" var="student">
    <tr>
      <td>${student.id}</td>
      <td>${student.name}</td>
      <td>${student.score}</td>
      <td>${student.brithday}</td>
      <td>
        <a href="student?method=deleteByID&id=${student.id}">删除</a>
        <a href="student?method=findById&id=${student.id}">修改</a>
      </td>
    </tr>
  </c:forEach>
  <!--访问http://localhost:8080/student会经过Servlet处理数据,然后到达index..jsp,
    会有完整的视图和数据,直接访问 index.jsp 没有经过Servlet处理数据,只会有视图 -->
</table>

  </body>
</html>

6.添加页面:add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="student" method="post">
        姓名:<input type="text" name="name"><br>
        成绩:<input type="text" name="score"><br>
        <input type="hidden" name="method" value="add">
        <!--一个隐藏的控件,当提交时,会发送一个
        name="method" value="update"的参数,用于区分 -->
        <input type="submit" value="提交">
    </form>
</body>
</html>

7.更新界面:update.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="student" method="post">
        编号:<input type="text" name="id" readonly value="${student.id}"><br>
        姓名:<input type="text" name="name" value="${student.name}"><br>
        成绩:<input type="text" name="score" value="${student.score}"><br>
        <input type="hidden" name="method" value="update">
        <!--一个隐藏的控件,当提交时,会发送一个
        name="method" value="update"的参数,用于区分 -->
        <input type="submit" value="修改">
    </form>
</body>
</html>

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值