简介本资源是一套面向Java初学者与课程设计实践者的完整Web项目案例聚焦手机销售业务场景基于JSP动态网页技术与Access轻量级数据库实现全栈功能闭环。资源包共含项目报告、开题报告、需求分析说明书、详细设计说明书、数据库设计说明书、测试计划及可运行源代码等核心交付物覆盖从需求定义、系统设计到编码实现与验证的全流程特别适合高校计算机专业学生开展课程设计、毕业设计前期训练或Java Web入门实战。压缩包为ZIP格式大小2.26MB文件以JSP页面、ASP脚本含数据库连接逻辑、Word文档含ER图、用例描述、界面原型为主结构清晰、注释完整便于逐模块理解MVC雏形与前后端交互逻辑。目前已有76人学习下载读者可直接部署运行系统掌握JSP嵌入式开发、Access表结构设计、库存/订单/用户管理等典型业务实现并复用文档模板提升工程化表达能力。1. 为什么一个“过时组合”反而成了毕设高分利器JSPAccess手机销售系统的真实交付逻辑你可能第一眼看到“JSP Access”就皱眉——这不都是十年前的技术栈吗Tomcat 7 都快进博物馆了还拿 Access 做后台但恰恰是这个组合在高校课程设计、本科毕设场景里连续五年稳居“答辩通过率TOP3”和“文档完整性评分榜首位”。原因很实在它不追求高并发、不拼微服务、不卷云原生而是死死卡在教学闭环的黄金交点上——零环境依赖、全链路可见、每行代码都能讲清来龙去脉。这个手机销售系统不是为上线而生它是为“让导师一眼看懂你干了什么”而设计的用户登录怎么校验库存扣减怎么防超卖订单生成后数据怎么落库所有逻辑都摊开在 .jsp 文件里数据库表结构直接双击 .mdb 就能打开验证。它适合三类人Java 初学者需要第一个可运行的 Web 全栈项目课设/毕设时间紧24周、要快速出报告源码演示视频的学生还有带过十几届毕业设计的某高校实验室导师——他们最怕学生用 Spring Boot 写出一堆注解却说不清 IOC 容器在哪初始化。这套方案就是给“讲得清、跑得通、交得齐”量身定做的最小可行交付体。2. 总体架构设计B/S三层结构与五个核心模块的职责边界这个系统没有微服务拆分没有网关层甚至没用 MVC 框架但它严格遵循经典 B/S 三层结构表现层JSP 页面、业务逻辑层JavaBean JSP Scriptlet、数据访问层JDBC-ODBC 桥接。这种“裸写”方式看似原始实则是教学场景下的最优解——学生能清晰看到请求从浏览器发出到 Tomcat 解析 JSP再到 Java 代码调用 JDBC 执行 SQL最后把 ResultSet 绑定到 HTML 表格的完整链条。所有模块均围绕手机销售主流程展开不堆砌功能不引入冗余组件。2.1 用户权限模块基于 Session 的轻量级角色控制系统仅定义两类角色普通用户可浏览、下单、查订单和管理员可增删改商品、管理库存、查看销售报表。权限控制不依赖框架全部由 JSP 脚本完成% String role (String) session.getAttribute(userRole); if (admin.equals(role)) { // 显示管理菜单栏 % lia hrefadmin/product_list.jsp商品管理/a/li lia hrefadmin/sales_report.jsp销售统计/a/li % } else { // 普通用户菜单 % lia hrefuser/order_history.jsp我的订单/a/li % } %提示session.getAttribute(userRole)是整个权限体系的唯一信任源。登录成功后必须在此处显式设置且后续所有敏感操作如删除商品都需重复校验该值。切勿只在菜单层做隐藏后端接口必须二次拦截。该模块的核心设计意图是让学生理解“状态保持”的本质——不是靠框架自动注入而是手动维护HttpSession生命周期。登录验证逻辑封装在LoginServlet.java中其关键校验段如下// LoginServlet.java 片段 String sql SELECT * FROM users WHERE username? AND password?; PreparedStatement pstmt conn.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, password); // 注意此处应为加密比对但教学项目常简化为明文见避坑章节 ResultSet rs pstmt.executeQuery(); if (rs.next()) { session.setAttribute(userId, rs.getString(id)); session.setAttribute(userName, rs.getString(username)); session.setAttribute(userRole, rs.getString(role)); // 关键角色信息存入Session response.sendRedirect(index.jsp); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); }参数说明rs.getString(role)直接读取 Access 表users中的role字段文本型值为admin或user。这种硬编码角色值虽不满足生产安全要求但在教学环境中极大降低了理解门槛——学生能直接在 Access 里修改用户表字段立刻看到权限变化形成强反馈闭环。2.2 商品管理模块CRUD 操作与库存联动机制该模块由管理员专属页面驱动核心是product_list.jsp列表页、product_add.jsp新增页、product_edit.jsp编辑页及ProductServlet.java统一处理增删改。所有操作均通过 JDBC 执行标准 SQL无 ORM 映射。新增商品的关键逻辑在于库存初始值校验与数据库事务保障// ProductServlet.java - addProduct 方法片段 String sql INSERT INTO products (name, brand, model, price, stock, description) VALUES (?, ?, ?, ?, ?, ?); PreparedStatement pstmt conn.prepareStatement(sql); pstmt.setString(1, request.getParameter(name)); pstmt.setString(2, request.getParameter(brand)); pstmt.setString(3, request.getParameter(model)); pstmt.setDouble(4, Double.parseDouble(request.getParameter(price))); pstmt.setInt(5, Integer.parseInt(request.getParameter(stock))); // 库存必须为整数 pstmt.setString(6, request.getParameter(description)); int rows pstmt.executeUpdate(); if (rows 0) { request.setAttribute(msg, 商品添加成功); } else { request.setAttribute(msg, 商品添加失败); } request.getRequestDispatcher(product_list.jsp).forward(request, response);设计说明stock字段在 Access 表中定义为Number (Integer)类型因此setInt()强制类型转换是必要的。若用户输入非数字字符parseInt()会抛出NumberFormatException此时需在try-catch中捕获并返回友好提示实际项目中已补全该异常处理见源码ProductServlet.java第 87 行起。这种“手动类型转换显式异常捕获”的写法比 MyBatis 自动映射更能暴露数据流转中的脆弱点是调试教学的重点环节。2.3 订单处理模块下单原子性与状态机设计订单模块是系统业务复杂度最高的部分涉及用户选择商品、填写收货信息、生成订单号、扣减库存、更新订单状态五个动作。为保证数据一致性采用单次 HTTP 请求内完成全部操作不引入消息队列或定时任务。订单号生成规则为ORD_YYYYMMDD_HHMMSS_XXXX如ORD_20240520_143022_8921其中末四位为随机数防重// OrderServlet.java 片段 String orderNo ORD_ new SimpleDateFormat(yyyyMMdd_HHmmss).format(new Date()) _ String.format(%04d, new Random().nextInt(10000));库存扣减与订单插入必须在同一事务中完成conn.setAutoCommit(false); // 关闭自动提交 try { // 1. 扣减库存 String updateStockSql UPDATE products SET stock stock - ? WHERE id ?; PreparedStatement psStock conn.prepareStatement(updateStockSql); psStock.setInt(1, quantity); psStock.setString(2, productId); int stockRows psStock.executeUpdate(); if (stockRows 0 || getStock(conn, productId) 0) { // 二次校验库存是否充足 throw new RuntimeException(库存不足); } // 2. 插入订单主表 String insertOrderSql INSERT INTO orders (order_no, user_id, total_amount, status, create_time) VALUES (?, ?, ?, ?, ?); PreparedStatement psOrder conn.prepareStatement(insertOrderSql, Statement.RETURN_GENERATED_KEYS); psOrder.setString(1, orderNo); psOrder.setString(2, userId); psOrder.setDouble(3, totalAmount); psOrder.setString(4, pending); // 初始状态 psOrder.setTimestamp(5, new Timestamp(System.currentTimeMillis())); psOrder.executeUpdate(); // 3. 获取生成的 order_id 插入订单明细表 ResultSet rsKeys psOrder.getGeneratedKeys(); if (rsKeys.next()) { String orderId rsKeys.getString(1); insertOrderItems(conn, orderId, cartItems); // 插入明细 } conn.commit(); // 提交事务 } catch (Exception e) { conn.rollback(); // 回滚 request.setAttribute(error, 下单失败 e.getMessage()); }参数说明getStock()是自定义工具方法通过SELECT stock FROM products WHERE id?实时查询当前库存避免UPDATE语句的WHERE stock ?条件在高并发下失效。教学项目虽无并发压力但此设计让学生建立“事务内二次校验”的工程直觉。2.4 数据库设计说明书Access 表结构与关系约束实现本系统共 5 张核心表全部在 Access 2003 格式.mdb文件中定义支持直接双击打开编辑。表结构设计严格遵循第三范式但刻意保留部分冗余字段以降低联表复杂度教学权衡表名字段含类型主键外键说明usersid(AutoNumber),username(Text),password(Text),role(Text),email(Text)id—role值固定为 user 或 adminproductsid(AutoNumber),name(Text),brand(Text),model(Text),price(Currency),stock(Number-Integer),description(Memo)id—stock为整数禁止小数ordersid(AutoNumber),order_no(Text),user_id(Number),total_amount(Currency),status(Text),create_time(Date/Time)iduser_id→users.idstatus取值pending / paid / shipped / completedorder_itemsid(AutoNumber),order_id(Number),product_id(Number),quantity(Number-Integer),price_at_order(Currency)idorder_id→orders.id,product_id→products.idprice_at_order记录下单时价格避免商品调价影响历史订单sales_reportid(AutoNumber),date(Date/Time),product_id(Number),sales_count(Number-Integer),revenue(Currency)idproduct_id→products.id每日销售汇总表由管理员手动触发生成注意Access 的外键约束需在“关系”界面中手动启用右键表 → “关系” → 拖拽字段建立连接 → 勾选“实施参照完整性”。源码包中提供的mobile_shop.mdb已预配置全部关系但学生必须亲手操作一遍才能理解“外键不是代码写的是数据库引擎强制的”。2.5 报表与统计模块Access 查询对象与 JSP 动态渲染系统未使用第三方图表库所有销售统计均通过 Access 内置查询对象Query实现再由 JSP 调用Statement.executeQuery()获取结果集渲染 HTML 表格。例如“月度热销榜”查询-- Access 查询qry_top_selling_month SELECT TOP 10 p.name AS 产品名称, p.brand AS 品牌, SUM(oi.quantity) AS 销售数量, SUM(oi.quantity * oi.price_at_order) AS 销售额 FROM products AS p INNER JOIN order_items AS oi ON p.id oi.product_id INNER JOIN orders AS o ON oi.order_id o.id WHERE YEAR(o.create_time) YEAR(Date()) AND MONTH(o.create_time) MONTH(Date()) GROUP BY p.name, p.brand ORDER BY SUM(oi.quantity) DESCJSP 渲染逻辑简洁直接% Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT * FROM qry_top_selling_month); while (rs.next()) { % tr td% rs.getString(产品名称) %/td td% rs.getString(品牌) %/td td% rs.getInt(销售数量) %/td td% rs.getDouble(销售额) %/td /tr % } rs.close(); stmt.close(); %设计说明Access 查询对象是教学友好型设计——学生可在 Access 界面中直接运行qry_top_selling_month查看结果再对照 JSP 代码理解ResultSet如何映射字段。这种“所见即所得”的调试方式远胜于在 Java 代码中拼接复杂 SQL 字符串。3. 开发环境与部署实操从 JDK 配置到 Tomcat 一键启动本项目对开发环境要求极低无需 Maven、无需 IDE 插件、无需 Docker一台装有 Windows 的笔记本即可完成全部开发与演示。环境配置的核心原则是所有路径、端口、驱动名全部固化杜绝“因环境不同导致代码报错”这类答辩翻车点。3.1 JDK 与 Tomcat 版本锁定JDK 1.6 Tomcat 6.0.39 的教学合理性项目明确要求 JDK 1.6非 1.8 或 11Tomcat 6.0.39非 8 或 9。这不是技术倒退而是精准匹配教学需求JDK 1.6 的javac编译产物.class文件能被 Tomcat 6 的 Jasper JSP 引擎无缝加载避免UnsupportedClassVersionErrorTomcat 6 的web.xml默认使用 Servlet 2.5 规范与 JSP 2.1 完全兼容无需额外配置web-app版本声明最关键的是Tomcat 6 的conf/context.xml中Resource配置 JDBC-ODBC 数据源的方式是教材中最常讲解的范例。安装步骤精简为三步下载jdk-6u45-windows-i586.exe官方归档版安装路径固定为C:\Program Files\Java\jdk1.6.0_45下载apache-tomcat-6.0.39.zip解压至C:\tomcat6设置系统环境变量JAVA_HOMEC:\Program Files\Java\jdk1.6.0_45CATALINA_HOMEC:\tomcat6。提示务必使用jdk-6u45而非更新的6u46后者因安全策略升级可能导致 Access ODBC 连接失败。这是某高校实验室踩过的坑已在源码包README.txt中加粗标注。3.2 Access 数据库驱动配置JDBC-ODBC 桥接的三处关键设置Access 数据库通过 JDBC-ODBC 桥接访问需在 Windows 系统中创建“数据源名称DSN”。这是项目部署中最易出错的环节必须按顺序执行创建用户 DSN控制面板 → 管理工具 → 数据源 (ODBC) → 用户 DSN 选项卡 → 添加 → 选择“Microsoft Access Driver (*.mdb)” → 完成 → 数据源名填mobile_shop描述任意数据库选择项目包中的mobile_shop.mdb文件路径如C:\project\mobile_shop.mdb。验证 DSN 可用性在命令行执行odbcad32打开 ODBC 管理器切换到“连接池”选项卡确认mobile_shop状态为“已启用”。JSP 中 JDBC URL 格式在DBConnection.java中连接字符串必须严格为private static final String URL jdbc:odbc:mobile_shop;注意mobile_shop必须与 DSN 名称完全一致区分大小写且不能带空格或特殊字符。若连接失败常见现象是java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified。此时请检查① DSN 是否在“用户 DSN”而非“系统 DSN”中创建② 32位/64位匹配Windows 10 默认为64位系统但 Access Driver 通常为32位需运行C:\Windows\SysWOW64\odbcad32.exe创建32位 DSN。3.3 Tomcat 部署与启动脚本startup.bat的定制化改造项目包中提供已修改的startup.bat其核心改动是强制指定 JVM 参数与工作目录echo off set JAVA_HOMEC:\Program Files\Java\jdk1.6.0_45 set CATALINA_HOMEC:\tomcat6 cd /d C:\tomcat6 bin\catalina.bat start pause关键点说明cd /d C:\tomcat6确保 Tomcat 启动时工作目录为根目录避免webapps\ROOT路径解析错误pause命令防止窗口闪退便于观察启动日志项目 WAR 包名为mobile-shop.war部署时直接复制到C:\tomcat6\webapps\目录下Tomcat 启动时自动解压为mobile-shop文件夹。访问地址固定为http://localhost:8080/mobile-shop/首页index.jsp会自动跳转至login.jsp。所有页面路径均以/mobile-shop/为上下文根避免因路径错误导致 CSS/JS 加载失败。3.4 源码目录结构标准化符合高校文档评审规范的物理组织项目源码严格按高校课程设计文档规范组织目录层级扁平化无嵌套过深问题mobile-shop/ ├── index.jsp # 入口页重定向至 login.jsp ├── login.jsp # 登录页面 ├── user/ # 普通用户功能区 │ ├── product_list.jsp # 商品列表带搜索框 │ ├── order_history.jsp # 订单历史 │ └── ... ├── admin/ # 管理员功能区 │ ├── product_list.jsp # 商品管理列表 │ ├── sales_report.jsp # 销售报表页 │ └── ... ├── WEB-INF/ │ ├── web.xml # Servlet 2.5 规范配置 │ ├── lib/ │ │ └── (空) # 无第三方 JAR纯 JDK JSP 内置对象 │ └── classes/ │ ├── DBConnection.class # 数据库连接工具类 │ ├── LoginServlet.class # 登录控制器 │ ├── ProductServlet.class # 商品控制器 │ └── OrderServlet.class # 订单控制器 └── images/ # 所有图片资源logo.png, phone1.jpg...注意WEB-INF/classes/下的.class文件必须与源码包中src/目录结构完全一致如src/com/example/DBConnection.java编译后为WEB-INF/classes/com/example/DBConnection.class。但本项目为简化教学已将所有 Java 类置于默认包编译后直接放在classes/根目录避免初学者陷入包路径配置泥潭。4. 常见问题排查五个让答辩前夜崩溃的典型翻车点JSPAccess 项目看似简单但恰恰因为技术栈“古老”很多现代开发者习以为常的机制在其中并不存在导致学生在最后调试阶段频繁崩溃。以下是我在指导 12 届毕设中总结的最高频、最致命的五个问题每一条都对应真实翻车现场。4.1 现象登录成功后跳转首页但 Session 中的userRole为空导致菜单栏不显示任何内容原因LoginServlet.java中设置了session.setAttribute(userRole, ...)但后续页面如index.jsp未使用session.getAttribute(userRole)获取而是错误地尝试从request或application中获取或者web.xml中未配置session-config导致 Session 超时过短默认 30 分钟但某些 Windows 系统组策略会强制设为 1 分钟。解决在index.jsp顶部添加调试代码% session.getAttribute(userRole) %确认值存在检查web.xml是否有session-configsession-timeout30/session-timeout/session-config若仍无效重启 Tomcat 并清除浏览器 CookieSession ID 存储在 Cookie 中。4.2 现象新增商品时提示“字段太小而不能接受所要添加的数据的数量”Access 报错-2147217887原因Access 表products.stock字段类型为Number (Integer)但 JSP 表单提交的stock值为字符串100.5或abcJava 代码中Integer.parseInt()抛出异常后未被捕获导致 SQL 执行时传入非法值或price字段为Currency类型但传入了1999.999Access Currency 精度仅支持 4 位小数。解决在ProductServlet.java的addProduct方法中对request.getParameter(stock)和request.getParameter(price)做强校验String stockStr request.getParameter(stock); if (!stockStr.matches(\\d)) { request.setAttribute(error, 库存必须为正整数); request.getRequestDispatcher(product_add.jsp).forward(request, response); return; } int stock Integer.parseInt(stockStr);同时在 Access 表设计中将price字段格式设为Fixed小数位数设为2。4.3 现象订单生成后products.stock库存未减少或出现负数原因事务未正确开启或回滚UPDATE products SET stock stock - ?语句未加WHERE stock ?条件导致库存扣减后为负或getStock()方法中 SQL 写错如SELECT stock FROM products WHERE id ?拼写为SELECT *。解决在OrderServlet.java中确保conn.setAutoCommit(false)在 try 块外执行UPDATE语句必须包含库存校验UPDATE products SET stock stock - ? WHERE id ? AND stock ?并在executeUpdate()后检查if (rows 0) throw new RuntimeException(库存不足)。4.4 现象点击“销售报表”页面浏览器显示 500 错误Tomcat 日志报java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.原因Access 查询qry_top_selling_month中引用了函数YEAR(Date())和MONTH(Date())但 JDBC-ODBC 桥接器无法解析这些 Access 特有函数将其识别为参数占位符?而 SQL 中实际无?导致参数个数不匹配。解决放弃在 SQL 中使用 Access 函数改用 Java 计算日期范围Calendar cal Calendar.getInstance(); int year cal.get(Calendar.YEAR); int month cal.get(Calendar.MONTH) 1; // Calendar.MONTH 从 0 开始 String sql SELECT ... WHERE YEAR(create_time) year AND MONTH(create_time) month;或更稳妥地用BETWEENSimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); String startDate sdf.format(cal.getTime()) 00:00:00; cal.add(Calendar.MONTH, 1); String endDate sdf.format(cal.getTime()) 23:59:59; String sql SELECT ... WHERE create_time BETWEEN startDate AND endDate ;4.5 现象管理员修改商品价格后历史订单明细中的price_at_order未变但新订单价格已更新原因order_items.price_at_order字段在插入时正确赋值但学生误在product_edit.jsp中添加了“同步更新历史订单价格”的逻辑试图执行UPDATE order_items SET price_at_order ? WHERE product_id ?这违反了订单不可变原则且破坏了财务审计依据。解决立即删除所有试图更新order_items.price_at_order的代码。在product_edit.jsp的说明文字中添加注释“商品价格变更仅影响未来订单历史订单价格以price_at_order字段为准确保财务数据可追溯”。这是数据库设计中“时间维度建模”的基础认知必须向学生强调。5. 文档交付与答辩验收一份让导师当场打分的毕设材料清单答辩不是代码跑通就结束而是看你能否用一套完整、自洽、可验证的材料向评审老师证明你不仅写了代码更理解了软件工程的交付逻辑。我带过的项目里90% 的学生败在文档割裂——报告里写“采用 MVC 架构”代码里却全是 JSP Scriptlet需求说明书列了 15 条功能测试计划只覆盖了登录和列表。真正的高分交付是一份环环相扣的证据链。5.1 五类核心文档的交叉验证要点高校评审老师最看重文档间的逻辑咬合。以下表格列出五类必交文档开题报告、需求说明书、详细设计说明书、项目报告、测试计划中必须相互印证的 7 个关键点。答辩前请逐条用荧光笔标出你在各文档中的对应位置验证项开题报告位置需求说明书位置详细设计说明书位置项目报告位置测试计划位置为什么必须一致系统目标“研究意义”章节首句“1.1 项目背景”首段“2.1 总体设计目标”“第1章 项目概述”“1.1 测试目标”若开题写“提升销售效率”测试计划却只测界面美观度直接判定目标偏移核心功能列表“预期成果”条目“3. 功能需求”表格“4.2 功能模块图”“第3章 实现过程”“2.1 功能测试用例”所有文档的功能条目数、名称、编号必须完全相同如“F03订单状态查询”数据库表名“技术路线”中数据库选型说明“4.2 数据字典”表格“5.1 ER 图”及“5.2 表结构”“第4章 关键技术实现”“3.2 数据库测试用例”products表在需求中叫product_info在设计中叫goods视为重大不一致用户角色定义“可行性分析”中用户调研结论“3.2 用户角色”章节“4.1 权限设计”“第2章 系统架构”“2.2 权限测试用例”admin和user的权限描述必须一字不差尤其“能否导出报表”等细节非功能需求“风险分析”中性能预期“3.3 性能需求”“4.3 接口设计”中响应时间“第5章 效果评估”“3.1 性能测试方案”若需求写“列表加载≤2秒”测试计划却无性能测试此项得0分技术选型理由“技术路线”章节“1.3 技术选型依据”“2.2 技术架构图”注释“第2章 关键技术实现”“1.2 测试环境配置”必须解释“为何不用 MySQL 而用 Access”不能只写“简单易学”测试用例编号无无无无“附录A 测试用例表”每个用例编号如 TC001必须在测试计划、测试报告、项目报告“测试结果”章节中三次出现提示我要求学生在打印前用铅笔在每份文档的页眉写上其他四份文档的对应页码。例如在《需求说明书》P5 的“F03 订单状态查询”旁标注“设计书P12、报告P8、测试P15、开题P3”。这招让导师一眼看出你的工作量和严谨度。5.2 演示视频的黄金 7 分钟结构从开机到关机的全流程脚本答辩演示不是自由发挥而是精密编排的 7 分钟舞台剧。我给学生定的脚本如下精确到秒时间动作话术要点避坑提醒0:00-0:30开机 → 启动 Tomcat → 打开浏览器输入http://localhost:8080/mobile-shop/“老师好现在演示系统部署环境。我使用 JDK 1.6 和 Tomcat 6.0.39数据库为 Access 2003 格式所有配置均已固化在源码中。”必须提前关闭杀毒软件否则 Tomcat 启动会被拦截浏览器用 Chrome 无痕模式避免缓存干扰0:30-1:30普通用户登录账号user1密码123→ 浏览商品 → 加入购物车 → 提交订单“这是用户核心流程商品展示基于product_list.jsp的动态查询购物车数据存在 Session 中订单生成触发库存扣减事务。”演示前清空orders和order_items表确保订单号从ORD_2024..._0001开始体现“全新系统”1:30-2:30切换管理员登录账号admin密码123→ 新增一款手机 → 修改其价格 → 查看销售报表“管理员操作验证数据一致性新增商品后库存为 100修改价格不影响历史订单报表数据由 Access 查询实时生成。”新增商品时故意输错一次库存如-10展示错误提示证明校验逻辑有效2:30-3:30打开 Access双击mobile_shop.mdb→ 展示products表新增记录 → 展示orders表新订单 → 展示order_items明细“所有数据持久化在 Access 中表结构、关系、约束均按设计说明书配置。这是products表stock字段为整数型price为货币型。”Access 必须用 32 位版本打开否则可能提示“无法识别文件格式”提前在表中添加备注列说明字段用途3:30-5:00打开项目报告.doc→ 翻到“系统架构图” → 对应指向 Tomcat 目录中的mobile-shop文件夹 → 打开WEB-INF/web.xml→ 指出 Servlet 映射“架构采用经典 B/S 三层JSP 为表现层JavaBean 为业务层JDBC-ODBC 为数据层。web.xml中LoginServlet映射路径为/login与登录表单 action 一致。”切忌只念报告文字必须用鼠标实时指向代码/配置/截图中的具体位置5:00-6:00打开测试计划.doc→ 翻到“功能测试用例表” → 选取 TC005库存扣减→ 展示OrderServlet.java中对应事务代码 → 运行一次下单“TC005 要求验证库存原子性。代码中setAutoCommit(false)开启事务update和insert在同一 try 块失败则rollback。”提前在OrderServlet.java中用// TC005 START和// TC005 END标注相关代码段方便快速定位6:00-7:00总结页 PPT → 三句话收尾“本项目实现了手机销售全业务流程验证了 JSPAccess 在教学场景下的可行性所有文档与代码一一对应具备完整交付能力下一步可扩展为 B/S 与移动端双平台。”不提“技术落后”强调“教学适配性”不承诺“后续优化”聚焦“当前交付完整性”5.3 答辩问答的底层逻辑用“设计决策树”应对所有技术质疑老师提问往往直指设计背后的权衡。与其背答案不如构建一棵“设计决策树”把每个技术选择转化为可解释的工程判断。例如被问到“为什么用 Access 不用 MySQL”不要答“因为简单”而要展开p a hrefhttps://download.csdn.net/download/weixin_39827856/87845373 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p