资讯动态

从0到1构建用户信息管理系统:Servlet+JSP实战指南

发布时间:2026/9/7 2:08:32 来源:尧图企业网站定制
简介基于Spring、Spring MVC与MyBatis框架实现用户信息管理系统是武汉理工大学计算机学院Web技术课程设计大作业的完整项目包面向高校Java Web课程设计、SSM框架整合练习及登录注册类系统开发者。系统涵盖用户注册、登录、注销、密码修改、个人资料维护以及学生信息管理中的列表展示、查询、编辑、删除并在屏幕宽度小于800px时自动隐藏左侧菜单同时支持主题风格切换交互界面完整。资源包共78个文件约1.81MB包含9个Java源码、6个HTML页面、7个JavaScript交互脚本、15个CSS样式、6个XML配置及SQL建库脚本30张PNG界面截图直观展示登录、注册、主界面、信息检索、编辑删除等功能页面目录层级按Maven工程组织便于定位和复用。附带的pom依赖、数据库脚本与README说明可辅助理解SSM三层架构、响应式布局、分页查询及基础增删改查写法已有3054人浏览学习适合直接部署体验、用于课程设计答辩演示或作为二次开发底座。 又到了学期末交课程设计大作业的时候不少学弟学妹在群里问用户信息管理系统到底怎么做。说实话这个题目看起来简单但你真动手写着写着就会发现它把Web开发里的注册、登录、数据校验、增删改查、分页、会话管理全串起来了几乎就是一个迷你版的企业后台系统。这篇内容我就按我当时做这门课设的思路来复盘一遍从需求拆解到技术选型从数据库设计到实际编码再把我踩过的几个坑原原本本讲出来希望对正在憋大作业的你有点用。1. 拿到题目后我先想的不是实现而是老师到底想看什么很多人一看到用户信息管理系统这六个字第一反应是打开IDE开始建项目、写登录页、做用户表。我建议你先冷静一下。课程设计大作业和平时的小实验不一样它不是让你跑通一个功能就完事而是要求你把一个完整的业务闭环做出来并且能讲清楚每一步为什么这么做。1.1 用户信息管理系统的真实能力边界用户信息管理系统这个命题表面上是一个普通的CRUD操作但它其实涵盖了以下几块核心能力用户注册与登录涉及表单校验、密码处理、会话保持用户信息的展示与检索涉及分页、条件查询用户信息的新增、编辑、删除涉及权限控制、数据一致性系统的基础防护涉及SQL注入、密码明文存储、非法访问拦截前端页面与后端接口的数据交互涉及请求转发、重定向、AJAX我当时把题目要求拆完之后发现它本质上就是一个简化版的后台管理平台。你的代码里体现了多少工程化思维决定了老师给你的是刚及格的分数还是优秀的分数。1.2 从三个层面倒推验收标准我去蹭了一节老师公开的答辩示范课才明白课程设计评分的重点通常落在三个层面第一功能完整度。有没有把用户管理这个闭环做完注册、登录、增删改查、退出、异常提示少任何一环都很容易被扣分。第二设计合理度。数据库表设计是否规范有没有考虑字段约束代码是否分层Servlet里是否堆了一大堆业务逻辑密码是否用明文存储。这些是拉开差距的地方。第三工程规范度。是否统一处理了编码问题是否有统一的响应结构是否做了基本的安全防护前端是否有基本的交互反馈。想明白了这三个层面后面做的一切技术选型和编码习惯都有了方向。我当时就用这个倒推法给自己列了一个验收清单每做完一项就划掉一项心理压力也会小很多。2. 技术栈定夺在ServletJSP和Spring Boot之间的取舍用户信息管理系统的技术栈选择是会直接影响你写代码效率的。我在做课设前特意把常用的三条路线都试了一遍各有利弊。2.1 三条主流路线到底差在哪第一条路线是纯Servlet JSP JDBC。这是最传统的Java Web方案没有框架所有请求都走Servlet页面由JSP动态渲染。它的好处是能让你把HTTP请求、响应、会话机制的底层逻辑看得明明白白课程设计答辩时老师问到底层机制你也能接得住。坏处是代码量偏大尤其处理表单校验和复杂页面时会显得有些繁琐。第二条路线是SSMSpring Spring MVC MyBatis组合。这是企业里非常经典的组合功能强大分层清晰但是配置项比较多。如果课设时间紧张光是把SSM的环境跑通就要耗费不少时间对小白有点不太友好。第三条路线是Spring Boot。Spring Boot的最大优势是约定优于配置你几乎不需要写一堆XML依赖管理也方便很多几秒钟就能启动一个Web项目。但它的问题在于封装程度太高很多同学做完课设都不清楚请求到底是怎么到Controller的一旦答辩时老师问到Spring MVC核心流程很容易卡壳。2.2 选择ServletJSP并补上连接池的完整理由我最后选了Servlet JSP JDBC但额外引入了Druid连接池和JSTL标签库理由有三个第一这是课程设计不是企业项目。老师更关心你是不是真的理解了Web的工作过程。用Servlet你能亲眼看清楚用户点击登录按钮后HTTP请求如何到达服务端、如何被解析、如何和数据库交互、如何再返回页面。这种体感是Spring Boot给不了的。第二排查问题更直接。用Spring Boot时一旦报错你会面对一长串堆栈信息只知道哪行代码崩了却不太清楚链路中间经历了什么。用Servlet请求的主要路径你心里完全有数报错时定位也快。第三方便展示我做了额外的努力。连接池、JSTL、统一Filter、BaseServlet反射调用这些优化属于课设中特别容易加分的亮点。用纯Servlet做底子这些优化点会非常显眼老师一看就知道你理解了性能和安全这两个关键词。如果你时间充裕或者将来想走Java后端方向可以先按我这个方案做一遍之后再看Spring Boot项目会发现很多东西都是相通的理解成本很低。3. 数据库设计用户表建得好后面少写两百行补丁代码用户信息管理系统最核心的就是用户表设计。很多人在这一步图省事建一张只有id、username、password的表就开始写代码结果后面一加需求就频繁改表结构、改代码。我建议一开始就把字段设计得相对完整一点。3.1 字段设计时的三个易漏点我当时设计的用户表包含了这些字段字段名类型约束说明idINT / BIGINT主键、自增用户唯一标识usernameVARCHAR(50)非空、唯一登录账号passwordVARCHAR(100)非空加密后的密码real_nameVARCHAR(50)可空真实姓名emailVARCHAR(100)可空、唯一邮箱phoneVARCHAR(20)可空手机号roleTINYINT默认值1角色区分1普通用户2管理员statusTINYINT默认值1账号状态1正常0禁用create_timeDATETIME非空注册时间update_timeDATETIME非空信息更新时间这里有三个特别容易漏掉的点第一username要加唯一约束。否则同一个用户名可以注册很多次后面做登录时会出大问题。第二不要忽略status字段。有了状态字段管理员可以一键禁用某个违规账号这在答辩时是一个很好的演示点。第三create_time和update_time一定要有。后面做分页展示时按时间倒序排列记录列表会更自然。3.2 密码加密与SQL注入防线密码存储是我认为课设里最值得写进结题报告的一大亮点。网页上传的密码绝对不能直接以明文存进数据库至少要有加盐的哈希处理。我当时用的思路是Java自带的MessageDigest做SHA-256加盐加密具体实现逻辑是这样的public static String encrypt(String password, String salt) { String str salt password; StringBuilder result new StringBuilder(); try { MessageDigest md MessageDigest.getInstance(SHA-256); byte[] bytes md.digest(str.getBytes(StandardCharsets.UTF_8)); for (byte b : bytes) { result.append(String.format(%02x, b)); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return result.toString(); }每次注册时我用System.currentTimeMillis()生成一个随机盐值存到用户表的一个salt字段里密码字段存加密后的哈希值。登录时取出该用户对应的盐值再对输入密码做同样的哈希比较结果是否一致。另外我所有SQL语句都用了PreparedStatement而不是Statement拼接字符串这是防SQL注入最简单也最有效的办法。用一句话说用户输入的每一个字符都应该被当成纯数据而不是SQL语句的一部分。这个观念在答辩时足够撑起好几个问题的回答。4. 核心功能落地的过程与关键代码数据库设计好之后就进入了最花时间的编码阶段。我按照公共层 - 基础功能 - 增删改查 - 查询增强的顺序推进这个顺序很重要能让你每写完一块都能立刻测试不至于最后一次性排错排到崩溃。4.1 统一编码Filter与登录拦截器项目刚建好时我遇到的第一个问题是中文乱码页面提交的中文到后端全变成了问号。后来我写了一个全局字符编码过滤器把所有请求和响应的编码统一为UTF-8。WebFilter(/*) public class EncodingFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(UTF-8); response.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8); chain.doFilter(request, response); } }这个Filter放在任何业务代码之前执行把编码问题一次性兜住了。登录拦截器的思路类似但作用是防非法访问。用户不登录就访问主页或管理接口时直接重定向到登录页。我通过检查Session里是否存在user对象来实现如果不存在就让请求跳到login页面。4.2 注册登录的完整链路注册功能的链路是用户填写表单 - 前端JavaScript做基础校验 - 提交到RegisterServlet - 查询用户名是否已存在 - 生成盐值并加密密码 - 封装成User对象 - 调用UserDao插入数据库。我在前端校验和后端校验都做了因为前端的校验只是优化体验后端才是真正保证安全的屏障。登录功能的链路是用户提交表单 - LoginServlet获取账号密码 - 根据username查库 - 取出盐值和加密密码做比对 - 比对成功则把用户基本信息放入Session - 跳转到列表页。同时我还做了失败次数的提示比如用户名或密码错误但不会明确告诉用户到底是用户名不存在还是密码错误这是安全感的细节。4.3 用户增删改查与分页搜索的实现顺序我做增删改查的顺序是查列表 - 增 - 删 - 改。列表页是与数据库交互最多的地方我先实现了简单的查询让所有用户数据都显示在表格里。接着做新增功能因为它不需要考虑原始数据影响。然后做删除这里我特意用了POST请求而不是GET请求因为GET请求的URL可能会被浏览器缓存或被人恶意构造链接删除操作必须有更强的防护。最后做编辑功能通过一个id参数把用户原有数据回显到表单修改后提交更新。分页和搜索我放在同一批实现。它们的核心点其实都集中在SQL层面SELECT id, username, real_name, email, phone, role, status, create_time FROM t_user WHERE username LIKE CONCAT(%, ?, %) ORDER BY create_time DESC LIMIT ?, ?;每次点击分页或搜索后端重新计算偏移量offset (page - 1) * pageSize并把前台传入的keyword拼进条件查询。页面上的分页条我用JSTLEL来实现数据用List封装后setAttribute到request域再转发给JSP渲染。5. 排错实录三个把我卡到深夜的问题每次写完课设最考验心态的不是功能不会写而是写着写着突然某个地方报错你却完全猜不到为什么。这三个问题是我印象中最深的它们都很典型。5.1 页面中文乱码一个Filter解决一半另一半在数据库连接我曾经以为只要加了EncodingFilter就万事大吉结果注册到数据库里的中文还是乱码。排查后发现问题出在JDBC连接串上。MySQL驱动在连接时如果没指定编码会用系统默认字符集和数据库表设定的utf8不一致自然就乱码了。修复方式是给JDBC URL加参数String url jdbc:mysql://localhost:3306/user_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai;加了characterEncodingutf8之后程序到数据库的整个编码链路才彻底走通。后来我还去MySQL里执行了SHOW VARIABLES LIKE char%;确认了客户端和服务端字符集一致。这个操作让我排查问题时多了一个很清晰的方向。5.2 404与资源路径相对路径害人不浅这件事发生在把登录页跳转逻辑从请求转发改成重定向之后。当时我项目结构是web/views/login.jsp页面里的css和js用的是相对路径。在地址栏显示localhost:8080/user/login时页面一切正常但重定向到localhost:8080/user/views/login.jsp后浏览器去加载资源时路径就乱了连续出现404。根因是浏览器解析相对路径是相对于当前URL的目录层级而不是相对于项目根目录。一旦URL层级变化相对路径就失效。修复方式很简单就是在JSP页面顶部统一引入动态绝对路径% String basePath request.getScheme() :// request.getServerName() : request.getServerPort() request.getContextPath() /; % base href%basePath%加了base标签之后页面里所有资源引用都基于项目根目录解析不会再因为路由层级变化而错乱。5.3 登录后刷新就失效Session与Cookie的配合问题我在做登录功能时遇到的最诡异问题登录成功后跳转到列表页一刷新就跳回登录页。后来才发现是我在设置Session时没注意配置了Cookie的时间范围。Tomcat的Session默认依赖一个名为JSESSIONID的Cookie这个Cookie默认只在当前浏览器进程内有效关闭浏览器就没了。但如果我在代码里手动设置了Cookie的MaxAge覆盖它并且把有效期设得太短就会导致Session后端的对象还在但客户端已经丢失了凭证。一般来理解Session数据存在服务端Session的标识通过Cookie传到浏览器。要让登录状态保持一段时间最省事的方式是不手动去动JSESSIONID直接利用Servlet默认机制。我最后只做了一件事在登录成功时调用session.setMaxInactiveInterval(30 * 60)让后端Session对象半小时内不失效同时确保没有乱改JSESSIONID的生命周期。之后刷新、跳转都正常了。那次排错让我明白一个道理看到刷新就失效这种问题第一反应不要怀疑后端Session对象丢了要先看浏览器开发者工具里的Cookie和网络请求头判断JSESSIONID是否在每次请求时都被带上了。6. 验收前一天我做的五件加分小事功能全部完成之后我本来打算直接提交。但群里一位已经做完课设的同学提醒了我一句课设的材料不是给机器看的是给老师看的。于是我又花一个下午检查了这些细节它们后来在演示时确实都派上了用场。第一我把管理员和普通用户的功能边界严格区分开。普通用户只能改自己的资料管理员才能进入用户列表做增删改查。这样答辩时可以重点讲角色控制的设计思路比单纯展示一个CRUD有深度得多。第二所有操作都加了明确的成功和失败提示。新增成功跳转列表并提示添加成功删除前弹确认框表单校验失败时错误信息具体到字段。这些体验细节虽然不直接影响功能但在老师快速过Demo时印象分会明显不一样。第三准备了一份简单的README。内容包括项目如何导入、数据库建表SQL、默认账号密码、功能列表。老师自己照着步骤一分钟就能把项目跑起来这减轻了他的负担他自然会给你好印象。第四把结题报告的结构按需求分析 - 总体设计 - 详细设计 - 核心代码 - 测试结果来写每个模块配上截图。尤其把Filter统一编码、加盐加密、PreparedStatement防注入这三处单独列出来用红框标注老师在翻材料时一眼就能看到技术亮点。第五也是我觉得最有用的我提前写好了几个答辩问题的草稿。比如为什么用Session不用Cookie存用户信息删除用户为什么要用POST请求分页SQL中的LIMIT怎么防参数越界。这些问题全是我在开发时思考过的点写下来的过程相当于把整个项目的设计逻辑又理了一遍。真正答辩那天老师问的方向基本没有超出这个范围。课程设计做到这个程度对我来说已经不仅仅是交作业了。它让我第一次完整地经历了一个Web项目从需求到设计再到落地和排错的全过程很多平时上课感觉抽象的概念比如请求转发和重定向的区别、Session与Cookie的关系、SQL注入的成因都在这个项目里变成了真实存在的直觉。如果你现在还在为这个题目头疼我的建议很简单先别急着写代码花一晚上把需求和技术路线理清楚后面每一步都会走得踏实很多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价