简介:基于JSP的网上购书系统设计与实现完整资料包,面向Java毕业设计学生与Web开发初学者,提供从项目规划到部署上线的全流程参考。资源以项目报告、答辩PPT、可运行源代码、数据库脚本、系统截图与部署视频为核心,压缩包约99.48MB,内容编排清晰,便于快速定位所需文件。源代码实现了图书浏览、购物车、订单支付等模块,运用JSP+Servlet+JDBC经典架构,并包含MVC分层、会话跟踪、AJAX局部刷新等关键点;数据库脚本设计了用户、图书、订单等核心表结构,部署视频演示了Tomcat环境下的运行步骤。项目报告与PPT从选题意义、技术选型、模块设计到测试结论进行系统梳理,便于毕设文档撰写与答辩准备。目前已有165人学习下载,特别适合需要完整毕设参考资料或希望快速掌握传统Java Web开发流程的读者,也可作为课程设计或项目实训的参照。
1. 拿到这个购书系统压缩包后,先别急着双击运行
基于JSP的网上购书系统设计与实现,是很多高校课程设计和毕业设计里反复出现的选题,通常以“项目报告+答辩PPT+源代码+数据库+截图+部署视频”的压缩包形式交付。拿到手之后最常看到的一幕是:解压、导入、启动Tomcat,然后面对404、乱码、数据库连不上轮番崩溃。这个系统能不能真正变成你的项目,不取决于压缩包解压出来的文件有多全,而取决于你能不能按正确顺序把它复现出来,并且知道每一步为什么这样做。这篇笔记按一线带项目的思路,从解包、配环境、跑通、踩坑到答辩前改造,给你一套可以直接照做的路径。适合需要交付完整JSP项目并进行答辩的在校同学,也适合想快速熟悉老Java Web项目结构的人。
2. 拆开压缩包:项目报告、PPT、源码、数据库、截图、部署视频各拿来干什么
2.1 六类文件各是干什么的,使用顺序比文件本身重要
拿到标题里那个压缩包,很多人第一反应是先把源代码解压出来丢进IDE。我建议反过来,先建一个干净的工作目录,路径里不要有中文和空格,例如D:\bookshop,把所有内容放到这一个目录下,再按下面的顺序看文件。
| 压缩包内容 | 在交付中的作用 | 我的建议 |
|---|---|---|
| 项目报告 | 呈现需求、设计、实现和测试过程 | 先读,从中提取功能模块图、流程图、ER图 |
| 答辩PPT | 现场演示和讲解提纲 | 先放着,跑通系统后再回来核内容 |
| 源代码 | 系统本体,所有功能和页面的实现 | 先复现运行,再动手改 |
| 数据库 | 包含建库建表语句和初始化数据的SQL脚本 | 用命令行导入,不要直接拷数据文件 |
| 截图 | 前台和后台页面效果图 | 写报告时替换成自己运行出来的真实截图 |
| 部署视频 | 录制者从零把系统跑起来的过程 | 重点记录版本、路径、账号密码 |
为什么是这个顺序?因为项目报告里写的是别人对这个系统的完整理解,看它等于拿到一张地图;部署视频是别人踩过一遍坑之后的顺利操作,看它等于拿到一条最短路径;直接看源代码容易一头扎进细节,反而说不清系统整体功能。等你自己跟着视频把系统跑起来,再回到源码时,就带着问题去看了,效率高很多。
2.2 项目报告先读:功能模块图和ER图是答辩地图
项目报告无论写得有多像模板,中间总有几个没法糊弄的部分:功能需求分析、系统模块图、数据库表关系、测试用例。这几部分恰恰是答辩时老师提问的高发区。常见做法是先快速翻目录,把功能模块图抄到一张草稿纸上,例如用户模块对应注册、登录、修改密码,图书模块对应分类浏览、搜索、详情,前台购物车模块,后台订单和图书管理模块。然后把ER图抄下来,标出每张表和主外键关系。这张草稿就是你后面几天改代码和准备讲稿的底稿。
读报告时还要做一件事:核销。报告里写“系统支持图书搜索”,你就去源码里搜搜索关键词,看用的是模糊查询还是走分类筛选;报告里写“管理员可以删除用户”,你就去后台代码里找对应的Servlet方法。这一遍核对的价值很大,能直接暴露报告与源码不一致的地方。如果发现报告里写了但代码里没有,要么删掉报告里那段描述,要么把功能补上,不能让它成为答辩现场的漏洞。
还需要留意报告里的目录结构图,它通常被忽略,却是理解源码包名和类名的最佳参考。如果报告里画了分层架构,标注了com.bookshop.entity、com.bookshop.dao、com.bookshop.servlet,那你打开源码时就能按图索骥。我习惯在IDE里按包名建好标签,把报告里出现的每个包和类名标上备注,再跟着一个用户操作走一遍流程,比如从 index.jsp 登录到查看图书详情,看请求到底经过了哪些类。这套动作做完,你对项目的熟悉程度基本可以应付大部分提问。
2.3 部署视频和截图是操作记忆,不是只拿来贴PPT
部署视频一般不长,常见内容是:启动MySQL、导入数据库脚本、把项目放到Tomcat下、启动Tomcat、打开浏览器演示。看的时候不要只跟着点,要停下来记三样东西。第一是项目名,也就是地址栏里http://localhost:8080/项目名/index.jsp中间那一段,它决定你把自己工程拷到webapps后用什么URL访问;第二是数据库名和账号,视频里导入时用的库名和源码里的连接配置通常是一套;第三是管理员账号密码,很多模板默认是 admin/123456,答辩时你自己都不记得,现场会很尴尬。
截图目录里通常是一堆前台页面和后台管理页面的图片。它们的直接作用是写报告和PPT时当插图,但还有一个更实际的作用:用截图反查代码。看截图能确定页面上有哪些模块和按钮,然后到源码里搜对应的英文关键词。例如截图里有个“添加到购物车”按钮,就在源码里搜addCart,很快就能定位到处理逻辑,这是熟悉一份陌生代码最快的方式。需要留意的是,截图是录制者那个环境下的产物,数据库里的图书封面、价格可能和你的环境不完全一样,所以报告和PPT里的截图最好等你本地跑通之后重新截一遍,保证截图和现场演示一致。如果压缩包里没有部署视频,或者视频里的环境和你本机差别很大,也没关系,第3章会给你一套从零跑通的完整步骤。把视频当作参考轨迹,把你自己的复现当作唯一目标,两者结合最省时间。
3. 本地跑通:JDK、Tomcat、MySQL版本搭配与部署操作
3.1 环境选型:老JSP项目为什么卡版本
浏览器里立刻出现404,多数不是代码问题而是环境不匹配。老JSP项目强依赖JDK和Servlet容器的版本关系。Tomcat 10开始把javax.servlet换成了jakarta.servlet,而这套系统的JSP和Servlet源码里全部是javax开头的import,直接放进Tomcat 10会因为找不到包而报错。所以选版本要贴近这套技术的年代,而不是选最新版。我一般用 JDK 8 + Tomcat 8.5 + MySQL 5.7 的组合跑这类项目,兼容性最省心。
| 组件 | 建议版本 | 一句话原因 |
|---|---|---|
| JDK | 1.8 | 老JSP项目编译目标基本都是Java 8,Tomcat 8.5对JDK 8支持最稳 |
| Tomcat | 8.5 或 9.0 | 仍是javax命名空间,JSP和Servlet与源码一致 |
| MySQL | 5.7 | 驱动com.mysql.jdbc.Driver、SQL脚本和utf8兼容性都好 |
| IDE | Eclipse或IDEA | 只要能配置Tomcat的Java IDE都行,也可以用命令行跑 |
MySQL 8也能跑,但要改驱动为com.mysql.cj.jdbc.Driver,还要处理认证插件,具体在第4章讲。IDE不是必需,我反而更推荐先命令行部署一次,能跑通后你就不会再怀疑是IDE配置问题。Tomcat从官方下载解压版即可,不需要额外安装,把压缩包解压后改一下bin目录权限就能用。
3.2 导入数据库:命令行比图形工具更稳
数据库脚本通常是book.sql或bookshop.sql。常见的坑是完全不导入,还以为是页面没做;另一个坑是图形工具直接双击导入时,遇到脚本里的中文注释因为客户端字符集不对而出错。命令行最可靠,先把脚本恢复到建库这一步,再导入。下面是最常用的一套操作,假设脚本文件名是bookshop.sql,放在第2章说好的工作目录里。
# 登录MySQL,输入root密码 mysql -u root -p # 进入MySQL命令行后执行,注意每条语句结束要加分号 CREATE DATABASE bookshop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE bookshop; SOURCE D:/bookshop/bookshop.sql;说明:SOURCE是MySQL命令行里执行外部SQL文件的指令,相当于把文件内容一条条执行。如果SQL文件里已经有CREATE DATABASE和USE,那就不要重复建库,直接SOURCE即可,否则会报“database exists”。为什么手动先建库?因为很多模板SQL脚本只写了建表语句,不建库,你直接SOURCE会提示没有选择数据库。导入之后快速验证,执行SHOW TABLES;,看表是否完整。
导入时如果提示语法错误,多半是SQL文件编码或MySQL版本兼容问题,可先看第4章的乱码和连接坑。库名建议和源码里的jdbc:mysql://localhost:3306/bookshop这一段保持一致,后面不用改代码。如果源码里用的是别的库名,就建同名的库,或者后面改URL,个人建议优先改库名而不是改代码,因为库名会出现在SQL脚本和很多页面里,统一命名更省事。
3.3 数据库连接改在哪:找驱动、URL、账号密码
接下来是让代码能连上你的数据库。解压源码后,先用IDE或文本编辑器的全局搜索,搜3306、jdbc:mysql、DriverManager,一般会命中一到两个文件。老项目里这些配置通常集中在两类位置:一类是src目录下的db.properties或jdbc.properties,另一类是util包或dao包里的DBUtil.java、ConnectionManager.java。无论哪种,核心内容就是四个变量:驱动类、URL、用户名、密码。如果用的是properties文件,注意文件编码,很多旧文件是GBK,千万别用记事本另存成UTF-8去覆盖,不然中文说明会乱码。
下面是一份最常见的DBUtil.java写法,包名和类名以你解压出来的为准:
package com.bookshop.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { // MySQL 5.7 用这个驱动 private static final String DRIVER = "com.mysql.jdbc.Driver"; // URL 里的 bookshop 要和数据库名一致 private static final String URL = "jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=utf8&useSSL=false"; private static final String USERNAME = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } }参数说明:useUnicode=true&characterEncoding=utf8保证中文以UTF-8编码传输,和建库时的字符集对应;useSSL=false只关掉本机连接时的SSL告警,不影响正常使用。如果你用的是MySQL 8,第一行的驱动要改成com.mysql.cj.jdbc.Driver,URL后面还要加&serverTimezone=Asia/Shanghai,否则连接会报时区相关的SQLException。改完密码、库名和驱动后,先不要急着启动Tomcat,写一个临时的main方法调用DBUtil.getConnection(),能打印出Connection对象说明数据库这一层通了,再启动Tomcat排查业务代码。
3.4 部署到Tomcat:两种常见方式与启动验证
部署方式常见有两种:一是把源码里Web项目的内容目录拷贝到Tomcat的webapps下;二是用IDE导出WAR包放到webapps。对于课程设计交付包,第一种更常见。注意一下目录层级:如果源码里是 Eclipse 的WebRoot或src/main/webapp这种结构,你要拷进去的是这个目录里面的内容,包括WEB-INF、index.jsp、css、js等,而不是把整个工程文件夹丢进去。判断标准就是WEB-INF/web.xml是否在下一级路径上,Tomcat就是靠webapps/项目名/WEB-INF识别Web应用的。
# 假设Tomcat安装在 D:/apache-tomcat-8.5.87 # 将本地工作目录中的 WebRoot 内容复制到 Tomcat 的 webapps/bookshop 下 mkdir D:/apache-tomcat-8.5.87/webapps/bookshop xcopy /E /Y D:/bookshop/WebRoot D:/apache-tomcat-8.5.87/webapps/bookshop # Windows 启动 Tomcat D:/apache-tomcat-8.5.87/bin/startup.bat # Linux/macOS 启动 Tomcat # D:/apache-tomcat-8.5.87/bin/startup.sh启动后不要只看黑窗口,重点是看日志。打开D:/apache-tomcat-8.5.87/logs/catalina.日期.log,拉到最下面,搜索Exception、SEVERE。如果没有报错,访问http://localhost:8080/bookshop/index.jsp。这里bookshop就是你刚建的目录名,如果目录名是BookShop,URL就写BookShop,大小写很多环境敏感。
验证不只是页面打开,还要走一遍业务:注册一个新账号,登录,看图书列表,点“加入购物车”,再走一次下单。这一步能排除只管页面不管数据流的假成功。如果注册成功但登录报错,很大概率是数据库连接的问题;如果页面能开但图片全是叉,就看图片引用的路径里有没有带项目名/,老项目常犯漏写上下文路径的毛病。建议把Tomcat关闭再启动一次,确认重启后系统仍然正常,这也是答辩前稳定性的最低标准。
4. 避坑:部署与答辩中最高频的6个坑,按现象、原因、解决来排查
这一章把我在类似项目上反复见的坑集中写,每一条都按“现象→原因→解决”的格式整理,你照着排查会比反复重装软件快很多。不要相信“换台电脑就能跑”的说法,换环境只会引入新的坑。
坑1:Tomcat正常启动,访问URL却总是404
现象:启动黑窗口不报错,浏览器输入http://localhost:8080/项目名/index.jsp返回404。
原因:绝大多数不是端口问题,而是项目没有部署到webapps下,或者目录层级不对。如果index.jsp所在目录没有展开,Tomcat找不到WEB-INF,就不会把它当作Web应用。
解决:去webapps/项目名下看有没有WEB-INF/web.xml。没有就把WebRoot或src/main/webapp下的内容拷到webapps/项目名目录内,而不是把工程文件夹直接放进去。拷完之后再确认URL里的路径和目录名完全一致。
坑2:首页能开,登录或查询提示无法连接数据库
现象:页面和静态资源正常,一到查数据库的操作就报Communications link failure,或者提示Unknown database 'bookshop'。
原因:MySQL服务没启动、数据库没导入、账号密码不对、URL里的库名写错,这四样至少中一个。
解决:先确认服务,任务管理器里看mysqld进程在不在;再执行SHOW DATABASES;看库在不在;然后全局搜索3306看URL里的库名和密码。最好把DBUtil里的连接参数用临时main方法测一下,能打印出Connection就说明数据库这一层通了,剩下再看JSP调用链。
坑3:页面中文全部乱码,包括数据库里读出来的数据
现象:HTML静态中文正常,但JSP输出和数据库字段里的中文是“锟斤拷”或问号。
原因:三层编码不一致,JSP页面编码、MySQL建库字符集、JDBC URL里的characterEncoding只要有一层不是UTF-8,就会出现乱码。
解决:JSP顶部统一写<%@ page contentType="text/html;charset=UTF-8" %>;数据库建库时用utf8mb4;JDBC URL里加characterEncoding=utf8。三层都对齐后再看。如果还乱,检查db.properties文件本身是不是GBK编码,把文件另存为UTF-8再重启Tomcat。
坑4:改了Java代码重新编译后,刷新还是旧页面
现象:修了一个Servlet或DAO方法,重启IDE甚至重启Tomcat后还是原来的行为。
原因:很大可能是改错地方了。你在IDE里改的是工程源码,但Tomcat跑的是webapps下的拷贝,两边不是同一份;另一个常见原因是浏览器缓存了旧静态资源。
解决:在IDE里确认源码目录是否被Tomcat直接引用,如果没有,就手动把改动后的编译产物或整个WebRoot重新复制到webapps下。改完重启Tomcat,用无痕窗口访问验证。JSP改动一般会热更新,但Java类必须重启Tomcat。
坑5:Tomcat启动一闪而过,或者8080端口被占用
现象:双击startup.bat窗口立刻关闭,或启动日志报Address already in use: JVM_Bind。
原因:一类是启动失败,错误信息被窗口吞掉;另一类是8080已被其他程序占用。
解决:先查端口,命令netstat -ano | findstr :8080,看最后一列PID,找到进程后在任务管理器里结束它;也可以改Tomcat的conf/server.xml里<Connector port="8080"改成8081,改完访问端口跟着变。如果窗口一闪而过,在命令行里执行catalina.bat run(Windows)或catalina.sh run(Linux),错误会直接打印出来,比看黑窗口消失直观得多。
坑6:答辩现场演示时,投到屏幕上的页面变形、按钮点不到
现象:在自己电脑上好好的,换到答辩设备或投屏后布局乱了,现场尴尬。
原因:浏览器缩放、分辨率与开发环境不一致;另一个原因是事先没有用答辩设备测试过。
解决:答辩前把浏览器缩放固定为100%,把窗口拉到1024×768或答辩设备常用分辨率测试一遍。准备一个演示账号和一个固定商品,提前把数据库和Tomcat都启动好,不要在老师面前等待启动。页面点击顺序也要固定,比如从首页登录到下单一气呵成,减少临场操作失误。
如果多条一起出现,建议按“先环境后代码、先数据库后Tomcat”的顺序排查:MySQL能连上吗,项目部署位置对吗,URL访问对了吗,最后再看业务代码。这个顺序能避开八成复合型翻车。环境细节解决后,剩下的问题通常集中在第5章要讲的源码和数据库结构上。
5. 读懂源码与数据库:购书主流程、ER模型与改造入口
5.1 架构:JSP、Servlet、DAO 各管一段
从源码包名能看出架构风格。常见包结构是entity(实体类)、dao(数据访问)、servlet/controller(控制器)、util(工具),JSP放在WebRoot下。这就是一个轻量MVC。用户请求URL到Servlet,Servlet调用DAO查询数据库,把结果放到request或session中,转发或重定向到JSP。JSP本身不写JDBC,最多用EL和JSTL遍历。当一个页面要显示图书列表,流程是:浏览器请求listBook,Servlet把数据库返回的List放进request,再request.getRequestDispatcher("bookList.jsp").forward(request, response)。这个流程一定要能用自己的话说出来,老师大概率会让你在白板上画。
为什么老项目要这么分层?因为直接在一个JSP里写Class.forName和PreparedStatement,页面会非常混乱,项目稍微大一点就没法维护。JSP+Servlet+DAO的写法把“显示”和“取数”分开,虽然比Spring MVC原始,但好处是每一层都能单独测试:DAO只管SQL,Servlet只管参数和跳转,JSP只管展示。答辩时这样讲,等于告诉老师你不是只会把代码粘进去。
5.2 核心主流程:从注册到下单,源码里怎么定位
建议跟着一条完整业务线去读代码。比如“用户登录”这条线,先搜LoginServlet,看doPost里做了什么。常见写法是把用户名密码从request里取出来,调用DAO查出用户,放进session,再跳转。下面是一段典型登录逻辑:
// 常见登录Servlet处理逻辑,类名和包名以你源码为准 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = userDao.findByUsernameAndPassword(username, password); if (user != null) { request.getSession().setAttribute("loginUser", user); response.sendRedirect("index.jsp"); } else { request.setAttribute("msg", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } }参数说明:request.getParameter拿到的是表单提交的字段名,字段名要和login.jsp里的name属性一致;sendRedirect是重定向,跳转会改变URL,适合登录成功后的页面切换;forward是转发,URL不变,适合把错误提示带回登录页。很多同学在答辩时被问“转发和重定向区别”,就靠这段代码展开。
“加购物车”这条线同样重要。购物车数据一般放在session里,而不是立刻写数据库,原因是用户还没下单时,购物车属于临时数据,频繁写库代价高。但缺点也明显:换浏览器或清缓存就丢失。老师往往追问这个设计,你要能接住。
// 加购逻辑,Cart是一个简单的购物车对象,内部维护Map protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); int bookId = Integer.parseInt(request.getParameter("bookId")); Cart cart = (Cart) session.getAttribute("cart"); if (cart == null) { cart = new Cart(); session.setAttribute("cart", cart); } cart.add(bookId, 1); response.sendRedirect("cart.jsp"); }参数说明:Integer.parseInt把字符串参数转成数字,如果bookId传空或不是数字,这里会抛异常,这也是老项目常见的安全问题。session.setAttribute是第一次加购时把空购物车放进session,后续加购直接给同一个对象追加。整段代码量不大,却是连锁的一环:购物车、生成订单、扣库存,每一步都对应一张表。
5.3 数据库表设计:订单主从表与冗余单价
网上购书系统的表一般不会超过10张,核心表是用户、图书、分类、购物车、订单主表、订单明细。看数据库脚本时,重点看订单相关表的设计,这是最容易考到的地方。
| 表名 | 关键字段 | 职责 |
|---|---|---|
| users | id, username, password, phone | 用户信息 |
| category | id, name | 图书分类 |
| book | id, category_id, name, author, price, stock | 图书信息 |
| cart | id, user_id, book_id, num | 临时购物车 |
| orders | id, user_id, total, create_time, status | 订单主体 |
| orderitem | id, order_id, book_id, num, price | 订单明细 |
为什么订单要拆成主表orders和明细表orderitem?因为一张订单包含多个商品。如果只建一张订单表,要么用一堆冗余字段存第1本书、第2本书,字段数量无法固定,要么一行只存一个商品却重复存订单时间、用户编号、收货地址,造成大量重复数据。所以主表存订单级别信息:用户、总价、下单时间、订单状态;明细表存每个商品的信息:哪本书、数量、当时单价。两者用order_id关联。按“一对多”拆表是订单系统最基本的设计,答辩时讲这一段,比背概念有用。
还有一个看似不起眼的细节:明细表里要存price,也就是下单那一刻的单价。这个值不能后来去图书表里现查,因为图书价格会变,今天的订单如果明天还去图书表查价格,订单金额就失真了。把下单时的单价冗余进明细表,属于典型的“以空间换正确性”设计,老师非常喜欢这种点。我在这个项目里要求自己至少能说出“冗余单价”这一个取舍,其他设计都可以即兴,这一个必须主动讲。
5.4 最小改造:给图书表加字段并显示到页面上
想快速证明“我真的改过这个项目”,最稳妥的切入点是给图书信息加一个字段。比如常见缺失的“出版社”字段,操作路径短,影响面可控,答辩时也好讲。先给数据库加字段:
ALTER TABLE book ADD COLUMN publisher VARCHAR(50) DEFAULT '' COMMENT '出版社';然后去源码里全局搜索book相关的DAO类。注意一个字段往往要改好几处:新增时的INSERT语句、SELECT *读取的实体类里有没有publisher属性。如果实体类是Book.java,加一个私有属性、getter/setter;如果插入SQL写明了字段列表,也要在INSERT里加入publisher;读取的地方如果是SELECT *,一般只需要在映射结果集时加一行,有的项目用手写映射那就得逐个改。改完后把图书列表页里加一行显示,比如在书名旁边加“出版社:xxx”。
改完这几处后,重启Tomcat,重新走一遍后台添加图书的流程,填写出版社信息,前台列表能看到即可。这样一次完整的小改造,前后用时半小时,却能让你在答辩时说清楚“新增字段需要动数据库、实体类、DAO、JSP四个层面”。很多人不敢改,怕改坏,其实字段级改动最不容易翻车,改完的成就感也足够支撑你继续往下做。
6. 答辩前夜的三件事:把它改造成你的系统
第一件事,加一个能在演示时立刻被看到的小功能点。不建议动核心模块,选边角但完整的点最合适。比如在图书列表页给“加入购物车”后面加一个“销量”显示,对应SQL就是SELECT book_id, COUNT(*) FROM orderitem GROUP BY book_id,把统计结果在DAO里查出来,JSP里循环时带上。功能不大,但它涉及查询、映射、展示三层,现场演示时老师能看到这和你模板原版不一样,提问方向会顺着你准备的内容走。
第二件事,清除模板痕迹。全局搜索bookshop、admin、123456这类词,把页面标题、页脚版权、默认管理员密码改成自己的命名。重点是默认账号密码,很多系统的管理员密码写在初始化SQL里,改完数据库后重新导入一次,确保用你改后的密码能登录后台。页面标题和页脚的改动要同时出现在所有JSP里,如果用了公共页头文件就更好,只改一处。这一件事花不了多少时间,却能避免答辩时被指着标题问“这是不是哪哪都能下载的模板”。
第三件事,准备三个必答问句的答案。第一个问句:“为什么用JSP,不用Spring Boot?”回答要点是项目规模小、原生态JSP能看清请求处理链路、便于理解Java Web基础,而不是说Spring Boot不好。第二个问句:“订单表和订单明细表为什么拆开?”用第5.3那套一对多模型和冗余单价讲。第三个问句:“购物车为什么放session而不放数据库?”回答临时候选数据放session简单高效,缺点是跨设备丢失,之后可以扩展为入库。三句话都要结合自己的代码位置说,不要背概念。
答辩前我自己有过一次教训:功能全部正常,但数据库里管理员密码还是模板默认的,老师顺手点进后台改了价格,现场没法自圆其说。从那以后,凡是交付类项目,我都会把默认账号、页脚版权、项目显示名这三样当成必改项。这个习惯后来替换了很多麻烦。这套系统也一样,跑通只是及格,改到你觉得每一页都能解释清楚,才是真正完成了“设计与实现”。希望帮到你。
本文还有配套的精品资源,点击获取