ARTICLE DETAIL

资讯详情

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

从课设源码到运行避坑:JavaWeb超市订单管理系统的JSP+Servlet实战

从课设源码到运行避坑:JavaWeb超市订单管理系统的JSP+Servlet实战 简介基于Javaweb的超市订单管理系统项目源码是一套达到95分以上课程设计水平的高分参考实现代码完整适合高校Java Web课设、毕业设计或自学练习。系统围绕超市订单管理核心业务展开覆盖订单处理、基础数据维护、权限控制等常见功能场景采用基于JSPServletJDBC的经典分层设计前端页面与后端控制逻辑清晰便于理解完整的Java Web请求处理流程。资源压缩包共包含135个文件核心文件类型有24个Java源文件、24个JSP页面、25个JavaScript脚本、9个CSS样式和10个JAR依赖包另有3个SQL数据库脚本、界面截图、字体图标等辅助内容整体仅2.69MB小巧完整。项目中SQL脚本可快速初始化数据库表格和测试数据页面样式整合了layui等常用组件界面简洁统一后端Servlet和DAO层代码规范适合作为模板进行功能扩展。目前已有281人学习浏览适合需要快速落地课设并深入学习订单流水的Java学习者。1. 拿到一份“超市订单管理系统”课设源码第一步不是跑起来而是搞懂它每年毕设和课设季都会有一批人下载“基于Javaweb的超市订单管理系统源码数据库”这类压缩包。解压后里面通常是整套 JSP 页面、Servlet 类、DAO 层和一个 init.sql运气好还带一份写好的课设报告。问题在于这种项目压缩包如果只是原样导入 IDEA 再点运行八成会卡在环境配置上即使跑起来了答辩时被问“订单状态是怎么流转的”也可能答不上来。这篇就按我做课设指导最常见的路径来讲先拆技术栈和目录再理数据库设计然后把 JDBC 到 JSP 的请求链路走一遍最后把运行时的坑一次性避开。文章覆盖的落点不是“看一遍就懂”而是“照着做就能复现”适合 JavaWeb 课程设计、期末项目以及第一次接触完整 Web 项目的初学者。2. 项目结构和技术选型为什么课设用 JSPServlet 最稳2.1 为什么 JSPServletMySQL 是课设最不容易翻车的组合市面上 Java 后端方案很多Spring Boot 现在也进了不少高职和本科课堂但超市订单管理系统这种课设选题我仍然建议优先用 JSP Servlet MySQL。理由很现实课设的核心是“你能讲清楚”不是“用了多新的框架”。Spring Boot 自动配置太多学生把项目跑起来后连请求怎么进 Controller 的链路都说不清答辩被追问两句就容易露馅。JSP Servlet 的好处是请求链路短浏览器发请求Tomcat 找到对应的 ServletServlet 调 DAO 查 MySQL再把结果塞进 request 域转发给 JSPJSP 渲染完返回到浏览器。整条链路每一环都能在代码里找到实体老师问“这个页面数据从哪来的”都是可以指着代码讲的。而且课程大纲里往往明确写了 Servlet、JSP、JDBC 这几个知识点用这个组合属于“踩在大纲上做项目”评分不会低。另外一个容易被忽略的点是项目体积。一套完整的超市订单管理系统用 JSPServlet 写大概 20 到 30 个 Java 文件加上 JSP 页面结构很清楚。换成 Spring Boot 就要多包一层 starter 依赖和自动配置课设报告里“系统架构”那部分反而不好写。还有一点关于依赖管理很多下载到的课设源码不带你熟悉的 Maven 工程结构而是直接把一堆 jar 放在 WebContent/WEB-INF/lib 下。别急着嫌弃这种“扁平式”依赖对课设反而是优势——不依赖外网仓库拷到哪都能编译。2.2 IDEA 运行 Javaweb 项目配置Tomcat、JDK 版本与启动顺序拿到源码后的第一个动作别急着点 Run先把三个东西确认好JDK 版本、Tomcat 版本、Artifacts 配置。我一般按这个顺序做先看java -versionJDK 8 和 JDK 11 都能跑这类项目但注意 Tomcat 版本要匹配。Tomcat 8.5 对应 JDK 8 没问题Tomcat 9 也能用 JDK 8但如果你系统里是 JDK 17建议装 Tomcat 9.0.xTomcat 7 在 JDK 17 上会因为模块访问问题直接启动失败。IDEA 里运行 JavaWeb 项目的配置路径是Run - Edit Configurations - 左上角加号 - Tomcat Server - Local。注意不是加 “Application” 那种普通配置。选好本地 Tomcat 路径后切到 Deployment 页签把 Artifact 添加进去Application context 统一写成/supermarket这样访问路径就是http://localhost:8080/supermarket。然后是 Artifacts。打开 Project Structure - Artifacts确认有没有一个 Exploded 类型的 war 包。没有就手动加点加号 - Web Application: Exploded - From Modules把模块关联上。这里常见的错误是页面能打开但 CSS 和图片 404多半是 Artifacts 里没有把 Web 资源目录标进去。正常结构应该是Artifact 的根目录下有WEB-INF、jsp、static这些文件夹而不是把src或sql目录也打进去。第三个容易忽略的是web.xml所在位置。Servlet 3.0 以上支持注解也支持 web.xml但如果你用的是注解方式而 web.xml 版本写得低于 2.5Tomcat 可能会按 2.3 的老模式解析导致WebServlet不生效。这个坑我放在第 5 章专门说但配置环境时先确认WebContent/WEB-INF/web.xml存在且文件头声明的是 3.0 或更高版本。2.3 拿到源码后的目录检查清单src、WebContent、lib 和 sql 缺一不可不管源码是从什么渠道来的先按下面的结构核对一遍。一个“95 分以上”的课设项目目录上至少该有这四块supermarket/ ├── sql/ # 数据库脚本通常叫 init.sql 或 supermarket.sql │ └── init.sql ├── src/ # Java 源码按 com.xxx.util / dao / servlet 分包 │ ├── com/supermarket/util/ │ ├── com/supermarket/dao/ │ ├── com/supermarket/servlet/ │ └── com/supermarket/model/ └── WebContent/ # Web 根目录 ├── META-INF/ ├── WEB-INF/ │ ├── lib/ # 依赖 jar 包 │ └── web.xml ├── jsp/ # 页面文件 └── index.jsp如果下载的包解压后只有源码没有 sql 脚本或者只有 sql 没有 Java 源码那后面所有步骤都走不通。验证目录最简单的方式是用命令行tree -L 2 -d supermarket/没有 tree 命令就在资源管理器里看。检查优先级最高的是WEB-INF/lib里有没有 mysql 驱动 jar驱动都缺的话项目跑起来后第一个报错就是ClassNotFoundException: com.mysql.cj.jdbc.Driver。这个结构同时也是一个“自查清单”如果某个下载包把 Java 源码塞在别的位置或者 JSP 页面全部放在根目录而没有 jsp 子目录建议重新整理一下。别嫌麻烦整理目录的过程其实就是熟悉项目的过程答辩时被问到“项目结构是怎样的”你能直接画出这个图加分效果比多写十行代码都强。3. 数据库六张核心表从建库 SQL 到订单流转的增删改查3.1 主数据表管理员、供应商、商品、客户超市订单管理系统说到底就是围绕“谁在卖、卖什么、卖给谁、谁来审批”四个问题转。大多数课设源码的数据库都不会少于四张主数据表admin_info管理员表负责登录后台、审核订单supplier_info供应商表记录商品从哪进货goods_info商品表商品名称、分类、进价、售价、库存customer_info客户表收货人、联系电话、配送地址。建表 SQL 是整套系统的基础也是课设报告里“数据库设计”章节直接用得上的内容。我用 MySQL 8 为例注意字符集要明确写成 utf8mb4避免中文乱码CREATE DATABASE IF NOT EXISTS supermarket DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; USE supermarket; CREATE TABLE admin_info ( admin_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 管理员编号, login_name VARCHAR(50) NOT NULL UNIQUE COMMENT 登录账号, password VARCHAR(64) NOT NULL COMMENT 密码, real_name VARCHAR(50) COMMENT 真实姓名, role VARCHAR(20) DEFAULT ADMIN COMMENT 角色 ) ENGINEInnoDB COMMENT管理员表; CREATE TABLE supplier_info ( supplier_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 供应商编号, supplier_name VARCHAR(100) NOT NULL COMMENT 供应商名称, contact VARCHAR(50) COMMENT 联系人, phone VARCHAR(20) COMMENT 联系电话, address VARCHAR(200) COMMENT 地址, status TINYINT DEFAULT 1 COMMENT 1启用 0停用 ) ENGINEInnoDB COMMENT供应商表; CREATE TABLE goods_info ( goods_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 商品编号, goods_name VARCHAR(100) NOT NULL COMMENT 商品名称, category VARCHAR(50) COMMENT 分类如饮料/日用品, supplier_id INT COMMENT 供应商编号, price DECIMAL(10,2) COMMENT 售价, stock INT DEFAULT 0 COMMENT 库存, status TINYINT DEFAULT 1 COMMENT 1上架 0下架 ) ENGINEInnoDB COMMENT商品表; CREATE TABLE customer_info ( customer_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 客户编号, customer_name VARCHAR(50) NOT NULL COMMENT 客户名称, phone VARCHAR(20) COMMENT 联系电话, address VARCHAR(200) COMMENT 配送地址, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) ENGINEInnoDB COMMENT客户表;登录名和密码字段建议用login_name而不是username因为username在部分 MySQL 版本里没有保留字问题但在拼接 SQL 时容易和其他上下文混淆。密码字段长度给 64 是为了兼容 MD5 或 SHA-256 加密后的长度如果源码里用明文存储至少留一个改造成加密的空间。3.2 订单主表与明细表为什么要拆两张表订单模块是这个系统的核心也是评分老师一定会看的地方。订单主表存一次订单的总体信息明细表存这个订单买了哪些商品、各买多少、当时成交价是多少。拆开的原因很直接一个订单可能包含多件商品如果所有商品都塞在主表的一行里要么字段重复设计要么就得用逗号拼接商品 ID查询和统计都很难做。主表与明细表的标准 SQL 如下CREATE TABLE order_info ( order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 订单编号, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT 订单号业务编号, customer_id INT NOT NULL COMMENT 客户编号, total_amount DECIMAL(10,2) DEFAULT 0 COMMENT 订单总金额, status TINYINT DEFAULT 0 COMMENT 0待审核 1已通过 2已出库 3已完成 4已取消, remark VARCHAR(255) COMMENT 备注, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 下单时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 ) ENGINEInnoDB COMMENT订单主表; CREATE TABLE order_item ( item_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 明细编号, order_id INT NOT NULL COMMENT 订单编号, goods_id INT NOT NULL COMMENT 商品编号, quantity INT NOT NULL DEFAULT 1 COMMENT 购买数量, price DECIMAL(10,2) COMMENT 成交单价, amount DECIMAL(10,2) COMMENT 小计金额 ) ENGINEInnoDB COMMENT订单明细表;订单号order_no和主键order_id分开是我特意推荐的做法。主键自增编号用来做表关联订单号对外展示可以用时间戳加随机数生成比如20250615143000001。这样有两个好处对外看不出系统每天有多少订单以后做订单号查重也方便。回答老师“为什么有两个编号”时也能作为设计亮点。明细表里的price字段存的是“成交单价”不是“商品当前售价”。这是因为商品售价以后可能调而历史订单里的价格不应该跟着变。这个细节在课设报告里写一句“记录下单时的快照价格”能看出你理解了一致性设计属于典型的加分操作。3.3 写一份可直接导入的 init.sql外键关系与演示数据一份合格的课设脚本要有外键、索引、演示数据和导入验证命令。很多源码的 SQL 脚本里只有 create 语句没有 insert 数据导入后页面上什么都查不到容易误判是项目坏了。我建议自己补一份演示数据每种表至少插入 3 到 5 条记录订单至少要有“待审核”“已通过”“已完成”三种状态各一条这样前端每个状态页面都有数据可以展示。给订单相关表补数据时注意先插主表拿到自增的order_id再插明细表。可以直接写死数值脚本一次跑完示例INSERT INTO admin_info (login_name, password, real_name) VALUES (admin, admin123, 系统管理员); INSERT INTO supplier_info (supplier_name, contact, phone) VALUES (华南食品供应商, 张经理, 13800000001); INSERT INTO goods_info (goods_name, category, supplier_id, price, stock) VALUES (农夫山泉550ml, 饮料, 1, 2.50, 200), (乐事薯片原味, 零食, 1, 6.90, 120); INSERT INTO customer_info (customer_name, phone, address) VALUES (李四, 13900000001, 幸福小区3栋101); INSERT INTO order_info (order_no, customer_id, total_amount, status) VALUES (20250610001, 1, 13.80, 1); INSERT INTO order_item (order_id, goods_id, quantity, price, amount) VALUES (1, 2, 2, 6.90, 13.80);导入命令用 MySQL 客户端直接执行mysql -u root -p init.sql导入后一定要验证不要急着启动 Tomcat。按顺序执行下面三条命令USE supermarket; SHOW TABLES; SELECT o.order_no, c.customer_name, o.total_amount, o.status FROM order_info o JOIN customer_info c ON o.customer_id c.customer_id;能查出数据说明建库、外键、数据三个环节都正常。这一套验证下来以后项目里页面查不到订单时你就能分清是数据库的问题还是 Java 代码的问题而不是两眼一抹黑瞎调试。4. 请求链路怎么写JDBC、Servlet 到 JSP 的完整代码4.1 JDBC 连接参数中文乱码与 MySQL 8 驱动是两个必踩点先把数据库连接工具类写好这是所有 DAO 类都要依赖的入口。下面这个JdbcUtil是课设里能直接替换到项目里的标准写法package com.supermarket.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JdbcUtil { // 如果 MySQL 是 5.7把 com.mysql.cj.jdbc.Driver 换成 com.mysql.jdbc.Driver private static final String DRIVER com.mysql.cj.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/supermarket ?useUnicodetruecharacterEncodingutf8 useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD root; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println(MySQL 驱动加载失败请检查 WEB-INF/lib 下是否有 mysql-connector jar 包); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这三个参数值得记一下useUnicodetruecharacterEncodingutf8少了任何一个页面上输入的中文存进数据库就变成问号serverTimezoneAsia/Shanghai是 MySQL 8 的强制要求不写会报时区错误useSSLfalse避免 MySQL 8 在本地连接时做 SSL 握手警告。密码建议从单独的配置读取但课设阶段直接写在常量里问题不大。答辩被问“这样写安全吗”时如实说“课设环境生产环境应该把配置外置到 properties 文件”即可这反而是懂行的表现。4.2 用 BaseServlet 统一处理请求分发避免 Controller 里一堆 if同一个 Servlet 里往往要处理多个动作比如订单模块要有“查询列表”“审核通过”“查询明细”三个操作。新手写法是在doGet里用 if 判断参数三个操作写出来还算能看等系统做到供货商模块、商品模块时每个 Servlet 里都是嵌套 if维护起来很痛苦。更简洁的方案是抽一个 BaseServlet利用反射把 action 参数映射成方法名package com.supermarket.servlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; public class BaseServlet extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) { String action req.getParameter(action); try { // 约定页面传过来的 action 值和方法名保持一致 Method method this.getClass().getMethod(action, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, resp); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(找不到对应的方法请检查 action 参数 action); } } }这段代码要配合一个约定请求 URL 写成orderServlet?actionaddOrder那么OrderServlet里就必须有一个addOrder(HttpServletRequest, HttpServletResponse)方法。方法名和 action 参数不一致时反射会直接报NoSuchMethodException这个异常信息比 if 分支的 404 好排查得多。4.3 订单列表、审核和明细查询三个核心接口的实现订单模块的 Servlet 继承 BaseServlet然后按业务动作写方法。下面这个例子只保留核心逻辑DAO 层的方法名与实现类保持一致package com.supermarket.servlet; import com.supermarket.dao.OrderDao; import com.supermarket.entity.OrderInfo; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; WebServlet(/orderServlet) public class OrderServlet extends BaseServlet { private OrderDao orderDao new OrderDao(); // 进入订单管理页 public void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String keyword req.getParameter(keyword); ListOrderInfo orders orderDao.findByCondition(keyword); req.setAttribute(orders, orders); req.getRequestDispatcher(/jsp/order/list.jsp).forward(req, resp); } // 订单明细页 public void detail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int orderId Integer.parseInt(req.getParameter(orderId)); req.setAttribute(order, orderDao.findById(orderId)); req.setAttribute(items, orderDao.findItems(orderId)); req.getRequestDispatcher(/jsp/order/detail.jsp).forward(req, resp); } // 审核通过把状态从 0 改成 1 public void audit(HttpServletRequest req, HttpServletResponse resp) throws IOException { int orderId Integer.parseInt(req.getParameter(orderId)); orderDao.updateStatus(orderId, 1); resp.sendRedirect(orderServlet?actionlist); } }resp.sendRedirect和forward的区别是课设常见追问点。这里用 redirect 是因为审核完成后要重新查一次列表数据重新经过一次完整的 Servlet 生命周期能保证列表刷新用 forward 的话地址栏不会变刷新页面会重复提交表单。回答“为什么不直接 forward 到 list.jsp”时能说出“重定向避免表单重复提交”说明你对 HTTP 状态码是有概念的。JSP 列表页只做渲染不要写 Java 业务代码。数据已经从 Servlet 放进了 request 域JSP 里用 JSTL 循环输出即可% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table trth订单号/thth客户/thth金额/thth状态/thth操作/th/tr c:forEach items${orders} varorder tr td${order.orderNo}/td td${order.customerName}/td td${order.totalAmount}/td td c:choose c:when test${order.status 0}待审核/c:when c:when test${order.status 1}已通过/c:when c:when test${order.status 2}已出库/c:when c:otherwise已完成/c:otherwise /c:choose /td /tr /c:forEach /table状态字段用数字存而不是直接存“待审核”三个字这是数据库设计的基本功。页面用c:choose把数字翻译成文字以后想加“已退款”这种新状态数据库表不用改只改页面和常量类就够了。5. 课设运行避坑IDEA、Tomcat、MySQL 编码的五个血泪现场5.1 现象项目一启动 Tomcat 报错控制台看不到任何异常原因很多人下载源码后直接右键 Java 文件选 Run而不是通过 Tomcat 启动。JavaWeb 项目必须部署在 Web 容器里运行普通 main 方式是起不来的。还可能是因为 Tomcat 版本和项目编译级别不匹配比如用 JDK17 跑 Tomcat7启动日志会直接刷Unable to load class。解决先确认 Run/Debug Configurations 里配置的是 Tomcat Server不是 Application。然后到 File - Project Structure 检查 Module 的语言级别Language Level和 JDK 版本。最后到控制台看 Tomcat Localhost Log 标签页这里有完整的部署日志。如果启动还是失败把 Tomcat 换到 8.5 或 9.0不要在一个版本上死磕。5.2 现象页面上中文正常但数据库里显示“??”原因链接数据库时没有指定字符集编码或者表结构字符集不是 utf8。JDBC URL 里少了characterEncodingutf8是最常见情况其次是建库语句没写DEFAULT CHARSET utf8mb4MySQL 回退到默认的 latin1。解决第一步确认 JdbcUtil 里的 URL 是否带完整参数参考 4.1 节的代码。第二步确认建库脚本里写了DEFAULT CHARSET utf8mb4。第三步如果已经导入的库字符集不对临时补救可以执行ALTER DATABASE supermarket CHARACTER SET utf8mb4;但最稳的方式是删库重新导入一遍干净的脚本。5.3 现象lib 目录下有 jar 包但代码里 import 不到类原因IDEA 里 jar 包放在WEB-INF/lib下方只是一个文件IDE 不会自动把它加入编译路径。这是 Maven 用户最容易忽略的问题IDEA 对 Maven 依赖是自动识别的但对普通 lib 目录不自动处理。解决在 Project Structure - Libraries 里把WEB-INF/lib整个目录添加为 Java 库。或者更简单的做法在 IDEA 左侧目录树里右键WEB-INF/lib选择 Add as Library然后在弹窗里选 Project 级别确定后重新 Build。注意这一步必须在写代码之前完成否则每写一行新引用都报红。5.4 现象MySQL 8 连接报Public Key Retrieval is not allowed原因MySQL 8 默认使用caching_sha2_password身份认证JDBC 驱动第一次连接时拿不到服务端公钥就会抛这个异常。任何项目里连接 MySQL 8 都会遇到和代码本身无关。解决在 JDBC URL 末尾追加allowPublicKeyRetrievaltrue完整参数变成jdbc:mysql://localhost:3306/supermarket?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai。这是驱动层面为本地连接提供的机制课设环境下允许这么做生产环境会用 SSL 证书替代。5.5 现象JSP 页面里的${name}原样输出没有被解析原因web.xml的版本声明太旧解析到了 2.3。在 Servlet 2.3 规范中 EL 表达式默认不启用${}会被当成纯文本输出。Tomcat 也懒得管直接按旧规范处理页面。解决把web.xml的根标签替换成 Servlet 4.0 规范的版本。在 IDEA 里打开WebContent/WEB-INF/web.xml将web-app根元素的版本和 schema 地址改掉web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4.0.xsd version4.0如果你用的是注解方式WebServlet连web.xml都可以不声明直接用注解。但为兼容一些老项目里的 Filter 配置web.xml 保留且版本写高一些是更省事的做法。这五个问题基本覆盖了课设运行阶段 80% 的报错。要是还遇上别的记住一个通用排除顺序先看 IDEA 的控制台报错再去看 Tomcat 的日志最后看 MySQL 的字符集别跳层排查。6. 答辩前值得加的三处升级趋势报表、接口返回 JSON 与自测脚本评分拿 95 分以上的项目除了基础功能完整通常还要有两三个“超出课设要求”的亮点。这里说三个改动量小、答辩价值高的方向。第一个是报表统计。用 SQL 按月份汇总订单数量与销售金额做成一个 JSP 柱状图或表格页面。SQL 就三条SELECT DATE_FORMAT(create_time, %Y-%m) AS month, COUNT(*) AS order_count, SUM(total_amount) AS total_amount FROM order_info WHERE status IN (1, 2, 3) GROUP BY DATE_FORMAT(create_time, %Y-%m) ORDER BY month DESC;注意统计的是有效订单状态 0待审核和 4取消不应该计入销售额。答辩时能说出这层过滤逻辑比直接把所有订单都加一遍要专业。第二个是把订单接口改成返回 JSON给以后扩展留路。在 OrderServlet 里增加一个listJson方法返回application/json而不是转发到 JSPpublic void listJson(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType(application/json;charsetutf-8); ListOrderInfo orders orderDao.findByCondition(null); resp.getWriter().write(new com.fasterxml.jackson.databind.ObjectMapper() .writeValueAsString(orders)); }页面端以后想用 Vue 或原生 JS 重写直接调这个接口就行Servlet 端不用动。这是典型的“前后端分离预留”写法课设报告里加一句“系统支持以 JSON 方式对外提供数据接口”含金量立刻不一样。第三个是自测脚本。课设答辩前用下面两条命令快速检查代码质量可以在三分钟内发现明显的遗漏find src -name *.java | xargs wc -l | tail -1 grep -rn System.out.println src --include*.java | wc -l第一行统计 Java 源码总行数你自己心里对项目规模有数第二行统计调试输出个数答辩时被打断切到代码页面会看到干净的编程习惯。建议把第二行的结果压到 0 或个位数排查用的输出在提交前全部清理掉。以上三处改动加起来不会超过半天时间但答辩时的观感完全不同。我当年做课设时只顾着让功能跑通没注意编码规范结果演示完被老师指着一处写死的密码问“这个怎么不加密”愣了几秒只能承认偷懒。其实在提交前花十分钟把敏感信息挪到常量类、把调试输出清干净就能避免这种尴尬。希望这篇能帮你少走这些弯路祝跑通顺利。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表