SpringMVC 简介

Web MVC framework
1.1 Spring MVC介绍

1.是一个模型-视图-控制(model-view-controller)框架,它设计为围绕DispatcherServlet将请求分派给各个处理器,具有可匹配的映射处理器(handler mappings)、视图解析器(view resolution)、本地设置、时区和主题解析以及支持文件上传。
2.在Spring Web MVC中,您可以使用任何对象作为命令或表单支持对象; 您不需要实现框架特定的接口或基类。

1.2 Spring MVC特性

1.明确的角色分离。各个角色--控制器,验证器,命令对象,表单对象,模型对象,DispatcherServlet,映射处理器,视图解析等等都可以用专门的对象来实现。
2.框架和程序类都可以使用直接使用强大的JavaBeans配置,这些配置包含简单的上下文的引用,如从控制器到业务对象和验证器。
3.适用性,非侵入性,灵活性,定义你需要的任何控制器方法签名。可能会使用的如(@RequestParam, @RequestHeader, @PathVariable)。
4.可重用的业务代码,不需要重复写,使用现有业务对象如命令对象或表单对象代替。
5.可定制绑定和验证,如本地化数据和数值绑定,而不要只是用字符串表单对象进行手动解析和转换业务对象。
6.可定制映射处理器和视图解析器。映射处理器和视图解析器的策略范围从简单的基于URL配置到复杂的专用解析策略,比其他框架更灵活。
7.灵活的模型传输,基础key/value的map模型,很容易与任何视图技术集成。
8.可定制化本地化,时区和主题解析。支持JSPs或不带Spring标签库的JSP,支持JSTL,内置支持Velocity。
9.提供一个称为Spring标签库的简单强大JSP标签库,支持如数据绑定和主题等功能,在标记代码方面自定义标签库提供了最大的灵活性。
10.从Spring2.0开始就引入了JSP表单标签库,使在JSP里面写表单变得更简单。
11.Beans的生命周期范围限定在当前的HTTP请求或HTTP的Session中,不是由Spring MVC提供的是由使用的WebApplicationContext容器限定的。

1.3 请求处理流程

Spring的Web MVC框架与许多其他Web MVC框架一样,以请求为驱动,围绕一个中央Servlet设计,将请求发送给控制器,并提供了其他促进Web应用程序开发的功能。 但是Spring的DispatcherServlet不仅仅是这样做。 它与Spring IoC容器完全集成,因此允许您使用Spring的其他所有功能。

 

1.请求处理流程图


 
 
DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类),因此可以Web应用程序中被声明。 您需要使用URL映射来映射要DispatcherServlet处理的请求。 以下是Servlet 3.0+环境中的标准Java EE Servlet配置:

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        ServletRegistration.Dynamic registration = container.addServlet("example", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/example/*");
    }

}
 在这个配置中以/ example开头的所有请求都将由名为Example的DispatcherServlet实例处理。WebApplicationInitializer是由Spring MVC提供的接口,可确保您的基于代码的配置被检测并自动用于初始化任何Servlet 3容器。AbstractAnnotationConfigDispatcherServletInitializer的接口的抽象基类实现通过简单地指定其servlet映射和列出配置类来更容易地注册DispatcherServlet。

也可以在web.xml中声明,下面是一个标准的Java EE Servlet配置。

<web-app>
    <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>/example/*</url-pattern>
    </servlet-mapping>

</web-app>
 

在Web MVC框架中,每个DispatcherServlet都有自己的WebApplicationContext,它继承了所有已经在根WebApplicationContext中定义的bean。

2.Spring Web MVC中的典型上下文层次结构

 

 
 在初始化DispatcherServlet时,Spring MVC将在Web应用程序的WEB-INF目录中查找名为[servlet-name] -servlet.xml的文件,并创建在那里定义的bean,覆盖全局范围内使用相同名称定义的任何bean的定义。

如以下DispatcherServlet 配置

 

 

<web-app>
    <servlet>
        <servlet-name>golfing</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>golfing</servlet-name>
        <url-pattern>/golfing/*</url-pattern>
    </servlet-mapping>
</web-app>
 

 

使用上述Servlet配置,您需要在应用程序中有一个名为/WEB-INF/golfing-servlet.xml的文件; 该文件将包含您所有的Spring Web MVC特定组件(bean)。 您可以通过Servlet初始化参数更改此配置文件的指定位置。

3.Spring Web MVC中的单根上下文




 
 

可以通过设置一个空的ContextConfigLocation servlet init参数进行配置,如下所示:

<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
 

WebApplicationContext是普通ApplicationContext的扩展,它具有Web应用程序所需的一些额外功能。 它与普通的ApplicationContext不同之处在于它能够解析主题,并且它知道它与哪个Servlet相关联(通过连接到ServletContext)。 WebApplicationContext绑定在ServletContext中,并且通过在RequestContextUtils类上的静态方法,您可以随时查找WebApplicationContext。

我们可以通过基于Java的配置实现

public class GolfingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // GolfingAppConfig defines beans that would be in root-context.xml
        return new Class[] { GolfingAppConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // GolfingWebConfig defines beans that would be in golfing-servlet.xml
        return new Class[] { GolfingWebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/golfing/*" };
    }

}
 

3.WebApplicationContext中的特殊Bean类型

HandlerMapping 将请求映射到一个处理器列表,它包含前置处理器和后置处理器(处理拦截器),其细节由HandlerMapping实现而异。 最流行的实现支持注释控制器,但其他实现也存在。
HandlerAdapter 主要是用来屏蔽DispatcherServlet 的技术细节,它帮助DispatcherServlet 调用映射到请求的处理程序,而不管实际调用哪个处理程序,如调用带注释的控制器需要解析各种注释。
HandlerExceptionResolver 将异常映射到视图,也允许更复杂的异常处理代码。
ViewResolver 将基于逻辑字符串的视图名称解析为实际的View类型。
LocaleResolver & LocaleContextResolver 解决客户端正在使用的区域设置以及可能的时区,以便能够提供国际化的视图。
ThemeResolver 解决您的Web应用程序可以使用的主题,例如,提供个性化的布局
MultipartResolver 解析多部分请求,以支持从HTML表单处理文件上传。
FlashMapManager 存储并检索“输入”和“输出”FlashMap,它可以用于将属性从一个请求传递到另一个请求,通常是通过重定向。

4.默认DispatcherServlet配置

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
 一旦您在WebApplicationContext中配置了一个特殊的bean(如InternalResourceViewResolver),就会覆盖了该特殊bean类型的默认实现列表。 例如,如果配置了InternalResourceViewResolver,则会忽略ViewResolver实现的默认列表。

5.DispatcherServlet处理序列

在您设置了DispatcherServlet并且针对该特定DispatcherServlet启动了一个请求后,DispatcherServlet将按如下所示开始处理请求:

● 在请求中搜索并绑定WebApplicationContext作为控制器和进程中的其他元素可以使用的属性。默认情况下,它将在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE键下绑定。   ● 语言环境解析器被绑定到请求,以使进程中的元素能够解决在处理请求时使用的区域设置(渲染视图,准备数据等)。 如果您不需要语言环境解析,则不需要它。   ● 主题解析器被绑定到使得诸如视图之类的元素确定要使用哪个主题的请求。 如果不使用主题,可以忽略它。   ● 如果指定了多部分文件解析器,则会检查该请求的多部分; 如果找到多部分,则请求被包装在MultipartHttpServletRequest中,以便进程中的其他元素进一步处理。   ● 搜索适当的处理程序,如果找到处理程序,通过执行与处理程序(预处理程序,后处理程序和控制器)关联的执行链来准备模型或渲染视图。   ● 如果返回模型则呈现视图。 如果没有返回模型(可能是由于预处理程序或后处理程序拦截请求,如可安全原因没有通过),因为请求可能已经被实现了,所以不会呈现任何视图。   在WebApplicationContext中声明的处理程序异常解析程序在处理请求期间提取异常。 使用这些异常解析器允许您定义自定义行为来解决异常。 Spring DispatcherServlet还支持返回由Servlet API指定的最后修改日期。 确定特定请求的最后修改日期的过程很简单:DispatcherServlet查找适当的处理程序映射,并测试发现的处理程序是否实现了LastModified接口。 如果是,则LastModified接口的long getLastModified(request)方法的值将返回给客户端。   DispatcherServlet初始化参数
contextClass 实现WebApplicationContext的类,它实例化了这个Servlet使用的上下文。 默认情况下,使用XmlWebApplicationContext。
contextConfigLocation 传递给上下文实例(由contextClass指定)以指示可以找到上下文的字符串,该字符串可能包含多个字符串(使用逗号作为分隔符)来支持多个上下文。在具有两次定义的bean的多个上下文位置的情况下,最后定义的优先级最高。
namespace WebApplicationContext的命名空间。 默认为[servlet-name] -servlet。
 

猜你喜欢

转载自tx1999.iteye.com/blog/2380031