Spring MVC(Model-View-Controller)是一种基于请求和响应的设计模式,它通过分离不同的业务功能模块,提高了代码的可维护性和扩展性。在Spring MVC中,处理HTTP请求的过程涉及多个组件的协作,下面详细讲解Spring MVC的执行流程。
Spring MVC 执行流程概述
- 客户端发起请求:客户端(如浏览器)向服务器发送一个HTTP请求。
- DispatcherServlet 接收请求:Spring MVC的前端控制器
DispatcherServlet
接收到客户端的请求,并将其转发给适当的处理器。 - HandlerMapping 查找处理器:
DispatcherServlet
通过HandlerMapping
查找与请求URL匹配的处理器(Controller)。 - Controller 处理请求:找到对应的处理器(Controller)后,
DispatcherServlet
将请求交给它处理。 - 返回模型和视图:Controller处理完请求后,会返回一个包含模型数据(Model)和视图(View)的对象(通常是
ModelAndView
)。 - ViewResolver 解析视图:
DispatcherServlet
将返回的视图名传递给ViewResolver
,后者根据视图名找到对应的视图(JSP、Thymeleaf等)。 - 渲染视图:
View
负责渲染最终的HTML页面并返回给客户端。 - 客户端显示响应:最终生成的响应(HTML)被返回到客户端,浏览器渲染页面。
Spring MVC 执行流程详解
1. 客户端请求
客户端(如浏览器)发送HTTP请求,URL通常会指向一个特定的控制器(Controller)方法。例如,用户访问http://localhost:8080/myapp/hello
。
2. DispatcherServlet 接收请求
所有的请求都会首先由Spring MVC的前端控制器DispatcherServlet
来接收。DispatcherServlet
是Spring MVC架构中的核心,它负责将请求分发到正确的Controller,并处理返回的结果。
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3. HandlerMapping 查找处理器(Controller)
DispatcherServlet
会根据请求的URL,使用HandlerMapping
来查找哪个Controller负责处理该请求。Spring MVC可以使用多种方式来配置HandlerMapping
,比如基于注解的方式(@RequestMapping
)或基于XML的配置。
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping
public String sayHello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "helloView";
}
}
在此例中,@RequestMapping("/hello")
定义了该Controller处理/hello
路径的请求。
4. Controller 处理请求
DispatcherServlet
将请求交给相应的Controller进行处理。Controller方法可以有不同的返回值类型,比如String
、ModelAndView
、ResponseEntity
等。通常返回的是一个视图名称(如"helloView"
)和模型数据(Model
或ModelMap
)。
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "helloView"; // 返回视图名称
}
}
5. 返回模型和视图(ModelAndView)
Controller处理完请求后,会返回一个ModelAndView
对象。ModelAndView
包含了两个主要内容:
- 模型(Model):包含了数据,通常是一个Map结构,存储了请求的结果数据。
- 视图(View):指定了要渲染的视图(如JSP、HTML等)。
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("helloView"); // 设置视图
modelAndView.addObject("message", "Hello, Spring MVC!"); // 设置模型数据
return modelAndView;
}
6. ViewResolver 解析视图
DispatcherServlet
将通过ViewResolver
来解析视图名称,查找实际的视图文件(如JSP、Thymeleaf模板等)。ViewResolver
负责根据视图名找到具体的视图文件。
Spring MVC支持多种视图解析方式,最常见的是JSP视图解析:
<bean class="org.springframework.web.servlet.view.JstlView">
<property name="url" value="/WEB-INF/jsp/hello.jsp"/>
</bean>
7. 渲染视图
View
对象负责将模型数据填充到视图模板中,并渲染成最终的HTML响应。不同的视图技术(如JSP、Thymeleaf)会有不同的渲染方式。
例如,JSP视图会通过JSP引擎渲染页面,将数据(如message
)替换到页面中。
<!-- hello.jsp -->
<html>
<head><title>Hello Page</title></head>
<body>
<h1>${message}</h1>
</body>
</html>
8. 客户端显示响应
最终,渲染好的HTML内容作为HTTP响应返回给客户端,客户端的浏览器会显示该页面。
Spring MVC 执行流程图
客户端请求 --> DispatcherServlet --> HandlerMapping 查找控制器
| |
找到对应的Controller --> Controller 处理请求
| |
返回 ModelAndView ViewResolver 解析视图
| |
渲染视图并返回给客户端 --> 客户端显示响应
总结
Spring MVC的执行流程是一个由多个组件协作完成的过程:
- DispatcherServlet 负责请求的接收与分发。
- HandlerMapping 查找对应的控制器(Controller)。
- Controller 处理业务逻辑并返回视图名称和数据。
- ViewResolver 解析视图并渲染页面。
- View 渲染最终的响应内容。
Spring MVC的这种分层设计使得代码的关注点分离,提高了应用的可扩展性和维护性。