Spring MVC处理浏览器发出请求到返回响应的全过程

版权声明:博主保留一切权利,转载请注明出处。 https://blog.csdn.net/li_canhui/article/details/85712651

在请求离开浏览器时,会带有用户正在请求哪些内容的信息。至少,也会带有被请求的URL。不过,请求还可能带有其他信息,例如,用户利用表格提交的信息。

请求旅程的第一个停止点是Spring的DispatcherServlet。和大多数Java的MVC框架一样,Spring将所有请求都经过一个前端Servlet控制器。这个控制器是一个常用的Web应用模式,一个单实例的servlet委托应用系统的其他模块进行真正的处理工作。在Spring MVC中,DispatcherServlet就是这个前端控制器。

DispatcherServlet的工作是将请求发送给Spring MVC控制器,所谓控制器就是一个处理请求的Spring组件。不过,一个典型的应用程序可能会有多个控制器,DispatcherServlet需要知道请求应该发送给哪个控制器。因此,DispatcherServlet会查询一个或多个控制器映射,了解请求的下一个停止点是什么。处理器映射会根据请求携带的URL做出决策。

一旦DispatcherServlet找到了一个控制器对象,它会将请求以适当的方式派发给这个控制器。在控制器上,请求卸下其负载,并且等待控制器处理这些信息(实际上,一个设计良好的控制器自己只执行很少或者自己不执行处理工作,而是委托给一个或多个业务组件,让它们负责业务逻辑处理)。

完成业务逻辑后,一般会生成一些需要返回给用户并在浏览器中显示的信息。这些信息被称为模型(model)。不过,仅仅向用户展示这些未加工的信息是不够的--这些信息需要被友好的格式进行格式化,一般是HTML。对那些需要传递给视图的信息,一般是JSP。

因此,控制器做的最后一件工作,是将模型数据和视图的名称打包到ModelAndView对象中。接着,将带有新ModelAndView捆绑的请求发送回DispatcherServlet。顾名思义,ModelAndView不仅携带模型数据,还携带由哪个视图来呈现结果的提示。

因此,控制器并不会和特定的视图耦合。ModelAndView并不携带具体JSP的引用,而是只携带视图对象的逻辑名,以便于查找生成结果HTML的实际视图。一旦ModelAndView被提交给DispatcherServlet,DispatcherServlet会要求视图解析器来协助查找实际的JSP。

现在,DispatcherServlet已经知道由哪个视图来渲染结果,请求工作也差不多完成了。最后一个停止点是被提交的模型数据达到的视图实现(可能是一个JSP)。随着模型数据被提交给视图,请求的所有工作就完成了。视图会使用这些模型数据渲染一个页面,并通过响应对象返回给浏览器。

猜你喜欢

转载自blog.csdn.net/li_canhui/article/details/85712651