简介:这个基于Java的Web学生成绩管理系统源码包,面向正在学习Java Web开发的学生或需要完成课程设计的开发者,提供了一套完整的Servlet+JSP+JDBC实现方案。包内共有36个文件,其中包含10个Java源码、9个JSP页面、13张界面与设计图、XML配置和README说明等,压缩包体积仅2.94MB,便于快速下载与本地部署。系统中实现了学生成绩的录入、修改、查询、筛选和统计等核心功能,并且配套了数据表设计、运行界面等图片资料,能帮助读者直观理解前后端交互和数据库操作流程。已有33人学习下载,特别适合用来参考MVC分层、JDBC数据库连接以及Tomcat环境下JSP/Servlet的整合实践。通过阅读源码和截图,可以快速掌握Web成绩管理系统的页面设计思路、业务逻辑组织方式以及异常处理细节,对完成类似课设或入门Java Web开发很有帮助。
1. 基于 Java 的 Web 学生成绩管理系统:一份能跑通全流程的 JSP + Servlet 课设包
像“基于 Java 的 Web 学生成绩管理系统.zip”这种资源,在课设季几乎是标配。它的价值不在于代码多高级,而在于把 JSP + Servlet + JDBC 从建表到部署的完整链路都摆在你面前:解压后能看到 src 下的 Java 类、WebRoot 里的 JSP 页面、WEB-INF 下的 web.xml,还有一组运行界面截图帮你提前确认页面长什么样。对正在赶课程设计、或者准备 Java 面试前想补 Web 基础的人,这是一份能少踩坑的学习样本。
这份资源解决的是一个典型问题:学生成绩系统该怎么组织代码、怎么录成绩、怎么改成绩、怎么按分数降序筛选、怎么做统计。它适合三类人——需要交课设的在校生、想把 Servlet 请求流程重新过一遍的转行者、以及想快速搭一套演示项目做内训的在职开发。
下面我按“先读结构 → 部署运行 → 拆功能实现 → 避坑 → 进阶改造”的顺序拆,目标是让你拿到 zip 后两小时内把它跑在自己电脑上。
2. 先读懂目录再动手:从 stuPackage、WebRoot 和截图反推项目设计
解压后第一件事别急着导 IDE。先在文件管理器里把目录结构过一遍,你能在五分钟内判断出这个项目的技术栈、数据库类型和部署方式,后面导进 Eclipse 会顺很多。
2.1 src/stuPackage:Servlet、数据库连接类与业务入口的分工
src 下唯一一个包是 stuPackage,命名没有按 com.xxx 的规范来,而是直接用项目名做包名。这是课设源码很常见的写法,虽然不算工程化,但类名短、路径直,当教学案例读反而更友好。包内的 Java 文件按职责大致分成三类:
- 处理 HTTP 请求的 Servlet 类,负责接收 request、解析参数、调用业务方法,最后转发或重定向到 JSP;
- 数据库连接和数据访问类,通常叫 DBConnection、DBUtil、XxxDAO,里面放着 JDBC 连接和增删改查方法;
- 实体类(如果有),对应数据库表字段,用于在 Servlet 与 JSP 之间传对象。
这类项目最常见的连接管理类长这样,课设代码十有八九是这个套路:
package stuPackage; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/stumanage" + "?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static Connection getConnection() throws SQLException { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } return DriverManager.getConnection(URL, USER, PASSWORD); } }要注意的不是类名,而是三个常量:URL 里的数据库名 stumanage 要和你后面建库时保持一致;USER 和 PASSWORD 要改成自己 MySQL 的账号;驱动类名要匹配 MySQL 版本,8.x 用 com.mysql.cj.jdbc.Driver,5.x 及以下多数用 com.mysql.jdbc.Driver。这一行不对,启动时必报 ClassNotFoundException。
如果项目里没有这个类,而是把连接代码散落在每个 Servlet 里,也别慌。只需搜索关键字 Class.forName,Java 文件里凡是加载 JDBC 驱动的地方,都是需要统一修改的连接参数位置,复制搜出来的路径,全局替换即可。
2.2 WebRoot 与 WEB-INF:页面、静态资源和配置的职责边界
WebRoot 是整个 Web 应用的根目录,对应部署到 Tomcat 后的上下文路径。从 zip 内容能看出入口文件 index.jsp 直接放在 WebRoot 下,业务页面放在 JSP 子目录,图片和样式放在 IMG。分层很典型:
java0323/ ├── src/ │ └── stuPackage/ # Java 源码:Servlet、DBUtil、DAO ├── WebRoot/ │ ├── WEB-INF/ # web.xml、lib 依赖、编译输出 class │ ├── META-INF/ # 容器元信息,默认不动 │ ├── IMG/ # 图片、CSS、JS 等静态资源 │ ├── JSP/ # 录入、查询、筛选、统计等业务页面 │ └── index.jsp # welcome-file 入口 ├── 运行界面截图/ # 系统首页、查询、录入、统计等截图 └── README.mdWEB-INF 下的 web.xml 是配置的核心,它负责注册 Servlet 和做 URL 映射。一套典型配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>ScoreServlet</servlet-name> <servlet-class>stuPackage.ScoreServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ScoreServlet</servlet-name> <url-pattern>/score</url-pattern> </servlet-mapping> </web-app>url-pattern 的值决定访问路径,比如配置成 /score,就用 http://localhost:8080/项目名/score 访问。这个文件内容不多,但新人翻车最多的地方就在这:Servlet 类名写错导致 500,url-pattern 漏了斜杠导致 404,这里的每一项都值得对照源码逐字检查。META-INF 一般放 context.xml 或打包元信息,课设里多为默认内容,不要动它。
2.3 截图当需求文档用:从数据表设计.jpg 还原数据库结构
这套 zip 里最有价值的部分之一就是数据表设计.jpg。它画出了字段名、类型和主外键,是建库建表的唯一依据;运行截图告诉你怎么录成绩、提交后跳哪里、筛选结果怎么排序,等于把需求文档直接可视化。
如果截图暂时看不清,按课设最常见的三表设计来建是安全的:
CREATE DATABASE stumanage DEFAULT CHARACTER SET utf8mb4; USE stumanage; CREATE TABLE student ( sno VARCHAR(20) PRIMARY KEY, sname VARCHAR(50) NOT NULL, sclass VARCHAR(50) ); CREATE TABLE course ( cno VARCHAR(20) PRIMARY KEY, cname VARCHAR(50) NOT NULL ); CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, sno VARCHAR(20) NOT NULL, cno VARCHAR(20) NOT NULL, score DOUBLE, FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) );有些简化的课设会把成绩直接放在 student 表里,只建一张表,避免连表查询。无论哪种,一个原则必须守住:字段名要和代码里 rs.getString("sname") 这类取值完全一致,否则页面能打开但数据永远是空的。我一般建议先把表建好,插入三条测试数据,确认查询能出结果,再继续部署,这个习惯能省掉大量调试时间。
提示:如果你的项目不是三表设计,请以数据表设计.jpg 为准。截图上出现过多少个字段,表里就建多少个字段,多一个少一个都会影响后续 SQL 查询。
3. 部署与运行:Eclipse 导入、建库建表到 Tomcat 启动的全过程
上面确认完结构,就可以进 IDE。部署这件事最容易“玄学”,其实把版本匹配关系理清,翻车概率会直线下降。
3.1 版本搭配:JDK、Tomcat、MySQL 用哪套组合最省事
不用最新版本,而用最匹配课设代码的版本,这是血泪经验。看这个项目结构:src 下没有 pom.xml,WebRoot 下没有 Maven 的 target 目录,说明它是一个传统的 Eclipse Web Project,手动管理 jar 依赖。推荐搭配如下:
| 组件 | 推荐版本 | 理由 |
|---|---|---|
| JDK | 1.8 | 课设源码大多基于 JDK 8 编写,换高版本容易踩模块化限制 |
| Tomcat | 8.5 | 对应 Servlet 3.1 / JSP 2.3,使用 javax.servlet 包名,和源码一致 |
| MySQL | 5.7 或 8.0 | 课设最常见数据库,驱动版本需和数据库版本匹配 |
| Eclipse IDE for Java EE | 2023 后版本均可 | 自带 Tomcat 集成和 Dynamic Web Project 支持 |
特别提醒:如果电脑上只有 JDK 17 和 Tomcat 10,这套代码大概率跑不起来。原因是 Tomcat 10 把 javax.servlet 换成了 jakarta.servlet,Servlet 里 import 的全是旧包名,一启动就是 NoClassDefFoundError。正确做法是装一个 JDK 8 配 Tomcat 8.5,或者给 Eclipse 单独指定一个 JDK 8 的运行环境,二选一。
3.2 项目导入:识别不出项目时的两手准备
导入操作本身很简单:Eclipse 菜单 File → Import → Existing Projects into Workspace,选择解压目录,勾上项目后 Finish。但课设包经常没有 .project 和 .classpath 文件,导入窗口里可能看不到项目。我遇到这种情况时一般这样处理:
- 能看到项目:直接导入,然后检查 Java Build Path 里的 JRE 是不是当前 JDK 8;
- 看不到项目:新建一个 Dynamic Web Project,项目名随意,再把 src 和 WebRoot 两个文件夹手动复制进对应目录,最后把 WEB-INF/lib 下的 jar 加入 Build Path。
复制后还要检查一个关键位置:项目属性 → Java Build Path → Source,确认 Default output folder 指向 /build/classes 或 WebRoot/WEB-INF/classes。如果输出目录不对,Servlet 编译出的 class 不会进 WEB-INF/classes,Tomcat 启动时找不到类,页面必然 404。
导完后先确认 WEB-INF/lib 里有没有 mysql-connector 的 jar。如果整个 lib 是空的,后面数据库操作会直接抛 ClassNotFoundException。常见做法是把 mysql-connector-java-8.0.x.jar 复制进去,右键 Build Path → Add to Build Path,让编译期和运行期都能读到同一条驱动。
3.3 建库、插入测试数据、改 JDBC 连接配置
数据库这步我建议先建最小数据集,不要等代码写完再导数据。打开 MySQL 命令行或 Navicat,执行第 2.3 节的建表 SQL,然后插入少量测试数据:
INSERT INTO student(sno, sname, sclass) VALUES ('2024001', '张三', '计算机一班'), ('2024002', '李四', '计算机二班'); INSERT INTO course(cno, cname) VALUES ('C01', 'Java程序设计'), ('C02', '数据库原理'); INSERT INTO score(sno, cno, score) VALUES ('2024001', 'C01', 88.5), ('2024002', 'C01', 76.0), ('2024001', 'C02', 92.0);数据插完,回到 DBUtil 类,把 URL 中的库名、用户名、密码改成你本机配置。常见坑是密码里带特殊字符,比如 @ 或 #,JDBC URL 里的特殊字符需要 URL 编码,否则连接会失败。MySQL 8.x 的连接串必须带 serverTimezone=Asia/Shanghai,否则驱动会报时区错误。
提示:项目里若没有 lib 目录,或者连不上数据库但找不出原因,可以先写一个最简单的 Java 类,只执行 DBUtil.getConnection() 并输出 Connection 对象。能打印出对象,问题在业务代码;打不出来,问题就在 URL、账号或驱动。
我一般还会顺手确认 MySQL 服务状态:Windows 下按 Win+R 输入 services.msc,找到 MySQL 服务看是否 Running。很多“连接超时”是服务没启动,不是代码问题。
3.4 启动 Tomcat 并验证完整页面链路
在 Eclipse 下方 Servers 面板右键 New → Server,选 Tomcat 8.5,指向本地安装目录,然后 Add and Remove 把项目加进去。启动后观察 Console 日志,看到 Server startup 字样说明启动成功。此时访问主页面:
http://localhost:8080/项目名/项目名就是项目导入时显示的字符串,比如叫 student-score,那地址就是 http://localhost:8080/student-score/。这一步能看到 index.jsp 与系统首页截图长得一致,说明 welcome-file 生效。
接下来分两条路径验证:第一条,进查询页面,确认能列出刚插入的成绩数据;第二条,进录入/修改页面,把张三的 Java 成绩从 88.5 改成 89,提交后跳回列表页并确认新值生效。两条链路都成立,说明 Servlet 映射和 JDBC 读写全通了,后面再看功能逻辑就不慌。如果某一步失败,优先看 Tomcat 安装目录下 logs 里的 localhost.日期.log,这个日志比 Console 更详细,会直接标明是哪个类加载失败。
4. 核心功能拆解:成绩录入、降序筛选与统计页面的实现方式
跑通之后,建议别光看界面,把代码过一遍。成绩管理系统看似简单,其实覆盖了 Servlet 处理表单、JDBC 增删改查、SQL 排序聚合三块核心知识,面试和答辩都爱从这下手。
4.1 录入/修改成绩:表单提交、参数解析与 update 更新
从截图“录入或修改结果(可在页面中修改成绩,点击提交保存)”能看出,这个系统的录入页不是空白表单,而是把现有成绩列在表格里,每行都能直接改分数。常见实现是这样:
<form action="ScoreServlet?action=update" method="post"> <input type="hidden" name="id" value="<%=rs.getInt("id")%>"> 学号:<input type="text" name="sno" value="<%=rs.getString("sno")%>" readonly> 学生:<span><%=rs.getString("sname")%></span> 成绩:<input type="number" name="score" step="0.5" value="<%=rs.getDouble("score")%>"> <button type="submit">保存</button> </form>表单里 hidden 的 id 是用来定位数据行的主键,number 输入框加 step="0.5" 让浏览器直接支持小数分数。提交后请求落到 ScoreServlet:
package stuPackage; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ScoreServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String action = request.getParameter("action"); if ("update".equals(action)) { int id = Integer.parseInt(request.getParameter("id")); double score = Double.parseDouble(request.getParameter("score")); updateScore(id, score); } response.sendRedirect("query.jsp"); } private void updateScore(int id, double score) { // 实际执行 update score set score=? where id=? 并关闭资源 } }这段代码有两个知识点。第一,request.setCharacterEncoding 必须放在读取参数之前,否则 POST 中文大概率乱码;第二,response.sendRedirect 是重定向,地址栏会跳到 query.jsp,刷新页面不会重复提交表单。如果看到的是 request.getRequestDispatcher("query.jsp").forward(),那是转发,一次请求内完成;重定向是两次请求,面试时能说清这个区别会加分。
这里要特别提醒:Integer.parseInt 和 Double.parseDouble 都可能抛 NumberFormatException。如果页面输入框里不小心填入非数字,这个 Servlet 会直接 500。稳妥做法是加一个 try-catch,解析失败就回到录入页并给提示,这是课设答辩时很显眼的一个细节改进。
4.2 成绩筛选与降序排列:条件拼接与 ORDER BY 参数
截图“成绩筛选结果(按查询成绩降序排列)”对应的功能,本质是把筛选条件和排序规则拼进一条 SQL。先看 JSP 里的查询表单:
<form action="query.jsp" method="get"> 姓名关键字:<input type="text" name="keyword"> 排序: <select name="order"> <option value="desc">成绩降序</option> <option value="asc">成绩升序</option> </select> <button type="submit">筛选</button> </form>然后 Java 端动态拼 SQL,我一般会写成这样:
String sql = "SELECT s.sno, s.sname, c.cname, sc.score " + "FROM score sc " + "JOIN student s ON sc.sno = s.sno " + "JOIN course c ON sc.cno = c.cno " + "WHERE 1=1 "; if (keyword != null && !keyword.trim().isEmpty()) { sql += "AND s.sname LIKE ? "; } String order = request.getParameter("order"); if ("asc".equals(order)) { sql += "ORDER BY sc.score ASC "; } else { sql += "ORDER BY sc.score DESC "; } PreparedStatement ps = conn.prepareStatement(sql); if (keyword != null && !keyword.trim().isEmpty()) { ps.setString(1, "%" + keyword.trim() + "%"); } ResultSet rs = ps.executeQuery();这里有两个逻辑值得记一下。WHERE 1=1 不是多余的装饰,它让后面每个筛选条件都能无脑拼 AND,少写很多 if 分支;排序方向用一个下拉参数控制,默认走 desc,对应截图中“降序排列”,想切升序只改 order 参数即可。如果发现排序没生效,先看拼出来 SQL 里有没有 ORDER BY,再确认排序字段是 score 还是 grade,很多项目字段命名不一样,截图里的“数据表内容.jpg”能帮你确认正确列名。
LIKE 查询还要注意通配符:keyword 为“张”时,匹配的是所有姓张的学生;keyword 为空字符串时,不要执行 setString,否则会过滤掉全部数据。这个边界条件筛下来,页面时好时坏,多半就是空参数处理不干净。
4.3 成绩统计页面:聚合函数、分组与及格率计算
统计页面截图通常会显示平均分、最高分、最低分,有时还有及格率。单个指标用一条聚合 SQL 就能出:
SELECT COUNT(*) AS total_count, AVG(score) AS avg_score, MAX(score) AS max_score, MIN(score) AS min_score, SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS pass_rate FROM score WHERE cno = 'C01';如果按课程分组统计,就在后面加 GROUP BY cno:
SELECT c.cname, COUNT(*) AS total_count, AVG(sc.score) AS avg_score, MAX(sc.score) AS max_score FROM score sc JOIN course c ON sc.cno = c.cno GROUP BY sc.cno;在 JSP 里显示统计值时,注意 rs.getInt("total_count") 用的是别名,不是表里的物理列名。COUNT(*) 返回 long 类型,AVG 返回 DOUBLE,在页面输出前最好格式化,保留一位小数,界面会干净很多。统计页面要做到和截图长得像,重点不是 SQL 复杂,而是把结果集的列名和页面表格的表头一一对齐。
注意:如果统计页查不出来数据,先单独在数据库客户端跑一遍同一条 SQL。SQL 能出结果,问题在 JSP 取值;SQL 出不来,问题在表结构或字段名。
另外,摘要里提到“成绩预警提示”这类人性化功能,不需要额外建表,在统计列表里给低于 60 分的行加一个 CSS 类标红就行。对课设来说,这是一个性价比很高的加分点,实现成本不到十分钟,演示效果却非常直观。
5. 避坑与常见问题:乱码、数据库连接、404 怎么按顺序排查
课设项目跑不起来的坑,翻来覆去就那么几类。我把最高频的四条按“现象 → 原因 → 解决”列出来,卡住时按这个顺序排查,比乱改代码效率高得多。
5.1 数据库连接失败:ClassNotFoundException 与 Communications link failure
现象:首页正常打开,一进查询或统计页就报 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,或者 Communications link failure 连接超时。
原因:前者是驱动类名或 jar 放错位置,驱动 jar 必须放在 WebRoot/WEB-INF/lib 下,而不是项目根目录随便建一个文件夹;后者是连接 URL 里的端口、时区不对,或者 MySQL 服务根本没启动。还有一个隐蔽情况:MySQL 8.0 驱动和 5.7 服务器有时会握手失败,报错信息很含糊。
解决:第一步,确认 WEB-INF/lib 下有 mysql-connector 的 jar 包,没有就从本地仓库复制进去并刷新;第二步,把驱动类名改成和版本匹配的名字;第三步,URL 末尾补上 useSSL=false&serverTimezone=Asia/Shanghai。改完重启 Tomcat,而不是只刷新页面,因为连接初始化发生在项目启动阶段。如果还不行,直接用第 3.3 节提的 getConnection 测试类定位。
5.2 中文乱码:页面编码、请求编码与数据库编码不一致
现象:页面中文全是问号,写入数据库的中文变成 ??。
原因:三个地方有一个不一致就出问题:JSP 文件顶部没有声明 UTF-8;doPost 里没有执行 setCharacterEncoding;数据库表默认字符集是 latin1 或建表时没指定 utf8mb4。
解决:先把 JSP 顶部写全:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>再在 Servlet 的 doPost 开头、读取参数之前写 request.setCharacterEncoding("UTF-8")。最后确认建表时用了 DEFAULT CHARACTER SET utf8mb4。如果表已经建好且存了乱码,可以执行ALTER TABLE score CONVERT TO CHARACTER SET utf8mb4,之后新写入的数据一般就正常了。曾经我为一个乱码问题折腾了一下午,最后发现是 Eclipse 里文件本身被保存成了 GBK,改一下 Properties → Resource → Text file encoding 就好了,这个位置很容易被忽略。
5.3 部署后 404:URL 映射、上下文路径与 class 输出目录
现象:首页能打开,点查询按钮跳 404,路径看着也对就是找不到资源。
原因:主要有三处。web.xml 里 servlet-mapping 的 url-pattern 和表单 action 不一致,比如页面写 ScoreServlet?action=query,映射却是 /ScoreServlet;项目部署名访问路径不对;Servlet 编译后的 class 没有输出到 WEB-INF/classes,Tomcat 找不到类。
解决:先在浏览器地址栏直接访问 web.xml 里的 url-pattern,比如 http://localhost:8080/项目名/score,看能不能调到 Servlet;再看项目 Properties → Java Build Path → Source 的 Default output folder,确保指向 WebRoot/WEB-INF/classes;最后翻 Tomcat 的 logs 目录,找 localhost.当前日期.log,里面有明确的类加载报错信息,比控制台输出详细得多。404 排查要按“路径 → 映射 → 类文件”的顺序走,不要一上来就怀疑代码逻辑。
5.4 成绩修改不生效:主键缺失或更新条件写错
现象:页面上的成绩改了,点保存跳回列表,但数值还是旧值。
原因:常见是两个。表单里没正确传递主键字段,update 语句的 WHERE 条件找不到行;或者 Servlet 里手动设置了 conn.setAutoCommit(false) 之后忘了 commit,修改没提交等于白改。
解决:先看网页源码里 hidden 的 id 或 sno 字段是否存在且带值;然后在 Servlet 里把 update 语句和绑定参数用 System.out 打印到控制台,复制到数据库客户端跑一遍,看影响行数。影响行数是 0,说明是条件不匹配,不是数据没改。如果你用了事务,记得在 finally 里 commit,同时按 Connection、Statement、ResultSet 的顺序关闭资源,避免连接泄漏。连接泄漏的典型表现是系统用几分钟后越来越慢,最后 Tomcat 报 too many connections,这个坑越早堵越好。
6. 进阶改造:用 Filter 登录拦截和统一 DAO 提升课设完成度
课设项目能跑只是及格线,答辩被问到“你的系统怎么控制权限”就容易卡壳。我建议花半小时做两个小改造,性价比很高:加一个登录过滤器,再把 JDBC 的关闭逻辑统一收拢。
6.1 用 Filter 做登录拦截
新建 LoginFilter.java,校验会话里有没有已登录用户:
package stuPackage; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public class LoginFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; Object user = request.getSession().getAttribute("loginUser"); if (user == null) { response.sendRedirect("login.jsp"); return; } chain.doFilter(req, resp); } }然后在 web.xml 里声明过滤器,把除了登录页之外的路径都拦住。这样“权限控制”这个答辩问题就有了实际代码支撑,而不是空口说“我做了登录”。
6.2 统一 JDBC 关闭并全面改用 PreparedStatement
把所有 DAO 里的 createStatement().execute() 换成 PreparedStatement,带参数查询一律用 setString、setDouble 绑定,能防 SQL 注入。再抽一个 BaseDAO,把 getConnection、close 收拢到一个地方,业务代码量能减三分之一:
package stuPackage; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class BaseDAO { protected Connection conn; protected Statement stmt; protected ResultSet rs; protected void close() { try { if (rs != null) rs.close(); } catch (Exception e) { } try { if (stmt != null) stmt.close(); } catch (Exception e) { } try { if (conn != null) conn.close(); } catch (Exception e) { } } }这样改完,答辩时能补一句“使用了预编译语句防注入,用 Filter 做请求校验,用 BaseDAO 统一资源管理”,完成度立刻不一样。
从那以后,我每次拿到课设包,第一件事就是看 web.xml、看数据库连接类、看截图里的表设计,看完再决定要不要导进 IDE。这个习惯帮我避开了至少一半的部署翻车,希望也能帮到你。
本文还有配套的精品资源,点击获取