面试中经常被问到的一个关于Spring MVC的问题就是解释web请求的过程,比如一个HTTP请求从开始到结束的处理过程。换句话说,就是解释Spring MVC处理请求的过程。其实,所有的请求都是从客户端出发,发送到特定的URL。当请求到达web容器,比如tomcat,它就会在web.xml中找出已经配置好的来处理特定的URL的Servlet或过滤器。由于Spring MVC是建立在Servlet之上的,所以这也是任何以Spring MVC为基础构建的Java Web应用的处理请求的过程。
像tomcat这样的web容器,是负责创建Servlet和过滤器实例,然后调用它们的各个生命周期内的方法,比如init(),service(),destroy()。在HTTP请求的例子中,HttpServlet负责处理请求,根据HttP请求的方法类型,调用各种doXXX()方法。比如doGet()处理GET请求,doPost处理POST请求。
我们应该都知道在启动一个Spring MVC项目的时候,我们要在web.xml配置文件中声明DispatcherServlet。如下图的web.xml所示,这个Servlet监听的URL是*模式,这意味着所有的请求都能通过DispatcherServlet。
下面是Spring MVC中的web.xml配置,从中你可以看到DispatcherServlet能处理各种使用*匹配模式的URL的请求。

<web-app>
    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet
        </servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>
                contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/config/web-application-config.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>*</url-pattern>
    </servlet-mapping>
</web-app>

URL匹配模式是非常重要的,如果请求符合DispatcherServlet配置的URL模式,那么这个请求就会被处理,否则就不会。DispatcherServlet根据URL请求的地址把请求传给指定的controller。那么DispatcherServlet是如何知道请求要传给哪个controller的呢?
使用@RequestMapping注解或者Spring MVC配置文件,可以找到URL请求的controller。当然也可以用特定的请求注解,比如@GetMapping或PostMapping。controller文件必须使用@Controller或@RestController(Restful风格)注解进行标记。

下面的这个例子中,Controller会处理所有包含 /appointments的URL。其中@GetMapping标记的方法会处理GET请求,@PostMapping标记的方法会处理POST请求。

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
    @GetMapping
    public Map get() {
        return appointmentBook.getAppointmentsForToday();
    }

    @PostMapping
    public String add(@Valid AppointmentForm appointment, BindingResult result) {
        if (result.hasErrors()) {
            return "appointments/new";
        }
        appointmentBook.addAppointment(appointment);
        return "redirect:/appointments";
    }
}

在处理请求之后,Controller将一个逻辑视图的名称和模型返回给DispatcherServlet,它会询问视图解析器,直到确定好一个实际的视图来呈现输出为止。
DispatchServlet可以选择Freemarker或JSP来展示数据。
呈现的输出作为HTTP响应返回给客户端,在返回的过程中,可以传递给配置好的过滤器,比如Spring Security过滤器链或者将响应转换为JSON或XML的过滤器。
Spring MVC框架中的DispatcherServlet是前端控制器模式的实现。它是单一入口点-处理所有传入的请求,不过这取决于URL配置模式和你的应用。
下面用一张图来表示Spring MVC的工作过程。

最后,总结一下Spring MVC处理HTTP请求的过程
1.客户端发送HTTP请求到指定的URL。
2.Spring MVC的DispatcherServlet接收到请求
3.DispatcherServlet把请求传到用@Controller和@RequestMapping注解的controller
4.Spring MVC返回逻辑视图的名称和模型给DispatcherServlet
5.DispatcherServlet咨询视图处理器直到有实际的视图来展示数据为止
6.DispatcherServlet使用模型数据联系所选的视图,例如Thymeleaf,Freemarker,JSP,并根据数据模型呈现输出。
7.呈现的输出作为响应返回给客户端
以上就是Spring MVC的工作流程或者说Spring MVC处理HTTP请求的过程。

原文地址

更多推荐

Spring MVC处理HTTP请求的过程