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 开始,核心只有两件事:
- 注册
DispatcherServlet:Servlet 名为dispatcher,并指定初始化参数contextConfigLocation指向/WEB-INF/spring-mvc.xml; - 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为例,请求的完整旅程如下:
- 进入 DispatcherServlet:
web.xml把/下的请求全部交给它; - 映射到方法:
CatalogController类上标注@RequestMapping("/catalog"),方法viewCategory标注@GetMapping("/viewCategory"),Spring MVC 精确匹配到该方法,并用@RequestParam把categoryId注入参数; - 调用 Service:控制器通过
@Autowired注入的CatalogService查询商品列表和分类信息; - 填充 Model:结果通过
model.addAttribute("productList", ...)存入 Model,方法返回视图名字符串"catalog/Category"; - 视图解析:
InternalResourceViewResolver把视图名拼成/WEB-INF/jsp/catalog/Category.jsp,转发过去渲染; - 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.xml | DispatcherServlet 注册与 URL 映射 |
| spring-mvc.xml | 控制器扫描与视图解析器 |
| applicationContext.xml | 数据源、事务、MyBatis 配置 |
| CatalogController.java | 最典型的"查询 + Model + 视图"写法 |
| Category.jsp | JSTL 遍历 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),仅供参考