简介这份资源是面向计算机相关专业学生与Java Web初学者的一套完整课程设计参考主题为基于JSP与SQL Server的学生信息管理系统采用B/S架构实现可用于毕业设计、课程作业或自学练手。压缩包共55个文件约2.45MB其中42个jsp页面构成系统主要功能界面另含jpg图片素材、ppt答辩模板、doc说明文档以及mdf与ldf数据库文件、xml配置和exe可执行程序源码经测试校正后可正常运行。资源还附带完整设计文档与多份答辩演示文稿方便读者理解系统整体结构与开发思路。目前已有797人学习下载适合需要快速获取可运行项目、对照文档梳理功能模块并完成答辩准备的读者参考使用。1. 从一份 JSPSQL Server 课设说起它到底能跑通什么如果你正在搜「基于JSPsqlserver的学生信息管理系统设计与实现」大概率是三种人之一要交毕设的应届生、被安排带课设的助教、或者想拿一个传统 JavaWeb 项目练手的新人。这个标题听起来很老派但它对应的技术栈恰恰是很多高校机房、老企业内网里还在跑的东西——JSP 负责页面渲染Servlet 或 JavaBean 处理业务SQL Server 存学生、课程、成绩、班级这几张核心表。它不新但足够完整登录鉴权、增删改查、分页、条件检索、成绩录入一个系统该有的骨架它都有。我见过太多人卡在第一步IDEA 新建 JSP 项目后不知道 web.xml 放哪、Tomcat 起不来、SQL Server 连不上报「TCP/IP 连接失败」。这篇不聊虚的就按「环境搭起来 → 表建出来 → 功能跑起来 → 坑填平」的顺序走一遍。适合能看懂 Java 基础语法、但没完整做过一个 Web 项目的人熟手可以直接跳到第 4 章的避坑清单和最后一章的打包技巧。2. 环境与选型为什么这套组合今天还值得动手2.1 JSP SQL Server 的定位别拿它跟 Spring Boot 比先把预期摆正。JSP 是服务端页面技术浏览器请求到达 Tomcat 后容器把.jsp编译成 Servlet执行里面的 Java 代码再把生成的 HTML 吐回去。它的优势是「页面和逻辑写在一起」对课设这种规模十来个页面、四五张表来说开发速度快不需要理解前后端分离那一套。缺点也明显业务一复杂页面里全是% %脚本片段维护起来就是灾难。SQL Server 这边选它通常不是技术最优解而是「学校机房装了」「老师要求」「毕设答辩时老师熟悉」。它和 MySQL 的差别在语法细节上分页用OFFSET ... FETCH或ROW_NUMBER()字符串拼接用而不是CONCAT虽然新版本也支持自增列是IDENTITY(1,1)。这些差异在写 DAO 层的时候会一个个冒出来。提示如果你的环境允许自由选型MySQL 的社区资料更多、驱动更省心但如果题目已经锁死 SQL Server就按下面的步骤走别中途换。2.2 把 JDK、Tomcat、IDEA 三件套装对版本搭配是第一个玄学点。我的建议是JDK 8 或 JDK 11Tomcat 8.5 或 9.0IDEA 社区版够用。不要上 JDK 17 配 Tomcat 8javax.servlet和jakarta.servlet的包名变更会让你在 import 那一步就翻车。安装顺序装 JDK配好JAVA_HOME命令行java -version能出版本号。解压 Tomcat不要装到带中文或空格的路径双击bin/startup.bat浏览器访问http://localhost:8080看到猫页面即成功。IDEA 里File → Project Structure → SDKs添加 JDKRun → Edit Configurations里新增 Tomcat Server → Local指向解压目录。# 验证 JDK 与 Tomcat 是否就绪 java -version # 输出示例java version 1.8.0_381 # Windows 下启动 TomcatLinux 用 startup.sh cd D:\apache-tomcat-9.0.85\bin startup.bat # 检查 8080 是否被占用Windows netstat -ano | findstr :8080这几条命令的作用分别是确认 JDK 版本符合预期、启动容器、排查端口冲突。netstat那条如果输出里有LISTENING且 PID 不是你刚启动的 Tomcat说明 8080 被别的进程占了改 Tomcat 的conf/server.xml里Connector port8080为 8081 即可。2.3 SQL Server 安装与远程连接的最小配置SQL Server 安装本身不复杂坑在「装完之后连不上」。安装时选「基本」或「自定义」都行关键是实例配置那一步记住实例名默认MSSQLSERVER是默认实例命名实例类似SQLEXPRESS。装完后打开「SQL Server 配置管理器」做两件事配置项位置要改成TCP/IP 协议网络配置 → 实例协议启用IP 地址TCP/IP 属性 → IPAllTCP 端口填 1433身份验证模式实例属性 → 安全性SQL Server 和 Windows 混合模式sa 账户安全性 → 登录名启用设一个强密码改完必须重启 SQL Server 服务否则不生效。然后用 Navicat 或 SSMS 测试连接服务器地址填localhost,1433或127.0.0.1,1433注意是逗号不是冒号。-- 建库 CREATE DATABASE StudentMIS; GO USE StudentMIS; GO -- 学生表 CREATE TABLE student ( sid INT IDENTITY(1,1) PRIMARY KEY, sno VARCHAR(20) NOT NULL UNIQUE, -- 学号 sname NVARCHAR(50) NOT NULL, -- 姓名用 NVARCHAR 存中文 gender CHAR(2) DEFAULT 男, classname NVARCHAR(50), phone VARCHAR(20) ); -- 成绩表外键关联学生 CREATE TABLE score ( id INT IDENTITY(1,1) PRIMARY KEY, sno VARCHAR(20) NOT NULL, course NVARCHAR(50) NOT NULL, score DECIMAL(5,1), FOREIGN KEY (sno) REFERENCES student(sno) );建表时两个参数要留意中文姓名用NVARCHAR而不是VARCHAR否则插入中文可能变问号成绩用DECIMAL(5,1)而不是FLOAT避免出现89.99999这种浮点误差。外键约束建议加上课设答辩时老师常问「数据一致性怎么保证的」这就是答案。3. 从登录到成绩录入核心功能怎么落地3.1 JDBC 连接封装一个工具类省掉重复代码所有 DAO 都要拿连接、关连接写一个DBUtil是标准做法。注意 SQL Server 的驱动类名和 URL 格式跟 MySQL 不同。// DBUtil.java import java.sql.*; public class DBUtil { // SQL Server 驱动类注意不是 com.mysql.jdbc.Driver private static final String DRIVER com.microsoft.sqlserver.jdbc.SQLServerDriver; // databaseNameStudentMISencryptfalse 避免新版驱动强制加密导致握手失败 private static final String URL jdbc:sqlserver://localhost:1433;databaseNameStudentMIS;encryptfalse; private static final String USER sa; private static final String PWD YourStrongPwd123; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new RuntimeException(驱动未加载检查 mssql-jdbc jar 是否在 WEB-INF/lib 下, e); } } public static Connection getConn() throws SQLException { return DriverManager.getConnection(URL, USER, PWD); } public static void close(Connection c, Statement s, ResultSet r) { try { if (r ! null) r.close(); } catch (SQLException ignored) {} try { if (s ! null) s.close(); } catch (SQLException ignored) {} try { if (c ! null) c.close(); } catch (SQLException ignored) {} } }逻辑说明静态代码块在类加载时注册驱动只执行一次getConn()每次返回新连接课设规模不需要连接池。参数上encryptfalse是很多人连不上的元凶——SQL Server 新版 JDBC 驱动默认开启加密而本地实例往往没配证书握手直接失败。驱动 jar 用mssql-jdbc-9.x.jre8.jar这类版本放进WEB-INF/lib同时Project Structure → Libraries里也要加一份否则编译期就报找不到类。3.2 登录功能Model2 思想下的 Servlet JSP 分工热搜里有人问「按照 jsp model2 思想实现用户注册功能」Model2 就是 MVCServlet 当控制器JavaBean 当模型JSP 只负责展示。登录流程这样拆// LoginServlet.java WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); // 必须在取参数前设置 String username req.getParameter(username); String password req.getParameter(password); UserDao dao new UserDao(); User user dao.findByUsername(username); if (user ! null user.getPassword().equals(password)) { req.getSession().setAttribute(currentUser, user); resp.sendRedirect(req.getContextPath() /student/list); } else { req.setAttribute(msg, 用户名或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); } } }关键点有三个setCharacterEncoding(UTF-8)必须在第一次getParameter之前调用否则中文参数乱码登录成功用sendRedirect而不是forward避免刷新页面重复提交失败时把错误信息放 request 域再转发回登录页。密码这里直接明文比较是为了课设简洁真实项目必须加盐哈希答辩时如果被问到要能说清楚这个取舍。3.3 学生列表分页SQL Server 的 OFFSET FETCH 写法分页是课设必做项也是 SQL Server 和 MySQL 差异最大的地方。MySQL 用LIMITSQL Server 2012 以后用OFFSET ... ROWS FETCH NEXT ... ROWS ONLY而且必须配合ORDER BY。-- 第 2 页每页 10 条 SELECT sid, sno, sname, gender, classname, phone FROM student ORDER BY sid OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; -- 带条件的分页按姓名模糊查 SELECT sid, sno, sname, gender, classname, phone FROM student WHERE sname LIKE % ? % ORDER BY sid OFFSET ? ROWS FETCH NEXT ? ROWS ONLY;参数说明第一个?是姓名关键字第二个?是偏移量(pageNo-1)*pageSize第三个是每页条数。注意LIKE的拼接用而不是CONCAT这是 SQL Server 的语法。如果遇到「invalid object name string_split」这类报错说明你用了高版本才有的函数但数据库兼容级别不够改用LIKE或临时表拆分即可。3.4 成绩录入与事务一个容易被忽略的完整性点成绩录入往往涉及「先查学生是否存在再插成绩」两步之间可能出问题。用事务包起来public boolean addScore(String sno, String course, double score) { String checkSql SELECT COUNT(*) FROM student WHERE sno ?; String insertSql INSERT INTO score(sno, course, score) VALUES(?,?,?); Connection conn null; try { conn DBUtil.getConn(); conn.setAutoCommit(false); // 关闭自动提交开启事务 try (PreparedStatement ps1 conn.prepareStatement(checkSql)) { ps1.setString(1, sno); ResultSet rs ps1.executeQuery(); rs.next(); if (rs.getInt(1) 0) { conn.rollback(); return false; // 学生不存在回滚 } } try (PreparedStatement ps2 conn.prepareStatement(insertSql)) { ps2.setString(1, sno); ps2.setString(2, course); ps2.setDouble(3, score); ps2.executeUpdate(); } conn.commit(); return true; } catch (SQLException e) { try { if (conn ! null) conn.rollback(); } catch (SQLException ignored) {} e.printStackTrace(); return false; } finally { try { if (conn ! null) conn.setAutoCommit(true); conn.close(); } catch (SQLException ignored) {} } }逻辑说明setAutoCommit(false)之后所有操作在同一个事务里任何一步失败都rollback保证不会出现「成绩插进去了但学生根本不存在」的脏数据。参数上PreparedStatement的占位符从 1 开始编号别写成 0。finally 里恢复自动提交再关闭连接是防止连接池场景下状态污染的习惯写法。4. 避坑与排查那些让课设卡三天的真实问题4.1 现象启动 Tomcat 报 404页面找不到原因通常有三种项目没有部署成 war exploded、访问路径写错、web.xml里url-pattern和 Servlet 注解冲突。解决在 IDEA 的 Deployment 标签确认 Artifact 是xxx:war explodedApplication context 设成/或/mis访问时带上 context 路径比如http://localhost:8080/mis/login.jsp。如果 Servlet 用了WebServlet注解就不要再在web.xml里重复配置同一个类否则容器启动报错。4.2 现象SQL Server 报「用户 sa 登录失败」原因混合验证模式没开或者 sa 账户被禁用或者密码在安装后没设。解决配置管理器里确认实例属性是「混合模式」安全性 → 登录名 → sa → 右键属性取消「登录已禁用」重设密码然后重启 SQL Server 服务。很多人改完不重启以为没生效其实是服务没重载配置。4.3 现象插入中文变成问号原因数据库字段用了VARCHAR而非NVARCHAR或者 JDBC URL 没指定字符集或者 JSP 页面pageEncoding不是 UTF-8。解决字段类型改NVARCHARJSP 顶部写% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %Servlet 里req.setCharacterEncoding(UTF-8)放在取参数之前。三处都对了才不会乱码。4.4 现象还原数据库失败提示「备份集缺少后缀」原因备份时文件名没加.bak或者还原时选错了源。解决还原对话框里选「设备」→ 找到备份文件如果文件没有.bak后缀手动在文件名后补上再选另外确认「选项」页里「覆盖现有数据库」勾上否则同名库会拒绝还原。4.5 现象ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver原因驱动 jar 没放进WEB-INF/lib或者只加到了 IDEA 的 Libraries 但没随 war 打包。解决把mssql-jdbc-*.jar复制到web/WEB-INF/lib目录下然后在Project Structure → Artifacts里确认该 jar 出现在WEB-INF/lib的输出布局中。只加 Libraries 是编译期可见运行期 Tomcat 找不到。5. 打包成 war 与一个提速小技巧课设最后一步是交一个能跑的 war 包。IDEA 里Build → Build Artifacts → Build产物在out/artifacts/下。把 war 丢进 Tomcat 的webapps目录启动后 Tomcat 会自动解压部署。注意 war 包里必须包含WEB-INF/lib下的所有依赖 jar 和WEB-INF/classes下的编译产物缺一个就是 404 或 500。# 手动打 war在项目 web 目录的上一级执行 jar -cvf StudentMIS.war -C web . # 部署 cp StudentMIS.war $TOMCAT_HOME/webapps/ # 查看启动日志确认部署成功 tail -f $TOMCAT_HOME/logs/catalina.outjar -cvf的-C web .表示切换到 web 目录再把内容打进包这样 war 根目录就是WEB-INF和index.jsp不会多套一层文件夹。部署后看日志里有没有Deployment of web application archive ... has finished有就说明成功。一个提速技巧调试阶段别反复打 war直接在 IDEA 里跑 Tomcat改完 JSP 按CtrlF9重新编译刷新浏览器即可只有改 Java 代码才需要重启。这个习惯能省掉大量等待时间。最后说个我自己的教训当年做课设时我把数据库连接信息硬编码在DBUtil里答辩换台机器演示直接连不上当场翻车。后来养成习惯把 URL、用户名、密码抽到db.properties里用Properties类加载换环境只改一个文件。这个方案值不值得做如果你只是交个课设硬编码也能过但如果你想把它写进简历、面试时被追问「怎么管理配置」那这一步就是分水岭。希望帮到你。本文还有配套的精品资源点击获取