[Spring MVC Framework 自我学习系列加翻译1]

Spring MVC 特色

1.对于每个业务角色都有明确定义 :Controller Validator,Command Object, Form Object,Model Object , DispatcherServlet, Handler Mapping, View Resolver.

2.无论是框架还是应用的 Class都是可配置的

3.使用Annotation 达到适配性,灵活性,并且不会和应用代码强耦合

4.业务代码的可重用性,可以直接将自己的业务对象映射成Command或者Form 对象

5.可定制的数据绑定和校验

6.可定制的Handler映射以及视图策略,可以使用基于URL的配置也可以使用内建复杂的策略

7。灵活的Model 传递技术,基于Map实现的Model很容易实现和其他视图技术集成

8.可定制的Locale以及Theme类,支持JSP标签库,支持Velocity

9.提供强大的Spring 标签库

10.<form>标签使写Jsp页面更容易

11.Bean的声明周期可以局限于当前的Http请求或者HttpSession中,该功能是由WebApplicationContext提供的

一。DispatcherServlet

是一个Servlet ,继承 HttpServlet,定义与每个项目中的 web.xml文件中,他处理请求的流程如下图所表示:

mvc

具体定义如下:

<servlet>
        <servlet-name>storeshare-server</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:storeshare-sever.xml,/WEB-INF/storeshare-servlet.xml</param-value>
        </init-param>

        <init-param>
            <param-name>dispatchOptionsRequest</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>storeshare-server</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

每个DispatcherServlet都有自己的WebApplicationContext,如下图所表示:

mvc-contexts

当初始化DispatcherServlet时候,就会去加载 contextConfigLocation 路径下的文件,然后创建定义在这些文件中的Bean,如果Bean的文件名字相同,则会再全局范围内覆盖该Bean.WebApplicationContext 是ApplicationContext的扩展,他们之间的区别是: 1) 可以解决Theme(主题)2.可以和具体的Servlet关联。 3.可以通过 RequestContextUtils 方法访问到WebApplicationContext。

二。DispatcherServlet依赖的特殊类型的 Beans

如果你什么也不配置,那么DispatcherServlet会使用自己一套default的配置,下表描述了DispatcherServlet所依赖的特殊Beans:

Bean type Explanation
HandlerMapping 将请求映射到一个Handler
HandlerAdapter 帮助DispatcherServlet去调用一个Handler
HandlerExceptionResolver 将异常映射到视图
ViewResolver 解决基于String的试图名到实际视图类型的逻辑
LocaleResolver 解决客户端使用的 local,用于提供国际化视图
ThemeResolver 解决应用可以使用的主题,例如提供个性化的布局
MultipartResolver 解决MultiPart请求
FlashMapManager Stores and retrieves the "input" and the "output" FlashMap that can be used to pass attributes from one request to another, usually across a redirect.

三。默认DispatcherServlet的配置

DispatcherServlet的默认配置保存在 org.springframework.web.servlet 包下的这个文件中 DispatcherServlet.properties,对这些默认配置,我们需要定制化其中的一些属性,例如InternalResourceViewResolver 就需要设置 prefix属性。 你在配置文件中配置的任何属性都会覆盖DispatcherServlet使用的默认属性。 具体的默认属性如下所表示:

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

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

四。DispatcherServelt 处理流程

DispatcherServlet处理web请求的流程如下:

mvc3

五。 异常处理

默认加载所有的异常处理类,如果要处理默认Spring处理的异常,则只配置一个异常即可。

默认加载的所有实现异常类HandlerExceptionResolver:

如果只想加载一个异常处理类,则需要做如下处理:

5.1 配置加载一个异常处理类

<servlet>
        <servlet-name>server</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*sever.xml,/WEB-INF/servlet.xml</param-value>
        </init-param>

        <init-param>
            <param-name>dispatchOptionsRequest</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>detectAllHandlerExceptionResolvers</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

5.2 定义自定义异常类(在项目中使用)

其中注意id=”handlerExceptionResolver”名字是固定的,否则Spring会找不到该异常类。

<bean id="handlerExceptionResolver"
          class="cn.com.conversant.swiftsync.mvc.HTTP500ExceptionResolver">
        <property name="messageSource" ref="messageSource"/>
        <property name="language" value=""/>
    </bean>

 

参考链接:

文档:http://docs.spring.io/spring-framework/docs/3.2.0.M1/reference/htmlsingle/#mvc-introduction

源码:https://github.com/spring-projects/spring-framework

原文地址:https://www.cnblogs.com/lily-tiantian/p/4362078.html