ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JSP课设源码全解析:三层架构、部署避坑与项目改造

JSP课设源码全解析:三层架构、部署避坑与项目改造 简介这套基于Java Server PagesJSP技术的CIMS课程设计源码适合高校学生与JavaWeb入门开发者系统学习动态网站建设。压缩包共212个文件约15.2MB其中100个XML文件用于数据库连接和系统参数配置29个JAR包提供第三方依赖24个CLASS文件为编译生成的字节码14个JAVA源文件实现业务逻辑12个JSP页面负责动态渲染同时包含4个CSS样式表、4个JavaScript脚本、3个SQL建表/初始化脚本、3个属性文件以及若干字体与图片资源目录划分清晰方便按控制层、服务层、页面层逐步研读。项目通过JSP嵌入Java代码的方式配合CSS和JavaScript完成前端交互覆盖从数据库建表、服务端处理到浏览器展示的完整CIMS业务场景。目前已有103人学习下载适合作为课程设计参考或毕业设计模板也可用于理解JavaWeb项目分层设计与前后端协作的具体实践。1. JSP课程设计源码213 个文件的 CIMS 到底学什么学校的 JSP 课程设计通常不缺题目缺的是一份能让你一次看懂完整代码的样本。这份基于 Java Server Pages 技术的 CIMS 课程设计源码解压出来一共 213 个文件100 个 XML 配置、29 个 JAR 包、24 个 CLASS 文件、14 个 JAVA 源文件、12 个 JSP 页面再配上 CSS、JavaScript、SQL 脚本和属性文件。从文件名就能看出它的分层意图CustomerController、CustomerServiceImpl、UserController、UserServiceImpl再加上一个 PageBean是典型的 Servlet JSP 三层写法没有复杂框架兜底。它适合两类人一类是急着交课设、需要一份能跑通能讲清楚的项目作参考的学生另一类是刚学完 Servlet 想补一个完整项目体感的新手。接下来我把目录拆开、把部署路径理顺、把最容易翻车的地方逐个讲清楚。2. 从文件分布拆架构213 个文件里的三层骨架长什么样拿到一份源码先别急着启动 Tomcat先把文件摊开看一遍。这份 CIMS 课设源码的文件构成是非常典型的打包产物既有可读的源码也有编译好的字节码还有一堆配置和依赖。搞清楚每一类文件的角色后面排查问题的时候才知道去哪翻。2.1 文件清单先说话哪些是源码哪些是依赖哪些是部署产物文件类别数量在项目里的角色XML 配置文件100框架与容器配置、web.xml、数据库与日志配置JAR 包29WEB-INF/lib 下的第三方依赖如 MySQL 驱动、JSTLCLASS 文件24Java 源码编译后的字节码Tomcat 实际执行的是这些JAVA 源文件14可读的源码课程设计要读的重点JSP 文件12视图层放在 WebContent 或 webroot 下CSS 样式表4页面样式JavaScript4前端交互与表单校验PNG 图片3图标与页面素材属性文件3数据库连接、常量配置SQL 文件3建库、建表、初始化数据从这张表能读出一个重要信息JSP 课程设计项目里XML 文件数量多不代表配置复杂。这里 100 个 XML 大部分是依赖库自带的描述文件真正需要人工维护的核心配置通常集中在 3~5 个文件里。我最先打开的是.properties文件和 SQL 脚本因为数据库连接信息直接决定这个项目能不能启动。属性文件一般长得像这样jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/cims?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password123456以上是 JSP 课设项目最常见的写法。jdbc.url里的characterEncodingutf8是重点不少乱码问题就是这里漏了。useUnicodetrue这个参数老项目里很常见它配合字符编码参数使用让你的 JDBC 连接按 UTF-8 而非平台默认编码传输数据。如果你换成了 MySQL 8.x 的驱动com.mysql.jdbc.Driver要改成com.mysql.cj.jdbc.Driver后面部署章节再说。2.2 Controller → Service → JSP一次请求的完整路径从类名回推架构是读源码最省力的方式。这个项目里CustomerController是 Servlet 入口CustomerServiceImpl是业务逻辑实现PageBean是分页封装UserController和UserServiceImpl负责登录与用户管理。典型的请求路径如下浏览器发起请求 → Tomcat 根据 web.xml 或注解找到对应的 Controller → Controller 解析参数并调用 Service → Service 处理数据访问并返回结果 → Controller 把结果封装进 request 作用域 → forward 到 JSP 渲染 → 浏览器收到 HTML。以客户列表为例Controller 层最常见的写法是这样WebServlet(/customer) public class CustomerController extends HttpServlet { private CustomerServiceImpl customerService new CustomerServiceImpl(); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String action req.getParameter(action); if (list.equals(action)) { int pageNum 1; int pageSize 10; String pageNumStr req.getParameter(pageNum); String pageSizeStr req.getParameter(pageSize); if (pageNumStr ! null !pageNumStr.isEmpty()) { pageNum Integer.parseInt(pageNumStr); } if (pageSizeStr ! null !pageSizeStr.isEmpty()) { pageSize Integer.parseInt(pageSizeStr); } PageBeanCustomer pageBean customerService.findByPage(pageNum, pageSize); req.setAttribute(pageBean, pageBean); req.getRequestDispatcher(/customer_list.jsp).forward(req, resp); } else if (delete.equals(action)) { int id Integer.parseInt(req.getParameter(id)); customerService.deleteById(id); resp.sendRedirect(customer?actionlist); } } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }逻辑说明WebServlet(/customer)把访问路径和这个控制器绑定省去在 web.xml 里逐条配置 Servlet 映射的麻烦这也是较新的 JSP 课设项目常见的写法。doGet里先用 action 参数区分是列表还是删除再分别处理。列表分支里手动解析pageNum和pageSize两个分页参数PageBean 对象放进 request 后 forward 给 JSP。参数说明pageNum从 1 开始pageSize默认 10。Integer.parseInt直接转换如果前端传了非数字这里会抛异常后面避坑章节专门讲这个问题。resp.sendRedirect用重定向避免刷新页面时重复提交删除请求这是老生常谈但课设里经常被忽略的点。2.3 SQL 脚本3 个文件分别管什么3 个 SQL 文件通常是这么分工的一个建库、一个建表、一个写初始数据。表结构部分一般包含customer和user两张核心表CREATE TABLE customer ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, phone VARCHAR(20) DEFAULT NULL, email VARCHAR(100) DEFAULT NULL, remark VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;注意CHARSETutf8这里要留个心眼。如果你在 MySQL 8.x 里执行这份脚本建出来的表字符集是 utf8而推荐做法是utf8mb4。utf8 在 MySQL 里实际是 utf8mb3 的别名存不了 emoji 字符但课设场景里影响不大。真正的问题是后面插入中文数据时如果连接串没加characterEncodingutf8会出现中文全是问号的现象。3. 部署运行从零到浏览器出现 CIMS 登录页的完整路径源码能读懂和能跑起来是两回事。JSP 课设项目最大的门槛不在代码本身而在环境匹配。这一章按我平常配课设的步骤来省得你来回试错。3.1 版本选择JDK、Tomcat、MySQL 怎么搭配这份项目用了 24 个 CLASS 文件、29 个 JAR 包说明它至少是编译后打包的状态。从技术栈看最匹配的经典组合是组件推荐版本理由JDK1.8老项目最常见编译目标兼容性稳Tomcat8.5 或 9.0支持 Servlet 3.1/4.0WebServlet 注解可用MySQL5.7jdbc.properties 里的驱动名匹配IDEIDEA 或 EclipseIDEA 对 Maven 友好但这个项目是纯 Web 结构如果你本机只有 JDK 17 和 Tomcat 10也能强行跑但要注意 Tomcat 10 之后把javax.servlet换成了jakarta.servlet包名老源码的编译产物 CLASS 文件会直接 ClassNotFoundException。所以我的建议是别用最新版 Tomcat 跑课设老项目Tomcat 9 是最稳妥的选择。MySQL 8.x 也可以只要你把连接驱动换掉。老项目 lib 里的mysql-connector-java版本较老直接换成 8.0.x 就行同时记得改驱动类名jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/cims?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的密码serverTimezoneAsia/Shanghai是 MySQL 8 加的时间区参数不加会报时区错误这个参数在 MySQL 5.7 里可不加。注意这里没有写useSSLfalse是因为有的驱动版本默认会尝试 SSL 握手连接慢或连不上时再加这个参数。3.2 IDEA 导入项目并补全运行环境这个源码不是 Maven 结构没有pom.xml只有 JAR 包和 CLASS 文件导入方式要选对IDEA 里选择New Project - Empty Project把解压后的源码目录整体拷进来。打开File - Project Structure - Modules选中Scope Compile路径里是否包含了src目录。添加依赖Project Structure - Libraries - - Java选择WEB-INF/lib目录把 29 个 JAR 包一次性引入。把项目结构标记为 WebModules - - Web指定WebContent或 WebRoot目录为 Web 资源目录web.xml 路径要对上。配置 TomcatRun - Edit Configurations - - Tomcat Server - Local选择本机 Tomcat 9Deployment 里点加号选Artifact - war explodedApplication context 填/cims。这里最容易翻车的是第四步如果 Project Structure 里没指定 Web 目录IDEA 无法生成exploded war运行按钮是灰的。很多同学卡在这一步就以为是项目坏了实际上只是 IDEA 没识别出 Web 工程结构。对于 Eclipse 用户来说步骤类似File - Import - Existing Projects into Workspace然后Project Facets里勾选 Dynamic Web Module再把lib目录 Import 到 Build Path。IDEA 和 Eclipse 二选一就行别在一个项目里来回切换。3.3 建库、导数据、启动验证先把数据库准备好。用命令行或 Navicat 执行三个 SQL 文件顺序不能乱mysql -u root -p 01_create_database.sql mysql -u root -p cims 02_create_table.sql mysql -u root -p cims 03_init_data.sql如果01_create_database.sql里已经写了USE cims;后两个文件可以直接执行mysql -u root -p 02_create_table.sql mysql -u root -p 03_init_data.sql执行完检查一下USE cims; SHOW TABLES; SELECT * FROM user; SELECT * FROM customer;user表里应该有一条初始账号密码一般做过 MD5 加密或者明文取决于源码里UserServiceImpl的校验方式。登录时如果密码对不上先去看 SQL 脚本里 INSERT 的是什么格式再到 Java 代码里找有没有MD5相关调用这件事别靠猜。启动 Tomcat 后打开浏览器访问http://localhost:8080/cims/正常情况下会跳转到登录页。如果直接 404去检查 Application context 是不是配成了/那样访问路径就变成http://localhost:8080/而不是http://localhost:8080/cims/。3.4 连不上数据库时的三个定位手段数据库连接失败是启动后第一个拦路虎我用固定三板斧排查第一看 Tomcat 日志里最早的异常类型。如果是ClassNotFoundException: com.mysql.jdbc.Driver说明 JAR 包没加载进 WEB-INF/lib检查项目构建路径。第二如果是Communications link failure先ping localhost再telnet 127.0.0.1 3306确认 MySQL 服务在跑、端口没被改过。第三如果是Access denied for user rootlocalhost看属性文件里的用户名密码和 MySQL 实际账户是否一致。这里有个血泪经验很多人改了 MySQL 密码却忘了同步改属性文件结果项目里写的还是旧密码。以后我每次导入项目第一件事就是把jdbc.properties和 MySQL 实际账户对比一遍。4. 核心源码走读Customer、User、PageBean 三条主干逻辑项目能不能过答辩取决于你能不能把代码逻辑讲清楚。这一章按业务线拆开把 Customer 和 User 两条线各自的关键代码过一遍也顺带解析 PageBean 为什么能成为课设里的加分项。4.1 CustomerController 到 CustomerServiceImpl一条数据的服务端旅程Controller 拿了参数之后不直接操作数据库而是交给 Service 层处理这是三层架构的核心约定。CustomerServiceImpl里的分页查询方法实践中最常见是这样写的public class CustomerServiceImpl { public PageBeanCustomer findByPage(int pageNum, int pageSize) { // 1. 计算总记录数和总页数 int total customerDao.findTotalCount(); int totalPages (total pageSize - 1) / pageSize; // 2. 计算当前页起始位置 int startIndex (pageNum - 1) * pageSize; // 3. 查当前页数据 ListCustomer list customerDao.findPage(startIndex, pageSize); // 4. 封装 PageBean 返回 PageBeanCustomer pageBean new PageBean(); pageBean.setPageNum(pageNum); pageBean.setPageSize(pageSize); pageBean.setTotal(total); pageBean.setTotalPages(totalPages); pageBean.setData(list); return pageBean; } public void deleteById(int id) { customerDao.deleteById(id); } }逻辑说明totalPages的计算用了(total pageSize - 1) / pageSize这是整数除法向上取整的经典写法。如果total 23、pageSize 10直接23 / 10 2但实际应该分 3 页加上pageSize - 1再整除就变成32 / 10 3。这个公式在分页里非常常见答辩时被问到加分页公式时直接答这个。参数说明startIndex (pageNum - 1) * pageSize表示当前页的偏移量。pageNum 1时查第 0 条开始pageNum 2时查第 10 条开始对应 SQL 里的LIMIT startIndex, pageSize。4.2 PageBean 为什么是课设分页的标准答案你去看大部分 JSP 课设项目PageBean 都是自研的很少引入 MyBatis PageHelper 或者 Spring Data 的分页对象。原因是 JSP 课设的定位决定了它不需要复杂框架自研分页对象能让学习者完全掌控分页流程。PageBean 的完整字段一般包含这些public class PageBeanT { private int pageNum; // 当前页码 private int pageSize; // 每页条数 private int total; // 总记录数 private int totalPages; // 总页数 private int startIndex; // 起始下标 private ListT data; // 当前页的数据集合 }startIndex可以放在 Bean 里也可以在 Service 里计算两种都有。放在 Service 里更流行一点MyBatis PageHelper 也是类似思路你只管传 pageNum 和 pageSize框架负责算 LIMIT。totalPages通常不需要持久化它是从 total 和 pageSize 推导出来的。有的同学会问为什么 JavaBean 里不写构造方法只写 getter/setter因为 JSP 页面的 EL 表达式只能调用 getter 方法共 ${pageBean.total} 条第 ${pageBean.pageNum}/${pageBean.totalPages} 页EL 表达式通过getPageNum()、getTotalPages()取值这就是 JavaBean 规范的意义。项目里 24 个 CLASS 文件里应该就有对应的编译版本你打开 CLASS 和 JAVA 对比看会发现它们一一对应这能帮你理解编译前后代码的关系。4.3 UserController 与登录拦截逻辑UserController这条线比较简单核心是登录校验和 Session 管理。课设项目里登录校验最常见的做法public class UserServiceImpl { public User login(String username, String password) { // 1. 调用 DAO 查询用户 User user userDao.findByUsername(username); // 2. 比对密码 if (user ! null user.getPassword().equals(password)) { return user; } return null; } }Controller 层拿到结果后把用户对象放进 SessionUser user userService.login(username, password); if (user ! null) { req.getSession().setAttribute(loginUser, user); resp.sendRedirect(customer?actionlist); } else { req.setAttribute(errorMsg, 用户名或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); }老课设项目对密码普遍用明文或者 MD5课程设计答辩如果老师问密码安全你就说UserServiceImpl里新增一个 MD5 工具方法登录比对前先对输入密码做摘要。从整改角度这就是一个很好的应答点代码改动也很小。注意login.jsp的表单里 input 的 name 属性和这里getParameter(username)的字符串必须严格一致这是 JSP 项目里最无解但最常见的低级错误。4.4 JSP 页面、CSS 和 JavaScript 怎么配合12 个 JSP 页面不会全都是独立的业务页面通常会抽一个head.jsp或header.jsp作为公共头部然后用静态 include 引入% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % % include fileheader.jsp %JSP 页面里经常混着 Java 代码片段和 HTMLc:forEach items${pageBean.data} varc tr td${c.id}/td td${c.name}/td td${c.phone}/td td a hrefcustomer?actioneditid${c.id}编辑/a a hrefcustomer?actiondeleteid${c.id} onclickreturn confirm(确定删除吗)删除/a /td /tr /c:forEach这段里面用了 JSTL 的forEach是课设项目的标准做法。如果你发现 JSP 页面里用的是% for(...) { %而不是c:forEach说明这个项目的 JSP 写法更老。JSTL 标签的优势在于页面里没有 Java 代码EL 表达式自动处理空值不会因为null属性报 500。CSS 和 JS 资源文件通常放 WebContent 下的css/、js/目录JSP 里引用路径用${pageContext.request.contextPath}拼接避免不同部署路径下资源 404link relstylesheet href${pageContext.request.contextPath}/css/style.css script src${pageContext.request.contextPath}/js/validate.js/script这个前缀在 JSP 页面里很关键。项目中 Application context 从/cims改成/时静态资源路径会全部失效JS 校验逻辑不生效老师点登录按钮没反应但能通过 F12 看到 404这类问题就属资源路径写死。5. 避坑JSP 课设部署里最常见的五个翻车点这部分全是我自己和带过的同学在课设阶段真实踩过的。每一条按「现象 → 原因 → 解决」来写你可以直接当作排查手册用。5.1 端口被占Tomcat 启动立刻报错现象启动 Tomcat 时控制台提示Port 8080 was already in use弹窗问是否 use a port in use。原因8080 端口被其他进程占用常见的有Oracle 的 HTTP 服务、另一个 Tomcat 实例、Nginx甚至有些代理工具也喜欢绑 8080。解决先查占用进程再杀掉。Windows 命令如下netstat -ano | findstr 8080 taskkill /PID 进程号 /F或者干脆给 Tomcat 换端口编辑 Tomcat 的conf/server.xmlConnector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /把8080改成8081然后访问http://localhost:8081/cims/。注意这里改的是 server.xml不是项目的配置文件别改错地方。5.2 页面全部乱码责任不在前端在请求链路的三个节点现象登录成功后浏览器显示中文全是问号或者数据库表里的中文显示正常但页面上乱码。原因字符编码链路有三段任何一段不一致都乱码——数据库连接串里的字符集、JSP 页面声明的编码、前端请求传输的编码。解决按顺序检查三处。先看 JSP 开头三行有没有pageEncodingUTF-8% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%再看 Controller 的 doGet 开头有没有req.setCharacterEncoding(UTF-8)最后看jdbc.url里的characterEncodingutf8。三处都统一成 UTF-8乱码问题 90% 可以解决。剩下的 10% 是 TABLE 建表字符集用成了 latin1需要重建表。5.3 Tomcat 10 跑老项目CLASS 文件报 ClassNotFoundException现象项目导入后能编译但启动时抛java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet或者类名转换异常。原因Tomcat 10 起把 Servlet API 包名从javax.servlet迁移到jakarta.servlet老项目编译出来的 CLASS 文件引用的是 javax 包路径必然加载失败。解决卸载 Tomcat 10改装 Tomcat 9 或 8.5。如果你非要用 Tomcat 10得把源码里所有import javax.servlet改成import jakarta.servlet然后重新编译替换 CLASS 文件。对课设来说换 Tomcat 是成本最低的方案改包名纯属给自己挖坑。5.4 改了 JAVA 源码但页面没变化不是热部署的锅现象在 IDEA 里改了CustomerServiceImpl.java重启 Tomcat 后页面行为还是旧的。原因项目里 24 个 CLASS 文件是编译好的如果 IDEA 没有自动编译源码覆盖这些 CLASSTomcat 加载的还是原来的字节码。解决强制重新编译。IDEA 里执行Build - Rebuild Project然后再启动 Tomcat。如果没有生效检查 WEB-INF 下的classes目录里CustomerServiceImpl.class文件的修改时间是否比.java文件新。这个排查手段很有用我后来看任何项目都有先看 CLASS 和 JAVA 时间戳的习惯。5.5 刷新页面重复提交删除/添加操作现象在客户列表点删除页面上数据删除了但按 F5 刷新后又删除一次或者弹出「确认重新提交表单」的浏览器提示。原因删除操作用的是表单 POST 提交Controller 处理完直接 forward 回列表页浏览器重复提交了上一次请求。解决处理完写操作后不要 forward用重定向。对应到代码就是把req.getRequestDispatcher(/customer_list.jsp).forward(req, resp);改成resp.sendRedirect(customer?actionlist);重定向等于让浏览器重新发起一次 GET 请求URL 变成干净的customer?actionlist刷新不会重复触发写操作。这个也是答辩时老师比较爱问的「Post/Redirect/Get 模式」。6. 把它改造成你自己的课设实体替换、分页调整和一次回归验证拿到别人源码交自己的课设最忌讳的是只改标题不改内容。老师每年看那么多份报告页面里还留着 CIMS 字样一眼就能看出来。与其冒险不如花一下午把整个项目翻新成自己的业务主题。这一章给你一套可执行的改造顺序。6.1 第一步替换客户实体把表结构改成你的业务假设你要把客户管理系统改成「校园设备管理系统」核心实体从 Customer 变成 Equipment。做法是新建Equipment.java字段改成设备名、设备编号、存放地点、状态public class Equipment { private int id; private String equipName; private String equipCode; private String location; private String status; // 省略 getter setter }然后同步修改数据库建表脚本。注意把原来 customer 表的 SQL 改成CREATE TABLE equipment ( id INT PRIMARY KEY AUTO_INCREMENT, equip_name VARCHAR(50) NOT NULL, equip_code VARCHAR(30), location VARCHAR(100), status VARCHAR(10) ) ENGINEInnoDB DEFAULT CHARSETutf8;改完表之后CustomerController、CustomerServiceImpl里的泛型PageBeanCustomer要整体搜替换成PageBeanEquipment。IDEA 的Ctrl Shift R全局替换变量名时注意别把注释里的 Customer 也替换成 Equipment否则阅读时语义混乱。我自己通常会保留原项目的三层结构但把类名改成对齐新业务的EquipmentController、EquipmentServiceImpl这样项目结构上的连贯性更好。CLASS 文件由 IDEA 重新编译生成不需要手动删除旧 CLASS。6.2 第二步分页参数和前端表格联动调整替换完实体后JSP 页面的表格列也要同步改。原来遍历的是 name、phone 字段现在要换成 equipName、equipCodec:forEach items${pageBean.data} vare tr td${e.id}/td td${e.equipName}/td td${e.equipCode}/td td${e.location}/td td${e.status}/td td a hrefequipment?actioneditid${e.id}编辑/a a hrefequipment?actiondeleteid${e.id} onclickreturn confirm(确认删除该设备吗)删除/a /td /tr /c:forEach同时把分页条里的页码参数对齐。原来的 JSP 里如果有a hrefcustomer?actionlistpageNum${pageBean.pageNum 1}下一页/a要把路径一并改成equipment?actionlist。这里有一个我最常见的翻车案例Controller 路径改成了/equipment但 JSP 里还留着旧路径点删除按钮跳到 404。改完 Controller 后在 IDEA 里对旧 Servlet 路径做一次全局搜索一个都不能留。6.3 第三步回归验证清单启动后按顺序过一遍改造完不能直接交报告先按下面这张清单跑一遍步骤操作预期结果1访问首页登录跳转到设备列表页非登录状态访问其余页面会重定向2新增一条设备记录列表出现新记录分页总数 13编辑设备信息提交后列表显示修改后的内容4删除一条设备确认后数据消失刷新不重复删除5翻到最后一页分页条高亮当前页码无空页6查询框中输入中文关键字搜索结果中文正常显示无乱码7换浏览器或清除缓存重放静态资源 CSS、JS 正常加载第 5 步是分页最容易翻车的当总页数正好是整数时总记录数 20 / 每页 10 2最后一页页码应该显示 2 而不是 3这个逻辑在totalPages计算里已经处理了不需要你在 JSP 里做 if 判断。第 7 步很多人会忽略浏览器缓存会导致你很确定改了 JS 文件但页面依然走旧脚本。验证时按Ctrl F5强制刷新或者打开 DevTools 的 Network 面板勾选 Disable cache。6.4 我自己固定的收尾动作每次改完课设项目我都会执行一遍Build - Rebuild Project然后去 Tomcat 的webapps目录把旧 war 包对应文件夹删掉防止 Tomcat 自动解压旧版本覆盖新版本。然后启动服务按清单逐项点一遍再打开数据库执行SELECT * FROM 新表名确认数据完整、字段名与 JavaBean 属性对齐。全部过完才会去写课程设计报告。这也成了我后来的固定习惯任何项目提交前强制走一遍「清缓存 → 重新编译 → 数据库核对 → 功能回归」四步流程。你要是能把这个流程写进报告末尾的「测试过程」里答辩老师基本挑不出毛病。希望帮到你。本文还有配套的精品资源点击获取
返回列表