图片来源:狂神说
1. DispatcherServlet表示前置控制器,是整个
SpringMVC
的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>加载/WEB-INF/spring/目录下的所有XML作为Spring MVC的配置文件</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动级别:1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / 匹配所有的请求:不包括.jsp-->
<!-- /* 匹配所有的请求:包括.jsp-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2. HandlerMapping为处理器映射。
DispatcherServlet
调用
HandlerMapping,HandlerMapping
根据 请求url
查找
Handler
。
这里我们请求了hello,要根据hello找到处理器
在springmvc-servlet.xml中
3. HandlerExecution表示具体的
Handler,
其主要作用是根据
url
查找控制器,如上
url
被查找控制器 为:hello
。
4. HandlerExecution将解析后的信息传递给
DispatcherServlet,
如解析控制器映射等。
5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行
Handler,说白了就是去找Controller。而这一步其实已经被spring做完了。
6. Handler让具体的
Controller
执行。
package com.dc.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//模型和视图
ModelAndView mav=new ModelAndView();
//封装对象,放在ModelAndView中
mav.addObject("msg","hellodc");
//封装要跳转的视图,放在ModelAndView中
mav.setViewName("hello");
return mav;
}
}
7. Controller将具体的执行信息返回给
HandlerAdapter,
如
ModelAndView
。
8. HandlerAdapter将视图逻辑名或模型传递给
DispatcherServlet
。
<!-- 视图解析器:DispatcherServlet给他的ModelAndView
1.获取了ModelAndView中的数据
2.解析ModelAndView的视图名字
3.拼接视图名字,找到对应的视图:/WEB-INF/jsp/hello.jsp
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
9. DispatcherServlet调用视图解析器
(ViewResolver)
来解析
HandlerAdapter
传递的逻辑视图名。
10. 视图解析器将解析的逻辑视图名传给
DispatcherServlet
。
11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
12. 最终视图呈现给用户。