当前位置: 首页 > news >正文

jpetstore-6 Spring MVC全链路解析:从DispatcherServlet到JSP视图渲染的完整指南

jpetstore-6 Spring MVC全链路解析:从DispatcherServlet到JSP视图渲染的完整指南

【免费下载链接】jpetstore-6A web application built on top of MyBatis 3, Spring 3 and Stripes项目地址: https://gitcode.com/gh_mirrors/jp/jpetstore-6

jpetstore-6 是基于Spring MVC + MyBatis 3 + JSP构建的经典宠物店 Web 应用,是学习 Spring 全栈开发的绝佳样本。本文带你完整走一遍请求链路:从DispatcherServlet如何接管 URL、@Controller如何响应、Model如何传递数据,到最终 JSP 视图如何渲染,帮助新手快速建立对 Spring MVC 的整体认知。

🧭 一图看懂架构:三层各司其职

jpetstore-6 采用经典的「控制器 → 服务 → 数据映射」三层结构,Spring MVC 负责 Web 层,MyBatis 负责数据层:

代表文件职责
Web 层(Spring MVC)web/controllers 目录 下的 5 个控制器接收请求、调用服务、返回视图名
Service 层src/main/java/org/mybatis/jpetstore/service/业务逻辑与事务边界
Mapper 层(MyBatis)src/main/java/org/mybatis/jpetstore/mapper/SQL 映射,读写数据库
View 层(JSP)src/main/webapp/WEB-INF/jsp/页面渲染

所有 JSP 都被放在WEB-INF之下——这是刻意的安全设计:浏览器无法直接访问 JSP 文件,页面只能通过控制器转发渲染。

🚪 入口配置:web.xml 如何拉起 DispatcherServlet

一切从 web.xml 开始,核心只有两件事:

  1. 注册DispatcherServlet:Servlet 名为dispatcher,并指定初始化参数contextConfigLocation指向/WEB-INF/spring-mvc.xml
  2. URL 模式为/:意味着所有请求都会先进入 Spring MVC 的前门,由它统一分派。

同时还注册了ContextLoaderListener,用于加载根应用上下文 applicationContext.xml,其中配置了内嵌 HSQLDB 数据库、事务管理器和 MyBatis 的SqlSessionFactoryBean,并用<mybatis:scan>扫描 Mapper 包。根上下文管数据源和事务,Spring MVC 上下文管控制器——这就是典型的「父子双容器」结构。

🧩 MVC 上下文里只有 4 行关键配置

spring-mvc.xml 内容非常精简,每一行都值得新手记住:

  • <mvc:annotation-driven />:开启@Controller@GetMapping等注解驱动;
  • <context:component-scan base-package="org.mybatis.jpetstore.web.controllers" />:扫描并注册所有控制器 Bean;
  • InternalResourceViewResolver:前缀/WEB-INF/jsp/、后缀.jsp——视图名到 JSP 文件的映射规则就在这一行。

📮 请求路由:5 个控制器覆盖全站 URL

控制器都在org.mybatis.jpetstore.web.controllers包下,职责划分一目了然:

控制器前缀典型路由
RootController/根路径重定向到index.html
CatalogController/catalog浏览分类、商品、搜索
CartController/cart加购、改数量、删商品
AccountController/account登录、注册、修改资料
OrderController/order下单、确认、查看订单

🔄 走一遍真实链路:以"浏览商品分类"为例

以访问/catalog/viewCategory?categoryId=FISH为例,请求的完整旅程如下:

  1. 进入 DispatcherServletweb.xml/下的请求全部交给它;
  2. 映射到方法CatalogController类上标注@RequestMapping("/catalog"),方法viewCategory标注@GetMapping("/viewCategory"),Spring MVC 精确匹配到该方法,并用@RequestParamcategoryId注入参数;
  3. 调用 Service:控制器通过@Autowired注入的CatalogService查询商品列表和分类信息;
  4. 填充 Model:结果通过model.addAttribute("productList", ...)存入 Model,方法返回视图名字符串"catalog/Category"
  5. 视图解析InternalResourceViewResolver把视图名拼成/WEB-INF/jsp/catalog/Category.jsp,转发过去渲染;
  6. JSP 输出:Category.jsp 中用 JSTL 的<c:forEach>遍历productList,拼出带链接的商品表格,最后把 HTML 返回浏览器。

整个过程中控制器从不直接操作数据库,JSP从不直接写业务逻辑——分层边界非常干净,这也是本项目适合新手阅读的原因。

🔐 会话与状态:HttpSession 贯穿购物全流程

购物车和登录态都存放在HttpSession中:

  • CartController的私有方法getCart()负责"会话里没有购物车就建一个",加购、删除都围绕这个对象操作;
  • AccountController登录成功后,把账户信息包进内部类AccountSession存入会话,之后OrderController的每个下单接口都会先检查会话中是否已认证,未登录则重定向到登录页;
  • 下单确认后,控制器会清空购物车并返回订单详情视图。

这种"表单分步提交 + 会话暂存订单"的写法(OrderController中按表单来源只覆盖非空字段),是传统服务端渲染应用中处理多步表单的典型范式。

🚀 三步跑起来:最快的本地体验方式

git clone https://gitcode.com/gh_mirrors/jp/jpetstore-6 cd jpetstore-6 ./mvnw clean package ./mvnw cargo:run -P tomcat9

启动后访问http://localhost:8080/jpetstore/即可。更喜欢 Docker 的话,docker-compose.yaml 已配置好,一条docker compose up -d直接起飞。项目使用内嵌 HSQLDB,无需额外安装数据库——这也是它被广泛用作教学示例的原因。

📚 关键文件索引

文件说明
web.xmlDispatcherServlet 注册与 URL 映射
spring-mvc.xml控制器扫描与视图解析器
applicationContext.xml数据源、事务、MyBatis 配置
CatalogController.java最典型的"查询 + Model + 视图"写法
Category.jspJSTL 遍历 Model 数据的最小示例
ScreenTransitionIT.java端到端页面跳转集成测试

小结:jpetstore-6 用最小的配置展示了 Spring MVC 的完整闭环——web.xml定入口,spring-mvc.xml定规则,控制器接请求,Model 传数据,JSP 出页面。读懂这条链路,再去看 Spring Boot 项目里的自动配置,你会发现不过是在同一套原理之上省去了手动声明而已。

【免费下载链接】jpetstore-6A web application built on top of MyBatis 3, Spring 3 and Stripes项目地址: https://gitcode.com/gh_mirrors/jp/jpetstore-6

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4249888.html

相关文章:

  • 开源项目维护与社区运营要点
  • 从跑通到出片:JoyAI-Echo 分钟级长视频生成完整上手指南
  • 【必收藏】从0到1掌握AI智能体:大模型的进化与应用实践
  • audioMotion.js频谱分析仪设置与预设完整指南:Sensitivity、Peaks、加权滤波器,调出最适合你的频谱响应
  • ifconfig.io porttest功能实战:一条curl命令测试服务器远程端口是否可达
  • PowerSync多框架实战对比:一套同步代码跑通React、Vue、Angular与Nuxt的差异详解
  • 遗留系统 Canvas 兼容策略:ExplorerCanvas 部署指南与向 HTML5 的平滑迁移路线
  • 为什么Essential Paxos是学习Paxos的经典教材?与Multi-Paxos及Composable Paxos的设计哲学深度对比
  • 8款主流AI论文平台横向实测,本硕博撰稿避坑实操指南
  • 三款AI写作辅助软件横评:从构思到提交怎么选才不踩坑?
  • 大模型应用开发必备,RAG技术详解与工具选型:LlamaIndex、GraphRAG、 RAGFlow
  • 右键菜单管理三步走:用 ContextMenuManager 把 Windows 右键菜单彻底清理干净
  • 2002-2024年地级城市道路面积、人均道路面积
  • 从零开始学MoE:混合专家模型技术详解,助你掌握大模型高效训练秘籍,建议收藏!!
  • 收藏必备:从提示工程到上下文工程,构建高性能AI Agent完全指南
  • Office Custom UI Editor:不写一行代码定制 Office 功能区,10 分钟让常用按钮前置
  • 别再手动逐个比对了:HashCalculator 批量计算与校验文件哈希的完整指南
  • 收藏必备:从RAG到RL Agent,检索系统的革命性升级!
  • 如何用一条命令构建全栈应用:Skeet TypeScript Serverless框架终极入门
  • 1900行深度学习工具库全解析:Dive-Into-Deep-Learning-PyTorch-PDF的d2lzh.py自定义层与训练函数设计原理
  • 从 Docker 到 Kubernetes:node-oracledb 容器化部署的 6 个关键决策与避坑指南
  • 定制laravel-logger:扩展自定义路由、视图与活动模型的完整指南
  • 降漏写成法定义务之后,分区计量与工单闭环如何让地下漏点显形
  • 八大网盘拿到真实直链:LinkSwift网盘直链解析工具实操指南
  • 低成本LoRA微调ChatGLM3-6B:从数据准备到模型部署
  • AI挖掘机落地指南:从感知、规划到真机部署的完整实践
  • PaperTodo 快速上手:10 分钟把今天的待办贴到桌面
  • material-scrolling源码精读:RecyclerViewHolder如何桥接ObservableRecyclerView滚动状态
  • axure-cn Axure 汉化语言包安装教程:15 分钟让 RP 9/10/11 变成中文界面
  • 如何为 doc2dash 编写自定义解析器:从 Parser 协议到 Patcher 的完整插件开发指南