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>