JSP课程设计CIMS源码详解:分层架构与部署避坑指南 简介基于Java Server PagesJSP技术的CIMS课程设计源码面向高校软件工程、计算机相关专业学生尤其适合正在完成课程设计或需要传统Java Web开发案例的初学者。项目包含212个文件压缩包约15.2MB涵盖JSP视图页面、Java业务逻辑源码、XML配置、JAR依赖库、CSS样式、JavaScript脚本以及SQL数据库脚本等类型配置与静态资源齐全可帮助理解从数据库设计到前端展示的完整开发链路。资源按标准Web工程结构组织清晰展示了控制器、服务层、实体类等分层设计并包含用户管理、客户管理等典型业务模块。已有103人学习使用可作为课程设计与毕业设计参考。学习者可借此掌握JSP动态页面生成、Servlet处理请求、JDBC操作数据库及前端交互实现等关键技能也能为后续开发同类管理信息系统提供可直接借鉴的代码模板与设计思路。1. 基于 Java Server Pages 技术的 CIMS 课程设计源码先看清它要你做什么很多同学拿到“基于 Java Server Pages 技术的 CIMS 课程设计源码”时第一反应是去搜 CIMS 到底指什么。它全称 Computer Integrated Manufacturing System直译是计算机集成制造系统但课程设计一般不会让你去写车间设备控制而是把制造企业的信息管理流程做成一个可运行的 Web 系统用户登录、生产计划、物料库存、工单跟踪。真正决定成绩的往往不是功能多新而是源码分层清楚、关键表之间有外键关系、答辩时每个文件都能说清存在意义。下面内容就围绕这样一份 JSP 课程设计源码展开适合正在赶 Java Web 课设或者需要从网上下载 java 课程设计案例源码来改造的读者。2. 为什么这份 CIMS 源码要用 JSP模块拆分与三层架构选型2.1 课程设计里的 CIMS 不是完整制造系统而是四类业务加四张表在工业软件里CIMS 覆盖 ERP、MES、设备控制做完是一整套大型系统。但 JSP 课程设计通常只要求你实现一个“做得通”的管理信息子系统。我一般会把需求收敛成四类业务用户管理负责登录、退出并区分管理员和普通操作员生产计划管理负责新增计划和查询计划物料库存管理维护物料档案并查看存量工单跟踪查看计划下达后的完成状态。对应的表最少只需要四张t_user、t_plan、t_material和t_work_order。很多网上的课程设计源码在这一层就出问题表之间没有外键生产计划不引用物料库存扣减写死在前台页面里。课程设计的评分点恰恰是“模块之间有没有数据关系”。比如一次新增计划时系统要检查物料库存并扣减而不是把计划表和物料表做成两个孤岛。所以在动手改源码前先画一遍业务关系一条生产计划消耗一种物料物料库存低于最低库存时给出提示。这个关系会决定后续 DAO 方法的数量、Servlet 的跳转方式以及 JSP 页面要展示什么。我用一张验收清单来约束课设工作量也推荐你这么做功能页面入口DAO 方法数据库影响登录login.jspfindByUsernameAndPassword查询 t_user计划列表planList.jspfindAllWithMaterial联表查询 t_plan、t_material新增计划planEdit.jspinsertWithStockCheck插入 t_plan扣减 t_material功能宁可少这条数据链路不能断。只要这三条链路能跑通答辩时的“系统演示”任务就已经完成了大半。2.2 为什么 JSP Servlet JDBC 比 Spring Boot 更适合这个课设如果只追求“能跑”用 Spring Boot 当然也可以但对你手里这类源码并不友好。市面上的 java 课程设计案例源码大量基于 JSP Servlet JavaBean 的老三层结构直接导入 Tomcat 就能启动不需要 Maven 解析几十个依赖也不需要理解启动类上的自动配置。JSP 页面本身是服务端模板浏览器看到的是渲染后的 HTML答辩时你可以直接在页面上说“这一块是 JSP 输出的”比讲一层 Vue 前后端分离省力得多。另外题目写明“基于 Java Server Pages 技术”评分标准里大概率包含 JSP 页面数量、Servlet 跳转、表单处理这些传统 JSP 技术点。用 JSP 是风险最低的选项。我见过不少同学用 Spring Boot 完成课设老师只看了一眼就说“这不是 JSP 题目”最后只能临时补页面得不偿失。JSP 的明显短板是脚本片段一多页面会变成“面条代码”所以下面会反复强调分层把 Java 代码尽量放到 DAO 和 ServletJSP 只负责循环和展示。2.3 Servlet、JavaBean、DAO 的边界一个请求从浏览器到数据库再返回CIMS 源码里最需要理解的是请求流转。一次登录请求的路径是这样浏览器 POST 到/loginTomcat 按WebServlet注解找到 LoginServletServlet 读取表单参数调用 UserDAOUserDAO 里用 JDBC 执行 SQL结果封装成 User 这个 JavaBeanServlet 把 JavaBean 放进 session再重定向到计划列表页。JSP 不在这个链路的开头而是在后端数据准备完之后负责把结果拼成 HTML。我习惯让三种文件各守边界。JavaBean 只有属性和 getter/setter不写业务DAO 只写 SQL 和结果映射Servlet 只做参数校验、调用 DAO、决定跳转JSP 里不出现复杂逻辑。这样划分之后代码量没有减少但每一层的改动都能被定位页面样式变了只改 JSP查询条件变了只改 DAO流程跳转变了只改 Servlet。答辩时被问“每层会不会写重”也可以直接拿这个分层回答。最小 User 实体可以这么写package com.cims.bean; public class User { private Integer id; private String username; private String password; private String role; public Integer getId() { return id; } public void setId(Integer id) { this.id id; } public String getUsername() { return username; } public void setUsername(String username) { this.username username; } public String getPassword() { return password; } public void setPassword(String password) { this.password password; } public String getRole() { return role; } public void setRole(String role) { this.role role; } }这个类没有任何框架注解Tomcat 容器不直接认识它它只是数据载体。课程设计里不引 MyBatis 的情况下所有表查询结果都要手动“set 到这个 POJO”。很多源码会在 DAO 里直接返回 ResultSet 给 JSP 用那样会让 JSP 页面出现rs.next()代码能跑但答辩容易露怯不建议模仿。2.4 表单提交地址别写错相对路径与 JSP 的 contextPath新手最容易翻车的地方其实是 JSP 表单里的地址。登录表单的 action 应该写成% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % !DOCTYPE html html headmeta charsetUTF-8titleCIMS 登录/title/head body form action${pageContext.request.contextPath}/login methodpost 用户名input typetext nameusername / 密码input typepassword namepassword / input typesubmit value登录 / /form /body /html${pageContext.request.contextPath}会动态拼上项目部署路径比如/cims。如果直接写死action/login浏览器会往http://localhost:8080/login发根本到不了你的项目写死/cims/login又会在项目改名后 404。课程设计里的所有表单、链接、sendRedirect都应该用这个表达式拼前缀。这是 JSP 技术里最实用也最容易被忽略的一个细节。项目里通常还会配一个web.xml欢迎页web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee version3.1 display-namecims-course/display-name welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-list /web-app如果登录页放到了WEB-INF目录下欢迎页就不能直接指向它必须通过 Servlet 跳转。我的习惯是登录页放根目录其余受保护页面全部走 Servlet这样权限控制才不会被绕过。3. 拆解 CIMS 源码目录结构、建表脚本与登录链路3.1 先把源码结构对齐包名和 jsp 各管什么一份能让人看懂的 JSP 课程设计源码目录通常长这样cims-course/ ├── src/ │ └── com/cims/ │ ├── bean/ # JavaBean表数据载体 │ │ ├── User.java │ │ ├── Plan.java │ │ └── Material.java │ ├── dao/ # 数据库访问层 │ │ ├── DBUtil.java │ │ ├── UserDAO.java │ │ └── PlanDAO.java │ └── servlet/ # 请求控制层 │ ├── LoginServlet.java │ └── PlanServlet.java ├── WebContent/ │ ├── WEB-INF/ │ │ ├── web.xml │ │ └── lib/ │ │ └── mysql-connector-java-8.0.x.jar │ ├── login.jsp │ ├── index.jsp │ ├── planList.jsp │ └── planEdit.jsp ├── cims.sql └── readme.txt拿到源码后不要先从 login.jsp 看起。我看代码的习惯是反着来先看 cims.sql 弄清有哪些表和字段再看WEB-INF/lib确认 JDBC 驱动版本接着看 DBUtil.java 里的连接串和账号密码最后才看 Servlet 和 JSP。原因简单课程设计源码最常见的坏毛病是“建表脚本都有语法错误”先确认数据库层面能落地比逐行读页面高效。WEB-INF是 JSP 规范里的受保护目录放在里面的 JSP 不能被浏览器直接访问。登录页如果放在WEB-INF下就必须通过 Servlet 跳转来打开。我一般把 login.jsp 放在WebContent根目录需要登录才能看的页面全放在 Servlet 保护下。如果你看到的源码把 index.jsp 放进了WEB-INF记得检查欢迎页配置是不是对不上。3.2 最小建表脚本用户表、物料表、生产计划表下面这个脚本足够支撑登录、计划展示和库存扣减字段命名也方便实体类映射CREATE DATABASE IF NOT EXISTS cims DEFAULT CHARACTER SET utf8mb4; USE cims; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, role VARCHAR(20) DEFAULT operator ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_material ( id INT PRIMARY KEY AUTO_INCREMENT, material_code VARCHAR(50) NOT NULL UNIQUE, material_name VARCHAR(100) NOT NULL, stock INT NOT NULL DEFAULT 0, min_stock INT NOT NULL DEFAULT 10 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_plan ( id INT PRIMARY KEY AUTO_INCREMENT, plan_no VARCHAR(50) NOT NULL UNIQUE, product_name VARCHAR(100) NOT NULL, quantity INT NOT NULL, material_id INT NOT NULL, status VARCHAR(20) DEFAULT pending, create_time DATETIME, CONSTRAINT fk_plan_material FOREIGN KEY (material_id) REFERENCES t_material(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_user (username, password, role) VALUES (admin, 123456, admin);设计上有三个关键点。第一t_plan.material_id必须引用t_material.id这样计划才能和库存数据产生真实关联新增计划时才能带出“这个产品消耗什么物料、库存够不够”的信息。第二status用pending/finished这类短字符串比数字更直观答辩时也好解释。第三字符集统一utf8mb4既能兜住产品名称里的中文也避免后面 JDBC 连接串里 characterEncoding 和表字符集对不上。password字段我写成 64 位就是提醒你课程设计里明文密码能跑但如果想把这套代码放到简历项目至少把密码改成 MD5 或 BCrypt 的哈希。第 6 章会讲权限和事务密码这点先立个规矩不要在课设里留明文密码给老师挑毛病。3.3 登录链路从 JSP 表单到 DAO 查询登录 Servlet 的核心逻辑如下package com.cims.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import com.cims.bean.User; import com.cims.dao.UserDAO; WebServlet(/login) public class LoginServlet extends HttpServlet { private static final long serialVersionUID 1L; Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); UserDAO userDAO new UserDAO(); User user null; try { user userDAO.findByUsernameAndPassword(username, password); } catch (SQLException e) { e.printStackTrace(); request.setAttribute(error, 数据库查询失败请查看控制台日志); request.getRequestDispatcher(/login.jsp).forward(request, response); return; } if (user null) { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(/login.jsp).forward(request, response); } else { request.getSession().setAttribute(user, user); response.sendRedirect(request.getContextPath() /planList); } } }这里有三个设计点。第一request.setCharacterEncoding(UTF-8)必须写在读取参数之前否则中文用户名会乱码。第二结果被分成“查询异常”“无此用户”“成功”三路异常和失败路径用forward回登录页把错误信息塞到 request成功路径用sendRedirect让浏览器重新发起 GET 请求到计划列表避免刷新页面时重复提交登录表单。第三sendRedirect的地址仍然用request.getContextPath()拼接不能写死。DAO 侧的对应实现package com.cims.dao; import java.sql.*; import com.cims.bean.User; public class UserDAO { public User findByUsernameAndPassword(String username, String password) throws SQLException { String sql SELECT id, username, password, role FROM t_user WHERE username ? AND password ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { User user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setPassword(rs.getString(password)); user.setRole(rs.getString(role)); return user; } } } return null; } }用PreparedStatement而不是字符串拼接 SQL是为了避开 SQL 注入。你可以故意在用户名框输入 or 11试试没做参数化的代码直接就能登录答辩时这是送命题。try-with-resources会帮你自动关闭连接、语句和结果集但要注意一点连接关闭得越早后面做事务越受限。所以第 6 章写事务时DAO 里的连接不能自己提前关必须由调用方统一管理。4. 把源码跑起来Eclipse、Tomcat、MySQL 的部署与配置4.1 导入 Eclipse 并挂到 Tomcat完整的项目导入三步老式 JSP 项目在 Eclipse 里的导入路径是固定的。第一步File Import General Existing Projects into Workspace选择源码根目录如果 Eclipse 能识别出项目勾选 Copy projects into workspace 后点 Finish。如果导入后项目没有显示成 Java Web 项目通常是缺少.project和.classpath我会新建一个 Dynamic Web Project再把源码和WebContent按目录拷进去。第二步右键项目Properties Targeted Runtimes勾选你本机的 Tomcat 版本比如 Tomcat v9.0。不勾选的话项目在 Eclipse 里可能不报错但部署到 Tomcat 时找不到javax.servlet相关类。第三步在 Servers 面板新建 Server选择 Apache Tomcat v9.0指定 Tomcat 安装目录然后把项目 Add 到 Configured 列表启动。等控制台出现INFO: Server startup就说明 Tomcat 已经起来了。如果你的源码是 Maven 结构导入方式会不同但课程设计极少用 Maven这里以 Eclipse 传统目录为准。4.2 JDBC 连接参数三处必改改完至少能连上数据库数据库连接的核心全在 DBUtil.javapackage com.cims.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/cims ?useUnicodetruecharacterEncodingutf-8 useSSLfalseserverTimezoneAsia/Shanghai allowPublicKeyRetrievaltrue; private static final String USER root; private static final String PASSWORD 你的MySQL密码; private static final String DRIVER com.mysql.cj.jdbc.Driver; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }三个最容易改错的地方。第一DRIVER字符串。MySQL 8 对应com.mysql.cj.jdbc.Driver老资料里写com.mysql.jdbc.Driver在 MySQL 8 下有时能跑但会有警告反过来驱动 jar 是 5.x却写了cj直接抛ClassNotFoundException。第二serverTimezone。MySQL 8 不带这个参数会报时区错Asia/Shanghai是面向国内服务器的常规值。第三allowPublicKeyRetrievaltrue。MySQL 8 的 caching_sha2_password 认证在非 SSL 连接下需要这个参数不加会报Public Key Retrieval is not allowed这一条在第 5 章还会再展开。密码直接写在源码里不是好习惯但课程设计里能用。更稳妥的做法是维护一个config.properties用类加载器读取演示时可以不解码源码就换密码。你要是怕答辩问安全性至少把账号密码从代码里拆出去这是实际加分点。4.3 初始化数据库命令行导入 cims.sql假设 MySQL 服务已经启动打开终端导入脚本mysql -u root -p -e CREATE DATABASE IF NOT EXISTS cims DEFAULT CHARACTER SET utf8mb4; mysql -u root -p cims /path/to/cims.sql第一条命令建库第二条命令把表结构和初始数据导入 cims 库。Windows 下路径里的反斜杠要改成正斜杠否则重定向会解析失败。如果 cims.sql 里已经写了USE cims;第二条命令的cims参数可以省略但为了明确我每次都会带库名。导入后检查一下USE cims; SHOW TABLES; SELECT * FROM t_user;能看到三张表和一行 admin 用户说明数据库 OK。后续改表结构时建议每次先从备份文件重新导入不要手删手建。课程设计阶段表结构变动频繁手动删表容易漏外键约束留下隐藏故障。4.4 启动验证与 Tomcat 端口调整数据库就绪后访问http://localhost:8080/cims/login.jsp。第一次访问 JSP 会被 Tomcat 编译首屏可能慢两秒。如果出现目录列表而不是登录页说明 web.xml 的欢迎页写成了/login.jsp但文件放在WEB-INF下把 login.jsp 移到WebContent根目录即可。如果 8080 被其他程序占用Tomcat 启动失败控制台报Port 8080 required by Tomcat ... is already in use。解决办法是改Tomcat/conf/server.xml里的连接端口Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /把 port 改成 8088重启 Tomcat 后访问http://localhost:8088/cims/login.jsp。改端口是排查手段不是项目功能答辩时如果现场端口被占改一次即可。5. CIMS 课程设计常见问题排查五个让现场演示翻车的坑5.1 MySQL 8 报 Public Key Retrieval is not allowed换驱动也没用现象Tomcat 启动正常页面也能打开输入 admin 和 123456 点登录后控制台出现Public Key Retrieval is not allowed浏览器停在登录页或直接 500。原因MySQL 8 默认用户使用 caching_sha2_password 认证。客户端在没有 SSL 加密的情况下要取服务器公钥来加密密码而 JDBC 驱动默认禁止这种公钥获取行为。换新版驱动不等于解决认证方式需要在连接参数里显式放开。解决在 JDBC URL 上追加allowPublicKeyRetrievaltrue同时确认 mysql 连接 jar 与服务端 MySQL 大版本不要差太多。我通常直接使用 4.2 节里的完整 URL再把 MySQL 用户的认证插件改成 mysql_native_password 作为后备方案。两个做法在课程设计里都能交差但前者更接近工程习惯。5.2 页面中文全部变问号字符集要四个地方保持一致现象登录页中文正常登录后计划列表里的产品名称显示成问号或者反过来页面源码是 UTF-8数据库里却是 latin1。原因JSP 页面、Servlet 请求、JDBC 连接、MySQL 表字段四个环节只要有一个字符集不一致中文就可能被换码。最常见的是只改了 JSP 的 pageEncoding没改 URL 里的 characterEncoding或者建表用了 latin1。解决按清单逐项对齐。JSP 第一行写contentTypetext/html; charsetUTF-8 pageEncodingUTF-8Servlet 读取参数前写request.setCharacterEncoding(UTF-8)JDBC URL 加useUnicodetruecharacterEncodingutf-8建表统一DEFAULT CHARSETutf8mb4。演示机器上的 MySQL 全局字符集也建议改成 utf8mb4避免某些表继承了服务端老配置。5.3 部署后访问一直 404Context Path 和 Servlet 映射各查一遍现象Tomcat 启动成功但访问http://localhost:8080/cims/planList返回 404login.jsp 正常登录后一跳转又 404。原因Servlet 注解写的是WebServlet(/planList)浏览器地址却漏掉了项目上下文/cims。另一个常见原因是项目被部署成了别的名字比如 cims-courseContext Path 不再是 cims。解决先看控制台启动日志确认实际路径再统一用${pageContext.request.contextPath}拼页面里的链接和sendRedirect地址不要在 HTML 和 Java 代码里写死/cims。如果是 Eclipse右键项目Properties Web Project Settings能直接改 Context root。5.4 JSP 编译报错找不到 javax.servlet项目缺 Tomcat 运行时现象项目里所有 Servlet 和 JSP 文件都画红叉提示The import javax.servlet cannot be resolved但 Tomcat 控制台没有错误。原因项目的编译路径没有加入 Tomcat 运行时。Eclipse 里服务器运行时和 JRE 是分开配置的必须显式把 Tomcat 提供的 servlet-api 加到项目的 Build Path。解决项目右键Build Path Configure Build Path Libraries Add Library Server Runtime选择本机配置的 Tomcat。直接下载一个javax.servlet-apijar 放到 WEB-INF/lib 也能消除红叉但用 Server Runtime 更干净部署时不会把这个 jar 复制到服务器。不要从 Tomcat 安装目录把 servlet-api.jar 复制到项目 lib 里容易和容器版本冲突。5.5 表单刷新重复提交数据POST 后要用重定向而不是转发现象登录成功后按 F5浏览器提示重新发送表单新增计划时连续提交数据库里出现多条相同记录。原因Servlet 在写库后使用request.getRequestDispatcher(/xxx.jsp).forward(...)地址栏不变浏览器刷新会重放上一次 POST。登录成功、新增计划、修改状态这些写操作最容易踩到。解决使用 Post/Redirect/Get 模式。登录成功或数据写库后用response.sendRedirect(request.getContextPath() /planList)让浏览器发新的 GET 请求只有表单校验失败时才 forward 回原页面并展示错误。还可以在 JSP 里用一次性 token 防双点提交课设不要求但能在答辩时显得你考虑过重复提交问题。6. 让 CIMS 源码在答辩里更像自己写的权限过滤和事务补偿6.1 加一个登录过滤器堵住“绕过登录直接访问”课设演示时有人会登录后直接输入planList.jsp的地址访问页面。如果没做权限控制别人不登录也能看到数据。加一个 Filter 并不难package com.cims.filter; import java.io.IOException; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.*; WebFilter(/plan/*) public class LoginFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) res; HttpSession session request.getSession(false); if (session null || session.getAttribute(user) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(request, response); } }WebFilter(/plan/*)只拦以 /plan 开头的路径这是我有意约定的计划相关 Servlet 统一放在/plan/xxx下过滤器就能覆盖。如果你把受保护页面散落在根目录 JSPFilter 拦不住因为直接访问 JSP 不经过/plan/*映射。更稳的做法是让受保护页面全部通过 Servlet 转发JSP 放WEB-INF外部永远无法直接访问。6.2 把“创建计划 扣库存”放进一个事务如果 CIMS 只剩下单表 CRUD答辩会显得没有业务逻辑。一个常见加分业务是新增生产计划时同时扣减物料库存任何一个操作失败都不能生效。用 JDBC 手写事务Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); PlanDAO planDAO new PlanDAO(conn); MaterialDAO materialDAO new MaterialDAO(conn); planDAO.insert(plan); materialDAO.decreaseStock(plan.getMaterialId(), plan.getQuantity()); conn.commit(); } catch (SQLException e) { if (conn ! null) { conn.rollback(); } throw e; } finally { if (conn ! null) { conn.setAutoCommit(true); conn.close(); } }这段代码把 Connection 从 DAO 私有方法提升到调用层让两个 DAO 共享同一个连接。三个细节值得记setAutoCommit(false)必须在第一条 SQL 之前commit放在所有 DAO 调用之后finally 里要恢复自动提交再关连接。很多参考代码只在 catch 里 rollback忘记 setAutoCommit(true)连接带着半事务状态回到池里下一次查询就会卡住。这几件事做完源码就不再是“登录加增删改查”。我自己的习惯是答辩前把边界情况全预演一遍物料不够怎么办连接中断怎么办用户直接输入后台 URL 怎么办把这些场景对应到代码里比背十张表结构更能说明项目是你自己改的。希望帮到你。本文还有配套的精品资源点击获取