ARTICLE DETAIL

资讯详情

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

Java+JSP+MySQL电子健康档案系统:从环境搭建到Word导出全流程

Java+JSP+MySQL电子健康档案系统:从环境搭建到Word导出全流程 简介本资源为基于JavaJSPMySQL的电子健康档案系统毕业设计完整源码包面向计算机相关专业学生及需要Java Web实战案例的开发者可用于毕业设计选题、课程实践或医疗机构信息化参考。压缩包共760个文件约17.76MB以js脚本、gif与png图片、html页面、jar依赖包、css样式为主另含jsp页面、java源码、xml配置及properties文件等覆盖前端交互、后端逻辑与数据库配置各环节。项目围绕患者信息、病历记录、检查结果等数据表展开涉及MVC设计模式、Servlet请求处理、JavaBeans封装、JDBC数据库操作、用户认证与SQL注入防护、异常处理及性能调优等知识点源码结构清晰便于对照学习Java Web开发流程。目前已有131人学习下载适合作为毕业设计参考与实战练手素材。1. 从一份 .rar 说起JavaJSPMySQL 电子健康档案系统到底在做什么很多计算机毕业设计的选题里「电子健康档案系统」出现的频率高得离谱但真正动手时才发现它既不是简单的增删改查也不是把几张表拼在一起就能交差。这个标题背后其实是一套典型的 Java Web 三层架构JSP 负责页面渲染Servlet 或 Spring 承接业务逻辑MySQL 存健康档案、就诊记录、体检数据这些结构化信息。它解决的核心问题是——把纸质档案里散落的血压、血糖、过敏史、用药记录变成可检索、可追踪、可统计的电子数据。适合谁适合正在做基于 JSP 的毕设选题、想用传统 Java Web 技术栈跑通一个完整项目的人也适合刚学完 JSP 入门、想找一个真实场景练手的同学。你拿到的那份 .rar 里大概率是源码加数据库脚本但直接解压运行往往报错因为环境、编码、驱动版本这些坑一个都不会少。下面我按实际落地的顺序把这条路走一遍。2. 环境与数据库先把 MySQL 和 Tomcat 跑通再谈代码2.1 为什么传统 JSP 项目在 IDEA 里总翻车JSP 项目最让人头疼的不是业务逻辑而是环境。很多人用 IDEA 新建 JSP 项目结果发现没有 webapp 目录或者 Tomcat 启动后 404。原因在于 IDEA 的版本差异社区版没有内置的 Java EE 支持需要手动配置 Web 模块和 Artifact。常见做法是先用 Maven 建一个 war 类型的项目再手动补 webapp/WEB-INF/web.xml这样结构最稳。另一个高频问题是 JSP 页面中文乱码根源是 pageEncoding 和 contentType 不一致加上 Tomcat 的 URIEncoding 默认不是 UTF-8。我一般会在 server.xml 的 Connector 里加 URIEncodingUTF-8同时在每个 JSP 顶部写% page contentTypetext/html;charsetUTF-8 languagejava %这两步做完乱码基本消失。MySQL 这边安装配置教程网上一搜一大把但真正卡人的是连接时的 SSL 错误和时区问题。MySQL 8.x 默认要求 SSL 连接老驱动不认报错Error 2002或者Cant connect to local MySQL server through socket。解决办法是在 JDBC URL 里显式关掉 SSL 并指定时区jdbc:mysql://localhost:3306/health_record?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8allowPublicKeyRetrievaltrue参数说明useSSLfalse跳过 SSL 握手本地开发够用serverTimezone不设的话插入时间会差 8 小时allowPublicKeyRetrievaltrue是 MySQL 8 的 caching_sha2_password 插件需要的不加会报公钥检索失败。数据库连接池建议用 Druid 或 HikariCP别用 DriverManager 每次新建连接毕设答辩时老师一问连接池就露馅。2.2 建库建表电子健康档案的字段怎么定电子健康档案系统的表结构不用太复杂但几个核心实体必须清晰。我一般会建这几张表用户表区分管理员、医生、居民、健康档案主表、就诊记录表、体检指标表、用药记录表。健康档案主表里身份证号做唯一索引血型、过敏史、既往病史用 varchar 存血压血糖这类数值用 decimal别用 float否则统计时精度对不上。CREATE TABLE health_record ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, id_card VARCHAR(18) UNIQUE NOT NULL, blood_type VARCHAR(5), allergy_history TEXT, past_history TEXT, height DECIMAL(5,1), weight DECIMAL(5,1), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_user (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明id_card加唯一索引防止重复建档create_time和update_time用默认值自动维护省去手动赋值utf8mb4而不是 utf8因为 utf8 在 MySQL 里只存 3 字节遇到生僻字或 emoji 会丢数据。体检指标表建议做成纵表字段是 record_id、indicator_name、indicator_value、unit、measure_time这样以后加新指标不用改表结构扩展性好。建完表后用 Navicat 或者 MySQL Workbench 导入一份测试数据至少 20 条档案、50 条就诊记录不然页面分页和统计功能没法验证。3. JSP 页面与后端交互从个人信息展示到档案增删改查3.1 JSP 个人信息展示页面的最小实现热搜里有人搜「jsp个人信息展示页面」这其实是整个系统里最基础也最容易出问题的环节。JSP 的本质是 Servlet页面上的 Java 代码最终会被编译成 class 文件。我一般不在 JSP 里写业务逻辑只做展示数据由 Servlet 通过 request.setAttribute 传过来。下面是一个居民健康档案详情页的核心片段% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html headtitle健康档案详情/title/head body h2${record.userName} 的健康档案/h2 table border1 trtd身份证号/tdtd${record.idCard}/td/tr trtd血型/tdtd${record.bloodType}/td/tr trtd过敏史/tdtd${record.allergyHistory}/td/tr trtd身高/体重/tdtd${record.height}cm / ${record.weight}kg/td/tr /table c:if test${sessionScope.role doctor} a hrefeditRecord?id${record.id}编辑档案/a /c:if /body /html逻辑说明用 JSTL 的${}取值比% %脚本片段更干净也避免空指针直接抛到页面上。c:if做角色判断只有医生才显示编辑按钮这是最简权限控制。参数说明sessionScope.role在登录时写入 session居民角色看不到编辑入口。注意 JSTL 需要引入 jstl.jar 和 standard.jarMaven 里加对应依赖否则标签不解析页面直接原样输出。3.2 Servlet 接收表单与 MySQL 写入的完整链路JSP 展示的数据从哪来从 Servlet 查出来。以新增就诊记录为例前端表单 POST 到AddVisitServlet后端做三件事取参数、调 DAO、跳转。下面是一个精简的 Servlet 实现WebServlet(/addVisit) public class AddVisitServlet extends HttpServlet { private VisitDao visitDao new VisitDao(); protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); int recordId Integer.parseInt(req.getParameter(recordId)); String doctor req.getParameter(doctor); String diagnosis req.getParameter(diagnosis); String prescription req.getParameter(prescription); Visit visit new Visit(); visit.setRecordId(recordId); visit.setDoctor(doctor); visit.setDiagnosis(diagnosis); visit.setPrescription(prescription); visit.setVisitTime(new Date()); boolean ok visitDao.insert(visit); if (ok) { resp.sendRedirect(visitList?recordId recordId); } else { req.setAttribute(msg, 保存失败请检查数据库连接); req.getRequestDispatcher(error.jsp).forward(req, resp); } } }逻辑说明req.setCharacterEncoding(UTF-8)必须在取参数之前调用否则 POST 中文乱码。DAO 层用 PreparedStatement 防 SQL 注入别用 Statement 拼接。参数说明recordId是外键关联到健康档案主表visitTime用new Date()存当前时间如果数据库字段是 datetimeJDBC 会自动转换。跳转用 sendRedirect 而不是 forward避免刷新页面重复提交。这里有个血泪经验如果 MySQL 驱动版本和 Tomcat 的 lib 目录里的驱动冲突会报No suitable driver found解决办法是把驱动只放在 WEB-INF/lib 下别放 Tomcat 的 lib。3.3 传统 JSP 项目打包 war 与部署到 Tomcat毕设最后要交一个能跑的东西传统 JSP 项目打包 war 是标准做法。IDEA 里在 Project Structure 的 Artifacts 里加 Web Application: Archive输出目录选 out/artifacts然后 Build Artifacts 就能生成 war 包。把 war 丢进 Tomcat 的 webapps 目录启动 bin/startup.sh 或 startup.batTomcat 会自动解压。注意如果项目名和 war 包名不一致访问路径会变建议 war 包名就用项目名。另外Linux 安装 MySQL 后记得把数据库脚本导入别只拷源码不导数据否则登录都进不去。Nginx 支持 JSP 吗不支持Nginx 只能处理静态资源JSP 必须交给 Tomcat 或 Jetty 这类 Servlet 容器常见做法是 Nginx 反代 Tomcat静态资源 Nginx 直接返回动态请求转发给 Tomcat。4. 避坑与排查那些让毕设卡三天的真实问题4.1 中文乱码从请求到响应全链路排查现象表单提交后数据库里存的是问号或者页面显示乱码。原因JSP 的 pageEncoding、Servlet 的 request 编码、MySQL 的 character_set_server、JDBC URL 的 characterEncoding 四处只要有一处不是 UTF-8 就会乱。解决JSP 顶部统一写% page contentTypetext/html;charsetUTF-8 %Servlet 里req.setCharacterEncoding(UTF-8)和resp.setContentType(text/html;charsetUTF-8)都加上MySQL 建库时指定DEFAULT CHARSETutf8mb4JDBC URL 加characterEncodingutf8。改完重启 Tomcat清浏览器缓存再试。4.2 MySQL 8 连接报错与驱动版本不匹配现象启动项目报Communications link failure或Unknown system variable query_cache_size。原因前者通常是 MySQL 没启动或端口不对后者是驱动版本太老MySQL 8 移除了 query_cache_size 变量。解决确认 MySQL 服务在运行端口 3306 没被占用把 mysql-connector-java 换成 8.0.x 版本Maven 依赖里写清楚。如果报Public Key Retrieval is not allowed在 URL 里加allowPublicKeyRetrievaltrue。4.3 JSP 页面修改后不生效的缓存问题现象改了 JSP 代码刷新浏览器还是旧页面。原因Tomcat 的 work 目录缓存了编译后的 Servlet或者浏览器缓存了静态资源。解决删掉 Tomcat 的 work/Catalina 目录重启 Tomcat浏览器用 CtrlF5 强制刷新。如果用了 IDEA 的热部署确认 Artifact 里 JSP 文件被正确包含别只更新了 class 没更新 JSP。4.4 数据库连接池配置不当导致连接耗尽现象项目跑一会儿就报Too many connections或页面卡死。原因每次请求都新建 Connection 且没关闭或者连接池最大连接数设太小。解决用 Druid 或 HikariCP配置 maxActive 至少 20并在 finally 块里关闭 Connection、Statement、ResultSet。如果用了 try-with-resources确认资源确实被释放。检查 MySQL 的show processlist看有没有大量 Sleep 状态的连接。4.5 外键约束导致删除档案失败现象删除健康档案时提示Cannot delete or update a parent row。原因就诊记录表、体检指标表里有外键指向档案主表直接删主表记录会被拒绝。解决要么先删子表记录再删主表要么在建表时设置ON DELETE CASCADE让子表记录跟着主表一起删。毕设里建议用逻辑删除加一个is_deleted字段避免物理删除带来的数据一致性问题。5. 进阶技巧用 Java POI 导出健康档案 Word 报表答辩时如果只演示增删改查分数很难拔高。我一般会加一个导出功能把居民的健康档案和最近几次就诊记录生成一份 Word 文档用 Java POI 实现。热搜里有人问「java poi word能生成图表吗」答案是能但毕设里用表格就够图表反而增加复杂度。下面是一个最小可用的导出代码public void exportWord(HealthRecord record, ListVisit visits, OutputStream out) throws Exception { XWPFDocument doc new XWPFDocument(); XWPFParagraph title doc.createParagraph(); title.setAlignment(ParagraphAlignment.CENTER); XWPFRun run title.createRun(); run.setText(电子健康档案 - record.getUserName()); run.setBold(true); run.setFontSize(16); XWPFTable table doc.createTable(4, 2); table.getRow(0).getCell(0).setText(身份证号); table.getRow(0).getCell(1).setText(record.getIdCard()); table.getRow(1).getCell(0).setText(血型); table.getRow(1).getCell(1).setText(record.getBloodType()); table.getRow(2).getCell(0).setText(过敏史); table.getRow(2).getCell(1).setText(record.getAllergyHistory()); table.getRow(3).getCell(0).setText(身高/体重); table.getRow(3).getCell(1).setText(record.getHeight() cm / record.getWeight() kg); XWPFParagraph visitTitle doc.createParagraph(); visitTitle.createRun().setText(最近就诊记录); for (Visit v : visits) { XWPFParagraph p doc.createParagraph(); p.createRun().setText(v.getVisitTime() v.getDoctor() v.getDiagnosis()); } doc.write(out); doc.close(); }逻辑说明XWPFDocument 是 POI 操作 docx 的核心类createTable 建表格setText 填内容。参数说明out是 HttpServletResponse 的 OutputStream调用前设置response.setContentType(application/msword)和Content-Disposition让浏览器下载。注意 POI 的版本要和 JDK 匹配poi-ooxml 5.x 需要 JDK 8 以上。导出功能不用做太复杂能体现你会用第三方库、能把数据库数据转成文档就行。我自己的习惯是每次做完一个模块先手动跑一遍完整流程从登录到建档到导出确认没有断点再写下一个模块。毕设最怕的不是功能少而是功能多但每个都跑不通。希望帮到你。本文还有配套的精品资源点击获取
返回列表