初识Spring-MVC之DispatcherServlet详解

Spring-MVC是一种基于请求启动的WEB框架,并且使用了前端控制器的设计模式,所有满足【WEB-INF/web.xml】文件中的【url-pattern】的匹配条件的请求,这些满足的请求都会交给这个前端控制器。而这个前端控制器就是【DispatcherServlet】,然后再由这个前端控制器转交给满足URL匹配的页面控制器。

这个前端控制器就是提供一个统一的访问点,

一、Spring-MVC的一个请求的流程图:

二、DispatcherServlet的功能:从上图可以清楚的看到DispatcherServlet的部分功能:

①、DispatcherServlet通过HandlerMapping,将请求映射到一个页面处理器上(返回一个HandlerExecutionChain,它包括多个HandlerInterceptor连接器,和一个Handler处理器)

②、DispatcherServlet通过HandlerAdapter支持多种类型的处理器(例如:SimpleControllerHandlerAdapter,   AnnotationMethodHandlerAdapter等等)

③、通过ViewResolver解析逻辑视图名到具体的视图名

④、渲染具体的视图

⑤、在执行过程中,如果遇到异常HandlerExceptionResolver处理

⑥、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析。

三、DispatcherServlet在web.xml文件中的配置参数:例如

<servlet>
        <!--servlet的一个名称-->
        <servlet-name>do</servlet-name>
        <!--Dispatcherservlet所在的类路径-->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--下面可以不写,他有一个默认的contextConfigLocation配置,默认的param-value是【servlet-name】的值-servlet.xml文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/do-servlet.xml</param-value>
        </init-param>
        <!--在服务器启东时,初始化改servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>do</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

这个servlet就是设置DispatcherServlet的。

①、load-on-startup就是在启动服务器的时候,初始化该servlet

②、init-param就是这个DispatcherServlet的属性值,可以自己配置初始化参数,这样就会把默认的参数值覆盖掉:

其中param-name就是属性名,而param-value就是对应的属性值

他的主要参数有:


参数


描述


contextClass


实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。如果这个参数没有指定, 默认使用XmlWebApplicationContext。


contextConfigLocation


传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。他有一个默认值:servlet的name-servlet.xml的配置文件。,如果设置的话,就会覆盖默认值


namespace


WebApplicationContext命名空间。默认值是[server-name]-servlet。

③、url-pattern可以看【初识Spring-MVC之Controller的URL的映射规则注解版】中的第1小点。http://blog.csdn.net/cw_hello1/article/details/51322652

四、上下文的关系:

集成WEB环境的通用配置,在web.xml文件中设置:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
        <!--默认值是:applicationContext.xml-->
    </context-param>

    <!--作用就是在启动web服务器时,自动装配ApplicationContext的配置信息-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

如上设置是Spring集成WEB框架的通用配置,一般用于加载除了WEB层的Bean,例如(DataSource,DAO,service等等)的Bean以便于与其他任何WEB框架的集成

contextConfigLocation,用于设置Spring的配置文件。有一个默认值,是applicationContext.xml

contextClass:用于设置加载Bean的ApplicationContext的实现类,默认值是WebApplicationContext

而listener监听器,就是在服务器启动时,自动装配applicationContext的配置信息

五、ContextLoaderLister初始化的上下文和DispatcherServlet初始化的上下文的关系:

从图中可以看出:

ContextLoadLister配置的上下文加载的Bean是对整个应用程序所共享,不管使用什么表现层技术,一般如DAO,service,dataSource等等。

DispatcherServlet配置的上下文加载的Bean只能是Spring-WEB-MVC有效的Bean,例如controller,HandlerMapping,handlerAdapter等等。

六、初始化默认的上下文参数:

在DispatcherServlet中的initStrategies方法中,初始化使用的策略:

public class DispatcherServlet extends FrameworkServlet {
     //实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
    @Override
    protected void onRefresh(ApplicationContext context) {
       initStrategies(context);
    }

    //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
    protected void initStrategies(ApplicationContext context) {
       initMultipartResolver(context);
       initLocaleResolver(context);
       initThemeResolver(context);
       initHandlerMappings(context);
       initHandlerAdapters(context);
       initHandlerExceptionResolvers(context);
       initRequestToViewNameTranslator(context);
       initViewResolvers(context);
       initFlashMapManager(context);
    }
……
}

DispatcherServlet在启动时,会进行我们在Spring-MVC的中设置了init-param的属性值配置,就是用指定的属性值,如果没有设置就是用默认的属性。

默认的属性值在:Spring-webmvcjar包下的org.springframework.web.servlet.DispatcherServlet.properties中配置。例如:

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

如上的Bean配置,会在DispatcherServlet启动时,会自动配置这些特殊的Bean,如果我们设置就不会自动装配对应的Bean,而是会加载你在xml文件中设置的bean

七、DispatcherServlet的特殊的Bean:

①、controller:就是页面控制器,可以使用@controller注解方式,可以实现Controller接口的方式。

②、HandlerMapping:就是请求处理器的映射。默认值就是【上面代码的第3条】,可以通过注解,Bean的name值等等

③、HandlerAdapter:HandlerAdapter会将处理器包装成适配器。默认值就是【上面代码的第4条】.例如:如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,执行处理器的handleRequest方法进行功能。

④、ViewResolver:用于将逻辑视图名传话为集体的视图名。默认值就是【上面代码的倒数第2条】。需要设置他的前缀,和后缀等信息。

⑤、LocalResover:用于本地序列化,支持国际化。

⑥、ThemeResovler:主题解析

⑦、MultipartResolver:文件上传解析,用于支持文件上传;

⑧、HandlerExceptionResolver:处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面

⑨、RequestToViewNameTranslator:当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名

时间: 2024-08-26 06:49:58

初识Spring-MVC之DispatcherServlet详解的相关文章

Spring mvc请求处理流程详解(一)之视图解析

前言 Spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过,但是后面一段时间不用发现又忘记了.所以决定写下来,以备后用. 本系列文基于spring-4.3.1,配置方式全部基于java-based方式 从配置讲起 先上一段配置的代码: @EnableWebMvc @Configuration public class MvcConfig extends WebMvcConfigurerAdapt

Spring MVC @RequestMapping注解详解

@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) params:定义请求的 URL 中必须包含的参数.或者不包含某些参数.(了解) headers:定义请求中 Request Headers 必须包含的参数.或者不包含某些参数.(了解) @RequestMapping 的用法 @RequestMapping 有两种标注方式,一种是标注在类级别上,一种是

Spring MVC 配置Controller详解

在SpringMVC中,对于Controller的配置方式有很多种,如下做简单总结 第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置: <!-- 表示将请求的URL和Bean名字映射--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean name="/hello.do" class

Spring mvc整合freemarker详解

1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) 2.FreeMarker特性 能够生成各种文本:HTML.XML.RTF.Java源代码等等 易于嵌入到你的产品中:轻量级:不需要Servl

Spring MVC 注解开发详解

@Controller控制器定义 1.Controller是单利模式,被多个线程请求共享,因此设计成无序状态. 2.通过@controller标注即可将class定义为一个controller类.为使spring能找到定义为controller的bean,需要在spring-context配置文件中增加如下定义: @RequestMapping @RequestParam @SessionAttributes @ModelAttribute

Spring MVC整合Velocity详解

一.Velocity简介 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人 员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码.Velocity将java代码从web页面中分离出来,这样为web站点的长 期维

Spring MVC之@RequestMapping 详解

引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessage

[转]Spring MVC之@RequestMapping 详解

前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessageConv

【转】Spring MVC之@RequestMapping 详解

@RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她分成三类进行说明. 1. value, method: value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明): method:  指定请求的method类型, GET.POST.PUT.DELETE等: 2. con

Spring MVC之@ModelAttribute详解

用法 其实这个注解最多也就两个用处,第一个就是被该注解注释的方法会在相应的controller中的任何一个方法执行之前执行一遍,直接贴代码吧 @ModelAttribute public void getUser(Map<String, Object> map){ User user=new User("xhj", "123456", "23"); map.put("user", user); } @Request