ARTICLE DETAIL

资讯详情

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

JSP+Servlet蛋糕店网站实战:Java Web入门核心训练

JSP+Servlet蛋糕店网站实战:Java Web入门核心训练 简介本资源是一套完整可用的JavaWeb课程设计级蛋糕店售卖网站项目面向计算机相关专业在校学生、初学者及教师解决Web开发实践入门与毕设选题落地问题。项目基于JSPServlet技术栈构建涵盖用户注册登录、商品分类展示、推荐模块轮播图/热销/新品、购物车管理、订单结算等核心电商功能代码经实际运行验证答辩平均分96分适合作为课程设计、毕业设计或自学进阶范例。压缩包含290个文件主体为58个JSP页面、55个Java业务类、20个XML配置文件、14个JS脚本及12个CSS样式文件辅以图片资源与SQL数据库脚本整体18.95MB预览可见Bootstrap与Layer UI框架集成体现前端工程化基础实践。已有182人学习下载提供README说明文档、结构清晰的MVC分层目录及可直接部署的完整源码便于快速理解JavaWeb开发全流程。1. 这不是“过时技术”的怀旧练习一个能真上手、真调试、真部署的 JSPServlet 蛋糕店网站为什么至今仍是 Java Web 入门最扎实的落脚点你可能在招聘要求里看到“熟悉 Spring Boot”在课程表上被推着学“微服务架构”但当你第一次需要独立搭一个带登录、商品管理、购物车、订单提交的完整 Web 应用——没有现成脚手架、不依赖云平台、不调第三方 API只有一台装了 JDK 和 Tomcat 的笔记本这时候JSP Servlet 不是古董而是你唯一能立刻画出全链路、逐行断点、改完即生效的“可控黑匣子”。这个《基于 JSP 和 Servlet 的蛋糕店售卖网站》大作业表面是课程任务实则是把 HTTP 请求怎么来、Session 怎么存、数据库怎么连、页面怎么渲染、跳转逻辑怎么写这五根骨头一根根拆开、再亲手拼回去的硬核训练。它不追求高并发或分布式但逼你直面request.getParameter()拿不到值、response.sendRedirect()丢失中文、MySQL 时间字段和 Java Date 类型对不上、Bootstrap 表单校验和 Servlet 后端校验脱节这些真实翻车现场。适合刚学完 Java 基础、正卡在“写了代码却不知道请求到底走到了哪一步”的同学也适合想补全传统 Web 开发底层逻辑的 Spring Boot 开发者——毕竟Spring MVC 的Controller本质就是 Servlet 的封装ModelAndView就是 JSP 的request.setAttribute()加RequestDispatcher.forward()。别急着跳进框架先把地基的每一块砖的尺寸、承重、砌法摸透。2. 从零启动用 IntelliJ IDEA 搭建可运行的 JSPServlet 工程避开环境配置的“第一道深坑”2.1 创建标准 Dynamic Web Project拒绝“新建 Maven 项目后手动加 web.xml”的玄学操作很多新手在 IDEA 里点“New Project” → “Maven”然后一路 Next结果发现创建出来的项目缺webapp目录、没有web.xml、JSP 文件标红报错。这不是你配置错了是 IDEA 默认的 Maven 模板压根没按 Java EE 规范生成 Web 结构。正确做法是File → New → Project → 选择左侧 Java Enterprise → 勾选 Web Application → 取消勾选 Create project from template → Next提示务必取消“Create project from template”否则会强制引入不必要的框架如 Struts 或 JSF反而污染纯净的 Servlet 环境。IDEA 会自动生成标准目录结构src/main/java放 Servlet、src/main/webapp放 JSP/HTML/CSS/JS、src/main/webapp/WEB-INF/web.xml核心配置文件。项目创建后右键项目名 →Add Framework Support...→ 勾选Web→ 点击OK。此时 IDEA 会自动识别webapp为 Web Root并将WEB-INF/web.xml标记为 Deployment Descriptor。2.2 配置 Tomcat Server让 JSP 编译、Servlet 映射、静态资源访问全部归位光有项目结构还不够必须让 Tomcat 知道“这个项目该跑在哪、怎么跑”。关键三步下载并指定 Tomcat Home Directory去 Apache Tomcat 官网 下载Tomcat 9.x推荐 9.0.83或 10.x注意 Servlet API 版本兼容性。解压后在 IDEA 中Run → Edit Configurations... → → Tomcat Server → Local在Application server栏点击Configure...→Tomcat Home选择你解压的目录如D:\apache-tomcat-9.0.83。Deployment 设置确保 WAR exploded 正确指向在同一配置页切换到Deployment标签 → → Artifact → your-project-name:war exploded→Application context改为/cake这样访问地址就是http://localhost:8080/cake避免根路径冲突。参数说明war exploded是“解压式部署”修改 JSP 或 class 文件后无需重新打包刷新浏览器即可生效是开发阶段的刚需Application context决定应用上下文路径设为/cake比/更安全避免与 Tomcat 自带的 manager 应用冲突。Server 设置解决中文乱码与热更新失效切换到Server标签 →VM options添加-Dfile.encodingUTF-8 -Duser.languagezh -Duser.countryCNOn update action选Update classes and resources类和资源变更自动热更新On frame deactivation选Update classes and resources切出 IDEA 窗口时也同步。逻辑说明-Dfile.encodingUTF-8强制 JVM 使用 UTF-8 解析源码和配置文件解决 JSP 中文注释乱码、request.getParameter()获取中文参数为空的问题Update classes and resources是 IDEA 对 Tomcat 的热加载支持比手动重启快 10 倍以上。2.3 验证基础通路写一个最简 Servlet JSP确认请求能完整走完在src/main/java下新建包com.cake.servlet创建HelloServlet.javapackage com.cake.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; WebServlet(/hello) public class HelloServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute(msg, 欢迎来到蛋糕店); // 向 request 域存数据 request.getRequestDispatcher(/index.jsp).forward(request, response); // 转发到 JSP } }在src/main/webapp下创建index.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title蛋糕店首页/title /head body h1${msg}/h1 !-- EL 表达式取值 -- /body /html运行 Tomcat访问http://localhost:8080/cake/hello。如果页面显示“欢迎来到蛋糕店”说明✅ Servlet 被正确映射并执行✅request.setAttribute()数据成功传递到 JSP✅ JSP 的 EL 表达式解析正常✅ Tomcat 的 JSP 编译器Jasper工作正常参数说明WebServlet(/hello)是 Servlet 3.0 的注解式映射比web.xml配置更简洁request.getRequestDispatcher().forward()是服务器端转发URL 不变且能共享request域对象${msg}是 EL 表达式依赖 JSP 容器的 EL 解析器若报错需检查web.xml的web-app版本是否 ≥ 2.4IDEA 创建时默认满足。3. 核心功能落地用原生 Servlet JSP 实现蛋糕店四大模块不绕弯、不跳步3.1 用户登录与 Session 管理用HttpSession实现状态保持拒绝 Cookie 伪造漏洞蛋糕店网站必须区分顾客和管理员。登录不是简单比对密码关键是会话状态的可信绑定。常见错误是把用户名存在 Cookie 里前端随意修改就能“登录任意账号”。正确做法是用户登录成功后将用户 ID 和角色存入HttpSession后续所有敏感操作如下单、管理商品都校验 Session 是否存在且有效。LoginServlet.java关键逻辑protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); // 1. 查询数据库此处简化为硬编码验证实际应调用 DAO if (admin.equals(username) 123456.equals(password)) { // 2. 创建 Session 并存入用户信息 HttpSession session request.getSession(true); // true 表示不存在则创建 session.setAttribute(userId, 1); session.setAttribute(username, admin); session.setAttribute(role, admin); session.setMaxInactiveInterval(30 * 60); // Session 30 分钟无操作失效 response.sendRedirect(request.getContextPath() /admin/index.jsp); return; } request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(/login.jsp).forward(request, response); }admin/index.jsp顶部添加权限校验% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % % // 传统 scriptlet 方式校验兼容性最强 HttpSession session request.getSession(false); if (session null || !admin.equals(session.getAttribute(role))) { response.sendRedirect(request.getContextPath() /login.jsp); return; } % !DOCTYPE html html headtitle管理员后台/title/head body h2欢迎${sessionScope.username}/h2 !-- 管理员专属内容 -- /body /html逻辑说明request.getSession(true)确保 Session 存在setMaxInactiveInterval()设定超时时间防止长期空闲 Session 占用内存sessionScope.username是 JSTL 的隐式对象比session.getAttribute(username)更简洁安全return;在response.sendRedirect()后立即终止 JSP 执行避免后续 HTML 渲染造成响应已提交异常。3.2 商品展示与分页用ArrayListPageBean手写分页理解数据与视图的边界Bootstrap 的表格组件需要 JSON 或 HTML 表格数据而 JSP 天然适合直接嵌套循环。我们不引入 AJAX用最朴素的“页码链接”实现分页重点在于数据层Servlet计算好当前页数据视图层JSP只负责展示不参与逻辑判断。ProductListServlet.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int currentPage 1; String pageStr request.getParameter(page); if (pageStr ! null !pageStr.trim().isEmpty()) { currentPage Integer.parseInt(pageStr); } int pageSize 8; // 每页显示 8 条 ListProduct allProducts productService.findAll(); // 从 DAO 获取全部商品 int total allProducts.size(); int fromIndex (currentPage - 1) * pageSize; int toIndex Math.min(fromIndex pageSize, total); ListProduct pageList allProducts.subList(fromIndex, toIndex); // 封装分页信息 PageBean pageBean new PageBean(); pageBean.setPage(currentPage); pageBean.setPageSize(pageSize); pageBean.setTotal(total); pageBean.setList(pageList); pageBean.setTotalPage((int) Math.ceil((double) total / pageSize)); request.setAttribute(pageBean, pageBean); request.getRequestDispatcher(/product/list.jsp).forward(request, response); }list.jsp中用 JSTL 循环展示c:forEach items${pageBean.list} varproduct tr td${product.id}/td td${product.name}/td td¥${product.price}/td tdimg src${pageContext.request.contextPath}/images/${product.image} width80/td td a href${pageContext.request.contextPath}/product/detail?id${product.id} classbtn btn-info btn-sm详情/a /td /tr /c:forEach !-- 分页导航 -- ul classpagination c:if test${pageBean.page 1} li classpage-itema classpage-link href?page1首页/a/li li classpage-itema classpage-link href?page${pageBean.page - 1}上一页/a/li /c:if c:forEach begin1 end${pageBean.totalPage} vari c:choose c:when test${i pageBean.page} li classpage-item activea classpage-link${i}/a/li /c:when c:otherwise li classpage-itema classpage-link href?page${i}${i}/a/li /c:otherwise /c:choose /c:forEach c:if test${pageBean.page pageBean.totalPage} li classpage-itema classpage-link href?page${pageBean.page 1}下一页/a/li li classpage-itema classpage-link href?page${pageBean.totalPage}尾页/a/li /c:if /ul参数说明subList(fromIndex, toIndex)是 Java 集合的轻量级分页避免 SQLLIMIT的数据库耦合适合数据量不大的教学场景PageBean是自定义 POJO封装当前页、总页数、数据列表等是 Servlet 向 JSP 传递分页上下文的标准方式Bootstrap 的pagination组件通过ul classpagination结构渲染JSTL 的c:forEach动态生成liactive类控制当前页高亮。3.3 购物车实现用HttpSession存储MapInteger, Integer模拟真实业务中的数量叠加购物车不是“存个商品 ID 列表”那么简单。用户可能多次添加同一商品需合并数量删除时要减数量数量为 0 时才真正移除。用MapproductId, quantity是最贴合业务的内存结构。CartServlet.java添加商品逻辑protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int productId Integer.parseInt(request.getParameter(productId)); int quantity Integer.parseInt(request.getParameter(quantity)); HttpSession session request.getSession(); SuppressWarnings(unchecked) MapInteger, Integer cart (MapInteger, Integer) session.getAttribute(cart); if (cart null) { cart new HashMap(); session.setAttribute(cart, cart); } // 合并数量已有则累加否则设为 quantity int currentQty cart.getOrDefault(productId, 0); cart.put(productId, currentQty quantity); response.sendRedirect(request.getContextPath() /cart/view.jsp); }view.jsp展示并计算总价c:set vartotalPrice value0/ table classtable table-bordered theadtrth商品/thth单价/thth数量/thth小计/thth操作/th/tr/thead tbody c:forEach items${sessionScope.cart} varentry c:set varproduct value${productService.findById(entry.key)}/ tr td${product.name}/td td¥${product.price}/td td${entry.value}/td td¥${product.price * entry.value}/td td a href${pageContext.request.contextPath}/cart/remove?pid${entry.key} classbtn btn-danger btn-sm删除/a /td /tr c:set vartotalPrice value${totalPrice product.price * entry.value}/ /c:forEach /tbody /table h4总计¥${totalPrice}/h4逻辑说明session.getAttribute(cart)返回的是Map需强制转换getOrDefault()是 Java 8 方法安全获取默认值 0c:set在 JSP 中声明变量并参与计算totalPrice在循环中累加最终输出删除链接remove?pid${entry.key}对应RemoveServlet其逻辑是cart.remove(productId)后重定向回view.jsp。3.4 订单提交与 MySQL 事务用Connection.setAutoCommit(false)保证库存扣减与订单创建原子性下单是典型多表操作扣减商品库存、插入订单主表、插入订单明细表。任何一步失败整个操作必须回滚。不能依赖“先查再更新”的乐观锁教学场景数据量小但逻辑必须严谨。OrderServlet.java关键事务代码protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn null; try { conn JDBCUtil.getConnection(); // 自定义工具类获取连接 conn.setAutoCommit(false); // 关闭自动提交开启事务 // 1. 扣减库存UPDATE product SET stock stock - ? WHERE id ? String updateSql UPDATE product SET stock stock - ? WHERE id ?; PreparedStatement ps1 conn.prepareStatement(updateSql); // ... 设置参数执行 // 2. 插入订单主表INSERT INTO orders (...) VALUES (...) String insertOrderSql INSERT INTO orders (user_id, total_price, status) VALUES (?, ?, ?); PreparedStatement ps2 conn.prepareStatement(insertOrderSql, Statement.RETURN_GENERATED_KEYS); // ... 设置参数执行获取生成的 order_id // 3. 插入订单明细INSERT INTO order_item (...) VALUES (...) String insertItemSql INSERT INTO order_item (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?); PreparedStatement ps3 conn.prepareStatement(insertItemSql); // ... 设置参数执行 conn.commit(); // 全部成功提交事务 request.setAttribute(message, 订单提交成功); } catch (SQLException e) { if (conn ! null) { try { conn.rollback(); // 任一失败回滚 } catch (SQLException ex) { ex.printStackTrace(); } } request.setAttribute(error, 下单失败 e.getMessage()); } finally { JDBCUtil.close(conn); // 工具类统一关闭资源 } request.getRequestDispatcher(/order/success.jsp).forward(request, response); }参数说明setAutoCommit(false)是事务起点Statement.RETURN_GENERATED_KEYS允许ps2获取orders表的自增id用于后续order_item的外键关联JDBCUtil是封装了DriverManager.getConnection()和close()的工具类避免重复代码finally块确保连接无论成功失败都释放防止连接泄漏。4. 前端增强用 Bootstrap 4 Layer 弹层提升交互体验不写一行 jQuery 也能搞定4.1 Bootstrap 4 表单与栅格用form-control和row/col快速构建响应式页面蛋糕店网站不需要炫技动画但必须清晰易用。Bootstrap 4 的栅格系统12 列和表单组件是最佳选择。例如商品添加表单form action${pageContext.request.contextPath}/admin/product/add methodpost classneeds-validation novalidate div classrow div classcol-md-6 mb-3 label forname商品名称/label input typetext classform-control idname namename required div classinvalid-feedback请输入商品名称/div /div div classcol-md-3 mb-3 label forprice价格元/label input typenumber classform-control idprice nameprice step0.01 required /div div classcol-md-3 mb-3 label forstock库存/label input typenumber classform-control idstock namestock required /div /div div classrow div classcol-md-12 mb-3 label fordescription描述/label textarea classform-control iddescription namedescription rows3/textarea /div /div button classbtn btn-primary typesubmit提交/button /form逻辑说明classneeds-validation启用 Bootstrap 4 内置表单验证novalidate禁用浏览器默认验证由 Bootstrap 控制div classrow包裹col-md-*实现响应式布局小屏自动堆叠中屏并排step0.01确保价格输入支持小数required属性触发invalid-feedback提示。4.2 Layer 弹层集成用layer.msg()和layer.confirm()替代原生 alert提升专业感Layer 是国产轻量弹层库比 Bootstrap Modal 更易用且与 JSP 无缝集成。下载layer.js放入webapp/js/在页面底部引入script src${pageContext.request.contextPath}/js/layer/layer.js/script script // 登录成功后跳转并提示 c:if test${not empty param.success} layer.msg(登录成功, {icon: 1}); setTimeout(function(){ window.location.href ${pageContext.request.contextPath}/index.jsp; }, 1500); /c:if // 删除商品前确认 function confirmDelete(id) { layer.confirm(确定要删除该商品吗, {icon: 3, title:警告}, function(index){ window.location.href ${pageContext.request.contextPath}/admin/product/delete?id id; layer.close(index); }); } /script参数说明layer.msg(text, {icon: 1})显示绿色成功提示icon:1layer.confirm()弹出带“确定/取消”按钮的对话框icon:3是黄色警告图标setTimeout延迟跳转给用户阅读提示的时间confirmDelete(id)是 JavaScript 函数绑定在删除按钮的onclickconfirmDelete(${product.id})上避免误删。4.3 图片上传与预览用commons-fileupload实现多图上传不依赖前端框架JSP 原生不支持文件上传必须借助 Apache Commons FileUpload。添加 Maven 依赖dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.5/version /dependencyProductAddServlet.java处理上传protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DiskFileItemFactory factory new DiskFileItemFactory(); ServletFileUpload upload new ServletFileUpload(factory); upload.setHeaderEncoding(UTF-8); // 解决中文文件名乱码 try { ListFileItem items upload.parseRequest(request); for (FileItem item : items) { if (item.isFormField()) { // 普通表单项 String fieldName item.getFieldName(); String value item.getString(UTF-8); // ... 处理 name, price 等 } else { // 文件项 String fileName new File(item.getName()).getName(); // 获取原始文件名 if (!fileName.isEmpty()) { String uploadPath request.getServletContext().getRealPath(/images/); File uploadDir new File(uploadPath); if (!uploadDir.exists()) uploadDir.mkdirs(); String finalPath uploadPath fileName; item.write(new File(finalPath)); // 保存文件 // 保存相对路径到数据库如 images/cheese-cake.jpg product.setImage(images/ fileName); } } } productService.add(product); request.setAttribute(message, 商品添加成功); } catch (Exception e) { request.setAttribute(error, 上传失败 e.getMessage()); } request.getRequestDispatcher(/admin/product/add.jsp).forward(request, response); }逻辑说明upload.setHeaderEncoding(UTF-8)解决 IE 浏览器上传中文文件名乱码new File(item.getName()).getName()提取纯文件名过滤掉 IE 的完整路径getServletContext().getRealPath(/images/)获取服务器上webapp/images/的绝对路径确保文件保存到正确位置item.write()是 FileItem 的便捷方法自动处理流关闭。5. 避坑指南JSPServlet 开发中 5 个高频翻车点血泪经验总结5.1 现象JSP 页面中文显示为乱码如“???”或request.getParameter()获取中文参数为空原因Tomcat 默认使用 ISO-8859-1 解码 URL 参数而浏览器发送的是 UTF-8 编码同时 JSP 文件本身未声明编码。解决① 在web.xml中全局设置请求编码Tomcat 8.0 推荐filter filter-nameCharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping② 若不用 Spring可在每个 Servlet 的doPost()开头手动设置request.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8);③ JSP 文件顶部必须声明% page contentTypetext/html;charsetUTF-8 %。5.2 现象response.sendRedirect()后页面空白或报IllegalStateException: Cannot forward after response has been committed原因sendRedirect()是客户端重定向会发送 302 响应头若之前已向响应体写入内容如out.print()或 JSP 中的 HTML再调用sendRedirect()就会因响应已提交而失败。解决①sendRedirect()必须在response未写入任何内容前调用② 重定向后立即return;阻止后续代码执行③ 避免在 JSP 中混用response.sendRedirect()和 HTML 输出重定向逻辑全部放在 Servlet 中。5.3 现象MySQL 中文存入后变成???或查询结果中文乱码原因MySQL 服务端、数据库、表、连接四层编码不一致常见于安装时未设 UTF-8。解决① 检查 MySQL 配置文件my.iniWindows或my.cnfLinux确保[client]和[mysqld]下都有[client] default-character-setutf8mb4 [mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci② 创建数据库时指定字符集CREATE DATABASE cake_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;③ JDBC URL 添加参数jdbc:mysql://localhost:3306/cake_shop?useUnicodetruecharacterEncodingutf8mb4serverTimezoneGMT%2B8④serverTimezoneGMT%2B8解决 MySQL 8.0 的时区问题避免java.sql.SQLException: The server time zone value ... is unrecognized。5.4 现象Bootstrap 样式不生效按钮无圆角、表格无边框原因未正确引入 Bootstrap CSS 和 JS或引入顺序错误CSS 必须在 JS 前或 CDN 地址失效。解决① 使用国内 CDN如 BootCDN确保稳定link relstylesheet hrefhttps://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css script srchttps://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js/script script srchttps://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js/script② 检查浏览器开发者工具 Network 标签确认bootstrap.min.css返回 200③ Bootstrap 4 依赖 jQuery必须在bootstrap.min.js前引入且版本匹配Bootstrap 4.6 需 jQuery 3.0。5.5 现象Layer 弹层不显示控制台报layer is not defined原因layer.js未加载成功或加载时机早于 jQueryLayer 依赖 jQuery或路径错误。解决① 确保layer.js在jquery.min.js之后引入② 使用绝对路径引入避免相对路径错误script src${pageContext.request.contextPath}/js/layer/layer.js/script③ 检查layer.js文件是否真的存在于webapp/js/layer/目录下文件名大小写是否匹配Linux 服务器严格区分④ 初始化前加判断if (typeof layer undefined) { console.error(Layer.js 未加载); } else { layer.msg(Hello); }6. 进阶技巧用 Maven 打包 WAR 并部署到独立 Tomcat完成从开发到交付的最后一公里6.1 将传统 Dynamic Web Project 迁移为 Maven 工程结构标准化依赖可追溯IDEA 创建的 Dynamic Web Project 缺少pom.xml无法用 Maven 管理依赖和构建。迁移步骤右键项目 → Add Framework Support... → MavenIDEA 会自动生成pom.xml手动修正pom.xml补充 Servlet、JSP、MySQL 驱动等依赖dependencies !-- Servlet API -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope !-- provided 表示由 Tomcat 提供不打入 WAR -- /dependency !-- JSP API -- dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency !-- JSTL -- dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- MySQL Driver -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency !-- Apache Commons FileUpload -- dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.5/version /dependency /dependencies build plugins !-- Maven Compiler Plugin -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version configuration source8/source target8/target /configuration /plugin !-- Maven War Plugin -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.4.0/version configuration failOnMissingWebXmlfalse/failOnMissingWebXml !-- Servlet 3.0 可无 web.xml -- /configuration /plugin /plugins /build参数说明scopeprovided/scope告诉 Maven 这些依赖由运行容器Tomcat提供编译时可用但不会打包进 WAR避免版本冲突failOnMissingWebXmlfalse/failOnMissingWebXml允许无web.xml的注解式配置source和target设为 8匹配 JDK 8 编译要求Tomcat 9 兼容。6.2 构建可部署 WAR 包用mvn clean package生成标准归档验证结构完整性在 IDEA Terminal 中执行mvn clean package成功后target/cake-shop-1.0-SNAPSHOT.war生成。解压该 WAR 文件用 7-Zip 或jar -xvf检查关键结构路径说明必须存在WEB-INF/classes/编译后的.class文件含 Servlet 和工具类✅WEB-INF/lib/pom.xml中scope非provided的依赖如mysql-connector-java.jar✅WEB-INF/web.xml若使用注解此文件可为空或不存在⚠️可选index.jsp,login.jsp等JSP 文件位于 WAR本文还有配套的精品资源点击获取
返回列表