[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文件中,他处理请求的流程如下图所表示:
具体定义如下:
<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,如下图所表示:
当初始化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请求的流程如下:
五。 异常处理
默认加载所有的异常处理类,如果要处理默认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