ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java+JSP+Mysql学生信息管理系统源码:环境搭建与增删改查实战

Java+JSP+Mysql学生信息管理系统源码:环境搭建与增删改查实战 简介这份资源是面向高校计算机相关专业学生的Java Web课程设计参考方案采用JSPServletMySQL技术栈实现学生信息管理系统适合正在准备期末大作业、课程设计或需要练手Java Web项目的学习者。压缩包共241个文件约9.17MB其中109个Java源文件承载后端业务逻辑56个JSP页面负责前端展示另有23个JS脚本、8个CSS样式及15个jar依赖包并附带SQL建库脚本与项目说明文档结构完整、层次清晰。资源已在本地编译验证可运行评审分达到98分难度适中内容经助教老师审定能够满足学习与作业提交需求。目前已有247人学习关注。读者可从中获得一套可直接部署运行的完整项目源码、数据库脚本与配置说明便于快速理解MVC分层设计、掌握JSP与数据库交互流程并在此基础上进行功能扩展与二次开发。1. 从一份能跑通的 JSP 学生信息管理系统源码说起课程设计周最怕的不是不会写代码而是环境搭到一半发现跑不起来。这份 JavaJSPMysql 实现的学生信息管理系统源码核心价值就在于「本地编译过、能直接跑」——它把 JSP 页面、Servlet 逻辑、MySQL 建表脚本和一份文档说明打包在一起省掉了从零搭架子再逐个调通的时间。技术栈是经典的 JSP Servlet JDBC MySQL前端用 layui 做表格和弹窗样式文件里能看到 layui.css、layer.css、laydate.css 这些说明增删改查的交互层是现成的。适合两类人一是期末大作业或课程设计需要交完整可运行项目的同学二是想拿一个真实 CRUD 项目练手 JSP 请求流转和 JDBC 封装的初学者。评审分 98 分这个信息说明功能覆盖和代码规范是过关的难度适中不会一上来就卡在某个冷门框架上。2. 环境搭建与数据库初始化把项目跑起来的第一步2.1 JDK、Tomcat、MySQL 的版本选择JSP 项目对版本比较敏感选错了会出现编译报错或者页面 404。常见做法是 JDK 8 Tomcat 8.5 MySQL 5.7 这套组合兼容性最稳。JDK 8 是因为很多老项目的 Servlet 版本还是 3.x用高版本 JDK 编译时javax.servlet包路径可能对不上。Tomcat 8.5 支持 Servlet 3.1和项目里的 web.xml 配置匹配度高。MySQL 5.7 的驱动包mysql-connector-java-5.1.x.jar在项目 lib 目录里通常已经带好换成 MySQL 8.0 的话驱动类名从com.mysql.jdbc.Driver变成com.mysql.cj.jdbc.Driver连接串还要加时区参数不改就报Unknown system variable query_cache_size这类错。安装 MySQL 时记得勾选「Add to PATH」不然后面命令行执行mysql -u root -p会提示找不到命令。安装完成后设置 root 密码这个密码要填到项目的数据库配置文件里。2.2 导入数据库脚本与修改连接配置项目里一般有一个.sql文件里面是建库建表和初始数据的语句。操作步骤# 登录 MySQL mysql -u root -p # 创建数据库如果脚本里没有 CREATE DATABASE 语句 CREATE DATABASE student_manage DEFAULT CHARACTER SET utf8mb4; # 切换到该数据库 USE student_manage; # 导入脚本在 MySQL 命令行外执行 mysql -u root -p student_manage student_manage.sql导入完成后用SHOW TABLES;确认表是否都建好了。常见的有学生表、班级表、用户表、成绩表这几张。接下来找到项目里的数据库配置文件通常在src目录下文件名可能是db.properties或c3p0-config.xml也可能是直接写在某个 JDBC 工具类里。需要改的是三处数据库名、用户名、密码。# db.properties 示例 jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_manage?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password你的密码characterEncodingutf8这个参数不能省否则中文姓名插入后会变成乱码。useUnicodetrue配合它一起用。如果用的是 MySQL 8.0 驱动URL 要改成jdbc:mysql://localhost:3306/student_manage?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseserverTimezone不写会报时区错误useSSLfalse是关掉 SSL 连接警告。2.3 部署到 Tomcat 并验证首页把项目导入 Eclipse 或 IDEA 后右键项目 → Run As → Run on Server选 Tomcat 8.5。如果控制台没有报错浏览器访问http://localhost:8080/项目名/应该能看到登录页。登录页的样式依赖 layui.css 和 iconfont如果页面出来是纯文字没有样式检查WebContent或webapp目录下的 css、js、fonts 文件夹是否完整有时候解压时路径层级会多一层。登录账号密码一般在数据库的 user 表里或者文档说明里会写。默认可能是 admin/123456 这类。登录进去后能看到学生列表页面说明 JDBC 连接和 Servlet 转发都通了。提示如果启动时报ClassNotFoundException: com.mysql.jdbc.Driver说明驱动 jar 包没有放到WEB-INF/lib目录下或者 Build Path 里没有添加。放到 lib 目录后记得在 Eclipse 里 Refresh 一下项目。3. 核心功能模块拆解学生增删改查的请求流转3.1 JSP 页面如何触发 Servlet这个项目的架构是典型的 JSP Servlet JDBC 三层。JSP 负责展示Servlet 负责接收请求和调度DAO 层负责数据库操作。以学生列表页为例页面加载时通过window.location或者表单提交跳转到 Servlet。!-- studentList.jsp 片段 -- a hrefStudentServlet?actionlist classlayui-btn layui-btn-sm查询全部/a !-- 删除操作 -- a hrefjavascript:; onclickdel(${stu.id}) classlayui-btn layui-btn-danger layui-btn-xs删除/a script function del(id) { if (confirm(确定删除该学生吗)) { location.href StudentServlet?actiondeleteid id; } } /script这里actionlist和actiondelete是 Servlet 里用来区分操作的参数。Servlet 的doGet或doPost方法里会读取request.getParameter(action)然后 switch 到对应的方法。这种写法在课程设计里很常见好处是一个 Servlet 能处理同一实体的所有操作不用建多个 Servlet 类。3.2 Servlet 中的参数接收与转发// StudentServlet.java 片段 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (list.equals(action)) { list(request, response); } else if (delete.equals(action)) { delete(request, response); } else if (add.equals(action)) { add(request, response); } else if (update.equals(action)) { update(request, response); } } private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ListStudent students studentDao.findAll(); request.setAttribute(students, students); request.getRequestDispatcher(studentList.jsp).forward(request, response); }request.setAttribute把数据存到请求域forward转发到 JSP 页面JSP 里用 EL 表达式${students}取出来遍历。注意这里用的是 forward 不是 redirectredirect 会导致 request 域里的数据丢失页面上取不到列表。3.3 DAO 层的 JDBC 封装与 SQL 参数// StudentDao.java 片段 public ListStudent findAll() { ListStudent list new ArrayList(); String sql SELECT * FROM student; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { Student stu new Student(); stu.setId(rs.getInt(id)); stu.setName(rs.getString(name)); stu.setGender(rs.getString(gender)); stu.setClassName(rs.getString(class_name)); list.add(stu); } } catch (SQLException e) { e.printStackTrace(); } return list; }用PreparedStatement而不是Statement拼接字符串是为了防止 SQL 注入。比如删除时DELETE FROM student WHERE id ?然后ps.setInt(1, id)这样即使 id 参数被篡改也不会执行额外 SQL。try-with-resources写法自动关闭连接比手动在 finally 里 close 更简洁也不容易漏关导致连接池耗尽。注意如果项目用的是 C3P0 或 Druid 连接池DBUtil.getConnection()内部是从池里取连接用完必须 close 归还否则池满之后新请求会一直等待直到超时。4. 避坑排查跑不起来时先看这几个地方4.1 页面 404路径和项目名对不上现象是浏览器访问http://localhost:8080/后显示 Tomcat 默认页但加项目名就 404。原因通常是 Eclipse 里配置的 Context root 和实际访问路径不一致或者 web.xml 里url-pattern写的是/StudentServlet但表单提交的 action 写成了StudentServlet少了斜杠。解决方法是右键项目 → Properties → Web Project Settings看 Context root 是什么访问时就用那个名字。另外检查WebContent/WEB-INF/web.xml里 Servlet 的映射路径确保和 JSP 里写的 action 一致。4.2 中文乱码三个位置都要设编码现象是登录后学生姓名显示成问号或方块。原因可能出在三个地方JSP 页面顶部没有% page contentTypetext/html;charsetUTF-8 languagejava %Servlet 里没有request.setCharacterEncoding(UTF-8)数据库连接串没有characterEncodingutf8。三个位置缺一个都可能乱码。解决方法是逐个检查JSP 页面编码、Servlet 请求编码、JDBC 连接编码三者统一成 UTF-8。如果是 POST 请求setCharacterEncoding要在读取任何参数之前调用GET 请求在 Tomcat 8 之后默认 URI 编码是 UTF-8一般不用额外处理。4.3 数据库连接失败驱动、URL、权限三查现象是启动后点登录没反应控制台报Communications link failure或Access denied for user。原因可能是 MySQL 服务没启动、URL 里的端口不是 3306、用户名密码填错、或者 root 用户没有远程访问权限。解决方法是先在命令行mysql -u root -p确认能登录然后SELECT user, host FROM mysql.user;看 root 对应的 host 是不是 localhost。如果项目连的是 127.0.0.1 但 MySQL 只允许 localhost也会被拒。另外检查 MySQL 服务是否在运行Windows 下services.msc里找 MySQL 服务Linux 下systemctl status mysql。4.4 修改代码后页面没变化缓存和重新部署现象是改了 JSP 或 Java 代码刷新浏览器还是旧页面。原因是 Tomcat 有工作目录缓存或者 Eclipse 没有自动重新编译。解决方法是右键 Tomcat → Clean然后右键项目 → Refresh再重新 Run on Server。如果改的是 Java 代码确认 Build Automatically 是开启的否则 class 文件不会重新生成。JSP 改动一般不需要重启但 Java 改动必须重启 Tomcat 才生效。4.5 分页查询结果不对SQL 的 limit 参数如果项目带分页功能现象是第二页数据和第一页重复或者最后一页多出空行。原因是LIMIT的偏移量算错了。常见公式是LIMIT (pageNum - 1) * pageSize, pageSizepageNum 从 1 开始。如果 pageNum 从 0 开始公式要改成pageNum * pageSize。另外总记录数要用SELECT COUNT(*)单独查不能拿当前页的 list.size() 当总数否则总页数永远是 1。5. 二次开发与功能扩展从能跑到好用5.1 增加导出 Excel 功能课程设计如果要求导出学生名单可以在现有 DAO 基础上加一个导出方法。常见做法是用 Apache POI 库在WEB-INF/lib下放入poi-3.x.jar和poi-ooxml-3.x.jar然后写一个 Servlet 方法// ExportServlet.java 片段 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(application/vnd.ms-excel); response.setHeader(Content-Disposition, attachment;filenamestudents.xls); ListStudent list studentDao.findAll(); HSSFWorkbook workbook new HSSFWorkbook(); HSSFSheet sheet workbook.createSheet(学生信息); HSSFRow header sheet.createRow(0); header.createCell(0).setCellValue(学号); header.createCell(1).setCellValue(姓名); header.createCell(2).setCellValue(性别); header.createCell(3).setCellValue(班级); int rowNum 1; for (Student stu : list) { HSSFRow row sheet.createRow(rowNum); row.createCell(0).setCellValue(stu.getId()); row.createCell(1).setCellValue(stu.getName()); row.createCell(2).setCellValue(stu.getGender()); row.createCell(3).setCellValue(stu.getClassName()); } workbook.write(response.getOutputStream()); workbook.close(); }Content-Disposition里的 filename 决定下载时的默认文件名中文文件名要做 URL 编码否则可能乱码。HSSFWorkbook对应 .xls 格式数据量大时用XSSFWorkbook写 .xlsx。写完直接输出到 response 的流里不要先存到服务器磁盘再读那样多一步 IO 还占空间。5.2 把 JDBC 换成连接池项目默认可能是每次请求都DriverManager.getConnection并发一高就崩。改成 Druid 连接池只需要三步引入druid-1.x.jar在 src 下建druid.properties改 DBUtil 的获取连接方式。# druid.properties driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/student_manage?useUnicodetruecharacterEncodingutf8 usernameroot password你的密码 initialSize5 maxActive20// DBUtil.java 改造后 private static DataSource dataSource; static { try { Properties props new Properties(); props.load(DBUtil.class.getClassLoader().getResourceAsStream(druid.properties)); dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); }initialSize是启动时创建的连接数maxActive是最大连接数超过这个数的请求会排队等待。maxWait可以设等待超时毫秒数不设的话默认一直等。改完之后记得把原来的Class.forName和DriverManager代码删掉否则两套逻辑混在一起容易出问题。5.3 用过滤器统一处理编码和登录校验每个 Servlet 都写一遍setCharacterEncoding很啰嗦而且容易漏。加一个 Filter 统一处理// EncodingFilter.java public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); chain.doFilter(req, resp); } }web.xml 里配置filter-mapping拦截/*。登录校验也可以放在这里判断 session 里有没有 user没有就跳回登录页。注意放行登录页和登录请求本身否则会死循环。5.4 验证改动是否生效的检查清单改完代码后按这个顺序验证先看控制台有没有编译错误和异常堆栈再访问首页确认能打开然后登录进去看列表数据是否正常接着做一次新增和删除确认数据库里数据变了最后看分页和搜索是否还正常。如果某一步失败回退到上一步确认是哪个改动引入的问题。我一般会在改之前把能跑的版本打个压缩包改崩了直接解压覆盖比一点点回退快得多。从那以后我每次拿到这类 JSP 项目都先把数据库脚本单独跑一遍确认表结构再改连接配置最后才动代码逻辑——顺序反了的话出了问题根本分不清是环境还是代码的锅。希望帮到你。本文还有配套的精品资源点击获取
返回列表