ARTICLE DETAIL

资讯详情

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

JSP超市管理系统源码+论文:环境搭建、避坑与加固指南

JSP超市管理系统源码+论文:环境搭建、避坑与加固指南 简介面向中小型超市的信息化建设需求这份资源提供基于 JSP 技术、采用 B/S 架构的超市管理系统完整源码与配套毕业设计论文适合计算机相关专业学生进行毕业设计也适合需要轻量进销存方案的开发者参考。系统覆盖商品入库、销售、库存、财务等核心业务模块通过信息化手段帮助经营者减少库存积压、降低资金风险并可在此基础上根据实际门店流程二次扩展。压缩包为 rar 格式约 29.11MB包内文件总数暂未统计主体为 Java 源码与论文文档便于按模块阅读和部署调试。已有 30 人浏览学习。对准备完成 JSP 课题或想快速搭建超市管理原型的人而言可从源码结构、数据库设计、页面交互与论文撰写思路中获得完整参照缩短系统设计与实现周期。1. 中小型超市管理系统源码论文到底能拿来干什么看到标题里的“jsp”和“源码论文”你基本能猜到这又是下载站里最常见的课程设计包。这类项目技术上并不前沿却常青它用 JSP Servlet JDBC 讲清了 Web 系统从页面、请求、数据库到响应的完整链路。对刚入门 Java Web 的人来说它是一套能跑的参照系统对要应付毕业答辩的人来说它是凑齐“需求分析代码论文”的最短路径。但别被“源码”两个字骗了解压后直接部署往往翻车你需要先补环境、改配置、还得辨认哪些代码是能上生产环境的哪些只是教学演示。按我的实操流程把跑通和改造这条路上的坑提前填上就是你接下来要做的事。2. 把 JSP 超市管理系统跑起来环境、导入、启动三步走从 rar 包里拿到的不是一个直接可执行的安装程序而是一个需要被 Tomcat 容器托管的 Web 工程。你首先要做的事不是看代码而是把本机环境调成和这个老项目的“脾气”匹配。这一章按我自己的动手顺序来每步都会解释为什么避免你照着抄完仍找不到北。2.1 先装齐四件套JDK、Tomcat、MySQL、Eclipse版本怎么配老一批 JSP 课程设计大多写在 Tomcat 7/8 时代编码习惯是页面脚本代码堆在一起、数据库用 JDBC 直连。这种项目在使用上的坑通常不是代码写错而是运行环境太新导致的 API 不兼容。所以我建议不要用最新版全家桶按下面的版本组合去装组件推荐版本理由JDK81.8JSP 翻译成 Servlet 后在编译阶段最依赖 JDK 里的javax.servlet类JDK 8 与老工程的字节码兼容性最好Tomcat8.5 或 9.0Tomcat 10 开始把javax.*换成jakarta.*老源码里import javax.servlet.*会全部报红MySQL5.7 或 8.05.7 最省心8.0 也能用但必须换驱动类名并追加时区参数Eclipse IDE for Enterprise Java2021-03 之后任意版本能直接识别 Eclipse Web Project 结构导入成本最低先解释 Tomcat 为什么是关键变量JSP 文件本质上会被容器编译成一个 Servlet 类而编译时需要javax.servlet这一系列 API。Tomcat 10 迁移到了 Jakarta EE 9包名变了老代码里写死的 import 自然失效。你如果非要用 Tomcat 10就得到处改 import 和依赖 jar那已经不是“跑起来”的范畴了而是“重构”的范畴。装好四件套后还需要把环境变量配好。Windows 下使用系统属性里的环境变量设置JAVA_HOME指向 JDK 8 路径并把%JAVA_HOME%\bin加到Path后面 Tomcat 才能找到 Java 运行时。配置完成后打开一个命令行窗口输入java -version看到类似java version 1.8.0_202就说明 JDK 部分没问题。接着启动 MySQL 服务把端口确认在 3306然后进入下一步。2.2 解压源码包后如何找到入口项目结构、SQL脚本和数据库连接配置右键解压后先把整个工程目录放到一个全英文且没有空格的路径下面例如D:\workspace\SuperMarket。这一步不是强迫症是因为 Tomcat 在解析中文路径时出现过太多不可控的编码问题你不想把第一次运行时间花在“为什么页面又一片空白”上。不同来源的压缩包结构有差异但通常都会包含几个关键部分源码目录、Web 发布目录和数据库脚本。用下面这个目录树给你一个参照SuperMarket/ ├── src/ │ └── com/shop/ │ ├── bean/ // 实体类对应数据库里的表 │ ├── dao/ // JDBC 数据访问层 │ ├── servlet/ // Controller 层 │ ├── filter/ // 过滤器负责登录拦截和编码 │ └── util/ // 工具类通常是数据库连接类 ├── WebContent/ │ ├── login.jsp │ ├── index.jsp │ ├── admin/ │ ├── WEB-INF/ │ │ ├── web.xml │ │ └── lib/ // 工程依赖的 jar 包 │ └── static/ ├── sql/ │ └── supermarket.sql └── 论文.doc这个结构里我建议按“SQL 脚本 → 数据库连接类 → web.xml”的顺序去认识工程。先把sql/supermarket.sql导入 MySQL。如果脚本里包含CREATE DATABASE直接在命令行用重定向导入即可如果不包含就先手工建库再导入库名最好与代码里 URL 的库名保持一致。常见做法是mysql -uroot -p supermarket.sql如果数据库脚本比较大导入时看到一堆ERROR 1064或unsupported field先检查你用的 MySQL 版本是否过新。比如老脚本里会出现ENGINEMyISAM AUTO_INCREMENT1 DEFAULT CHARSETutf8;这在 MySQL 8.0 下仍能执行但若用了TYPEInnoDB这种古早语法就会报错需要手工改 SQL。处理完数据库接下来就是改连接信息。数据库连接信息通常集中在util/DBUtil.java或db.properties文件里最典型的写法是下面的 JDBC 直连public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/supermarket?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 123456; public static Connection getConnection() throws Exception { Class.forName(com.mysql.jdbc.Driver); return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码有两点需要特别注意第一MySQL 5.7 驱动类名是com.mysql.jdbc.DriverMySQL 8.0 要改成com.mysql.cj.jdbc.Driver否则报告ClassNotFoundException。第二URL里的serverTimezoneAsia/Shanghai是给 MySQL 8.0 准备的时区参数少了它会抛 SQLException。如果你打开的是 properties 配置文件就把其中的jdbc.url、jdbc.user、jdbc.password改成自己的值。改完先不要启动 Tomcat直接跑一个测试 main 方法或 JUnit 方法确认getConnection()能拿到连接这里提前验证能省掉后面一大半玄学报错。2.3 启动 Tomcat 并验证系统访问路径、登录账号和页面白屏排查把工程导入 Eclipse 的常见做法是File Import Existing Projects into Workspace然后选择你解压出来的根目录。如果导入后项目名旁边没有出现小地球图标说明它没有被识别成 Web 项目需要右键项目选Properties Project Facets勾选 Dynamic Web Module 和 Java并指定正确的 Servlet 版本选 3.0 或 3.1。这个步骤容易漏漏掉之后 Tomcat 不会部署该项目。配置好部署后在 Server 视图里新建一个 Tomcat 9.0 的服务器实例添加项目然后启动。控制台如果能在最后几行看到INFO: Server startup in [xxx] milliseconds说明容器起来了。接着访问http://localhost:8080/SuperMarket/login.jsp或者直接访问根路径看欢迎页。如果你看到 404 或直接白屏第一件事不是查浏览器而是去 Eclipse 的 Console 看有没有抛异常。JSP 页面的编译错误只出现在服务器日志里最常见的是Unable to compile class for JSP那就是页面里的 Java 脚本有问题或者缺失依赖 jar。检查一下WebContent/WEB-INF/lib下有没有mysql-connector-java的 jar很多压缩包为了保证体积会省略这个文件少了它连登录页面都渲染不出来。只要mysql-connector-java在登录逻辑一般就能通。登录账号去数据库表里查最快SELECT * FROM user; SELECT * FROM admin;很多系统的默认账号像admin/admin123但凡是建表脚本里手工写死的密码也可能被改过以实际表数据为准。登录进去后先挨个点一遍菜单看看哪些 JSP 是报错的白页把这些记录成一张清单后面的代码阅读和改造就从这张清单开始。3. 读懂 JSP 超市管理系统的内部设计模块、表结构与关键代码环境跑通只是第一步你要想在答辩或者二次开发中不露怯必须把内部设计看穿。JSP 超市系统的代码质量虽然参差不齐但它的分层思路对新手来说反而是非常直观的教材浏览器请求一个 JSP 或 ServletServlet 调用 DAO 访问数据库拿到结果后跳转回 JSP 渲染。这一章带你把模块边界、数据表和登录流程各拆一层让你不必通读全部代码也能讲清楚系统是怎么构造成的。3.1 模块拆解登录权限、商品管理、库存管理、销售收银和统计报表一个标着“中小型超市”的系统功能不会太庞杂核心就是进销存再加一个权限壳。我在接触过的多个这类项目里基本都能整理出下面这个功能矩阵模块主要职责对应角色登录与注销校验账号密码写 Session拦截未登录请求所有用户商品管理商品的增删改查、按分类浏览、搜索管理员库存管理入库记录、出库记录、库存总量、库存预警管理员销售收银新建销售单、选择商品、结算金额、打印小票收银员/管理员统计报表按天/按月统计营业额、热销商品排行管理员员工管理管理员账号的增删改或者简单的角色区分管理员这里没有把“进货管理”列成独立模块因为很多这种课程设计把进货和库存合并成一个页面。你拿到自己的包之后可以按这个结构对照代码里有哪些 Servlet比如GoodsServlet、CartServlet、SaleServlet。如果某一块缺失别急着加功能先判断是不是论文里也忽略了那块有时候功能在页面里并不在菜单上。关于架构选型这个项目属于典型的“弱分层”JSP 页面里直接写了大量 Java 代码Service 层基本不存在Servlet 只做转发。你不要觉得它低级它恰恰适合教学的原因是每一行数据库查询你都能追踪到发起它的页面出了问题很容易解释。它的代价是维护难、页面混乱这个后面加固章再讲。3.2 数据库表设计商品、用户、销售单如何通过外键衔接数据表是这种系统的命根子看懂表结构比读代码更快。下面是简化版的建表脚本足够表达这张“经典骨架”CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(64) NOT NULL, role VARCHAR(20) DEFAULT admin ); CREATE TABLE goods ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0, category VARCHAR(50) ); CREATE TABLE sales ( id INT PRIMARY KEY AUTO_INCREMENT, goods_id INT, sale_num INT, total_price DECIMAL(10,2), sale_time DATETIME );从这段脚本能看出三件事第一user表没有给密码加盐很多课程设计的密码干脆是明文这在一线开发里绝对禁止但答辩时老师通常不会深究我们自己改掉就行。第二goods表的stock字段是存量销售时先查库存再扣减但代码里未必加了事务这可能造成超卖后面加固时会提到。第三sales表和goods表之间用goods_id关联但外键约束常常没有真正建立导致可以插入不存在的商品编号。这也是老项目的常见通病。还有个值得注意的细节sale_time使用DATETIME类型有些旧脚本用的是TIMESTAMP并且没写默认值这样每次插入记录都必须手工给时间如果代码里没传时间数据库会写0000-00-00 00:00:00统计报表就会出问题。建议你拿到 SQL 脚本后把所有日期字段都确认一遍默认值是不是CURRENT_TIMESTAMP。3.3 登录鉴权的经典 JSPServlet 写法从 request 到 session登录是几乎所有系统都有的一道题而 JSP 系统的标准答案往往长这样用户在login.jsp填表表单 POST 到LoginServletServlet 用 JDBC 查数据库成功则把用户名塞进 Session失败则返回错误信息。我用一个代码片段带你看清楚它的每个关键点WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); String username req.getParameter(username); String password req.getParameter(password); try (Connection conn DBUtil.getConnection()) { String sql SELECT role FROM user WHERE username? AND password?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { HttpSession session req.getSession(); session.setAttribute(loginUser, username); session.setAttribute(role, rs.getString(role)); resp.sendRedirect(index.jsp); } else { resp.sendRedirect(login.jsp?error1); } } catch (Exception e) { e.printStackTrace(); resp.sendRedirect(login.jsp?error2); } } }这段代码里最有价值的是它示范了三个通用原则一是使用PreparedStatement拼参数而不是字符串拼接这能避免 SQL 注入二是刷新会话写sendRedirect而不是直接forward到 JSP防止表单重复提交三是在catch里把异常打印出来用于排查但生产环境不应该把堆栈暴露给用户。如果你拿到的系统源码里用的是Statement字符串拼接比如SELECT * FROM user WHERE username username 那这就是最优先要改的安全项。除了登录你可能还会看到 Session 拦截过滤器它检查每个请求的 Session 里有没有loginUser属性没有就重定向到登录页。这也是这类系统里比较正统的做法比每个 JSP 页面顶部自己调 Session 判断要省事得多。阅读代码时如果发现过滤器没有生效多半是web.xml里的url-pattern写成了/*.jsp或者漏配了 Servlet 类这一点在避坑章会进一步展开。4. 把“论文”当成需求说明书从论文里快速抽取功能清单与验收点很多人在收到“源码论文”压缩包时觉得论文就是凑字数抄格式用的源码才是主力。这种判断糟蹋了好东西论文里那一堆用例图、E-R 图、数据流图其实就是你理解这套系统最快的目录也是老师提问时的题库。一个精明的做法是从论文反推代码应该有哪些类、哪些表、哪些功能然后把论文作为默认答案对着代码找证据。4.1 论文框架怎么读需求分析、概要设计、数据库设计、测试四段传统软件工程论文的结构几乎固定你不需要从头读到尾。打开目录直接翻到中间两章“系统设计”和“数据库设计”。系统设计里会画功能结构图和业务流程图它告诉你这个超市管理系统把“收银”和“库存”放在什么位置数据库设计里会列出数据表清单和字段含义它告诉你代码里的bean类是怎么映射成表的。我自己的效率做法是先把论文里所有用例图拍下来然后把图里的每个用例变成一个 Excel 行作为功能验收清单。比如用例图里有“管理员登录”“商品信息维护”“入库登记”“销售结算”那么代码里就应该有对应的 Servlet 和 JSP。如果代码里没有说明交付包有缺漏反过来如果代码里有论文里没提的功能那也正常一般是时间紧代码东拼西凑的结果。把这张清单拉出来你就能在答辩前明确自己会讲哪些模块、哪些功能是演示不出来的。还要注意有的论文会在系统实现章节贴出一段带行号的代码这段代码被老师视为作者“真正理解”的证据。你需要拿它和源码包对比如果对不上论文里的代码未必是最终版本替换成你本地的版本也没关系但答辩时要能解释差异。论文最后通常有“系统测试”一节里面有一张张测试用例表行列是“操作步骤、预期结果、实际结果”。这部分是顶好的登录账号挖掘机很多作者会把测试数据写进去比如“输入用户名 admin、密码 admin123点击登录”。如果你之前找不到默认密码直接翻这一节就能捞到。4.2 从用例图和 E-R 图反推系统边界用例图是读系统边界最好的黑匣子地图。举例来说如果用例图只画了管理员和收银员两个角色那么大概率没有独立的“供应商”角色如果图里的“商品信息管理”包含“上传商品图片”你就要去代码里找文件上传相关的库比如commons-fileupload。一张用例图能让你在翻代码前就判断出这个系统的范围是“完整”还是“减配”。E-R 图对应的则是数据库表之间的关系。它常常把“顾客”和“销售单”画成 1 对 N把“商品”和“销售单明细”画成 M 对 N。看懂这个关系后你再打开sales表立刻能看出它到底是把“销售单主表”和“销售明细表”合并成了一张表还是拆成两张表。这两者在代码实现上的复杂程度完全不同合并表会让每件商品都重复存一次订单头信息统计销售额时要按订单号去重拆分表则要求事务机制保证主表和明细表同时入库。搞清楚边界你读代码时的目标就更明确了。数据库设计章节里的数据字典也非常有用它把每个字段名、类型、长度、是否为空列得清清楚楚。当你看不懂代码里的 getter/setter 时回到数据字典对照一下马上就知道这个字段对应哪个业务含义。如果论文数据字典里出现一个代码里没有的表说明源码包不完整你可以在答辩前把它补上或者诚实地说这是预留功能。把论文和代码交叉阅读能让你在很短时间里从“会运行”升级到“讲得清”。4.3 答辩时怎么从论文里找“亮点”事务、分页、触发器论文的“系统实现”或“关键技术”部分往往写着“本系统使用了事务处理机制保证数据一致性”“采用分页查询减少服务器压力”但这些漂亮话和真实代码时常对不上。聪明的做法是先不质疑论文而是把它当成老师的提问提纲老师在论文里看到这个词就可能问你它在哪里实现。你需要做的就是把论文里提到的技术名词逐个去代码库里做“考古”。比如论文里写“库存预警”你可能在商品列表页面看到一个红色的超库存阈值提示但没有对应的独立查询方法。那你就自己在 DAO 层加一个ListGoods getLowStockGoods(int threshold)做一个简单的库存预警报表页。再比如“分页”老系统可能只有一个“下一页”按钮没有页码条你可以用 MySQL 的LIMIT配合请求参数把它补上SELECT * FROM goods ORDER BY id LIMIT ?, ?对应的 DAO 方法里传入pageIndex和pageSize两个参数再写一个SELECT COUNT(*) FROM goods得到总记录数就能在页面上渲染出页码条。这个小改动大概半小时就能完成但它非常能体现工程能力也符合论文里“系统具备分页查询功能”的描述。答辩时你可以直接说“原系统分页不完整我基于 LIMIT 重新实现并增加了页码跳转。”因此读完论文后你应该产出一张“论文技术点 vs 代码实现”对照表把差异项标红。标红的项目要么是你要补的代码要么是你要在答辩前想好话术解释的“设计意向”。这个动作能让你从一个“会跑通代码的人”升级成一个“会说清楚设计理由的人”。5. JSP 超市管理系统避坑指南至少 5 个会让你通宵的坑运行这类老项目真正让新手崩溃的往往不是业务逻辑而是一堆看似随机的环境问题。我从自己带过的项目里挑了 5 个出现频率最高的坑每条按“现象、原因、解决”的顺序讲。慢慢看后面全都是血泪经验。5.1 坑1JDBC 驱动 ClassNotFound 或者 Connection refused现象页面报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或者日志里出现java.sql.SQLException: Connections could not be acquired总之数据库完全连不上。原因通常有两个一是WEB-INF/lib里没有 MySQL 驱动 jar驱动类找不到二是 MySQL 服务没起来或者端口写错。老教程里可能用的是 MySQL 5.5新版 MySQL 8 默认端口还是 3306但如果你机器上装过 MariaDB端口可能被占也会引发 Connection refused。解决先把 jar 放进WebContent/WEB-INF/lib确认后重启 Tomcat再用命令行验证 MySQL 是否在监听netstat -ano | findstr 3306Windows或ss -tlnp | grep 3306Linux。最后检查 URL 的主机名和端口是否和数据库实例一致。如果还不行写一段独立的 JDBC 测试类直接调用getConnection()把异常打印到命令行比在 Tomcat 容器里猜快得多。5.2 坑2页面中文乱码或者从数据库读出来全是问号现象登录页的按钮文字正常但商品名称、客户姓名一进页面就成了“???”更诡异的是部分页面正常、部分页面乱码。原因编码不统一的典型表现。JSP 页面可能是GBKServlet 里没有设置request.setCharacterEncoding数据库连接 URL 里没带characterEncodingutf-8三层有一层断了就乱。乱码并非固定出现在所有页面说明书里带生僻字的字段最先露馅。解决把 JSP 文件头统一为% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %在 Servlet 里对所有doGet/doPost开头设置req.setCharacterEncoding(utf-8)数据库 URL 加上useUnicodetruecharacterEncodingutf-8。另外如果你用的是 MySQL 8还要确认数据库本身的默认字符集不是 latin1可以通过SHOW CREATE DATABASE supermarket;检查。5.3 坑3JSP 页面加载完后刷新一次才显示最新数据现象登录后首页的用户名还是上一次会话的老名字或者添加完商品列表没变只有按 F5 手动刷新一次才看到新数据。原因这是“Post/Redirect/Get”缺失的经典症状。表单提交后 Servlet 直接把请求转发到了 JSP浏览器地址栏停留在 POST 状态刷新时会重新提交表单或者受浏览器缓存影响展示旧页面。老代码里大量使用forward所以常见。解决改用sendRedirect完成提交后的跳转。同时在 JSP 头部加缓存禁用防止浏览器在后退/前进时直接读内存页。如果想全局解决就配一个简单的 Filter统一给响应加下面几个头resp.setHeader(Cache-Control, no-cache, no-store, must-revalidate); resp.setHeader(Pragma, no-cache); resp.setDateHeader(Expires, 0);这个 Filter 顺带能处理“退出登录后按浏览器后退还能看到旧页面”的问题。很多老师会让你现场演示退出登录你不想当众翻车的话这个坑一定得管。5.4 坑4商品图片路径错乱JSP 图片坐标定位对不上现象商品图片上传后页面裂图或者用 JS 在图片上做热点区域时点击位置与实际商品位置偏出好几个像素。原因老项目存储上传文件时喜欢用File.separator拼出来的绝对路径但 JSP 渲染时访问的是 Web 路径两者分隔符不一致后端返回的图片路径如果以C:\upload\xxx.jpg这种形式写入imgTomcat 默认不会把它映射成可访问资源。坐标定位则是因为页面引用的图片不是原图大小CSS 缩放后坐标没有按比例换算导致偏移。解决上传路径统一使用虚拟路径/upload/并在 Tomcat 中配置Context映射或者用 Servlet 静态资源映射指向物理目录。前端做坐标定位时不要用图片固定像素值而是用相对百分比先拿鼠标事件的 offsetX/offsetY 除以当前图片显示宽高的百分比再乘以原图宽高得到图片逻辑坐标。这一点如果论文里写了“商品图像标注”之类功能百分之百会被现场验收。5.5 坑5用 IDEA 导入 Eclipse 工程后跑不起来现象用 IDEA 导入后项目结构一片红Tomcat Artifact 里没有可部署的 war/exploded 包所有第三方 jar 都是缺的运行按钮是灰的。原因IDEA 和 Eclipse 的工程模型不同。Eclipse 工程用.classpath文件记录依赖IDEA 则是通过模块和库来管理Web 资源目录的标记方式也不同WebContent在 IDEA 里默认不会被识别成 web 目录。解决如果你不是非要 IDEA我建议直接用 Eclipse 把这个项目跑通省得把时间花在换工具的战斗上。如果必须用 IDEA导入时选择Open定位到工程目录然后在Project Structure Facets里手动添加 Web并将WebContent目录设为 Web 资源目录再在Artifacts里新建 Web Application Exploded把 lib 目录加进去。这个过程里最容易忘的是把WEB-INF/lib下的 jar 添加到模块依赖漏了这一步编译不报错但运行时会说 class not found。6. 让 JSP 系统脱离“教学味”的三个加固技巧跑通和读懂只是开始如果你想把这个作品讲成有实际价值的系统还差最后一步给它做一点符合生产习惯的安全和性能加固。这一章三个技巧都不复杂但对演示效果提升非常明显而且都是答辩老师爱听的点。6.1 用连接池替换 DriverManager解决并发假死DriverManager.getConnection()每次请求都新建物理连接在高并发和频繁请求下会很快占满 MySQL 连接数页面表现为“卡一下然后白屏”。常见做法是引入连接池。用 c3p0 或 dbcp 都可配置一个c3p0-config.xml放在 classpathc3p0-config default-config property namejdbcUrljdbc:mysql://localhost:3306/supermarket/property property namedriverClasscom.mysql.jdbc.Driver/property property nameuserroot/property property namepassword123456/property property namemaxPoolSize20/property property namecheckoutTimeout3000/property /default-config /c3p0-config改造时把DBUtil里的getConnection()替换为new ComboPooledDataSource().getConnection()其余 DAO 代码不用动。这个方法大约十分钟就能完成却能让你讲出“我把系统从单连接升级为连接池”的真实开发动作。6.2 给 SQL 查询统一套一层预编译防线老系统里最容易受攻击的是登录接口。如果原始代码还在用字符串拼接 SQL请全部改写为PreparedStatement。你可以做一个简单的BaseDao封装查询参数public ListMapString, Object query(String sql, Object... args) { try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { for (int i 0; i args.length; i) { ps.setObject(i 1, args[i]); } ResultSet rs ps.executeQuery(); // 转换结果集为 ListMap } catch (SQLException e) { throw new RuntimeException(查询失败, e); } }使用参数占位符后用户的输入永远只会被当作字符串值而不是 SQL 片段注入自然失效。这一步对你来说不仅是个安全补丁也是你在答辩时回答“系统有什么特点”的标准答案之一。6.3 加一条操作日志表让系统能讲出审计故事真实系统都需要记录谁在什么时候改了什么数据。加一张operation_log表成本极低但演示价值高CREATE TABLE operation_log ( id INT PRIMARY KEY AUTO_INCREMENT, operator VARCHAR(50), action VARCHAR(100), target VARCHAR(100), create_time DATETIME DEFAULT CURRENT_TIMESTAMP );在商品新增、修改、删除等 DAO 方法里调用一次插入日志的操作即可。答辩时你可以指着浏览器页面说“系统里的关键操作都会写入审计日志管理员可以追溯商品价格被谁改动过。”一个简单的日志表就能把项目从“会动的作业”变成“有管理思想的系统”。最后说一点我自己的教训。早年我顺手拿到一个类似源码包只顾着跑起来演示被老师一个“你的登录查询存在什么问题”问到哑口无言。后来我养成一个习惯凡是准备拿出去讲的项目先做一遍代码安全检查再做一遍并发小压测哪怕只是用ab工具打上几十个请求都能发现连接池和事务的缺口。先把稳定性和安全问题堵住再谈功能多少。希望帮到你。本文还有配套的精品资源点击获取
返回列表