dispatcherServlet--前置控制器
handlerMapping接口--处理请求的映射
handlerMapping接口的实现类:(a).simpleUrlHandlerMapping通过配置文件,把url映射到controller.(b).defaultAnnotationHandlerMapping 通过注解,把url映射到controller类上
handlerAdapter接口---处理请求的映射
AnnotationMethodHandlerAdapter类,通过注射,把url映射到controller类的方法上
controller接口----控制器:使用@controller注解的类就可以担任控制器(action)的职责,就可以不使用这个接口
handlerInterceptor接口----拦截器
viewResolver接口的实现类:UrlBasedViewResolver类通过配置文件,把一个视图名交给到一个View来处理,InternalResourceViewResolver类,比上面的类加了JSTL支持
HandlerExceptionResolver接口---异常处理
SimpleMappingExceptionResolver实现类
spring3 MVC核心流程图说明:浏览器发送Http请求到前置控制器(dispatcherServlet),前置控制器(dispatcherServlet)提交请求到handlerMapping,通过handlerMapping接口的实现类defaultAnnotationhandlerMapping来判断是否通过注解,把url映射到controller类上,如果找到就经过拦截器(handlerInterceptor)交由控制器处理业务,如果未找到controller再交由simpleUrlHandlerMapping来判断是否通过配置文件把url映射到controller上,如何还未找到,就有defaulthandler发送Http响应,如果找到就经过拦截器(handlerInterceptor)交由控制器处理业务。再由控制器交给ViewResolver接口,有ViewResolver接口的实现类来交给view控制器,最后由view控制器发送HTTP响应到浏览器
DispatcherServlet说明:dispatcherServlet是一个servlet,所以可以配置多个dispatcherServlet,dispatcherServlet是前置控制器,配置在web.xml文件中,servlet拦截匹配规则自定义,把拦截到的请求,依据你使用的handlerMapping接口的实现类发到目标controller(我们写的Action)来处理。
例子1
<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlert>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>
<load-on-startup>1</load-on-startup>是启动顺序,让这个servlet随servletp容器一起启动
<url-pattern>*.form</url-pattern>会拦截*.form的请求。
<servlet-name>example</servlet-name>这个servlet的名字是example,每一个通过name对于的dispatcherServlet都有自己的WebApplicationContext上下文对象。同时保存的servletContext中和request对象中。
在dispatcherServlet的初始化过程中,框架会在WEB应用的web-inf文件夹下找到<servlet-name>-servlet.xml的配置文件,生产文件中定义的bean。
例子2:
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/springMVC.xml</param-value>
</init-param>
<load-on-startup>1<load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
指明配置文件的文件名,不使用默认的配置文件名,而使用springMVC.xml配置文件
<param-value>的写法(a)**.xml(b)不写。默认值/WEB-INF/<servlet-name>-servlet.xml(c)/WEB-INF/classes/springMVC.xml(d)classpath*:springMVC-mvc.xml(e)多个值使用逗号分隔。
spring会创建一个WebApplicationContext上下文,称为父上下文。保存在servletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。
使用spring提供的工具类取出上下文对象:WebApplicationContextUtils.getApplicationContext(ServletContext);
dispatcherServlet是一个servlet有一个自己对应的上下文对象(WebApplicationContext)称为子上下文。子上下文可以访问父上下文的内容,但父上下文不能访问子上下文的内容。它也保存在ServletContext中,key是org.springframework.web.servlet.FrameworkServlet.CONTEXT+Servlet名称。当一个Request对象产生时,会把这个子上下文(WebApplicationContext)保存在Request对象中,key是DispatcherServlet.class.getName()+.CONTEXT.
可以使用工具类取出上下文对象:RequestContextUtils.getWebApplicationContext(request);