Students2025项目(一)
原始Servlet+JSP架构项目初步搭建
jsp项目已被淘汰,在此学习目的是了解未来学习的新技术的底层原理
项目结构:
项目结构介绍:
目前阶段只完成了初始化的后端搭建,实现从本地数据库获取数据在浏览器显示
项目大体运行流程为Global->StudentServlet->StudentService->StudentDao,StudentDao层层将获取的数据回传一直到StudentServlet,然后请求转发到list.jsp在jsp页面中通过JSEL读入提前写好的html表格(model的Student类为数据模型,存放类的属性和get、set方法)
接下来按项目大体运行流程的顺序介绍各部分
Global
package com.example.common;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import javax.sql.DataSource;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Date;public class Global {//驱动名private static final String JDBC_DRIVER="com.mysql.cj.jdbc.Driver";
// 数据库链接字符串private static final String JDBC_URL="jdbc:mysql://localhost:3306/students2025?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true";private static final String JDBC_USERNAME="root";private static final String JDBC_PASSWORD="123456";//获取数据源 数据库连接池private static DataSource dataSource = null;//获取数据源 数据库连接池public static DataSource getDataSource() throws SQLException {if (dataSource==null){Driver driver = new com.mysql.cj.jdbc.Driver();dataSource = new SimpleDriverDataSource(driver,JDBC_URL,JDBC_USERNAME,JDBC_PASSWORD);}return dataSource;}//spring提供的jdbc模板操作类public static JdbcTemplate getJdbcTemplate() {try {return new JdbcTemplate(getDataSource());} catch (SQLException e) {throw new RuntimeException(e);}}
}
作用:
初始化数据库连接,创建数据库连接池,如果连接池为空,就按参数新建一个连接,JdbcTemplate 是 Spring JDBC 模块的核心类,通过get数据源创建 JdbcTemplate 实例,在StudentDao中被调用
数据库连接池:
用于在应用程序启动时创建一定数量的数据库连接,并将这些连接保存在一个"池"中,供应用程序随时取用。当应用程序需要与数据库交互时, 不是新建一个连接,而是从连接池中获取一个空闲连接,使用完毕后再归还给连接池,而不是关闭它。
StudentService
package com.example.servlet;import com.example.model.Student;
import com.example.service.impl.StudentServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.List;@WebServlet("/admin/student/*")
public class StudentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String action = req.getPathInfo();if("/list".equals(action)){StudentServiceImpl studentService =new StudentServiceImpl();List<Student> students = studentService.findAll();//放到请求域req.setAttribute("students",students);req.getRequestDispatcher("/WEB-INF/jsp/student/list.jsp").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//todo}
}
作用:
处理http请求, 用户访问URL:
/admin/student/list,if判断用户输入地址是不是/admin/student//list,如果是,创建StudentServiceImpl对象,调用findall方法,将获取到的数据存到List中,然后将名为students的集合存放到request请求域中,然后request调用请求转发方法将students转发到/WEB-INF/jsp/student/list.jsp。
StudentServiceImpl和StudentService
package com.example.service.impl;import com.example.dao.impl.StudentDaoImpl;
import com.example.model.Student;
import com.example.service.StudentService;import java.util.List;public class StudentServiceImpl implements StudentService {@Overridepublic List<Student> findAll() {StudentDaoImpl studentDaoImpl = new StudentDaoImpl();return studentDaoImpl.findAll();}
}
package com.example.service;import com.example.model.Student;import java.util.List;public interface StudentService {//查询所有学生List<Student> findAll();
}
StudentServiceImpl是StudentService的实现,StudentService接口定义了findAll的抽象方法,
StudentServiceImpl实现这个抽象方法,在方法中创建new
StudentDaoImpl()对象,调用了studentDaoImpl.findAll()方法,在studentDaoImpl.findAll()的方法体内真正实现了查找功能实现。
StudentDaoImpl和 StudentDao
package com.example.dao.impl;import com.example.common.Global;
import com.example.dao.StudentDao;
import com.example.model.Student;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
//数据仓库
public class StudentDaoImpl implements StudentDao {@Overridepublic List<Student> findAll() {JdbcTemplate jdbcTemplate= Global.getJdbcTemplate();String sql ="select id,stu_id,name,sex,birthday,pinyin,phone,email,qq,wechat from t_student limit 20";RowMapper<Student> rowMapper =new BeanPropertyRowMapper<>(Student.class);List<Student> students = jdbcTemplate.query(sql, rowMapper);return students;}
}
package com.example.dao;import com.example.model.Student;import java.util.List;public interface StudentDao {List<Student> findAll();
}
作用:负责与数据库直接交互
StudentDao 的findAll方法是这几个类层层调用的最底层的findAll抽象方法,也就是上面介绍的findAll方法层层调用,最终都是调的这个findAll方法,首先获取JdbcTemplate实例通过Global.getJdbcTemplate()获取Spring的JdbcTemplate,JdbcTemplate是Spring对JDBC的核心封装,简化了数据库操作,然后定义sql查询,查询t_student表中的20条记录,然后创建RowMapper,BeanPropertyRowMapper是Spring提供的实现类,自动将结果集的列映射到Student对象的属性,也就是将结果集列名转换为属性名(stu_id → stuId),jdbcTemplate.query(sql, rowMapper)执行sql语句存到集合里并返回
Student
package com.example.model;import lombok.Getter;
import lombok.Setter;import java.time.LocalDate;
//这两个注解相当于getset方法
@Getter
@Setter
public class Student {private Integer id;private String stuId;private String name;private String pinyin;private String sex;private String qq;private String email;private String phone;private String wechat;private LocalDate birthday;}
作用:
定义了Student类的数据模型,属性,通过@Getter和@Setter注解简便实现get和set方法
剩余流程分析
在StudentDaoImpl里将查询结果list列表student结果进行层层返回,最终到StudentServlet的List students = studentService.findAll();中,也是存到list集合里,然后通过 req.setAttribute(“students”,students);放到请求域中,再请求转发到
“/WEB-INF/jsp/student/list.jsp”
在list.jsp中有如下代码:
<%--Created by IntelliJ IDEA.User: LenovoDate: 2025/7/24Time: 15:16To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入标签库,固定语法--%>
<%@taglib prefix="c" uri="jakarta.tags.core" %>
<html>
<head><title>Title</title>
</head>
<body>
<table id="tbl"><thead><tr><th>ID</th><th>学号</th><th>姓名</th><th>拼音</th><th>性别</th><th>出生日期</th><th>手机号</th><th>微信号</th><th>邮箱</th><th>QQ</th></tr></thead><tbody>
<%-- 遍历名为"students"的集合(由Servlet通过req.setAttribute("students",students)设置)--%><c:forEach items="${students}" var="s"><tr><td>${s.id}</td><td>${s.stuId}</td><td>${s.name}</td><td>${s.pinyin}</td><td>${s.sex}</td><td>${s.birthday}</td><td>${s.phone}</td><td>${s.wechat}</td><td>${s.email}</td><td>${s.qq}</td></tr></c:forEach></tbody>
</table>
</body>
</html>
<c:forEach items=“${students}” var=“s”>遍历传入的名为student的list集合,获取各个属性放入提前写好的表格中