ARTICLE DETAIL

资讯详情

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

Javaweb药店管理系统源码解析:环境配置与CRUD闭环实战

Javaweb药店管理系统源码解析:环境配置与CRUD闭环实战 简介这是一套基于Java Web技术栈的药店管理系统完整项目包含可运行源码与配套数据库面向Java Web初学者、课程设计学生及需要实战练手的开发者帮助理解Servlet、JSP、JSTL与MVC分层开发在真实业务中的应用。系统覆盖用户管理、药品管理、销售管理、库存管理、报表统计与权限控制等模块数据库设计涉及药品表、用户表、订单表等核心结构并包含库存预警、销售报表生成等实用功能可作为课程设计或毕业设计的参考方案。资源包共2493个文件以js脚本、png与gif图片、css样式、jsp页面、java源码、class文件及jar依赖为主另含sql建库脚本与xml配置压缩包约22.51MB目录按MVC结构组织便于按模块查阅与二次开发。目前已有882人学习下载适合希望系统掌握Java Web开发流程、积累项目经验的读者参考借鉴。1. 药店管理系统源码拆包从一堆 JSP 到能跑起来的 CRUD 闭环拿到「基于 Javaweb 的药店管理系统及源码和数据库」这个包时我第一反应不是打开 IDE而是先看目录结构——因为 Javaweb 老项目的坑八成埋在路径和编码里。这套源码是典型的 Servlet JSP MySQL 组合带完整 SQL 脚本覆盖药品、库存、销售、用户四个核心模块适合课程设计、毕设起步也适合想补一遍原生 Javaweb 增删改查闭环的开发者。它不依赖 Spring 全家桶纯手写 JDBC 和 DAO对理解 MVC 分层比看框架源码更直观。但正因为它「老」Tomcat 版本、JDBC 驱动、字符集这三处不先对齐导入后大概率是白屏或 500。下面按我实际跑通的顺序拆。2. 环境对齐JDK、Tomcat 与 MySQL 驱动的版本咬合2.1 为什么这套源码对版本敏感原生 Javaweb 项目没有 Maven 或 Gradle 帮你仲裁依赖WEB-INF/lib下放什么版本的 jar运行时就用什么。常见翻车场景是JDK 17 编译、Tomcat 10 部署结果javax.servlet包名在 Tomcat 10 里已经改成jakarta.servlet所有 Servlet 直接报ClassNotFoundException。这套药店系统的源码用的是javax.servlet.*所以 Tomcat 必须停在 9.x 及以下。MySQL 驱动同理com.mysql.jdbc.Driver是 5.x 的写法8.x 要换成com.mysql.cj.jdbc.Driver并加时区参数。我一般会先做一张版本对照表再动手导入。组件推荐版本原因JDK1.8源码语法级别低高版本编译易出--release警告Tomcat9.0.x保留javax.servlet命名空间MySQL5.7 或 8.08.0 需改驱动类名和 URL 参数mysql-connector-java5.1.49 或 8.0.28与 MySQL 版本对应IDEIDEA 2021对 Web Facet 配置友好2.2 IDEA 导入与运行配置的实操步骤IDEA 导入老 Web 项目最容易卡在「没有 Web Facet」和「Artifact 没配」。下面是我跑通这套源码的完整配置流程按顺序执行即可。# 第一步确认 JDK 和 Tomcat 已安装 java -version # 输出应为 1.8.x # 第二步把 mysql-connector-java 放入 WEB-INF/lib # 如果源码包内已有跳过没有则手动放入 ls WebContent/WEB-INF/lib/ # 应看到 mysql-connector-java-5.1.49.jarIDEA 内配置顺序 1. File - Project Structure - ProjectSDK 选 1.8语言级别选 8 2. Modules - 选中模块 - Sources标记 src 为 Sources 3. Facets - 添加 WebWeb Resource Directory 指向 WebContent 4. Artifacts - 添加 Web Application: Exploded输出目录默认 5. Run - Edit Configurations - 添加 Tomcat Local 6. Deployment 选项卡 - 添加 Artifact - 应用上面这段配置里第 3 步的 Web Resource Directory 必须指向WebContent而不是项目根目录否则 JSP 找不到。第 4 步的 Artifact 如果显示红色叹号说明WEB-INF/lib下有 jar 没被识别右键Add as Library即可。第 6 步部署后Application context 建议设为/pharmacy和源码里web.xml的url-pattern保持一致避免路径 404。2.3 数据库脚本导入与连接参数修改源码包里的.sql文件通常包含建库、建表、初始数据三部分。导入前先确认脚本里的库名再改 Java 侧的连接配置。-- 常见脚本开头先建库再建表 CREATE DATABASE IF NOT EXISTS pharmacy DEFAULT CHARACTER SET utf8mb4; USE pharmacy; -- 药品表结构示例字段名以实际脚本为准 CREATE TABLE medicine ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, spec VARCHAR(50), price DECIMAL(10,2), stock INT DEFAULT 0, warn_stock INT DEFAULT 10 );// DBUtil.java 或类似工具类中的连接配置 private static final String URL jdbc:mysql://localhost:3306/pharmacy?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 你的密码; // MySQL 8.x 驱动类名改为 com.mysql.cj.jdbc.DriverSQL 脚本执行时注意utf8mb4而不是utf8否则药品名里的生僻字会变问号。Java 侧 URL 里的characterEncodingutf8要和数据库字符集对齐serverTimezone在 MySQL 8 下不加会报时区异常。如果导入脚本报「Unknown collation: utf8mb4_0900_ai_ci」说明脚本是 MySQL 8 导出的而你本地是 5.7把该排序规则改成utf8mb4_general_ci再执行。3. 核心模块拆解用户、药品、库存、销售四条链路怎么串3.1 MVC 分层在源码里的实际落点这套系统没有用框架但目录结构是标准 MVC。src下通常分dao、service、servlet、entity四层WebContent下放 JSP 和静态资源。理解这个分层改功能时才知道该动哪个文件。src/ com.pharmacy.entity/ - 实体类和数据库表字段一一对应 com.pharmacy.dao/ - JDBC 增删改查SQL 写在这里 com.pharmacy.service/ - 业务逻辑如库存扣减、库存预警判断 com.pharmacy.servlet/ - 接收请求调 service转发 JSP WebContent/ jsp/ - 页面 WEB-INF/web.xml - Servlet 映射 WEB-INF/lib/ - 驱动 jar实体类里字段名和表字段的对应关系是排查「查出来是 null」的第一现场。比如表字段warn_stock实体类里如果是warnStock那 DAO 里rs.getInt(warn_stock)必须写对否则默认返回 0库存预警永远不触发。我见过有人把price定义成int结果 12.50 存进去变 12金额对不上这种就是实体类型和表类型没对齐。3.2 药品管理与库存预警的代码链路药品管理是这套系统的核心涉及录入、查询、更新、删除以及库存低于阈值时的提醒。下面以「库存扣减 预警判断」为例看一条完整链路。// MedicineService.java 中的库存扣减方法 public boolean reduceStock(int medicineId, int quantity) { Medicine m medicineDao.findById(medicineId); if (m null || m.getStock() quantity) { return false; // 库存不足直接拦截 } int newStock m.getStock() - quantity; boolean ok medicineDao.updateStock(medicineId, newStock); if (ok newStock m.getWarnStock()) { // 触发预警常见做法是写一条预警记录或置标志位 warnDao.insert(new Warn(medicineId, newStock)); } return ok; }这段逻辑里findById先查当前库存避免并发下超卖updateStock更新后再判断是否低于warnStock。参数quantity来自销售模块的订单明细warnStock是药品表里的预警阈值。常见坑是扣减和预警判断不在同一事务里扣减成功但预警写入失败导致库存低了却没提醒。原生 JDBC 下我一般会在 service 方法上加手动事务setAutoCommit(false)两步都成功再commit。3.3 销售管理与报表统计的数据来源销售模块生成订单订单明细关联药品统计报表按日期聚合。这套源码的报表通常是 JSP 里嵌 Java 代码直接查或者 Servlet 查完放 request 再转发。-- 每日销售额统计按订单日期分组 SELECT DATE(order_time) AS day, SUM(total_price) AS amount FROM orders WHERE order_time BETWEEN ? AND ? GROUP BY DATE(order_time) ORDER BY day DESC;// ReportServlet.java 中调用统计 String start request.getParameter(start); String end request.getParameter(end); ListReport list reportDao.statByDate(start, end); request.setAttribute(reportList, list); request.getRequestDispatcher(/jsp/report.jsp).forward(request, response);SQL 里DATE(order_time)把时间戳截断到天SUM(total_price)聚合当天金额。参数start和end从页面表单传入格式要和数据库时间字段匹配常见做法是yyyy-MM-dd。如果报表查出来是空先看order_time存的是datetime还是varchar后者会导致BETWEEN比较按字符串走跨月时结果错乱。4. 避坑与排查导入后跑不起来的五类高频问题4.1 现象访问任何页面都 404原因IDEA 的 Artifact 没配置或者 Application context 和web.xml里的路径不一致。解决检查 Run Configuration 的 Deployment 选项卡确认 Artifact 已添加再看web.xml里url-pattern的前缀把 Application context 改成一致或者访问时手动加上前缀。4.2 现象JSP 页面中文乱码原因JSP 文件本身编码、pageEncoding、响应头字符集、数据库字符集四处不一致。解决JSP 首行统一写% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %Servlet 里response.setContentType(text/html;charsetUTF-8)数据库连接 URL 加characterEncodingutf8建库用utf8mb4。四处对齐后乱码基本消失。4.3 现象登录后跳转空白页控制台无报错原因Servlet 里forward的路径写错或者 JSP 放在WEB-INF下被直接访问限制。解决WEB-INF下的 JSP 只能通过 Servlet 转发访问检查getRequestDispatcher的路径是否以/开头且相对于 Web 根目录。常见错误是写成jsp/main.jsp少了前导斜杠。4.4 现象MySQL 连接报「Public Key Retrieval is not allowed」原因MySQL 8 默认认证插件是caching_sha2_password旧驱动或未加参数时拒绝连接。解决URL 后加allowPublicKeyRetrievaltrueuseSSLfalse或者把用户认证插件改回mysql_native_password。生产环境不建议关 SSL本地调试可临时用。4.5 现象库存扣减后出现负数原因并发请求下两个线程同时查到相同库存各自扣减后写回导致超卖。解决在 SQL 层用条件更新UPDATE medicine SET stock stock - ? WHERE id ? AND stock ?根据返回的影响行数判断是否成功而不是先查再改。这是原生 JDBC 下最省事的防超卖手段。5. 二次开发与验证把课程设计改成能写进简历的项目5.1 从「能跑」到「能讲」的验证清单跑通只是第一步要让它变成能写进简历的项目得能说清每条链路。我一般会按下面这张清单逐项验证每通过一项就在 README 里记一条。验证项操作预期结果用户登录用管理员账号登录跳转管理首页普通用户看不到管理菜单药品录入新增一条药品库存设 5预警设 10列表可见库存显示 5库存预警销售该药品 1 件库存变 4预警列表出现记录销售报表选日期范围查询显示当天销售额汇总权限拦截普通用户直接访问管理 URL被拦截或跳转登录5.2 三个低成本进阶方向第一个方向是加过滤器做统一登录校验。原生 Javaweb 用Filter拦截/admin/*判断 session 里有没有用户信息没有就跳登录页。这样不用在每个 Servlet 里重复写校验。public class AuthFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) res; Object user request.getSession().getAttribute(user); if (user null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(req, res); } }第二个方向是把 JDBC 连接改成连接池比如 Druid 或 C3P0减少频繁建连开销。第三个方向是给报表加导出 Excel用 POI 把查询结果写成.xlsx面试时能讲出「从查询到导出」的完整链路。这三个方向都不需要引入 Spring保持原生栈改动量可控。5.3 我踩过的那次「库存对不上」有次帮人调这套系统销售扣了库存但报表里的销售额和库存变动对不上。查了半天发现订单主表和明细表插入不在同一事务主表成功、明细失败导致有订单没明细库存没扣但销售额记了。从那以后我每次碰原生 JDBC 的多表写入都强制先确认setAutoCommit(false)有没有加再走一遍异常回滚测试。这套源码的价值不在于代码多优雅而在于它把 Javaweb 的完整链路摊开给你看坑踩一遍比看十篇教程都记得牢。希望帮到你。本文还有配套的精品资源点击获取
返回列表