知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停地来唤醒你记忆深处的知识点。
一、请求如何达到后端
一个常见的Spring MVC Web请求的流程,即如何从头到尾处理HTTP请求。换句话说,解释Spring MVC中的请求流程。这一切都从客户端说起,客户端向特定URL发送请求。当该请求到达Web容器时,例如Tomcat,它会查看web.xml并找到映射到该特定URL的Servlet或Filter。它是Servlet或Filter处理请求的委托。由于Spring MVC构建在Servlet之上,因此这也是所有基于Spring MVC的Java Web应用程序中的初始请求过程。
Web容器例:如Tomcat负责创建Servlet和Filter实例并调用它们的各种生命周期方法,
例如 init(),service(),destroy()。在HTTP请求的情况下,HttpServlet处理该请求,并且根据HTTP请求方法,容器调用各种doXXX()方法,例如doGet()来处理GET请求和doPost()来处理POST请求。
要启用Spring MVC,我们需要将Spring MVC jar中的DispatcherServlet声明为web.xml。这个Servlet侦听URL模式*,如下面的web.xml所示,这意味着所有请求都映射到DispatcherServlet。
可以将其他servlet映射到其他URL,但如果使用Spring MVC开发Web应用程序或RESTful Web服务,则通过DispatcherServlet传递所有请求是有意义的。 这是Spring MVC的web.xml配置,可以看到DispatcherServlet使用URL模式映射到所有请求*
URL模式很重要,如果请求与DispatcherServlet的URL模式匹配,那么它将由Spring MVC处理,否则不会。DispatcherServlet根据请求的URL将请求传递给特定的控制器。DispatcherServlet如何知道哪个请求需要传递给哪个控制器? 它使用@RequestMapping注解或Spring MVC配置文件来查找请求URL到不同控制器的映射。它还可以使用特定的请求处理注解,例如@GetMapping或@PostMapping。控制器类也使用@Controller和@RestController进行标识
(在RESTful Web服务的情况下)注解。
二、简单例题
如,class下面是一个Controller,它将处理任何具有URI “/user”的请求。它还有@GetMapping,这意味着当收到此URL的GET请求时将调用该方法。如果客户端向“/user” URI 发送POST请求,则将调用使用@PostMapping注解的方法。
a. 处理完请求后,Controller会将逻辑视图名称和模型返回给DispatcherServlet,它会查询视图解析器,直到确定实际View呈现输出为止。然后,DispatcherServlet将所选视图(例如Freemarker或JSP)与模型数据联系,并根据模型数据呈现渲染输出。
b. 此渲染输出作为HTTP响应返回给客户端。在它回来的路上,它可以传递给任何已配置的过滤器,例如Spring Security过滤器链或配置为将响应转换为JSON或XML的过滤器。
c. Spring MVC框架中的DispatcherServlet是前端控制器模式,它也是一个单一的入口点 - 处理所有传入的请求,但这又取决于你的URL模式映射和你的应用程序。
d. 它将进一步处理的请求委托给其他组件,例如控制器,视图,视图解析器,处理程序映射器,异常处理程序等。
e. 它还可以直接映射到/,但是需要配置处理静态资源的异常。如果您查看web.xml配置,它还会使用load-on-startup标记进行预加载。
三、Spring MVC工作流程
四、Spring MVC框架的工作原理
RESTful Web Service请求的流程也与此没有太大区别。它遵循相同的路径,但在REST的情况下,Controller方法使用@ResponseBody注解, 这意味着它不会向DispatcherServlet返回逻辑视图名称,而是将输出直接写入HTTP响应主体。
总之,以下是使用Spring MVC框架创建的Java应用程序中的HTTP请求流:
1)客户端向特定URL发送HTTP请求
2)Spring MVC的DispatcherServlet接收请求
2)它将请求传递给特定控制器取决于使用@Controller和@RequestMapping注解请求的URL 。
3)Spring MVC Controller然后将逻辑视图名称和模型返回给DispatcherServlet。
4)DispatcherServlet查询视图解析器,直到确定实际View呈现输出
5)DispatcherServlet使用模型数据联系所选视图(例如Thymeleaf,Freemarker,JSP),并根据模型数据呈现渲染输出
6)渲染的输出作为响应返回给客户端。