ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

JSP+Servlet医院预约挂号系统部署实战:从环境配置到二次开发

JSP+Servlet医院预约挂号系统部署实战:从环境配置到二次开发 简介一份基于JspServlet技术栈的医院预约挂号系统项目源码面向Java初学者及课程设计、毕业设计需求演示了经典JSPServletMySQL的开发流程与分层思路。压缩包共1451个文件以jsp页面、java类、servlet控制器和JavaScript脚本为主另含sql数据库脚本、jar依赖库、XML配置文件以及部署工具资源总大小31.95MB。系统前端提供首页展示、用户注册、医生查询和公告浏览等基础功能后端管理模块则涵盖医院信息、科室信息、医生信息、会员信息以及系统公告的维护功能结构清晰具备开箱即用的完整度。包内同步附有部署教程和软件工具说明针对Eclipse/IDEA、JDK1.8、MySQL5.7及Tomcat7/8/9给出搭配方式能有效降低环境配置门槛。目前已有134人学习下载适合需要快速搭建预约挂号演示项目、理解传统ServletJSP分层结构的开发者参考使用。1. 这套 JspServlet 医院预约挂号系统为什么值得你花半小时跑起来JspServlet 这套组合放到今天看确实有点老但在课程设计、毕业设计和中小型公司内部系统里它依然是出现频率最高的一套技术栈。这套医院预约挂号系统正是标准的 JSPServlet 三层结构前端覆盖首页展示、用户注册、医生查询、公告信息后端把医院、科室、医生、会员、公告五类信息的增删改查全部做全功能齐全拿下来改一改就能当课设或毕设交。适合有 Java 基础、想在最短时间内看到一套完整 Web 项目跑起来的人也适合想复用后台管理端代码的从业者。项目自带数据库脚本、部署说明和开发工具配置指引不用自己从头拼环境这也是我推荐你先从这套入手的原因。2. 环境选型JDK 1.8、MySQL 5.7、Tomcat 8 是这套代码的最优解2.1 为什么锁定这三个版本而不是追求新版很多第一次拿到 JSP 项目的人第一反应是装最新版 JDK 和 Tomcat结果编译不过去或者启动直接报 ClassNotFound。这不是代码的问题是版本组合的问题算是 JSP 老项目最常见的翻车现场之一。这套代码是基于 javax.servlet 包写的传统 Servlet没有用 Spring Boot 那套内嵌容器。Tomcat 8 对应 Servlet 3.1 规范对 JSP 2.3 的支持非常完整和 JDK 1.8 配合最稳。MySQL 5.7 这层向下兼容 5.5、5.6 的项目向上不兼容 MySQL 8 的驱动和 URL 参数所以项目说明里特别标注了 MySQL 5.7这个标注不是随便写的。我一般建议直接用 Tomcat 8 JDK 1.8 MySQL 5.7 这个组合IDE 用 Eclipse 或 IDEA 都行。Tomcat 7 也能跑但部分新特性不支持Tomcat 9 默认走 Servlet 4.0遇到老项目偶尔会在 EL 表达式和 JSTL 标签上踩坑。以下是我在实际部署中推荐的版本组合组件推荐版本原因JDK1.8Servlet 编译兼容性最好javax.servlet 包完整MySQL5.7驱动为 5.1.xURL 参数与 8.x 差异大Tomcat8.5对应 Servlet 3.1 规范稳定且资料多IDEEclipse / IDEA都能直接导入项目无特殊依赖2.2 数据库脚本导入一条命令搞定核心表结构项目里自带数据库脚本通常是 .sql 文件。导入之前先确认 MySQL 服务已经启动然后打开命令行执行mysql -u root -p hospital.sql mysql -u root -p -e show tables;第一行命令中-u指定用户名-p表示交互输入密码把 .sql 文件内容作为输入喂给 mysql 客户端hospital.sql是项目自带的建库建表脚本。第二行用来验证导入结果-e后面直接跟 SQL 语句show tables会列出当前库里的所有表看到医院信息表、科室表、医生表、会员表、公告表这五张核心表就算成功了。如果脚本文件不在当前目录用绝对路径mysql -u root -p /path/to/hospital.sqlWindows 下路径里是反斜杠注意对引号的转义。导入前还要确认建库语句里的字符集建议建库时直接用DEFAULT CHARACTER SET utf8mb4否则后面 JSP 页面显示中文极易乱码。这一步是很多人事后后悔的地方因为库已经建好、数据已经录入之后再回头改字符集非常痛苦。3. 看懂这个项目的骨架从表结构到 Servlet 路由3.1 数据库核心表五张表怎么关联不用急着进代码先把表结构看明白。这个系统的核心是科室、医生、会员这三张业务表加一张医院信息表做基础配置一张公告表做内容发布总共五张表彼此关联不复杂。科室表和医生表是典型的主从关系科室表的 id 被医生表的 department_id 引用。会员表存注册用户的基础信息公告表是后台发布的通知公告医院信息表更多是配置级的比如医院名称、地址、联系电话这类展示在前台页脚的数据。以科室表和医生表为例CREATE TABLE department ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 科室ID, name VARCHAR(50) NOT NULL COMMENT 科室名称, intro TEXT COMMENT 科室介绍, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ); CREATE TABLE doctor ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 医生ID, name VARCHAR(30) NOT NULL COMMENT 医生姓名, department_id INT NOT NULL COMMENT 所属科室ID, title VARCHAR(30) COMMENT 职称, good_at VARCHAR(255) COMMENT 擅长领域, FOREIGN KEY (department_id) REFERENCES department(id) );逻辑说明doctor 表的 department_id 外键指向 department 表的 id这是整个系统里最关键的一对关联。你要实现“按科室找医生”这个功能SQL 就是关联这两张表查询。注意建表语句里没有写库名所以导入之前一定要先执行USE hospital;否则表会建到默认库里。3.2 Servlet 路由web.xml 里的映射关系这个项目没有用任何 MVC 框架请求怎么走全靠 web.xml 里的 servlet-mapping。比如你访问/doctorListweb.xml 里配的是 DoctorServlet然后 Servlet 根据 action 参数决定调用哪个业务方法。这是 JSPServlet 项目最经典的写法搞清楚这一层整个项目代码就能看懂了。servlet servlet-nameDoctorServlet/servlet-name servlet-classcom.hospital.servlet.DoctorServlet/servlet-class /servlet servlet-mapping servlet-nameDoctorServlet/servlet-name url-pattern/doctorList/url-pattern /servlet-mapping参数说明servlet-name 是逻辑名称servlet-class 是 Servlet 类的全限定名url-pattern 是前端页面访问的路径。以后要加新功能先在这里加一条映射别自己在页面里乱写请求路径否则 Tomcat 启动时不会报错但请求一过去就是 404。Servlet 里常见的做法是根据 action 参数分发请求这样的写法在老项目里是标配protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (query.equals(action)) { // 跳转到医生查询逻辑 listDoctors(request, response); } else if (addDoctor.equals(action)) { // 跳转到新增医生逻辑 addDoctor(request, response); } else if (updateDoctor.equals(action)) { // 跳转到修改医生逻辑 updateDoctor(request, response); } request.getRequestDispatcher(/doctorList.jsp).forward(request, response); }这段代码里的 action 参数来自前端表单里的隐藏字段你看到 JSP 页面里有input typehidden nameaction valueaddDoctor这样的写法就是往这个分发逻辑走的。这种写法代码集中但也容易让一个 Servlet 越来越臃肿所以看完这个项目的结构后你会对“为什么要用 Spring MVC 做路由”有更具体的体感。3.3 前端页面调用链从首页展示到会员个人信息展示页前端的调用链路是这个项目的另一条主线。以用户注册为例用户在注册页面填写信息提交到 MemberServlet 的 register 分支Servlet 调用 DAO 层把数据写入 member 表成功后重定向到登录页或首页。首页的医生查询、公告列表也是同样的链路只是没有写操作。这里有一条血泪经验JSP 项目里页面跳转有两种方式转发forward和重定向redirect。用 forward 的话URL 不会变刷新页面会导致表单重复提交用 redirect 的话URL 变成新地址但 request 域里的属性会丢失。这个项目里登录成功一般用 redirect因为要清掉表单参数查询展示用 forward把数据带到 JSP 页面渲染这两者千万别搞反。会员个人信息展示页就是典型的 forward 场景。查询出会员对象后放进 request 域再转发到个人信息 JSP 页面Member member memberDao.selectById(id); request.setAttribute(member, member); request.getRequestDispatcher(/memberInfo.jsp).forward(request, response);参数说明selectById返回会员对象request.setAttribute把对象绑定到请求域JSP 页面再用${member.username}这类 EL 表达式取出来展示。你需要改个人信息页面的展示字段时就改 JSP 里的 EL 表达式不需要动 Servlet 代码。4. 把项目跑起来从导入到看到首页的完整流程4.1 Eclipse 导入与 Tomcat 配置以 Eclipse 为例File → Import → General → Existing Projects into Workspace选择项目目录注意勾选 Search for nested projects避免目录层级嵌套过深导致导入后是个空壳。导入之后先找到数据库配置文件一般是 db.properties 或 jdbc.properties改成你自己的 MySQL 账号密码jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/hospital?characterEncodingUTF-8 jdbc.usernameroot jdbc.password123456参数说明characterEncodingUTF-8必须保留否则中文乱码数据库名 hospital 要和第 2 章导入时保持一致用户名密码改成你自己 MySQL 的实际配置。这一步改完先保存确认文件放在 src 目录下能被编译到 classes 里。接着在 Eclipse 里配置 TomcatWindow → Preferences → Server → Runtime Environments → Add选择 Tomcat 8填 Tomcat 安装目录。然后在 Servers 视图右键 → New → Server选择已经配置好的 Tomcat 8。这个项目的 Servlet 路由本身就是一份可以当 servlet demo 抄的样例建议把 WEB-INF 下 web.xml 完整浏览一遍后续所有前后端联调都依赖这里。4.2 启动与功能验证路径启动 Tomcat 之后访问http://localhost:8080/hospital/用这条路径走一遍验证流程首页能看到公告信息和医院基本信息注册一个新会员用注册的账号登录按科室查询医生列表点进医生详情后台登录在地址栏输入对应的后台管理员路径看后台管理界面能否正常加载后台管理端就是医院信息管理、科室信息管理、医生信息管理、会员信息管理、系统公告信息管理五个模块每个模块都是标准的列表 新增 修改 删除。不需要每个按钮都点一遍验证两条链路足够一条是前台用户链路注册会员、查医生、看公告一条是后台管理员链路登录、修改公告、查看会员列表。两条链路都能走通这个项目在你的机器上就算完全跑起来了。4.3 首页一直打不开或 404 怎么办先看 Tomcat 启动日志有没有异常重点找Caused by那行。最常见的是数据库连不上报Communications link failure那就是第 4.1 里的 URL 写错了或 MySQL 服务没启动。另一个常见问题是项目没有真正部署到 Tomcat 的 webapps 目录Eclipse 里右键项目 → Run As → Run on Server 的时候要选择刚才配置好的 Tomcat 8不要选默认的 J2EE Preview 服务器那不是一个完整的 Servlet 容器。5. 部署避坑这五个问题让我白折腾了两天5.1 注册页中文全部变成问号现象页面输入中文提交后数据库里存的全是??前台的公告标题也是乱码。原因数据库连接 URL 没有指定characterEncodingUTF-8或者建库时字符集还是默认的 latin1。解决先改 jdbc.properties加上characterEncodingUTF-8然后重建数据库建库语句用CREATE DATABASE hospital DEFAULT CHARACTER SET utf8mb4;重新导入脚本。顺序不能反先改配置再重建库否则数据还是要乱。5.2 Servlet 编译报错找不到 javax.servlet 包现象Eclipse 里javax.servlet.http.HttpServlet下面直接画红叉项目无法编译。原因项目没有关联 Tomcat 运行环境或者本地 JDK 版本过高JDK 11 以上把一部分 Java EE 模块移除了。解决项目右键 → Properties → Java Build Path → Libraries → Add Library → Server Runtime → 选 Tomcat 8。这个操作做完基本能消掉编译错误。如果本地强行用 JDK 17还需要手动把 Tomcat 目录里 lib 下的 servlet-api.jar 加进来但我不建议这么弄直接装 JDK 1.8 最省事。5.3 Tomcat 启动报端口被占用现象启动时弹窗提示Port 8080 required by Tomcat 8 is already in use。原因系统上已经有进程占用 8080可能是另一个 Tomcat也可能是别的开发工具。解决Windows 下命令行执行netstat -ano | findstr :8080 taskkill /F /PID 对应PID第一行查到占用 8080 的进程 PID第二行强制结束它。如果你不想动那个进程也可以改 Tomcat 的server.xml把 HTTP 端口从 8080 改成 8081改完记得重启 Tomcat访问地址也要跟着改成http://localhost:8081/hospital/。5.4 数据库连接失败 Communications link failure现象启动日志出现com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure后端所有涉及数据库的请求全部报错。原因MySQL 没启动、IP 或端口写错、MySQL 8 驱动差异。MySQL 8 已经把驱动类从com.mysql.jdbc.Driver换成了com.mysql.cj.jdbc.DriverURL 还要额外加serverTimezoneAsia/Shanghai所以这套项目直接锁 MySQL 5.7 就是不想让你踩这个坑。解决先用services.msc确认 MySQL 服务在运行然后本机命令行执行mysql -u root -p能登录说明服务正常。接着看 db.properties 里的 URL 有没有把 localhost 写成别的地址。如果只有 MySQL 8必须换 cj 驱动类并加时区参数。5.5 改了代码刷新页面还是旧内容现象修改 JSP 或 Servlet 之后浏览器刷新还是看到旧页面甚至重启 Tomcat 都没用。原因Tomcat 没开自动热部署或者浏览器缓存了静态资源再或者 Tomcat 的 work 目录里有编译缓存。解决检查server.xml里的reloadabletrue开发阶段建议打开浏览器强制刷新Ctrl F5还不行就把 Tomcat 安装目录下 work 文件夹里的缓存文件清空再重启 Tomcat。work 目录的缓存偶尔会作妖这个问题排查顺序通常是浏览器缓存 → Tomcat 热部署开关 → work 目录。6. 二次开发给系统加上预约时段选择功能这个项目基础信息管理做得很完整但“预约”这件事本身比较轻——用户查完医生没有一个具体时段的概念前台链路在医生查询之后就断了。加一个预约时段选择功能正好让你把整条链路完整练一遍从表到 Servlet 到 JSP 全走一次这在答辩时也是很好的完整度加分项。第一步加字段。给预约记录相关表加一个time_slot字段类型用 VARCHAR(20)存上午、下午、晚间这种文本也可以存具体时间段。SQL 示例如下ALTER TABLE appointment ADD COLUMN time_slot VARCHAR(20) DEFAULT 上午 COMMENT 预约时段;表名以你导入的脚本里实际存在的预约表为准只是一条 ALTER 语句注意字段名不要和已有的列重名。第二步在 Servlet 新增一个分支。以 DoctorServlet 为例在 doPost 里加一段处理预约的逻辑读取前端传来的 doctorId、memberId、timeSlot 三个参数调 DAO 方法插入预约记录。在做插入之前至少要判断这三个参数不能为空这是最基础的非空校验也是能体现代码严谨的地方。第三步改前端表单。在医生列表或医生详情页里加一个下拉框选项是上午、下午、晚间nametimeSlot表单提交路径指向刚才的 Servlet 分支。提交之后让页面跳转到个人信息展示页用户能在个人信息展示页面看到自己的预约记录这个页面可以直接复用第 3 章说的 forward 模式来渲染。测试时用一个真实用户走完整流程注册会员 → 查医生 → 填时段提交 → 在个人信息展示页看到预约记录。走完这一圈这个系统的预约链路才算真正合上了。我以前接手这种老项目时总习惯拿到代码就动手改功能不先把运行环境理顺结果经常在“跑起来”这一步卡半天很憋屈。从那以后我每次拿到 JSP 源码都强制自己先看三样东西web.xml 里的 servlet-mapping、db.properties 里的连接 URL、建库脚本的字符集。这三样不出错项目基本能顺利跑起来剩下才是功能层面的事。这个顺序能帮你省下大量定位问题的时间希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表