简介:这是一套基于JSP+Servlet+MySQL的学生信息管理系统Java Web项目源码,面向正在学习Java Web开发的学生或初级开发者,可用于课程设计、毕业设计或入门练手。压缩包共30个文件,约2.15MB,主要包含15个JSP页面、JDBC驱动JAR包、Java后端类、XML及Eclipse工程配置文件和CSS样式等,目录采用src/main分层结构,并带有项目配置信息,导入开发环境即可查看运行逻辑。系统实现了对学生信息的增、删、改、查等基础功能,覆盖了表单提交、数据库连接、结果集处理等典型Web开发环节,有助于理解JSP与MySQL配合开发的完整流程,也适合在此基础上扩展登录验证、分页查询等进阶功能。目前已有4342人学习下载,可作为课设参考或自学资料,代码结构简洁,便于对照博客中的说明进行逐步调试与复用。
1. javaWeb学生信息管理系统:一个能跑通的增删改查完整案例
做 JavaWeb 课设或者刚学完 JSP 的老哥,大概率都经历过这种尴尬:书上的例子太碎,网上找的“完整项目”一导入全是红叉,配环境配两小时还没见到登录页长什么样。手上这份学生信息管理系统(StudentManageSystem_Web)是典型的 JSP + Servlet + MySQL 三层结构,数据库用 MySQL,驱动给的是 5.1.48,功能就是学生信息的增删改查。别看它功能基础,胜在结构完整——从 Eclipse 工程文件到 .classpath 依赖配置、再到 lib 下的 JDBC 驱动全都有,导入 IDE 改一下数据库账号密码就能跑。
这套资源适合两类人:一是还在学校做课程设计、需要交一个能演示的 JavaWeb 项目的;二是想搞清楚 JSP 项目在 IDEA 或 Eclipse 里到底怎么部署、WEB-INF 下面那些配置各自干嘛的初学者。项目里没有框架,没有 Maven,就是最原始的 Servlet + JSP + JDBC,反而能让你把 JavaWeb 的请求流转和数据库交互看得很透。下面从环境到代码、再到部署和排错,一条线给你捋清楚。
2. 环境与导入:先把 JDK、Tomcat、IDEA 的关系理顺
2.1 技术栈和版本选择的底层逻辑
这个项目是 Eclipse 时代的标准 JavaWeb 工程,目录结构是.project+.classpath+src/main+WebContent那套。src/main是 Java 源码目录,WebContent是 Web 根目录,WEB-INF/lib下只放了一个mysql-connector-java-5.1.48-bin.jar。这里有两个关键信息:第一,JDBC 驱动是 5.1.48,对应 MySQL 5.x 系列,如果你本机装的是 MySQL 8.0+,连接串和驱动类名虽然不用换,但时区参数得处理好,否则会报Server returns invalid timezone;第二,项目没有用 Maven,意味着依赖全靠手动放到 lib 目录里,所以换 IDE 导入时,lib目录必须被标记为 Library,否则编译直接找不到 DriverManager。
JavaWeb 项目的运行环境本质上是三件套:JDK 负责编译,Tomcat 负责运行 Servlet 和 JSP,MySQL 负责存数据。JDK 版本建议用 8 或者 11,因为项目的代码是老的写法,JDK 8 最稳。Tomcat 用 8.5 或者 9.0 都行,前提是 JDK 版本匹配——Tomcat 9 配 JDK 8 没问题,但 Tomcat 10 就别碰了,它把javax.servlet全换成了jakarta.servlet,这个项目的import javax.servlet.*在 Tomcat 10 下直接编译不过。
2.2 在 IDEA 里导入 Eclipse 工程的具体操作
IDEA 导入 Eclipse 工程和导入 Maven 工程不一样,走的是File -> New -> Project from Existing Sources这条路,然后选 Eclipse 那项。导入之后第一件事是打开Project Structure(快捷键Ctrl+Alt+Shift+S),把三块配好:Project SDK 选你本机的 JDK 8;Language Level 选 8;Modules 里如果没显示源码目录,手动把src/main标记为 Sources,把WebContent标记为 Web 资源目录。
第二步是添加 Tomcat。正常做法是Run -> Edit Configurations -> 加号 -> Tomcat Server -> Local,然后在 Server 选项卡里把 Tomcat 安装路径指过去,Deployment 选项卡里把当前项目以war exploded的方式部署。这里有个坑:IDEA 的 Tomcat 配置界面如果 Application server 那里没有 Tomcat 选项,说明你没装 Tomcat 或者 IDEA 版本是社区版,社区版不带 Tomcat 集成,只能手动把 WAR 包丢进 Tomcat 的webapps目录。这一步你跑通之后才会明白,所谓“运行 JavaWeb 项目”,其实就是 Tomcat 加载了你的 Web 应用,然后把 HTTP 请求交给 Servlet 处理。
第三步是配置 MySQL。项目里大概率有一个db.properties或者直接在 DAO 里写死了连接串,你要把它改成自己本机的库名、用户名、密码。如果项目里没有建表 SQL,你自己连上 MySQL 执行一下——学生表核心字段就是学号、姓名、性别、年龄、班级、专业这几样。下面是一个标准的 JDBC 连接池写法:
// 以 db.properties 方式读取数据库配置 String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"; String user = "root"; String password = "yourpassword"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, user, password);参数说明:student是数据库名,useUnicode=true&characterEncoding=utf8解决中文乱码,serverTimezone=Asia/Shanghai是 MySQL 8.x 必加的参数,MySQL 5.x 不加也没事。Class.forName("com.mysql.jdbc.Driver")这行在 JDBC 4.0 之后可以省略,但老项目里都有,建议保留,兼容性最好。连接串里的时区参数在 MySQL 5.1.48 驱动下不需要,但在 MySQL 8.0 的服务器上必须加,这是最常见的一个环境问题。
3. 项目结构拆解:src、WebContent、.classpath 里到底藏了什么
3.1 从 Eclipse 工程文件反推项目全貌
.project文件是 Eclipse 的工程描述文件,里面记录了项目名称和构建器。.classpath文件才是关键,它定义了项目的 Java 构建路径——哪些目录是源码目录,哪些 jar 在 classpath 里。用 IDEA 导入时,IDEA 就是读这个文件来还原依赖的。如果你发现导入后很多类报红,大概率是.classpath里指向的 jar 路径和你本机不一致,比如它可能引用了 Tomcat 的servlet-api.jar,而你没在 IDEA 里关联 Tomcat 库。
典型的.classpath内容长这样:
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src/main"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtime.target"/> <classpathentry kind="lib" path="WebContent/WEB-INF/lib/mysql-connector-java-5.1.48-bin.jar"/> <classpathentry kind="output" path="build/classes"/> </classpath>这段 XML 里有几个关键标签:kind="src"告诉编译器源码在哪,kind="lib"告诉编译器依赖的 jar 在哪,kind="con"是 Eclipse 的容器类路径,这里引用了 Tomcat 运行时,所以在 Eclipse 里它不报错,但换到 IDEA 里,这种con类型的路径不会自动关联,必须手动加 Tomcat Library。输出目录是build/classes,如果你在运行后发现ClassNotFoundException但代码本身没毛病,检查一下编译输出目录对不对,IDEA 默认输出到target/classes,不一致就会出问题。
build目录里是编译后的字节码和资源文件,一般不会提交到压缩包里,但这份压缩包里有,说明作者连编译产物一起打了包。这个目录可以不用管,让 IDE 重新编译即可。
3.2 WEB-INF 目录和 JSP 页面的组织方式
这个项目的 Web 根目录下应该能看到index.jsp、login.jsp之类的页面,而WEB-INF里放着web.xml和lib目录,可能还有jsp子目录放内部页面。web.xml是部署描述符,老项目的 Servlet 映射、欢迎页面都在这里写。看web.xml是快速理解这个项目请求路由的方式——哪个 URL 对应哪个 Servlet,过滤器怎么配的,全都在这一个文件里。
WebContent |-- index.jsp // 入口页,通常带登录或跳转 |-- WEB-INF | |-- web.xml // Servlet 映射、欢迎页、过滤器 | |-- lib | | `-- mysql-connector-java-5.1.48-bin.jar | `-- jsp // 受保护的页面,直接访问 URL 进不去 `-- static // CSS、JS、图片(如果有)这里有一个 JavaWeb 的经典知识点:WEB-INF目录下的 JSP 文件不能通过浏览器直接输入 URL 访问,必须通过 Servlet 内部转发(RequestDispatcher.forward)来渲染。这样做的好处是页面受登录过滤器保护,坏处是新手如果直接把 JSP 丢进WEB-INF,发现访问不到就开始怀疑人生。所以你看项目里如果登录页叫login.jsp且放在WebContent根目录下,说明它能被直接访问;而WEB-INF/jsp下的页面,肯定有对应的 Servlet 在做转发。
3.3 DAO 层的 JDBC 操作套路
老项目没有 MyBatis,没有 Hibernate,DAO 层就是纯 JDBC。套路非常固定:加载驱动、获取连接、写 SQL、预编译、执行、遍历结果集、关闭资源。看几个典型的 DAO 方法你就能举一反三。比如查询所有学生信息的代码,写出来大概是这样:
public List<Student> findAll() { List<Student> list = new ArrayList<>(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); String sql = "SELECT id, student_no, name, gender, age, class_name FROM student"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { Student stu = new Student(); stu.setId(rs.getInt("id")); stu.setStudentNo(rs.getString("student_no")); stu.setName(rs.getString("name")); stu.setGender(rs.getString("gender")); stu.setAge(rs.getInt("age")); stu.setClassName(rs.getString("class_name")); list.add(stu); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } return list; }这段代码的逻辑很简单:PreparedStatement预编译 SQL 防止 SQL 注入,executeQuery()返回结果集,while(rs.next())逐行取数据封装成Student对象。注意finally里关闭资源的写法,顺序是先 ResultSet 再 PreparedStatement 最后 Connection,这套模板在老项目里是标配。改动的时候只需要换 SQL 语句和字段映射,其他骨架不用变。DBUtil这个工具类一般就是封装了getConnection()和close()两个静态方法,里面读配置文件拿到 URL、用户名和密码。
4. 部署运行:从 IDEA 到 Tomcat 浏览器的完整链路
4.1 配置 Tomcat 运行实例
IDEA 里跑 JavaWeb 项目,本质上是把项目打包成 WAR 或者直接以 exploded 目录方式发布到 Tomcat 的webapps下。注意war exploded和war的区别:前者是解压后的目录,IDEA 直接把编译输出和 Web 资源映射过去,修改 Java 代码后热部署快;后者是打成一个包,每次改动都要重新打包。平时开发用 exploded,交作业或者部署到服务器再用 war 包。我就是因为这个踩过坑——项目里写过很多次了,直接在 IDEA 里选war exploded就能跑。
配置步骤说一遍:Run -> Edit Configurations -> 左上角加号 -> Tomcat Server -> Local;Server 选项卡里 Name 随便填,Application server 下拉框点Configure...选 Tomcat 安装目录;Deployment 选项卡点加号选 Artifact,选StudentManageSystem_Web:war exploded;Application context 填/或者/student,这个决定了浏览器访问路径。配好后点运行,IDEA 会启动 Tomcat 并自动部署。如果启动后浏览器 404,先看日志,大多数是端口占用或者 Artifact 没选对。
还有一点值得注意:Tomcat 的server.xml里默认 8080 端口,如果你本机开了多个 Tomcat 实例,改端口要改三处:<Connector port="8080"的 HTTP 端口、<Server port="8005"的关闭端口、<Connector port="8009"的 AJP 端口。只改 8080 而不管其他两个,会有概率起冲突,因为 8005 和 8009 也会被别的实例占用。
4.2 数据库初始化与验证
项目跑起来之前,数据库必须建好,不然连上就开始报Unknown database。假设项目里没有自带 SQL 脚本,那你需要手动建库建表。我一般是这样处理的:打开 MySQL 命令行或者 Navicat,执行以下 SQL:
CREATE DATABASE IF NOT EXISTS student DEFAULT CHARSET utf8mb4; USE student; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT '学号', name VARCHAR(50) NOT NULL COMMENT '姓名', gender VARCHAR(4) COMMENT '性别', age INT COMMENT '年龄', class_name VARCHAR(50) COMMENT '班级', create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;说明一下:student_no加了唯一约束,这样重复学号插入的时候数据库会直接报错而不是出现脏数据;create_time字段是锦上添花,如果项目里没用到也不影响。字符集用utf8mb4,比老项目的utf8更保险,因为utf8mb4才完整支持中文和表情符号。如果你用的是 MySQL 5.5 或更早版本,utf8mb4可能不支持,那就退回utf8。
验证数据库没问题,把DBUtil里的用户名和密码改对,启动 Tomcat,浏览器访问http://localhost:8080/或者http://localhost:8080/student。看到页面能加载、增删改查能操作,就算完全跑通了。
4.3 排错:从 Tomcat 日志定位问题的通用流程
运行 JavaWeb 项目,最怕的是黑匣子——代码报错不知道去哪看。Tomcat 的日志在安装目录的logs文件夹下,catalina.out或localhost.log里能找到异常堆栈。IDEA 的 Console 窗口也会实时打印输出,报错信息一般长这样:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES),看到这种就知道是账号密码错了;Communications link failure说明数据库端口不通或者没启动;ClassNotFoundException: com.mysql.jdbc.Driver说明 jar 没加载进 lib。
给新手一个排错顺序:先看 Tomcat 能不能启动(日志里没有SEVERE级的异常);再看数据库连接串和账号密码;接着看表名和字段名是否和 DAO 里的 SQL 对得上;最后看 JSP 页面里的EL表达式的属性名和 JavaBean 的属性名是否完全一致。这套顺序按概率从大到小排除,绝大多数问题都能解决。
5. 避坑与常见问题:五个必踩的经典坑
5.1 页面中文乱码
现象:JSP 页面上的中文显示正常,但从数据库读出来全是问号,或者插入的中文变成???。
原因:三层编码不一致。数据库表字符集是latin1,JSP 页面没有声明页面编码,Servlet 响应没有设置text/html; charset=UTF-8。这三个环节只要有一处不对,中文就花。
解决:统一走 UTF-8。数据库表建表时明确DEFAULT CHARSET=utf8mb4;JSP 顶部加上<%@ page contentType="text/html;charset=UTF-8" language="java" %>;JDBC 连接串加useUnicode=true&characterEncoding=utf8;表单提交如果是 POST,在 Servlet 里调request.setCharacterEncoding("UTF-8")再取值。
5.2 Tomcat 端口被占用
现象:启动 Tomcat 时日志报Port 8080 required by Tomcat v9.0 Server at localhost is already in use,然后启动失败。
原因:之前的 Tomcat 实例没关,或者有其他程序占用了 8080 端口。
解决:cmd里执行netstat -ano | findstr 8080,拿到 PID 后在任务管理器结束进程,或者直接改 Tomcat 配置文件把端口换成 8081、8082。改完记得三个端口一起改,只改 HTTP 端口会导致 AJP 端口冲突。
5.3
Java 文件改动后不生效
现象:改了 Java 代码重新运行,浏览器里的功能还是老的,甚至页面还是报原来的错误。
原因:IDEA 的 Tomcat 集成默认是热部署,但某些情况下 Artifact 更新失败,或者编译输出目录不是 IDEA 默认值,改的代码根本没进到部署目录。
解决:Build -> Rebuild Project强制全量编译,然后在 Deployment 选项卡里把 Artifact 的 Output directory 和编译输出路径比对一下,确保一致。还有一个土办法:把 Tomcat 停掉重新 Run,重启后一定加载新代码。
5.4 导入 IDEA 后 Servlet 相关类全部报红
现象:import javax.servlet.http.HttpServlet这行下面画红线,提示包不存在。
原因:项目没有关联 Tomcat 的 Servlet API,.classpath里的con容器路径 IDEA 不认。
解决:File -> Project Structure -> Modules -> Dependencies -> 加号 -> Library -> Server -> 选 Apache Tomcat。这一步之后 Servlet 和 JSP 相关的类就能编译了,这也解释了为什么之前说 Tomcat 环境必须在运行配置里配好。如果 IDEA 的 Library 列表里没有 Tomcat,先去Settings -> Build Tools -> Application Servers里添加 Tomcat 安装目录。
5.5 MySQL 8.0 用 5.1.48 驱动时区报错
现象:运行程序时抛异常,堆栈里有java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized。
原因:MySQL 8.0 默认时区是SYSTEM,而 5.1.48 驱动解析不了这种时区表示。
解决:连接串加参数serverTimezone=Asia/Shanghai,或者执行 SQLSET GLOBAL time_zone = '+8:00'。注意 5.1.48 驱动连接 MySQL 8.0 虽然能工作,但建议有条件的话把驱动换到 8.0. 3x 版本,因为 5.x 驱动在 MySQL 8 的认证协议上可能会有兼容性问题——MySQL 8 默认的caching_sha2_password加密方式 5.x 驱动是不认的,报错表现为Unable to load authentication plugin 'caching_sha2_password'。遇到这个,要么把 MySQL 用户改回mysql_native_password,要么升级驱动。
6. 进阶用法:把这个增删改查项目改造成通用 DAO 的套路
拿到这个项目,除了用来看懂 JSP + Servlet 的请求流转,最有价值的进阶玩法就是把它从“单人单表”改成“通用基础版”。学生信息管理系统,本质上就是围绕student这张表的 CRUD。如果你理解了它的 DAO 写法,可以顺手把它抽象成一个通用 DAO,用泛型加反射处理任意一张表的基本操作。我在拿到这类项目时,第一件事就是把每个表的增删改查同时抽象出来,后面再写别的 JavaWeb 作业基本就是复制粘贴改表名。
具体思路是这样的:定义一个泛型接口BaseDao<T>,里面有findById(Integer id)、findAll()、insert(T obj)、update(T obj)、deleteById(Integer id)五个方法,然后用一个反射工具类把实体类的字段名和数据库列名对应起来。SQL 语句可以在运行时拼出来,字段列表从Class<T>的getDeclaredFields()获取。这样做的好处是,以后再要维护一张teacher表或者course表,只需要建一个实体类,继承或组合这个 BaseDao 就完事了。
在编码时,有几个小习惯我建议你保留:第一,PreparedStatement永远是首选,绝对不用Statement拼字符串,这个项目里也是这样写的,别学老代码里的坏习惯;第二,Connection要么手动close()要么用try-with-resources,别偷懒不关;第三,表字段命名一律下划线风格(student_no),Java 实体用驼峰(studentNo),映射的时候用AS别名或者写 ResultMap,别折腾 MySQL 把字段名改成驼峰。
我自己的习惯是,拿到任何 JavaWeb 项目包,不管代码多简单,都做三步:先把项目在本地完整跑通一遍,记录报错;再把web.xml从头到尾读一遍,弄清楚每个 Servlet 映射关系;最后把 DAO 层里所有 SQL 抽出来和数据库表结构比对。做完这三步,项目里几乎不会再有看不懂的地方。
所以最后这层意思很直接:这份资源对新手来说,完全够得着;对老手来说,也是一个很好的参考——老项目的每一行代码都服务于“能跑”,而不是“炫技”。把那几个坑避开、把部署链路走通,再顺手把它改造成连表查询或带分页的版本,这个资源就真正吃透了。希望帮到你。
本文还有配套的精品资源,点击获取