
简介一个基于JavaWeb的药品存销信息管理系统完整源码与数据库项目主要面向软件工程课程大作业、JavaWeb开发学习者以及需要快速搭建管理系统的开发者。项目围绕药品入库、库存查询、销售出库、供应商管理等核心业务采用Servlet、JSP、JDBC等主流技术构建提供从持久层到控制层到视图层的完整实现适合用于课程设计、毕业设计或二次开发。压缩包共六百二十三个文件整体大小约四十六点六七兆包含一百零八个Java源文件、二百零二个编译类文件、六十九个依赖包、三十六个JSP页面以及XML配置、JS脚本、CSS样式、SQL数据库脚本和Excel表格等。各类型文件分工清晰Java文件负责业务逻辑JSP负责页面展示XML和properties保存项目配置SQL提供建库建表与初始数据依赖包则封装第三方库整体结构便于直接导入IDE运行与调试。资源已有九十九人学习下载虽学习人数不算多但内容相对完整。通过阅读源码和数据库脚本可以掌握药企进销存流程、表单数据交互、数据库连接池使用以及权限拦截等关键环节同时项目中的目录结构和代码注释也能为类似管理系统的自主开发提供可借鉴的模板。1. 药品存销信息管理系统一套能直接交差的 JavaWeb 大作业如果你正在为软件工程课程设计找一套能跑得起来、讲得清楚、答辩不虚的 JavaWeb 项目这套基于 Servlet JSP MySQL 的药品存销信息管理系统值得你花一个下午把它拆开看一遍。它不是那种只有一个登录页的玩具 demo而是把药品入库、出库、销售、供应商和库存预警串成了一个完整业务闭环源代码和数据库脚本一起打包导入 IDEA、配好 Tomcat 就能启动。我当初拿到这套资源时最直观的感受是数据库表设计是认真建过的不是随便堆几个字段糊弄事JSP 页面和 Servlet 的请求流转也符合经典三层架构拿来交大作业或者做毕业设计底层框架都够用。下面我从表结构、技术栈、运行配置到踩坑记录完整过一遍。2. 拆开看系统功能与数据库设计先搞清楚它管了哪些事2.1 药品存销的业务闭环入库、出库、销售和供应商整套系统不是一个孤立的 CRUD。药品流通场景里最核心的矛盾是「库存账」和「销售单」之间的一致性。这套系统的功能模块基本围绕这条链路展开药品基础信息维护、入库单登记、出库单登记、销售开单、库存查询以及供应商档案管理。我拿到源码后先扫了一遍目录结构发现它的业务分层很清楚。控制层用 Servlet 接收请求业务逻辑放在 service 包数据访问放在 dao 包JSP 只负责页面渲染。这种划分不是大作业里常见的「所有代码堆在一个 Servlet 里」而是按标准 JavaWeb 三层架构组织的。对于软件工程课程设计来说这点很关键——老师在验收时问你「分层设计体现在哪里」你可以直接指着目录结构回答。具体到业务功能药品信息管理负责药品名称、规格、生产厂家、批准文号、有效期等基础档案的增删改查入库管理记录采购入库的批次、数量和进价出库管理对应销售出库或科室领用销售管理则生成销售单并扣减库存。整个流程走下来库存数量是动态计算的不是手动改的。这套系统最值得看的不是页面多华丽而是它对「药品有效期」这种行业特有字段的处理。普通库存管理系统最多管数量和金额但药品是有有效期的过期药不能出库。这套系统在药品表里设计了有效期字段出库时能按批次校验这一点在答辩时是很好的加分项。2.2 数据库表结构解读核心表与字段设计逻辑整套系统的数据库脚本是随源码一起打包的导入 MySQL 后能看到完整的建表语句和初始数据。我建议你不要直接双击导入就完事而是逐张表看一遍因为答辩时老师大概率会问「为什么这么设计」。药品主表是最核心的字段基本覆盖了药品档案的必备信息药品编码、通用名、商品名、规格、剂型、生产厂家、批准文号、有效期至、库存数量、进价、售价。其中药品编码建议设成唯一索引这是业务主键后续所有入库单、销售单都通过它关联。入库表和出库表是两张独立的流水表没有合并成一张「库存变动表」这个设计有讲究。药品入库和出库的业务含义不同入库存的是采购价出库存的是销售价字段语义不一样拆开反而更清晰。如果你后续要做财务对账这两张表分开统计也更方便。再看用户表它是管理员登录的凭证来源用户名加密码就能跑通认证逻辑。密码在数据库里存的是明文还是密文得看脚本里的实际写法——如果只是大作业演示存明文也能用但我建议你拿到手后自己改成 MD5 加盐这属于安全加分项。供应商表保存供货商名称、联系人、电话等信息它的存在让整个系统不再是单表操作而是有了多表关联的查询场景。比如查询某个药品的库存时可以连带定位到最近的入库批次和对应供应商。整套数据库一共十几张表左右作为课设规模是合理的——表太少显得业务单薄表太多又超出维护能力。2.3 初始化数据与测试账号拿起来就能演示数据库脚本里通常不只是建表语句还带了初始化数据。测试账号一般会在 SQL 文件里直接 INSERT 进去管理员账号的密码也写在里面。我拿到这套资源后的第一件事就是先在 Navicat 里执行脚本然后翻用户表看里面预置了哪些账号。这里有个实际操作建议你在本地执行建库脚本前先手动创建一个数据库实例字符集选 utf8mb4排序规则选 utf8mb4_general_ci再执行脚本。如果直接用脚本里的 CREATE DATABASE 语句有可能因为本地 MySQL 的默认配置和脚本里的设置不一致导致中文乱码或建表失败。预置的演示数据也值得花五分钟翻一遍。药品表里如果已经插入了十几条药品记录你登录后就能直接看到列表效果不用自己手动一条条录。对于答辩演示来说有数据的系统比空系统说服力强得多。如果预置数据不够我一般会再手动补几条边界数据——比如一条库存为 0 的药品、一条有效期很近的药品方便演示库存不足和效期预警的逻辑。3. Servlet JSP MySQL 的技术选型为什么这套组合依然能打3.1 选型理由课设场景下 Servlet JSP 比 Spring Boot 更合适你可能会问现在企业里 JavaWeb 开发早就是 Spring Boot 的天下了为什么课设还要用 Servlet JSP这个问题我在做项目时也纠结过但实际跑下来发现课设场景下 Servlet JSP 反而有它的优势。第一是答辩逻辑好讲。Servlet 的生命周期、请求转发、重定向JSP 的内置对象这些都是软件工程课程里明确教过的知识点。你拿着 Spring Boot 去答辩老师一问「自动配置原理是什么」就很容易露怯但 Servlet JSP 是你能一行行代码讲明白的东西。第二是依赖简单。整套项目只需要 Tomcat 一个运行时容器不涉及 Maven 依赖冲突、Spring 版本兼容这些破事。我那次在 IDEA 里导入项目配置好 Tomcat 后直接就能跑中间没折腾过依赖问题。对课设来说能稳定运行比技术新更重要。第三是代码结构直观。浏览器发起 HTTP 请求Web 容器把请求交给 ServletServlet 调用 Service 层处理业务逻辑DAO 层操作数据库最后 Forward 到 JSP 渲染页面。这个链路学生在课堂上学过也最容易在答辩时画出来。3.2 请求流转过程一次完整的药品查询调用链让我以「查询药品列表」这个功能为例把请求流转过程拆开讲。前端页面 JSP 里有一个查询表单提交后 action 指向某个 Servlet 的 URL。Tomcat 根据 web.xml 里的映射关系找到对应的 Servlet 类容器调用它的 doGet 或 doPost 方法。Servlet 里第一件事是设置请求和响应的编码格式避免中文乱码。然后从请求参数里取出查询条件封装成实体对象或直接作为参数传给 Service 层的接口。Service 层会做一些简单的参数校验再调用 DAO 层的查询方法。DAO 层通过 JDBC 拼接 SQL 语句通过 PreparedStatement 执行查询把结果集 ResultSet 遍历成实体对象列表逐层返回。Servlet 拿到结果后把它 setAttribute 到 request 域中然后 RequestDispatcher.forward 到列表页面。JSP 在渲染时用 JSTL 标签或 Scriptlet 遍历集合把药品名称、库存数量这些字段展示在表格里。整套调用链看起来不算短但每一层的职责都很单一。我在给答辩准备 PPT 时就画了这样一张请求流转图从浏览器到数据库标清楚每一层的类名和方法名。老师问「请求是怎么从页面到数据库的」照着这张图讲就行了。这张图比讲十页技术原理都管用。3.3 web.xml 里的关键配置Servlet 映射与欢迎页在 Servlet 3.1 之前Servlet 的映射关系是写在 web.xml 里的。这套系统的 web.xml 在 WEB-INF 目录下里面配置了 Servlet 名称、对应的 Java 类和 URL 映射。要看懂这套配置其实不难。每个 Servlet 节点有 servlet-name 和 servlet-class 两个子节点前者是别名后者是类的全限定名。然后在 servlet-mapping 节点里把 servlet-name 和 url-pattern 对应起来。url-pattern 就是你在浏览器地址栏里访问的路径。项目正文里有一段 repositoryAdminManagement_jsp.class 的信息这说明页面文件夹下存在 admin 管理相关的 JSP 页面编译后的 class 文件被服务器生成在 work 目录里。这类文件不用手动维护Tomcat 会自动把 JSP 编译成 Servlet class 再执行。但如果你的项目在运行时报 JSP 编译错误就需要去 Tomcat 的 work 目录看对应 class 的编译日志。web.xml 里还有欢迎页面和 session 超时配置。欢迎页一般指向 index.jsp 或直接重定向到登录页。session 超时时间的单位是分钟默认通常是 30 分钟如果你想演示时保持登录状态久一点可以调大这个值。我一般不建议在课设里去动 session 超时默认配置就够了。4. 把项目在 IDEA 里跑起来导入、配置、部署全流程4.1 环境准备JDK、Tomcat、MySQL 的版本搭配建议在动手导入项目前先把环境对齐否则后面会陷入玄学问题。这套系统是基于 JavaWeb 传统技术栈写的对 JDK 版本不敏感但有一个原则JDK 8 是最稳妥的选择不要用 JDK 17 跑老项目。原因在于老项目里大量使用 Java EE 的规范类库JDK 8 时代这些类还内置在 JDK 里从 JDK 11 开始部分模块被移除或者调整了访问权限。如果你用高版本 JDK 运行大概率会报 ClassNotFoundException 或者模块访问错误。就算能跑通也属于自找麻烦。Tomcat 版本建议用 Tomcat 8.5 或 Tomcat 9.0这两个版本对 Servlet 3.1 和 JSP 2.3 规范的支持最稳定兼容 JDK 8。Tomcat 10 之后包名从 javax.servlet 改成了 jakarta.servlet老代码直接部署会直接报编译错误所以千万别选 Tomcat 10。MySQL 版本这块如果本机装的是 MySQL 8.0需要注意 JDBC 驱动和连接串的配置。MySQL 8 的驱动类名变成了 com.mysql.cj.jdbc.Driver连接串里还需要加 serverTimezone 参数。下面我会在配置章节里详细说。4.2 导入工程到 IDEA 的完整步骤第一步打开 IDEA选择 File - New - Project from Existing Sources然后选中项目根目录。IDEA 会识别项目类型如果弹窗让你选择导入方式选 Eclipse 或直接选 Web Application 都可以。因为很多课设项目是从 Eclipse 导出的IDEA 能兼容导入。导入完成后先检查 Project Structure。按 Ctrl Alt Shift S 打开把 Project SDK 设为 1.8Language Level 设为 8。在 Modules 标签页里看到你的模块名后把 Sources 目录标记为 Sources把 webapp 或 WebContent 目录标记为 Web 资源目录。接下来配置 Artifacts。IDEA 里 Web 项目的部署包类型是 Web Application: Exploded。如果导入后没有自动生成需要手动新建一个点击 号选择 Web Application: Exploded然后在右侧的 Output Layout 里把 WEB-INF 下的 classes 目录指到编译输出路径。然后把 Tomcat 集成进 IDEARun - Edit Configurations点 号选 Tomcat Server - Local。在弹出的配置面板里点击 Configure 选择本机 Tomcat 目录然后在 Deployment 标签页点 号添加刚才建好的 Artifact。Application Context 建议改成 /drug这样访问路径就是 http://localhost:8080/drug/。这一步很关键改了对后续 JSP 跳转的路径理解有帮助。4.3 数据库初始化建库、导表、改连接配置在 MySQL 里建一个数据库实例名字可以叫 drug_db字符集选择 utf8mb4。建好之后执行随包附带的 SQL 脚本。有两种方式一种是在 Navicat 里打开脚本文件直接运行另一种是在命令行里用 source 命令导入。我习惯用 Navicat因为执行过程中如果有报错能更直观看到是哪条语句挂了。执行完脚本后打开项目里找数据库连接工具类一般是 db.properties 或 JDBCUtils.java。里面的连接信息需要改成你本机的配置重点是下面这么几行jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/drug_db?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password123456如果你的 MySQL 是 8.0驱动类名要改成com.mysql.cj.jdbc.Driver连接串里需要追加serverTimezoneAsia/Shanghai否则会报时区错误。这是新手最常见的翻车点。改完之后建议单独写一个测试类或在项目启动后先看日志确认数据库连接成功再继续。不要嫌麻烦这一步不做后面能排查到怀疑人生。4.4 部署到 Tomcat 并验证登录部署完成后直接点击 IDEA 右上角的运行按钮。IDEA 会自动启动 Tomcat打开浏览器访问http://localhost:8080/drug/。这时应该能看到登录页面。输入测试账号和密码点击登录如果跳转到系统主页面恭喜整套链路已经通了。我第一次跑这套系统的时候启动就报错查了半天发现是 Artifact 的名字带空格导致 Tomcat 部署失败。这种问题很无厘头排错时先去 IDEA 的 Run 面板看红色报错日志按日志定位问题不要靠猜。登录成功后的验证环节我建议按下面的流程走一遍进入药品管理页面翻看列表确认中文没有乱码手动新增一条测试药品记录提交后再刷新列表确认新增成功做一次入库操作确认库存数量相应增加做一次出库操作确认库存数量扣减正确走完这套流程说明系统核心功能是可用的。如果某一步挂了比如出库后库存没变那就要回去看 Service 层的事务控制有没有写全。这套系统有没有开启事务管理是个值得关注的点数据库操作时最好手动开启事务避免转出和转入只成功一边。5. 避坑指南数据库连接、路径和日志的常见问题5.1 启动 Tomcat 报 ClassNotFoundException: com.mysql.jdbc.Driver现象Tomcat 启动后页面报 500 错误日志里提示找不到 MySQL 驱动类。原因项目的 WEB-INF/lib 目录下没有打包 MySQL JDBC 驱动 jar 包或者驱动 jar 包版本与 MySQL 版本不兼容。解决把对应版本的驱动 jar 包拷贝到WEB-INF/lib目录下。MySQL 5.x 用mysql-connector-java-5.1.49.jarMySQL 8.x 用mysql-connector-java-8.0.33.jar。拷贝完后在 IDEA 里右键 jar 包选 Add as Library再重新部署。如果是 Maven 项目检查 pom.xml 里 mysql 依赖的版本号在本地仓库里确认依赖已下载完整。5.2 MySQL 8 连接报 The server time zone value is unrecognized现象数据库连接失败日志提示无法识别服务器时区值。原因MySQL 8 的驱动对时区校验更严格连接串里没指定 serverTimezone。解决在 JDBC 连接串里追加参数。我统一用下面的写法兼顾中文编码和时区jdbc:mysql://localhost:3306/drug_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai改完连接串后必须重启 Tomcat 才能生效不用重新编译项目。5.3 页面能打开但跳转全部 404或者 CSS/JS 全丢现象登录页面能显示但提交表单后跳转 404有时页面样式也是乱的。原因Application Context 配置不一致。比如部署时设置的是/drug但 JSP 里链接写的是绝对路径/login少了项目前缀。解决在 JSP 里统一用request.getContextPath()拼路径例如form action${pageContext.request.contextPath}/loginServlet methodpost不要硬编码/drug/loginServlet因为换了部署环境上下文路径可能变。把所有页面里的绝对路径替换成 EL 表达式动态获取就不会再有 404 问题。5.4 Tomcat 日志输出乱码项目里 info.log 数字对应不上现象控制台输出乱码有时你想核对某次操作记录发现项目生成的 info.log 里的日期和当前对不上。原因Tomcat 的日志编码格式和项目里设置的编码不一致。项目正文里能看到info.log.2021-04-19、access_log.2021-05-10这类文件说明系统在将近两个月的时间里都有运行记录。这些日志文件里记录了系统启动和访问日志如果你拿到手后发现最新日志停留在某一天不一定是你配置有问题可能是打包前的原始记录。解决这些历史日志文件不用手动清理也不影响系统运行。如果你看它们不顺眼直接删掉即可系统下次运行会重新生成。执行日志里时间对不上也不用担心不影响正常功能。5.5 IDEA 部署时提示端口被占用现象启动 Tomcat 时提示Port 8080 is already in use。原因本机有其他进程占用了 8080 端口或者是上个 Tomcat 实例没有完全关闭。解决在命令行里执行netstat -ano | findstr 8080找到对应的进程 PID然后在任务管理器里结束该进程。我自己的习惯是配置 Tomcat 时把默认端口改成 8090避免和本机其他开发工具抢端口。改端口在 Server 配置面板的 HTTP Port 栏直接改改完 Application Context 不用动。6. 从日志到二次开发答辩前的进阶准备与验证技巧6.1 用日志文件追踪系统运行轨迹提前排掉隐患项目里自带了 info.log 和 access_log 两类日志文件。info.log 记录的是系统运行信息比如 SQL 执行异常、Servlet 初始化access_log 是访问日志记录每一次页面请求的 IP、路径、响应时间等信息。虽然这些是项目里已经有的历史文件但你可以借此了解系统的日志机制还可以在答辩时说明你对日志体系做过梳理。我第一次跑这套系统时习惯性地去翻了 Tomcat 的 catalina.out 日志。每当启动报错我都会先看这个文件的尾部几百行里面的堆栈信息能直接定位到哪一个类哪一行代码出了问题。如果你调试时发现某次请求响应特别慢也可以去 access_log 里对比不同路径的响应时间判断是 JSP 渲染慢还是 SQL 查询慢。6.2 加一个药品效期预警功能教科书级的答辩加分项如果你想在答辩时展示一点超出课设要求的代码能力我强烈建议加一个药品效期预警模块。这个功能实现成本低但业务价值明确老师看到会觉得你考虑到了医药行业的实际场景。核心逻辑很简单药品表里有有效期字段。写一个定时任务或者每次进入页面时触发查询筛选出有效期小于 30 天的药品列表在首页用红色标出。SQL 大致长这样SELECT * FROM drug_info WHERE expiry_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY) ORDER BY expiry_date ASC;页面展示就用 JSTL 条件判断当剩余天数小于设定阈值时给该行加一个高亮样式。这个功能实现不到一百行代码但对系统的完整性提升是立竿见影的。答辩时老师问「你的系统有没有实际业务价值」这个功能就是一个有力的回答。6.3 答辩追问的常见方向与应对记录答辩时老师最喜欢问的问题集中在几个方向数据库为什么这么设计、请求流转过程是什么、系统存在哪些不足。数据库设计这块用第二章节的表结构分析来回答强调每张表的主外键关系和业务含义。请求流转用第三章的调用链讲清楚每一层的类名和方法。系统不足这块诚实一点比藏着掖着好。你可以主动说密码是明文存储的存在安全风险没有做分页查询数据量大了之后性能会下降。这样说不会扣分反而显得你有全局意识。如果老师追问怎么改进提前准备好方案密码改成 MD5 加盐存储列表查询用 LIMIT 做分页这些都是能现场说清楚的技术点。我自己做这套项目时最深的感悟是课设项目的价值不在于技术栈多新多炫而在于你能不能把每一个模块的设计思路讲清楚。从那以后我每次拿到一套源代码都强制自己先过一遍表结构和请求流转图再动手改代码。这套药品存销系统就是这样一步步被我拆熟、改顺的。希望帮到你。本文还有配套的精品资源点击获取