简介:一份基于Java Web的蛋糕店网站系统源码,面向Java课程设计、毕业设计及初期项目演练场景,完整实现前台商品推荐与分类展示、购物车增删改、用户注册登录与个人信息维护、订单查询、关键字搜索,以及后台管理等功能模块,适合计算机相关专业学生和正在进阶的Java开发者直接下载运行,也可在原始代码基础上扩展新功能。压缩包共586个文件,主体为55个java源文件、110个class文件、78个jsp页面,配套18个css和28个js实现界面样式与交互效果,164个jpg、48个png和24个gif为页面演示图及素材,另有数据库sql脚本、18个jar依赖库、8个ttf字体以及xml配置等,整体大小仅17.4MB,目录按前台、后台和数据库拆分,导入开发工具后即可快速定位业务代码。目前已有694人学习下载,代码测试通过并附带详细中文注释与文档说明,可帮助理清商品、订单、用户间的数据关系及MVC调用流程;若基础尚可,还可基于此改造前台风格、增加促销模块或对接其他支付接口,为课设答辩或毕设演示提供扎实参考。
1. 拿到“基于javaweb的蛋糕店网站系统”源码,先定位它解决什么问题
做课程设计的人最怕的不是写代码,而是写完之后发现题目撑不起页面、数据库里只有两张表、答辩讲不出五分钟。基于javaweb的蛋糕店网站系统恰好卡在一个很舒服的位置:业务上有管理员维护商品、用户注册登录、浏览蛋糕、加购物车、下单,技术上有JSP动态页面、Servlet控制跳转、JDBC连MySQL、增删改查全覆盖。它不是一个炫技项目,但它是把javaweb课程里所有考点串成一条完整链路的样板。第一次跑通这类项目,你等于把课堂知识重新按“能演示、能答辩”的标准过了一遍。
这篇文章写给两类人:一类是正在选课程设计题目、想找一个能撑住答辩场面的javaweb完整案例;另一类是已经拿到源码包,卡在“导入报错、数据库连不上、启动就404”的人。我会按拿到源码后的真实操作顺序来写——先拆结构,再导数据库,再跑起来,最后讲避坑和答辩前的改造。别看它叫“蛋糕店”,换成图书、零食、鲜花,这套骨架都能复用。
2. 项目结构与环境准备:读懂javaweb蛋糕店系统的分层和目录
2.1 这套系统的技术栈和三层架构从哪里看
拿到一个javaweb项目源码包,别急着点开IDEA,先把压缩包里的东西按类型分开。一个规范的课程设计包里通常有四个部分:src目录下的Java源代码、web目录下的JSP和静态资源、数据库SQL脚本、文档说明。如果缺了任何一个,要么是打包的人没收干净,要么是老师故意留了坑让你补。
蛋糕店系统的主流实现方式有两种,一种是用纯JSP+Servlet+JDBC,另一种是套了MyBatis或Spring的简化版。课程设计场景里,我建议你优先选纯JSP+Servlet+JDBC的版本,原因很实在:三层结构清清楚楚,DAO层写SQL、Service层写业务、Servlet层收请求调服务,答辩时老师问“你的项目结构是什么”你闭着眼都能画出来。那些用框架的版本虽然写起来快,但对刚学完javaweb的人来说,框架那一层会挡住你对请求流转的理解。
三层架构在哪看?打开src目录,看到包名是按entity、dao、service、servlet、util这样划分的,基本就是标准的三层结构。entity是数据库表的映射类,dao负责增删改查,service处理业务规则,servlet接收页面请求并转发视图。蛋糕店系统里最典型的例子是“下单”:购物车页面的提交按钮把请求发给OrderServlet,OrderServlet调用OrderService,OrderService先查库存再算总价,最后通过OrderDao把订单主表和订单详情表一起写进MySQL。这个链路你只要跟着代码走一遍,比看十遍讲义都管用。
2.2 目录结构逐层拆解:web目录、src、SQL脚本三块各管什么
解压后先看顶层目录名,常见的是cakeShop、cake-store或者直接用项目名。web目录是整个网站的根,里面放JSP页面、CSS、JS、图片,以及WEB-INF下的web.xml——web.xml是javaweb应用的描述文件,Servlet映射、欢迎页、过滤器都在这里注册。src目录里是Java源码,按三层架构分包。SQL脚本一般在docs或database目录下,文件名类似cake.sql或init.sql,这就是你的数据库“后悔药”,只要表结构弄乱了,重新执行一遍就能还原。
有一个容易被忽略的文件叫pom.xml或build.gradle,如果项目里存在它,说明这套系统用了Maven或Gradle管理依赖;如果没有,说明是纯手工导入jar包的项目。两者的处理方式完全不同:Maven项目要把JDBC驱动、JSTL标签库这些依赖写在pom里,IDEA会自动下载;纯jar包项目则需要你在WEB-INF/lib下手动放驱动包。现在市面上的课程设计源码,老一点的模板大多是纯jar包结构,新一点的是Maven结构。拿到手先判断类型,不要一上来就用Maven刷新,那样反而会把原本能跑的项目搞乱。
2.3 环境版本怎么配才不互相打架:JDK、IDEA、Tomcat、MySQL
环境问题占了课程设计排错的百分之六十,而且报错信息往往很“玄学”。我给你的是一套经过验证的组合,只要照着配,能避开绝大多数坑。JDK用8或者11都可以,但别用Java 17以上跑老项目——很多老项目是用javax.servlet命名空间写的,换到新JDK不一定崩,但换了高版本Tomcat就必崩。Tomcat用8.5或9.0,这两个版本对应javax.servlet,是课程设计源码的重灾区兼容区。MySQL服务器用5.7或8.0,本地连接工具用Navicat或IDEA自带的Database面板都行。
这套组合的逻辑是:JDK 8是javaweb教材的标准配置,Tomcat 8.5支持Servlet 3.1,MySQL 8.0虽然驱动名和认证方式有变化,但只要在JDBC的URL里加serverTimezone参数就能稳定连上。如果你拿到的源码里web.xml写的是Servlet 2.5规范,那建议Tomcat版本就锁定8.5,不要用9.0之后的版本去试。配置环境时别追求“全都用最新版”,课程设计的核心是稳定复现,不是尝鲜。先跑通一遍,再考虑升级依赖。
3. 数据库SQL脚本:从建库、导表到JDBC连通的完整路径
3.1 用命令行和Navicat两种方式执行MySQL脚本
数据库是整个蛋糕店系统的地基,地基不稳,页面再漂亮也白搭。拿到SQL脚本后,先别急着双击,用文本编辑器打开看一遍开头:一个规范的脚本应该有CREATE DATABASE语句、USE语句、DROP TABLE IF EXISTS语句、CREATE TABLE语句和INSERT语句。如果只有建表没有建库,需要你手动创建数据库后再执行;如果连INSERT都没有,说明这是一个只给空壳的项目,你要自己造测试数据,这种情况在课程设计里很常见,属于你答辩时展示“数据初始化能力”的机会。
执行脚本的方式有两种,我都建议你掌握。方式一是MySQL命令行,登录后执行source命令。注意Windows下路径分隔符要写成斜杠,而且要确认脚本文件的字符集和数据库一致,否则中文注释会乱码。方式二是Navicat这类图形工具,连接数据库后右键选择“运行SQL文件”,它会按脚本顺序逐条执行并在下方报告每步结果。执行后最重要的一步是刷新表列表,逐一检查核心表的行数:蛋糕商品表有十几条数据、分类表有五六条、管理员表至少有一条admin账号。表是空的往往不是脚本没执行成功,而是脚本里就只建了结构没插数据。
3.2 蛋糕店系统的核心表结构与字段约定
一套标准的蛋糕店系统,数据库里一般包含用户表、蛋糕分类表、蛋糕商品表、购物车表、订单表和订单详情表,再加一张管理员表。这几张表之间的关联靠外键逻辑连接:蛋糕表里存category_id指向分类表,购物车表里存user_id和cake_id,订单表里存user_id,订单详情表里存order_id和cake_id。表结构设计上有一个常见取舍——物理外键加不加。课程设计阶段,大部分模板是不加物理外键的,只保留逻辑关联,原因是数据初始化顺序更自由,删除数据时不容易被外键约束拦住。答辩如果被问到,可以回答“用逻辑外键保证业务灵活性,在DAO层控制关联查询”,这个说法在课程设计层面站得住。
拿蛋糕商品表举例,常见字段设计是:id主键自增、category_id分类编号、name蛋糕名称、price价格、image_url图片路径、stock库存、sales累计销量、status上下架状态。这里有个细节,image_url在脚本里往往只存相对路径,比如images/chocolate.jpg,真正的图片文件放在web项目的image目录下。如果你想换自己的蛋糕图片,只要把图片按同样命名丢进该目录,数据库不用动。这比把图片转成Base64存进数据库要合理得多,也符合实际项目里图片走静态资源、数据库只存索引的做法。
3.3 JDBC连接参数与连接池配置,字符集和时区必须显式声明
脚本导完后,下一步是把Java代码和MySQL对接起来。这一步的坑集中在JDBC连接串上。打开源码里的数据库连接工具类,通常叫DBUtil或JDBCUtil,你会看到类似下面的代码。这里必须盯死三个参数:driverClass、url、username/password。MySQL 5.7和8.0的驱动类名不一样,8.0以下用com.mysql.jdbc.Driver,8.0以上用com.mysql.cj.jdbc.Driver,用错了直接报ClassNotFoundException。
package com.cake.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 数据库连接工具类 * 静态代码块在类加载时执行,只注册一次驱动 */ public class DBUtil { // MySQL 8.x 必须用 cj 的驱动名,5.x 用 com.mysql.jdbc.Driver private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; // serverTimezone 不加会报时区错误,characterEncoding 不加会乱码 private static final String URL = "jdbc:mysql://localhost:3306/cake_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError("MySQL驱动加载失败,检查jar包是否放入WEB-INF/lib"); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, java.sql.Statement stmt, java.sql.ResultSet rs) { // 释放资源顺序:后打开的先关闭 try { if (rs != null) rs.close(); } catch (SQLException ignored) {} try { if (stmt != null) stmt.close(); } catch (SQLException ignored) {} try { if (conn != null) conn.close(); } catch (SQLException ignored) {} } }连接串里的useSSL=false是关闭SSL握手,本地开发没必要开着,能省掉一段证书警告;serverTimezone=Asia/Shanghai解决MySQL 8.0的时区报错,不写会看到“The server time zone value”开头的异常;characterEncoding=utf8保证中文字段不乱码。这三个参数是javaweb连接mysql数据库的老三样,缺哪个都会在运行时炸。把USER和PASSWORD改成你本机MySQL的实际账号,保存后这个工具类就可以供DAO层复用了。
连接池在这套系统里通常不出现,课程设计用DriverManager直连完全够用。原因很简单:蛋糕店系统的并发量极低,一次页面请求也就一两次数据库操作,连接池带来的性能提升感知不到,反而会引入配置复杂度。如果你以后把这个小项目改造成生产级,再引入Druid或HikariCP不迟。在DAO层你会反复看到getConnection、prepareStatement、executeQuery、close这套固定流程,这就是JDBC增删改查的最小闭环,也是面试里常被追问的“底层原理”所在。
4. 在IDEA里跑通登录、商品展示、购物车链路
4.1 IDEA运行javaweb项目配置:Artifact、Tomcat、Application context
数据库通了,接下来是把整个系统在IDEA里发起来。IDE配置这步是新手翻车最多的地方,很多人的项目代码没问题,就栽在“不知道IDEA要先把项目打包成Artifact再交给Tomcat”。以最常见的IDEA社区版或专业版为例,操作路径是:File -> Project Structure -> Artifacts,点加号选择Web Application: Exploded,把右侧可用的模块依赖添加进去。这一步的作用是把src下的类、web目录里的JSP和jar包组织成一个标准Web应用的目录结构,Tomcat部署的就是这个目录。
接着配置运行方式,点开Run/Debug Configurations,加一个Tomcat Server -> Local。在Deployment标签页里把刚刚建好的Artifact加进去,Application context填项目的访问根路径,比如/cake,那么启动后访问地址就是http://localhost:8080/cake/。如果你发现页面图片加载不出来,多半是JSP里写的图片路径没有带上这个context路径。最稳的写法是在JSP用${pageContext.request.contextPath}拼接静态资源路径,或者干脆用绝对路径/cake/images/xxx.jpg。配置完成后先启动一次,看到Tomcat日志里出现“Connected to server”并且没有异常堆栈,再打开浏览器输入地址验证。
4.2 从JSP到Servlet再到DAO的请求链路:三段最小可复现代码
登录功能是这套系统的门面,也是最容易出问题的一环。跟着请求走一遍,你会理解javaweb的MVC流转。用户在login.jsp输入用户名密码,表单提交到LoginServlet的doPost方法,Servlet调用UserDao查询数据库,返回结果后决定跳转到首页还是带着错误信息退回登录页。下面是一个最小实现,按这套系统最常见的写法给出,你拿到源码后可以先在本地跑通它,再对比原项目看差异在哪里。
<%-- login.jsp 核心部分 --%> <form action="${pageContext.request.contextPath}/login" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <button type="submit">登 录</button> </form>// LoginServlet.java @WebServlet("/login") public class LoginServlet extends HttpServlet { private UserDao userDao = new UserDao(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 接收页面参数,统一按字符串处理 String username = req.getParameter("username"); String password = req.getParameter("password"); // 2. 调用DAO层方法,返回用户对象;null代表用户名密码不匹配 User user = userDao.findByUsernameAndPassword(username, password); if (user != null) { // 3. 登录成功,写入session,重定向到首页,避免刷新页面重复提交表单 req.getSession().setAttribute("loginUser", user); resp.sendRedirect(req.getContextPath() + "/index"); } else { // 4. 失败则携带错误信息转发回登录页 req.setAttribute("error", "用户名或密码错误"); req.getRequestDispatcher("/login.jsp").forward(req, resp); } } }// UserDao.java 关键方法 public User findByUsernameAndPassword(String username, String password) { String sql = "SELECT id, username, phone, address FROM tb_user WHERE username=? AND password=?"; // 使用PreparedStatement,参数用占位符,天然防止SQL注入 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 u = new User(); u.setId(rs.getInt("id")); u.setUsername(rs.getString("username")); u.setPhone(rs.getString("phone")); u.setAddress(rs.getString("address")); return u; } } } catch (SQLException e) { e.printStackTrace(); } return null; }三个文件组合起来,你能看到一条完整的调用链。JSP不直接连数据库,它只是视图;Servlet是控制器,负责接收参数和决定跳转;DAO负责把SQL的结果映射成Java对象。代码里最关键的两处:一是查询只用PreparedStatement拼参数而不是用字符串拼接SQL,这是面试里高频的“sql注入”考点——登录框里输入万能密码绕过,本质上就是拼接SQL导致的;二是登录成功后用sendRedirect而不用forward,这是为了避免用户按F5刷新时重复提交登录表单,属于增删改查里“改”和“删”场景的通行教训。商品列表、购物车列表的代码结构跟这个完全相同,只是SQL变得更复杂——比如查询蛋糕列表时要关联分类表,购物车要按用户维度做查询。
4.3 详细注释怎么读、怎么改成自己的
课程设计源码带详细注释,是双刃剑。注释写得好,你能在十分钟内定位“哪个类负责哪张表”;注释写得空,满篇都是“// 获取用户信息”这种废话,等于没有。我读注释的顺序是:先看DAO层每个方法前的注释,它告诉你这个方法操作哪张表、执行哪条SQL;再看Servlet里的注释,它揭示一个页面提交的按钮对应哪个URL;最后才是工具类和实体类。读的时候拿一张纸画一下“页面-URL-Servlet-DAO-表”的对应关系,画完这张图,答辩时的系统架构图就有着落了。
如果你要把这份源码交成自己的课程设计,注释一定要动手改,改的不是格式,是理解。找一个足够简单的方法,比如蛋糕分类的增删改查,把DAO层的每个方法自己重写一遍注释,写清楚“这条SQL查的是什么条件、返回什么、调用后谁在用这个结果”。这么做的价值在于,答辩时老师随便指一个类问“这个方法是干什么的”,你能不看注释就讲出逻辑。很多翻车现场就是学生背了README里的系统简介,但对源码一知半解,被追问两句就露馅。
5. 避坑记录:导入、运行、答辩环节里高频翻车的七个现场
5.1 Tomcat启动闪退或端口被占:现象、原因与处理
启动Tomcat几秒后日志消失,或者报“Port 8080 was already in use”,这是javaweb项目最常见的第一道坎。闪退多半是CATALINA_HOME环境变量没配,或者JDK版本与Tomcat不兼容;端口被占是因为本机已经有程序在监听8080,常见的是另一个Tomcat实例、IDEA内置的HTTP服务,甚至某个开发工具的调试端口。解决办法分两步:先在IDEA的Run窗口看完整日志,确认是端口问题还是环境问题;端口问题可以直接在Tomcat配置的Server标签页把端口改成8081,注意访问URL里的端口也要跟着变。如果改完还是闪退,把环境变量JAVA_HOME明确指向你的JDK安装目录,Tomcat启动脚本依赖这个变量找jvm.dll。
5.2 MySQL 8.0连接报ClassNotFoundException或Public Key Retrieval错误
现象是两个报错交替出现,要么是“ClassNotFoundException: com.mysql.jdbc.Driver”,要么是“Public Key Retrieval is not allowed”。第一个报错的原因是驱动类名写成了老版,MySQL 8.0以上的驱动必须用com.mysql.cj.jdbc.Driver,同时确认WEB-INF/lib下的jar包是mysql-connector-java 8.x版本。第二个报错是两个参数的问题,在JDBC的URL末尾加allowPublicKeyRetrieval=true和useSSL=false就能解决。另外要检查驱动jar包有没有真的进到Artifact里,IDEA里Artifacts配置的WEB-INF/lib如果没同步添加jar包,代码里写得再对也白搭。判断标准很简单:启动后第一次请求数据库,如果报错发生在第1行,基本都是jar包缺失;发生在DriverManager.getConnection那一行,基本是连接串参数问题。
5.3 执行SQL脚本后中文乱码或表字段没更新
导入SQL脚本时,Navicat显示“执行成功”,打开表一看中文全是问号。这个根源不在数据库,在脚本文件的编码和连接字符集不一致。脚本文件用UTF-8编码,但MySQL客户端的默认字符集可能是gbk,导入时按gbk解析,中文就坏了。解决方法是导入前显式声明:命令行执行source命令前先跑set names utf8mb4;Navicat在连接属性里把编码改成utf8mb4后再运行SQL文件。还有一种隐蔽情况:你以为导的是最新脚本,但脚本里CREATE TABLE语句的字段没有和项目代码对齐。比如代码里查的是stock字段,但表中没有这个字段或者叫inventory,运行时就报“Unknown column”。遇到这种问题,打开脚本里的SHOW CREATE TABLE语句,以数据库实际结构为准,不要以代码为准。
5.4 页面中文乱码:JSP、Servlet、Tomcat三层都要设置编码
页面显示“蛋糕店”成了“èå¿åº”,这种乱码最磨人,因为三个环节只要有一个编码不一致,结果就是花的。JSP文件的头部要设置pageEncoding和contentType都是UTF-8;Servlet里接收参数前调用req.setCharacterEncoding("UTF-8");Tomcat的server.xml里给Connector加URIEncoding="UTF-8",这是处理GET请求中文参数的关键。我习惯的排查顺序是从下往上:先用数据库工具确认数据库里的数据本身不乱码,如果数据库就是乱的,返回去查导入脚本的字符集;如果数据库正常而页面乱,先查JSP的pageEncoding,再查Servlet里是否在读取参数前设置了编码。另外有一种情况是代码里写死了“ISO-8859-1”来转码,这种老写法在课程设计源码里偶尔出现,遇到直接改成UTF-8。
5.5 页面404但代码没错:Artifact和访问路径在捣鬼
浏览器输入http://localhost:8080/cake/后,Tomcat日志显示启动成功,但页面就是404。先别怀疑代码,查看IDEA的Tomcat配置里Deployment标签页,确认Artifact已经添加且Application context填的是/cake。如果配置正确,再检查访问路径:项目名称是cake,Servlet映射是/index,那么正确地址是http://localhost:8080/cake/index,少了一层context路径就会404。还有一种情况是JSP放在了WEB-INF目录下,通过浏览器直接访问是拿不到的——WEB-INF下的页面只能通过Servlet内部forward转发出去,这是javaweb的安全约束,很多模板把登录页和后台页面放在这里是有意的。
5.6 答辩被问“为什么表不加外键”和“怎么防SQL注入”
这两个问题几乎每个老师都会挑一个问。回答“不加外键”要有两层逻辑:一是业务上蛋糕分类被删时商品要保留,物理外键会阻止这种操作或引发连锁删级,逻辑外键则让DAO层自己控制规则;二是课程设计注重演示流畅性,初始化数据时物理外键会限制插入顺序。回答“防SQL注入”时直接指向UserDao代码里PreparedStatement的占位符写法,对比说明字符串拼接SQL的漏洞在哪里。这个小节的本质是提醒你,答辩前要照着这两个问题过一遍自己的代码,知道答案在哪个类里,而不是背概念。
5.7 改了数据库表结构但项目报错:SQL脚本和实体类不同步
课程设计做到一半,你可能会给蛋糕表加一个“是否推荐”的字段,然后在后台管理页面加一个开关。如果只改数据库表,没改实体类、DAO的SQL、JSP的展示,跑到任何一处都会报错。这类问题的特征是零散且随机:商品列表页正常,新增蛋糕页报错,原因极可能是新增页用了INSERT语句而这条语句没包含新字段。通用排查法是全局搜索报错信息里提到的字段名,在三个位置检查它:实体类有没有这个属性、DAO的SQL里有没有这个列、JSP表单有没有提交这个值。课程设计阶段的教训是,每动一次表结构,就重新导出一次SQL脚本存档,防止最后提交的时候数据库结构跟源码对不上。
6. 把课程设计改造成能写进简历的项目:验证清单与两个值得做的改进
跑通只是及格,答辩要想拿高分,需要把“能运行”升级成“经得起问”。我给你的第一个低成本改造是给DAO层加日志输出,用System.out或java.util.logging都行。在每个查询方法打印SQL和参数,比如“执行查询,参数为userId=3,SQL=SELECT...”,这能让你在演示时主动说出数据流,也让老师看到你有调试意识。注意日志必须在线上关闭,可以加一个常量开关IS_DEBUG,平时开着,答辩时看效果,提交前关掉。
第二个改造是密码加密存储。目前大多数模板的tb_user表里password是明文,你可以加一个MD5加盐的工具类,注册时加密写入,登录时先加密再比对。这块代码量不大,但价值很高,因为它对应的是面试里的安全话题。配合这个改造,你可以顺手给用户表加一个register_time字段,注册页面里用本地时间填充,这就自然带出了“数据库增删改查”里插入操作的业务语义。
验证阶段我建议按表格逐项过。功能点、验证方式、通过标准三列就能把整个系统的验收讲清楚:用户注册后能立刻登录,购物车加商品后刷新页面数量不丢,管理员后台新加蛋糕后前台能看到,下单后库存减少且订单表多一条记录。这四条是骨架功能,任何一条不通过都意味着项目有硬伤。再补充一条性能验证,把蛋糕列表页的SQL放到数据库工具里执行,如果耗时超过几十毫秒,检查是否少了索引——这是慢SQL优化的入门检查,也是你简历里可以写的一句实话。
用第一人称讲一个教训:我见过太多课程设计,功能全对,但老师在MySQL里执行一句SELECT * FROM cake WHERE price > 50时,页面直接报错,原因是SQL里把表名写错了一个字母。这类低级错误毁掉整个项目太可惜。所以我给自己定的规矩是:提交前用数据库工具把项目里的每一条核心SQL都手工执行一遍,确认表名、字段名和数据库完全一致,再启动项目跑一遍全流程。这个习惯看起来费时间,但它治好了我在增删改查里反复翻车的老毛病。
最后一个值得做的改进是给商品列表加分页。不要用框架的分页插件,自己用LIMIT关键字实现,记住每页大小pageSize和当前页page的换算公式,以及SQL里LIMIT起始偏移量是(page - 1) * pageSize。分页是javaweb里既能展示SQL功底又能展示前端控制力的点,做完它,你的课程设计就从“交作业”变成了“作品”。希望帮到你。
本文还有配套的精品资源,点击获取