ARTICLE DETAIL

资讯详情

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

JavaWeb医院药品管理系统部署实战:从数据库初始化到IDEA运行避坑

JavaWeb医院药品管理系统部署实战:从数据库初始化到IDEA运行避坑 简介这是一套基于JavaWeb的医院药品管理系统源码包主要面向计算机相关专业正在做毕业设计的学生以及需要JavaWeb项目实战练习的初级学习者。系统使用Java开发语言以MySQL作为后台数据库围绕医院药品管理场景实现了基础信息维护与业务流程处理整体功能完整、调试通过适合作为课程设计、期末大作业或毕业设计的直接参考项目。压缩包共包含195个文件其中Java源文件53个、HTML页面21个、JavaScript脚本22个、CSS样式表6个另有MySQL数据库脚本、项目说明文档、Maven构建配置及相关静态资源文件压缩包大小为869KB结构清晰、导入便捷。目前已有653人学习下载项目经导师指导并获高分下载即可运行无需自行修改。通过这套资源可以系统了解JavaWeb前后端代码组织、数据库表设计、样式脚本引用与项目打包方式对提升毕业设计完成效率和JavaWeb开发能力都很有帮助。1. 这套javaweb医院药品管理系统到底值不值得你花几天去跑通凡是经历过 Java 课程设计或毕业设计的人电脑里多半都躺着几个类似名字的压缩包基于javaweb的医院药品管理系统源码数据库.zip。它的本质是一套 JavaWeb 项目完整案例用 Servlet JSP JDBC 把药品的增删改查、库存出入库、用户登录注册这类典型功能串成一个能部署到 Tomcat 的 web 工程旁边陪着一份 MySQL 数据库脚本。你下载它多半是想在短时间内拥有一个“能演示、能交差、能答辩”的成品。但我的经验是指望它解压就能跑十有八九要翻车——翻车不是坏事跑通的过程才是这个压缩包真正值钱的地方。这篇文章就站在一线排查的视角带你从解压开始一步一步把数据库初始化、IDEA 运行配置、常见的启动失败原因捋清楚让你从“能跑别人的项目”变成“能自己动手改项目”。2. 拆开 zip 看门道先通过目录结构和配置文件摸清项目骨架2.1 解压后的典型目录结构如何一眼认出项目类型一个从网上下载的 javaweb 药品管理系统解压后目录结构五花八门但万变不离三种Maven 工程、Eclipse Web 工程、传统 WebContent 工程。我一般会先打开根目录看里面有没有 pom.xml。有 pom.xml说明这是 Maven 管理的没有就去找 web.xml 或者 WEB-INF 目录。常见结构类似下边这样hospital-drug-manage/ ├── src/ # Java 源码 │ ├── com/hospital/action # Servlet 控制层 │ ├── com/hospital/dao # 数据访问层 │ └── com/hospital/entity # 实体类 ├── WebContent/ # Web 根目录Eclipse 时代常用 │ ├── WEB-INF/ │ │ ├── web.xml # Web 应用描述符 │ │ └── lib/ # 老项目的 jar 包都堆在这里 │ ├── css/ │ ├── js/ │ └── index.jsp ├── database/ │ └── drug_hospital.sql # 数据库初始化脚本 └── README.md这段目录排布对应了大多数 zip 压缩包的真实情况。判断逻辑很简单有 WebContent、有 lib 目录这是从 Eclipse 时代导出的普通 web 工程有 src/main/java 和 pom.xml则是 Maven 工程。两者导入 IDEA 的方式完全不同第二步如果选错后面全是坑。技术选型上这套项目一般会用 JDBC 直连 MySQL数据库连接池用的是 C3P0 或者 DBCP如果看到 applicationContext.xml那它可能用了 Spring 管理 Bean但控制层仍然是 Servlet。你打开 src 目录看一眼 dao 层是直接写 JDBC 还是用 MyBatis就能判断这套代码的“新旧程度”也基本能预测它跑起来后会踩哪些兼容性问题。还有一个小细节lib 目录里如果某个 jar 包大小只有几个 KB那很可能是下载站把文件截断了。正常的 mysql-connector-java.jar 至少是几百 KB 到 1 MB看到这种异常体积赶紧重新下载完整包别等 IDEA 报错再回头找原因。2.2 用 grep 快速读取配置文件数据库账号和端口先摸清解压后第一件事不是点开 IDEA而是把配置文件里的数据库连接信息抄到记事本。常见的配置文件是 jdbc.properties、db.properties、database.properties或者在 XML 里直接写。我喜欢用 grep 一把梭grep -r jdbc:mysql src/ WebContent/ database/ --include*.properties --include*.xml -n这条命令会递归搜索 Java 源码、WebContent 和 database 目录下所有 properties 和 xml 文件并打印出包含 jdbc:mysql 的行和行号。输出后你会看到 jdbc:mysql://localhost:3306/hospital_drug_db 这样的地址。这时需要注意几个细节数据库名、用户名、密码是否和本机一致连接地址里有没有 useUnicodetruecharacterEncodingutf-8driverClass 是 com.mysql.jdbc.Driver 还是 com.mysql.cj.jdbc.Driver。这两类驱动对应 MySQL 5.x 和 8.x用错了会在启动时报驱动类找不到。配置信息抄完还应该确认运行环境JDK 版本。老项目的 class 文件很可能用 JDK 1.7 编译你机器上如果是 JDK 11直接跑会报 UnsupportedClassVersionError。解决办法不是重装 JDK而是把项目的编译级别降下来后面第 4 章在 IDEA 里操作。总之这一步的目标是摸清三个版本号Web 容器版本、JDK 版本、MySQL 版本它们共同决定了你后面能不能顺利启动。2.3 先看数据库脚本的头部建库还是建表数据库脚本文件的处理方式直接影响你导入数据成败。有的脚本开头是 CREATE DATABASE有的直接 CREATE TABLE。我习惯先看前 20 行head -n 20 database/drug_hospital.sql如果看到 CREATE DATABASE IF NOT EXISTS hospital_drug_db; 后面跟着 USE hospital_drug_db;那导入时不需要手动建库如果脚本一上来就是 CREATE TABLE你就得先手动建库再指定库导入。这个区别很基础但每年都有不少人在这一步把数据灌错库导致登录时提示表不存在。另一个容易忽略的点是脚本里的字符集。老脚本通常写 DEFAULT CHARSETutf8在 MySQL 5.7 下没问题在 MySQL 8.0 下也能用但如果你打算存药名里的生僻字或特殊符号最好在导入前批量替换成 utf8mb4。替換也有讲究不是全局无脑换只替换表定义里的 CHARSET 部分替换完保存为 UTF-8 编码再导入。这一章的最后提醒一句不要因为“能跑就行”就跳过版本核对。我见过太多人把时间浪费在 IDEA 报错上回头才发现是配置文件里的密码写错了一个字母。配置文件就是这套项目的体温计摸完再做动作后面会顺利得多。3. 初始化药品数据库表结构、测试数据和 MySQL 版本差异3.1 MySQL 5.7 还是 8.0选错版本会让人怀疑人生在导入 sql 之前先决定用什么版本的 MySQL。如果照着 zip 里附带的数据库脚本看绝大多数老项目是为 MySQL 5.x 设计的但这不代表 8.0 不能用。核心差异在驱动和认证插件上MySQL 8.0 需要 driverClass 为 com.mysql.cj.jdbc.DriverJDBC 连接串要加 serverTimezoneAsia/Shanghai否则会报时区错误MySQL 5.7 则没有这么多讲究。我的建议是如果只是本地开发调试装 5.7 最省心和脚本匹配最好如果已经装了 8.0也可以在连接 URL 后面补参数硬跑但要把驱动换掉、把 sql 里的 utf8 改成 utf8mb4。这里给出一个命令行导入的完整示例mysql -u root -p --default-character-setutf8mb4 database/drug_hospital.sql参数说明-u root 指定用户名-p 表示随后输入密码--default-character-setutf8mb4 告诉客户端按 utf8mb4 编码解析脚本内容这个参数对中文数据很关键不加它很多从 Windows 记事本保存的脚本会把中文读出成问号。导入结束后用 mysql 客户端查一下表数量验证mysql -u root -p -e use hospital_drug_db; show tables;如果列出的表数量和脚本里一致说明导入成功如果少了表往往是脚本中间有一条 SQL 报错后 MySQL 默认继续往下执行导致的结果需要回到那行附近找语法问题。多花这两分钟后面能省两个小时。3.2 核心表设计药品表、库存表和操作用户表的关系一个医院药品管理系统数据模型并不复杂但表与表之间的外键关系值得花十分钟梳理。最常见的四张表t_admin 或 t_user 存登录账号t_drug 存药品信息t_stock 存库存变动流水t_prescription 或 t_purchase 存处方或采购单据。药品表的核心字段大致如下CREATE TABLE t_drug ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 药品ID, drug_code VARCHAR(32) NOT NULL COMMENT 药品编码/货号, drug_name VARCHAR(100) NOT NULL COMMENT 药品通用名, spec VARCHAR(50) DEFAULT NULL COMMENT 规格如0.25g*24粒, unit VARCHAR(20) DEFAULT 盒 COMMENT 单位, stock_num INT DEFAULT 0 COMMENT 当前库存数, stock_upper INT DEFAULT 1000 COMMENT 库存上限用于缺货预警, purchase_price DECIMAL(10,2) DEFAULT 0.00 COMMENT 进价, sale_price DECIMAL(10,2) DEFAULT 0.00 COMMENT 零售价 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT药品信息表;这段 SQL 的关键参数PRIMARY KEY 和 AUTO_INCREMENT 保证主键自增DECIMAL(10,2) 表示最多 10 位数字、2 位小数专门用来存价格别用 FLOAT否则价格会莫名多出 0.00000002 这种尾巴。有了药品表库存表通常不再存“当前数量”而是记录每一次入库、出库的变化量当前库存由 SUM 算出来这是项目里一个常见的设计区分。理解这种设计对你后续改代码很重要如果需求要显示“库存快照”直接查药品表的 stock_num 字段最方便如果要做库存流水审计则必须查库存流水表两条路径对不上时往往是程序里同时更新了两张表而没用事务提交这也是后面避坑章节会重点讲的问题。3.3 测试账号脚本里的演示数据为什么不能乱删数据库脚本末尾通常会塞几条演示数据最常见的账号是 admin密码 admin123或者 123456。别小看这几行数据它们是项目里默认的登录凭证删掉后再去启动程序就会陷入“登录页永远提示用户名不存在”。如果你希望自己设密码不要去 sql 里更新而是用页面上的注册功能走一遍让程序按它自己的校验流程生成新密码这样才不会破坏代码里的密码判断逻辑。还有很多脚本会在药品表里预置几十条药名比如“青霉素注射剂”“阿莫西林胶囊”这些数据是前端测试列表页、搜索框、分页组件好不好用的依托。我建议保留原始数据先让项目跑通、看到列表再做清库操作。自己造测试数据可能更麻烦很多老项目的日期字段要求特定格式页面表单校验不过你会卡在一个跟系统无关的数据格式问题上。另外导入脚本后注意看 MySQL 报错。MySQL 在执行多条语句时会跳过出错语句继续跑这时你表面上看到“导入完成”实际上后面好多表是空的。我刚入行时吃过这个亏当时查了半天的“为什么登录报空指针”后来发现是导入时报主键冲突。所以导入完毕后可以顺手执行一个简单的统计SELECT table_name, table_rows FROM information_schema.tables WHERE table_schemahospital_drug_db;把返回的行数和脚本末尾的 INSERT 数据数量做个对照心里就有底了。这一章做完你手里就有了一个真实可用的数据库接下来要解决的就是怎么把 web 工程和它连起来。4. 用 IDEA 跑通整套项目导入、Tomcat 配置和接口自测4.1 IDEA 导入老项目普通 web 工程和 Maven 工程的正确姿势先说结论不要直接用 IDEA 打开解压目录然后点运行按钮你会得到一堆红色标记因为 IDEA 还不认识这个项目。正确的做法是 File - New - Project from Existing Sources选中解压后的根目录。这时 IDEA 会让你选择导入方式有 Maven 就选 Maven没有就选 “Create project from existing sources”。对于普通 web 工程WebContent 目录结构导入后需要手动做三件事把 src 目录标记为 Sources Root把 WebContent 目录标记为 Web 资源目录把 WEB-INF/lib 下的 jar 包 Add as Library。这些操作的位置在 Project Structure快捷键 CtrlAltShiftS里注意别漏了 lib 目录漏了你会看到满屏的 ClassNotFoundException。对于 Maven 工程IDEA 会自动下载依赖这个过程需要保证本机能访问 Maven 中央仓库如果卡住检查 settings.xml 里的镜像地址。导入完成后编译级别也是老项目最容易出问题的地方。在 Project Structure 里把 Project SDK 设成 1.8把 Java Compiler 的 target bytecode version 也设成 1.8。老项目多数用 JDK 1.8 编写你电脑装的是 JDK 17 也能编译但 Tomcat 跑的时候要兼容所以在本地统一用 1.8 最稳。这一步没什么玄学纯粹是版本对齐对齐了就少一半报错。4.2 配置 Tomcat 和 Deployment把 war exploded 说清楚IDEA 里运行 javaweb 项目一般不是直接跑 Java 类而是配置一个 Tomcat Server。打开 Run/Debug Configurations点加号选 Tomcat Server - Local。如果列表里没有 Tomcat需要先到 Settings - Build Tools - Application Servers 里把 Tomcat 路径指过来IDEA 会自动识别版本号。配置页里主要动作在 Deployment 标签添加 Artifact选 war exploded展开目录而不是 war压缩包这样改代码后热部署更快。Application context 建议填 /不要填 /hospital_drug_war_exploded否则整个项目的访问路径会多一层前缀造成登录接口 404。然后还有个小坑端口默认 8080如果本机已经装了另一个 Tomcat 或者被别的服务占用IDEA 启动时会报 Address already in use可以顺手把 HTTP port 改成 8081同一个配置里就能改。配置完成后的关键检查项是下边这几行# tomcat 输出里出现这几行才算部署成功 Deployment of web application ... finished in X ms Connector [HTTP/1.1-8081] - Started如果你用命令行启动 Tomcat把打包好的 war 丢到 tomcat/webapps 目录再启动也行效果一样只是调试时没有 IDEA 控制台的堆栈格式舒服。我个人更喜欢 IDEA 跑因为控制台会直接打印 SQL 日志排错效率高很多。日志里的堆栈要完整看别只看第一行异常描述真正的原因往往藏在 Caused by 那一串里。4.3 启动之后先验证三个接口连接池、登录、增删改查项目启动不代表万事大吉至少要把三个最核心的请求跑通才算过。第一是访问首页让浏览器输入 http://localhost:8080/能看到登录页或后台界面说明静态资源服务正常第二是登录接口输入脚本里的测试账号能进入后台主页说明数据库连接池、用户校验、session 都通了第三是药品新增接口随便插入一条测试数据再刷新列表能看到它说明数据库增删改查链路是通的。这三个接口的验证可以用浏览器也可以用 curl 快速做两次确认。举个登录请求例子curl -X POST http://localhost:8080/loginServlet \ -d usernameadminpasswordadmin123 \ -i参数说明-X POST 指定请求方法-d 附上表单参数-i 打印响应头方便你看是不是 302 跳转。老项目登录成功后经常是 sendRedirect 到 main.jsp如果响应码不对就去 Tomcat 的 localhost.log 里搜异常。这一个请求能兜住大部分 debug 时间。登录通过后再看一眼控制台的日志。如果项目配置了 log4j可以把 SQL 日志打开能看到每次增删改查对应的 JDBC 语句。如果没配日志也可以在 dao 层临时打印但记得调试完删掉。这里我有一个习惯每次跑通一个接口就在笔记里写一行“路径 参数 预期结果”攒下来的几十行恰好就是答辩时能讲清楚的东西。5. 避坑手册这套系统启动失败的 5 个典型翻车现场5.1 端口被占用Tomcat 启动失败但 IDEA 不告诉你原因现象点击运行按钮控制台在 Tomcat 启动阶段卡住过一会儿提示 Application Server was not connected within 60 seconds或者 Address already in use: 8080。原因本机装了其他服务占用 8080最常见的是另一个 Tomcat 实例、Spring Boot 开发端口或者某些软件的 HTTP 服务。解决先找到占用进程Windows 用 netstat -ano | findstr 8080拿到 PID 后 taskkill /F /PID 试一下IDEA 里也可以直接把 Tomcat 的 HTTP port 改掉一了百了。注意修改端口后所有访问地址都要跟着改。这个问题和项目代码无关纯粹是环境冲突但最容易让人误判成项目坏了。5.2 驱动类和连接串不匹配报错指向 mysql-connector现象启动时抛 ClassNotFoundException: com.mysql.jdbc.Driver或者连接时报 SSL connection without certificate 之类的提示。原因老 zip 里 lib 下放的是 mysql-connector-java 5.x而本机数据库是 MySQL 8.0两类驱动对驱动类名、连接参数要求不一样。解决把 lib 下老 jar 删掉换成 mysql-connector-java 8.0.x 的 jar并在 jdbc.properties 里把 driverClass 改为 com.mysql.cj.jdbc.DriverURL 加 serverTimezoneAsia/Shanghai。这个坑每年复现率最高因为 MySQL 8 刚推那会儿大家还习惯写老驱动直到连不上才回头查版本。5.3 中文乱码从页面到数据库整条链路排查现象登录后显示的药品名全是问号或者页面本身中文变成乱码。原因数据库表是 latin1 字符集或 JSP 页面没声明 UTF-8或连接 URL 里没带 characterEncodingutf-8。三条里中一条就会出问题。解决三处统一。第一处把表改成 utf8mb4执行 ALTER TABLE t_drug CONVERT TO CHARACTER SET utf8mb4第二处检查每个 JSP 开头的 pageEncodingUTF-8第三处连接 URL 加 useUnicodetruecharacterEncodingUTF-8。改完重启 Tomcat不要只刷新页面。中文乱码的排查顺序一般是从浏览器看到最后一层往数据库方向走先看页面源码再看请求头再看数据库。5.4 启动后访问 404 或者 500部署路径和包名不匹配现象首页能打开但点登录按钮跳到 404或者点进去 500控制台报 NoClassDefFoundError 或空指针。原因404 大多是 servlet 映射路径没对上比如页面 form 提交到 /drug/add而 WebServlet 写的是 /drugAdd500 则是 dao 层类找不到或者数据库连接没拿到属于前面几步没装完。解决优先看 Tomcat 的 localhost 日志有完整堆栈。路径不对就改 JSP 里的 action别改 Java 代码目录因为改 Java 要重新部署。空指针则回到第 3 章检查数据库表是否真的导入了。老项目里 Servlet 映射经常和页面路径差一个斜杠或多一个后缀这类错误没有规律只能靠日志定位。5.5 数据库表导入一半失败MySQL 会跳过错继续跑现象show tables 出来的表数量对不上登录时总提示某些列不存在。原因导出的 SQL 脚本里某条 INSERT 语句带了特殊字符MySQL 在该条出错后默认跳过继续执行后续的表或数据就不完整。解决重导并用更严格的方式执行让它在第一条错误处停下来或者用 MySQL Workbench 的导入功能它会弹出具体的报错行。养成导入后立刻数表数量的习惯能帮你少走半天弯路。此外有一些脚本末尾会把外键约束写在最后中间出错会导致全部外键建不起来但这种错误往往不显眼查表数量时也看不出来所以在登录后做一次带关联查询的接口验证会更可靠。6. 从能跑到能交付给自己加几道验收关卡再拿去评审6.1 冷启动、完整业务流程和异常输入三个验收动作跑通之后别急着打包交差。我一般会用三个动作验收第一是彻底关掉 IDEA 和 MySQL再重新启动一遍确认不是靠运气跑起来的第二是走完一条完整业务流程从新建药品、入库、开处方、出库到查看库存每一步都刷新页面确认数据变化第三是故意输入错误密码、异常价格和空表单看项目会不会报错。老项目大概率会直接在页面上抛一大段异常堆栈这其实是你真正要修的地方。还有一个小技巧把数据库脚本重新执行一遍确认导入过程在干净环境里也能成功然后把这个步骤写进项目的 README。以后不管是换电脑还是给别人部署照着 README 做就不会慌。如果你还有余力可以顺手补两个小功能比如把密码存储从明文改成散列或者在药品库存低于上限时给一个醒目的提示条。这类改进在答辩时特别容易讲也最能说明你确实看懂了代码而不只是能启动。我自己每次跑完下载来的源码都会把数据库脚本和配置文件从头到尾按一遍确保换一台机器也能重演成功。这个习惯救过我很多次因为很多“能跑”其实建立在恰好缺了某个本地依赖或者端口没被占用之上。真正把项目变成自己的是亲手给它补上短板的那一刻。希望帮到你。本文还有配套的精品资源点击获取
返回列表