Spring MVC 是一个基于 Java 的请求驱动型 Web 框架,其核心设计围绕 前端控制器模式,通过 DispatcherServlet 协调各个组件处理 HTTP 请求。以下是其完整的执行流程,共分为 8 个核心步骤:
1. HTTP请求到达DispatcherServlet
入口:所有请求首先由 DispatcherServlet
(前端控制器)接收。
配置:在 web.xml
中定义 DispatcherServlet
并映射 URL 路径(如 /
):
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2. 查询HandlerMapping
作用:确定请求对应的 Controller 方法。
组件:HandlerMapping
(如 RequestMappingHandlerMapping
)根据 URL 和注解(如 @RequestMapping
)匹配处理器。
Controller方法定义示例:
@Controller
public class UserController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "user/detail";
}
}
3. 调用HandlerAdapter
作用:适配器模式,执行 Controller 方法。
组件:HandlerAdapter
(如 RequestMappingHandlerAdapter
)负责调用方法,处理参数绑定(如 @RequestParam
、@RequestBody
)。
流程:
解析方法参数(通过 ArgumentResolver
)。
执行 Controller 方法。
处理返回值(通过 ReturnValueHandler
)。
4. Controller处理请求
业务逻辑:Controller 调用 Service 层,处理业务并返回数据。
返回值类型:
ModelAndView
:包含模型数据和视图名。
String
:视图名(如 "redirect:/success"
)。
@ResponseBody
:直接返回 JSON/XML 数据。
5. 处理返回值和Model
模型填充:将数据存入 Model
对象,供视图渲染使用。
@PostMapping("/user/create")
public String createUser(User user, RedirectAttributes redirectAttrs) {
userService.save(user);
redirectAttrs.addFlashAttribute("message", "用户创建成功!");
return "redirect:/user/list";
}
6. 解析视图(ViewResolver)
作用:将逻辑视图名(如 "user/detail"
)解析为实际视图对象(如 JSP、Thymeleaf)。
配置:在 spring-mvc.xml
中配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
7.渲染视图(View)
模板引擎:将模型数据填充到视图模板,生成 HTML。
示例:JSP 页面中访问模型数据:
<h1>用户详情</h1>
<p>用户名:${user.name}</p>
8. 返回HTTP响应
输出:将渲染后的内容写入 HttpServletResponse
,返回客户端。
小结
- 首先,用户发起一个HTTP请求到Web应用,这个请求会被前端控制器(DispatcherServlet)处理。DispatcherServlet是Spring MVC的核心,负责协调各个组件。
- 接下来,DispatcherServlet会查询处理器映射器(HandlerMapping)来确定哪个控制器(Controller)会处理这个请求。
- 然后,DispactcherServlet会将请求交给对应的Controller处理。Controller执行具体的业务逻辑,可能会调用Service层,处理数据,并返回一个模型和视图(ModelAndView)对象。
- 之后,DispactherServlet会根据视图名称,通过视图解析器(ViewResolver)来解析具体的视图对象。
- 最后,视图渲染阶段。将模型数据填充到视图中,生成最终的响应内容,返回给客户端。