Web MVC framework 笔记

来源:互联网 发布:ubuntu 17.04安装软件 编辑:程序博客网 时间:2024/06/06 00:20

读参考手册记下的,写的不够严格


DispatcherServlet

Spring MVC 的设计是围绕着一个DispatcherServlet开始的,DispatcherServlet负责将请求分发给各种Handler,Handler是通过配置实现的,而最基础的Handler就如@Controller和@RequestMapping注释,这两个灵活广泛的控制着各种请求。

DispatcherServlet和大多数mvc框架一样是一种前置控制器


DispatcherServlet是继承自HttpServlet的,所以搭建Spring MVC的开始就是
    <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>                classpath:servlet-context.xml            </param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>
如果你不指定contextConfigLocation,这个xml自动设置在web-inf目录下的${servlet-name}-servlet.xml

在Spring  MVC中每一个(当然,一般我们只有一个)DispatcherServlet都有自己的一个WebApplicationContext,就是上面代码中的servlet-context.xml,说白了就是一个定义bean的地方,这个WebApplicationContext会覆盖和继承我们其他地方定义的bean

一个DispatcherServlet指定的xml就对应着一个WebApplicationContext,而一个WebApplicationContext则对应着一个ServletContext,通过RequestContextUtils的静态方法你可以随时查看这个WebApplicationContext。
应该是这样,与Spring MVC相关的所有bean你都要定义在这个DispatcherServlet指定的xml中,其他的bean随意。因为一个DispatcherServlet指定的bean是和Servlet的生命周期绑定在一块的,而一个本地应用的bean则不是。

在这个WebApplicationContext中,即便是你不指定一个bean,Spring MVC还是默认维护着一堆bean给你用的
HandlerMappingHandlerAdapterHandlerExceptionResolverViewResolver    LocaleResolverMultipartResolverThemeResolverFlashMapManager
上面这些都是接口,在WebApplicationContext中有默认的配置和实现,如果你在你自己的WebApplicationContext中配置的它们,原先的默认就会被忽略,知道有这个概念就行,你迟早是要自定义这些bean的。

关于DispatcherServlet执行过程

1.和配置文件对应的WebApplicationContext将会找出来放在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE中,以供请求后续的controller和其他东西使用
2.locale resolver本地化解析器会绑定到请求中
3.theme resolver主题解析器会绑定到请求中,这关系到你是用jsp还是freemark之类的视图
4.如果你指定了multipart file resolver,请求还会去查找multiparts,如果找到了,请求会包装在一个MultipartHttpServletRequest中传递下去,这个关系到文件的upload。
5.一个适合的controller会被发现,请求的执行过程将会和controller的过程联系起来,因为controller会提供渲染视图需要的数据,也就是model
6.如果model有了,视图成功渲染,如果没有,渲染过程就不会执行,应为即便是没有model,一个请求也可能会成功返回。

DispatcherServlet是可以通过servlet api返回头信息的,通过controller继承LastModified接口,实现接口的LastModified方法就可以把last-modification-date头信息带回去了,具体看API吧

DispatcherServlet有三个可配置的参数
contextClass:指定载入配置文件的方式,默认是XmlWebApplicationContext
contextConfigLocation:指定配置文件的位置
namsapce:一般没什么用,默认是是[servlet-name]-servlet

0 0
原创粉丝点击