ARTICLE DETAIL

资讯详情

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

Java学生档案管理系统:从数据流图到JSP+Servlet数据库实现

Java学生档案管理系统:从数据流图到JSP+Servlet数据库实现 简介这是一份Java学生档案管理系统毕业设计论文的docx文档面向高校计算机相关专业学生、需要完成毕业设计或课程设计的研究者系统完整解决了学生档案管理信息化中的需求分析、系统设计、数据库设计与实现等问题。全文基于结构化分析方法按背景意义、可行性分析、业务流程、数据流图、数据字典、功能模块划分等章节展开并采用B/S模式、JSP技术与SQL2000数据库完成前后台开发兼顾论文写作参考和系统设计思路梳理。此外文中包含摘要、关键词、目录及完整的章节结构对理解学生档案管理系统的模块划分和数据流转过程很有帮助。资源包共1个文件类型为docx大小2.85MB打开即可直接阅读与编辑。该文档目前已有187人学习适合正在撰写同类管理系统论文或期末课程设计的读者借鉴。1. 一份 Java 学生档案管理系统的论文拆解高校学生档案管理系统很容易被当成一个“班级管理 成绩 CRUD”的演示项目但它真正值得拆的地方是把结构化分析方法完整踩了一遍先画业务流程图再抽数据流图和顶层图最后汇成数据字典和 E-R 模型然后才落到 JSP 页面和 SQL Server 数据库。这篇 docx 论文资源的特点是“分析过程比代码重”很适合应付毕业设计文档也适合想补软件工程方法论的 Java 开发者。它覆盖的模块包括专业、班级、学籍、成绩、奖惩、密码修改和系统管理技术栈是 JSP Struts SQL Server 2000。如果你正在刷 Java 面试题或者准备写第一份系统设计文档从这里能学到一个关键习惯表结构不是拍脑袋定的而是从数据流图推出来的。2. 从业务流程到数据流图学生档案管理系统的需求分析怎么做2.1 需求清单先圈定系统边界再谈功能论文把需求拆到“添加、浏览、处理、设置”四类又把档案处理细化成成绩、奖惩、学籍三个并列入口。我的看法是在做毕业设计或原型系统时不要一上来就建表先把角色和边界定下来。这个系统里有两类外部实体系统管理员和普通用户可以理解为辅导员或院系教务。系统管理员负责设置模块授权、密码修改普通管理员处理日常业务。表 2-1 列出了明确的功能边界与使用者。建议把这张表作为需求章节的第一张图比文字描述直观得多。功能模块主要操作使用角色是否必须登录专业管理添加、修改、删除专业系统管理员是班级管理按班级批量查看学籍普通管理员是学籍管理添加/修改/删除学生学籍普通管理员是成绩管理按学号查成绩、录入分数普通管理员是奖惩管理按学号记录奖惩信息普通管理员是密码修改修改当前用户密码所有登录用户是系统管理退出系统、回收权限系统管理员是这里有个容易忽略的需求成绩和奖惩都依赖学号存在也就是依赖学籍信息。设计时要把“无学籍则不允许记成绩/奖惩”当作一条业务规则而不是数据库外键能自动解决的事。因为外键能拦住孤儿数据但拦不住“辅导员先录成绩、后补学籍”这种操作顺序颠倒。常见做法是在 Service 层加一个前置检查方法。public boolean validateStudentForBusiness(String xuehao, int bizType) { Student student studentDao.queryByXuehao(xuehao); if (student null) { return false; // 学籍不存在成绩与奖惩都不能写 } if (bizType SCORE 毕业.equals(student.getState())) { return false; // 已毕业或档案已调走不允许再录成绩 } return true; }这段代码本质是一条校验规则先查学籍再判断业务类型。参数bizType用来区分成绩和奖惩student.getState()对应学生学籍表中的“在校/毕业”状态字段。很多 Java 初学者把校验写死在 JSP 页面里正则校验在前端做一遍service 层继续查表会造成两处逻辑不一致。正确做法是 Service 层必须再查一次前端校验只是体验优化。2.2 数据流图把业务流抽成四层模型业务流程分析在论文里对应“业务流程图”但实际开发中我认为更值得花时间的是数据流图。它把“谁给谁什么数据、数据存到哪里”讲清楚后面写数据字典和表结构时就不会乱。顶层数据流图里只有一个处理过程“学生档案管理系统P0”外部实体是“管理员”数据流围绕专业信息、班级信息、学籍信息、成绩信息、奖惩信息五条主线流动。展开之后系统被拆成 P1 专业管理、P2 班级管理、P3 学籍管理、P4 成绩管理、P5 奖惩管理五个处理过程。这里不用复杂符号只要记住四个元素外部实体数据的来源或去向、处理过程数据的加工、数据流带方向的线条、数据存储表或文件。提示画数据流图时最容易犯的错是“把用户界面也画进去”。数据流图关心的是数据不是按钮。比如“登录页面”不应该出现在图中只有“管理员信息”和“登录成功后的会话”才是数据流的一部分。常用工具是 Visio 或 draw.io。我的习惯是先用文本把每一条数据流列出来再画图避免边画边想。下面是一个可以直接整理到论文里的数据流清单P3 学籍管理 - 输入流管理员添加学籍信息管理员修改学籍信息 - 输出流学籍信息写入 D3 - 依赖班级信息 D2新增学生时必须指定班级 P4 成绩管理 - 输入流管理员按学号查询成绩管理员录入分数 - 输出流成绩信息写入 D4 - 规则学号必须存在于 D3 学籍信息 P5 奖惩管理 - 输入流管理员按学号查询奖惩信息管理员登记奖惩措施 - 输出流奖惩信息写入 D5 - 规则学号必须存在于 D3 学籍信息2.3 数据字典把图上每条流写成一页纸数据流图画完数据字典的作用是把“图上看得见、但没人解释清楚”的元素逐一定义。论文中列了数据元素、数据结构、数据流、数据存储和外部实体五类条目实际上对应数据库设计中的字段、表和关系。我一般会把数据字典做成 Excel列包含“名称、数据类型、长度、所属数据结构、是否主键、是否允许空”。这个习惯在答辩时很加分因为评委能看到你对字段的理解而不只是粘贴代码。以下是一个专业信息表的字典片段。条目名说明数据类型长度所属数据结构Id专业编号主键自增int11专业信息表Name专业名称varchar255专业信息表Del删除标记varchar255专业信息表有人会问Del字段不是应该用 int 或 tinyint 吗为什么论文里是 varchar(255)这是旧代码里的一个典型设计用字符串存“是/否”或“0/1”可读性好但浪费空间。如果你要往现代实现迁移建议改成int或bit否则排序和统计都不方便。这也说明读论文资源时不能照抄建表语句要带着“字段类型选型”的视角去看。3. 从 E-R 图到 SQL Server 2000 表结构档案库表设计的关键点3.1 概念结构设计实体、属性和一对多关系系统描述 E-R 图包含专业、学生、成绩、奖惩、管理员五个实体。实体之间有三组核心关系专业 (1) ----- (N) 班级班级 (1) ----- (N) 学生学生 (1) ----- (N) 成绩学生 (1) ----- (N) 奖惩也就是说成绩和奖惩并不独立存在它们必须挂在一个有学籍的学生下面。这一点在概念结构设计时就要定下来因为它直接影响后续外键的位置。一个典型的错误是把“学生姓名”也放到成绩表里似乎查询方便但一旦学生改名成绩历史就错了。正确做法是成绩表只存学号显示姓名时再 join 学生表。3.2 逻辑结构设计核心建表脚本SQL Server 2000 虽然老但它定下的范式仍然适用于今天的 MySQL、PostgreSQL。下面是按论文表结构整理后的核心建表脚本考虑到 2000 版本的兼容性没有使用CREATE TABLE IF NOT EXISTS这类新语法。CREATE TABLE t_admin ( id INT IDENTITY(1,1) PRIMARY KEY, username VARCHAR(255) NOT NULL, userpw VARCHAR(255) NOT NULL ); CREATE TABLE t_major ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(255) NOT NULL, del VARCHAR(255) NOT NULL DEFAULT 否 ); CREATE TABLE t_class ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(255) NOT NULL, major_id INT NOT NULL, del VARCHAR(255) NOT NULL DEFAULT 否 ); CREATE TABLE t_student ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(255) NOT NULL, xuehao VARCHAR(255) NOT NULL UNIQUE, sex VARCHAR(255) NOT NULL, age VARCHAR(255), class_id INT NOT NULL, ruxue_time VARCHAR(255) NOT NULL, state VARCHAR(255) NOT NULL DEFAULT 在校, del VARCHAR(255) NOT NULL DEFAULT 否 ); CREATE TABLE t_course ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(255) NOT NULL, jieshao VARCHAR(255), del VARCHAR(255) NOT NULL DEFAULT 否 ); CREATE TABLE t_score ( id INT IDENTITY(1,1) PRIMARY KEY, xuehao VARCHAR(255) NOT NULL, course_id VARCHAR(255) NOT NULL, score VARCHAR(255) NOT NULL, xuenian INT NOT NULL ); CREATE TABLE t_award_punish ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(255) NOT NULL, xuehao VARCHAR(255) NOT NULL, shijian VARCHAR(255) NOT NULL, shuxing VARCHAR(255) NOT NULL, del INT NOT NULL DEFAULT 0 );为什么要保留VARCHAR(255)因为原始设计把所有业务字段都用 varchar 处理年龄、成绩、时间都不做类型约束。这种“全字符串”设计在课程设计中很常见写起来省心但埋了很多坑age无法做区间筛选score不能直接求平均分ruxue_time没法按学期排序。如果你做的是毕业设计我建议分数改成NUMERIC(5,2)入学时间改成DATETIME否则后面做统计报表时会很痛苦。3.3 外键关系与删除策略论文里面没有直接给出ALTER TABLE ... ADD CONSTRAINT只画了“各表之间的关系图”。实际项目里应该补充明确的外键约束。下面是推荐的约束写法ALTER TABLE t_class ADD CONSTRAINT fk_class_major FOREIGN KEY (major_id) REFERENCES t_major(id); ALTER TABLE t_student ADD CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id); ALTER TABLE t_score ADD CONSTRAINT fk_score_student FOREIGN KEY (xuehao) REFERENCES t_student(xuehao); ALTER TABLE t_award_punish ADD CONSTRAINT fk_award_student FOREIGN KEY (xuehao) REFERENCES t_student(xuehao);这里需要注意如果主表t_student的xuehao是唯一键外键可以引用它但更规范的做法是用学生表主键id作为外键字段而不是学号。学号是业务编号理论上可以调整主键是技术编号不应该出现在成绩表中。论文里用学号做关联是为了页面展示方便代价是更新学籍时会出现连锁更新。为了把关系看清楚可以用下面这张表总结从表外键字段引用主表说明t_classmajor_idt_major.id班级必须属于某个专业t_studentclass_idt_class.id学生必须属于某个班级t_scorexuehaot_student.xuehao成绩必须挂到在册学籍t_award_punishxuehaot_student.xuehao奖惩必须挂到在册学籍删除策略建议不用ON DELETE CASCADE。学生退学、档案调走后手工先删成绩表和奖惩表再删学籍每一步都打日志。数据库级级联删除虽然快但出了问题很难定位是谁删的。3.4 常见的设计误用Del 字段与班级建模一个常见问题是“专业信息表里的 Del 字段只存‘是/否’为什么不用 int”这和历史代码有关另一个更常见的误用是“当删除时可逆性需求”不明确时直接物理删除。对档案系统来说学生档案一旦删除就是不可逆操作最好用del字段做逻辑删除查询语句统一追加WHERE del 否。另一个常见问题是把“班级”设计成“专业 届别 班号”三个字段拼接而不是单独一张表。单独建表才能在班级维度组织“班级管理”模块也方便统计班级人数。如果你对 SQL Server 2000 不太熟部署时也可以把脚本移植到 SQL Server 2008 以上版本或 MySQL只需要修改IDENTITY为AUTO_INCREMENT即可。底层 SQL 的差异不大关键还是表之间的关系不能动。4. JSP Servlet 实现登录、权限与档案查询的落地过程4.1 页面模块与技术栈的取舍论文在第 4.3 节把 JSP 和 Struts 并列介绍但没有给具体代码。JSP 负责页面渲染Struts 负责请求分发。放在 Tomcat 时代这是常规组合换到现在可以用 Spring Boot Thymeleaf 替代。但看论文资源时最好把 JSP 部分当“视图模板”理解页面端不写业务逻辑只有标签、表单和 JavaBean 引用。从实现角度登录、密码修改、专业管理以及班级、学籍、成绩、奖惩的增删改查可以拆成一组 Servlet 控制器。先建立一个简单的请求映射关系后面写代码时就不会乱。请求路径对应的控制器主要作用/loginServletLoginServlet登录校验/logoutServletLogoutServlet退出系统/studentServletStudentServlet学生学籍增删改查/scoreServletScoreServlet成绩录入与查询/punishServletPunishServlet奖惩登记与查询4.2 登录校验代码session 与过滤器的配合登录是最容易被面试官追问的模块。这里给一个能放在毕设代码里的最简实现!-- login.jsp -- form actionloginServlet methodpost 用户名input typetext nameusername requiredrequired / 密 码input typepassword namepassword requiredrequired / input typesubmit value登录 / /form// LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); Admin admin adminDao.findByUsername(username); if (admin ! null admin.getPassword().equals(hash(password))) { HttpSession session request.getSession(); session.setAttribute(admin, admin); response.sendRedirect(index.jsp); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } }代码里必须注意三个点第一request.setCharacterEncoding(UTF-8)要放在读取参数之前否则中文用户名乱码。第二密码比对不能直接明文等于至少要加一层 MD5 或 SHA-256 哈希。第三登录成功用sendRedirect而不用forward因为 forward 会导致刷新页面时重复提交表单。登录之后还要通过过滤器保证未登录用户不能访问管理页面。常见做法是实现 javax.servlet.Filter拦截所有.jsp和 Servlet 路径// AuthFilter.java public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpSession session request.getSession(false); if (session ! null session.getAttribute(admin) ! null) { chain.doFilter(req, resp); } else { ((HttpServletResponse) resp).sendRedirect(login.jsp); } }getSession(false)是重点这里故意不创建新 session避免未登录用户被分配一个临时 session。这个细节在 Java 面试里常被追问也是判断一个后端开发者有没有安全意识的分水岭。4.3 查询模块多条件检索与分页学生档案管理系统的核心操作是“按条件检索”。在 JSP 页面里条件来自表单在后端 Servlet 里要把条件拼成动态 SQL。为了避免 SQL 注入不要直接用拼接字符串应该用PreparedStatement占位符。// StudentDao.java public ListStudent search(String xuehao, String name, String className) { StringBuilder sql new StringBuilder( SELECT s.*, c.name AS class_name FROM t_student s ); sql.append(LEFT JOIN t_class c ON s.class_id c.id WHERE 11 ); ListString params new ArrayList(); if (xuehao ! null !xuehao.isEmpty()) { sql.append(AND s.xuehao LIKE ? ); params.add(% xuehao %); } if (name ! null !name.isEmpty()) { sql.append(AND s.name LIKE ? ); params.add(% name %); } if (className ! null !className.isEmpty()) { sql.append(AND c.name LIKE ? ); params.add(% className %); } // 去掉已删除状态 del否 的判断 return jdbcTemplate.queryForList(sql.toString(), params.toArray()); }这里为什么用WHERE 11只是一个方便条件拼接的技巧不会影响索引现代 SQL 优化器会忽略它。每个条件都用LIKE ?占位参数通过params列表统一传递能防止注入。实际部署时班级名称查询要先转成班级 id因为t_student里存的是class_id不是班级名字。4.4 档案维护成绩、奖惩与学籍的一致性问题成绩、奖惩都依赖学籍存在所以新增成绩时最佳实践是先在t_student.xuehao上执行一次 SELECT。如果找不到记录直接向前端返回“请先维护学籍信息”。前面那段校验方法的骨架在这里会转换成实际代码。提交按钮对应的 Servlet 里先调用validateStudentForBusiness通过后再执行 insert。删除学生学籍时要像第 3 章说的那样先删成绩、奖惩再删学籍。如果把这一套动作写在 Java 方法里需要使用事务。JSP Servlet 时代最简单的做法是Connection conn null; try { conn DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); // 1. 删除成绩 // 2. 删除奖惩 // 3. 删除学籍 conn.commit(); } catch (Exception e) { if (conn ! null) { conn.rollback(); } throw e; } finally { if (conn ! null) { conn.close(); } }setAutoCommit(false)保证三步操作要么全部成功要么全部失败。常见错误是只删除学籍导致成绩表出现无法关联的孤儿数据。5. Tomcat 部署、SQL Server 2000 兼容与回归测试5.1 把 Java 环境变量配置和部署路径串起来拿到这份文档时项目多半是 Tomcat 5/6 时代的产物。部署前先确认 JDK 版本Java 8 可以兼容 JSP 2.x但如果用了老版 Struts要显式引入jstl.jar和standard.jar。Tomcat 的 webapps 目录下放置项目目录访问地址为http://localhost:8080/StudentArchives/。5.2 SQL Server 2000 驱动与连接串property namedriverClassName valuecom.microsoft.jdbc.sqlserver.SQLServerDriver/ property nameurl valuejdbc:microsoft:sqlserver://localhost:1433;DatabaseNameStudentDB/ property nameusername valuesa/ property namepassword value123456/这是老式 JDBC 驱动写法对应msbase.jar、mssqlserver.jar、msutil.jar三个 jar 文件。如果你换成 SQL Server 2005/2008/2019必须改用com.microsoft.sqlserver.jdbc.SQLServerDriver和jdbc:sqlserver://localhost:1433;databaseNameStudentDB。很多文档因为忽略这一点在连接数据库时直接抛出ClassNotFoundException。另一个高发坑是 SQL Server 2000 的 TCP/IP 默认没有启用需要在“服务器网络实用工具”里打开 1433 端口监听。5.3 回归测试用例表测试主要验证四个链路登录、专业管理、学籍新增、成绩查询。下面是一份可以直接填测试结果的表格。用例编号操作步骤预期结果是否通过TC01输入正确管理员账号密码跳转到主页面session 有 admin 信息是TC02输入错误密码 3 次提示“用户名或密码错误”是TC03未登录直接访问 index.jsp被过滤器拦截并跳转 login.jsp是TC04新增专业“软件工程”专业列表出现新记录是TC05新增无学籍学生的成绩返回“请先维护学籍信息”是TC06删除有成绩的学籍成绩表和奖惩表先被清理是5.4 一个能提升效率的验证技巧整篇 docx 论文没有提到测试脚本。你可以在项目根目录放一个health-check.sql用纯 SQL 验证约束和关联关系比手点页面快得多-- 找出没有对应学籍的成绩记录 SELECT * FROM t_score s WHERE NOT EXISTS (SELECT 1 FROM t_student t WHERE t.xuehao s.xuehao);这条 SQL 每次发版前跑一遍如果能查出 0 行说明成绩与学籍的一致性没有被破坏。再把同样的逻辑复制到奖惩表就能覆盖整个档案系统最核心的数据质量问题。这样才算真正把“设计文档”和“可运行系统”串起来了。本文还有配套的精品资源点击获取
返回列表