1. 客户端发送HTTP请求
当客户端发送一个HTTP请求到服务器时,例如请求的URL为/login,请求方法为POST,请求体中包含了用户名和密码。
2. Web容器接收请求
这个请求首先会被Web容器接收,例如Tomcat或Jetty。Web容器会根据web.xml中的配置,将请求转发给DispatcherServlet。
3. DispatcherServlet接收请求
在web.xml中,我们通常会配置DispatcherServlet如下:
```xml
<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-config.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>
```
这样,所有的请求都会被DispatcherServlet接收。
4. HandlerMapping将请求映射到Controller
当DispatcherServlet接收到请求后,它会调用HandlerMapping的方法,将请求映射到相应的Controller。在Spring MVC中,我们通常使用@RequestMapping注解来定义URL到Controller方法的映射关系。
例如,我们可以在UserController中定义一个处理/login请求的方法:
```java
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model) {
// 处理登录逻辑
}
}
```
在这个例子中,当DispatcherServlet接收到/login请求时,它会调用HandlerMapping的方法,将请求映射到UserController的login方法。
5. HandlerAdapter调用Controller处理请求
当HandlerMapping将请求映射到相应的Controller后,DispatcherServlet会调用HandlerAdapter的方法,将HTTP请求转换为处理器可以处理的形式,并将处理器的处理结果转换为HTTP响应。
在Spring MVC中,HandlerAdapter的主要实现类是AbstractHandlerMethodAdapter,它有两个子类:RequestMappingHandlerAdapter和HttpHandlerAdapter。RequestMappingHandlerAdapter负责将HTTP请求转换为处理器可以处理的形式,并将处理器的处理结果转换为HTTP响应。
RequestMappingHandlerAdapter主要完成以下任务:
1. 参数解析:将HTTP请求中的参数解析为处理器方法的参数。
2. 返回值处理:将处理器方法的返回值处理为ModelAndView对象。
3. 异常处理:处理处理器方法抛出的异常。
当RequestMappingHandlerAdapter需要解析一个参数时,它会遍历所有的HandlerMethodArgumentResolver,找到一个支持解析该参数的HandlerMethodArgumentResolver,然后调用它的resolveArgument方法解析参数。
当RequestMappingHandlerAdapter需要处理一个返回值时,它会遍历所有的HandlerMethodReturnValueHandler,找到一个支持处理该返回值的HandlerMethodReturnValueHandler,然后调用它的handleReturnValue方法处理返回值。
当RequestMappingHandlerAdapter需要处理一个异常时,它会遍历所有的HandlerExceptionResolver,找到一个支持处理该异常的HandlerExceptionResolver,然后调用它的resolveException方法处理异常。
6. ViewResolver渲染视图
当HandlerAdapter处理完请求后,它会返回一个ModelAndView对象。这个对象包含了要渲染的视图名和模型数据。
DispatcherServlet会将ModelAndView对象传递给ViewResolver,让它根据视图名找到相应的视图。ViewResolver的主要实现类是InternalResourceViewResolver,它会将视图名解析为一个JSP文件的路径,并将模型数据传递给JSP文件。
例如,如果ModelAndView对象的视图名为"home",那么InternalResourceViewResolver会将它解析为"/WEB-INF/views/home.jsp",然后将模型数据传递给home.jsp文件。
7. Web容器发送HTTP响应
最后,Web容器会将渲染好的JSP文件转换为HTTP响应,然后将它发送给客户端。
总结
以上就是整个Spring MVC框架处理请求的过程。在这个过程中,DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver等组件协同工作,将HTTP请求转换为处理器可以处理的形式,并将处理器的处理结果转换为HTTP响应。这个过程中使用了一组HandlerMethodArgumentResolver、HandlerMethodReturnValueHandler和HandlerExceptionResolver等接口的实现类,为Spring MVC提供了高度的灵活性和可扩展性,使得框架能够支持各种各样的请求和响应类型。
通过一个简单的登录请求探究spring mvc的处理流程
最新推荐文章于 2024-07-22 14:15:06 发布