在乐视风口浪尖的时候,敢于站出来讲本身是乐视的而即使被打脸的,也正是本人了。就算自身随后不在乐视了,谈到来在乐视职业过,小编也还是挺骄傲的。因为那是四个有上佳,敢拼敢干的公司。想起复仇者缔盟里Fury指挥官的一句话:Until
such time as the world ends, we will act as though it intends to spin
on.
下一周我们去怀柔团建,人家都是五个家长住壹间,带小孩子的是几个人一间。笔者带着小编家小王子四人住了13801晚的高档住房,据说是最棒的房间。像自己说过的,每每好事儿都让作者摊上了,所以照旧该干啥干啥。

应用spring MVC,配置DispatcherServlet是率先步。

  大家部门叫基础业务平台部,担负基本管理乐视录像的录制,音频及所在的专辑数据。单台QPS几千,业爱妻士表示并发量非常的小,只是公司的汇总缓存壮志未酬。

DispatcherServlet是3个Servlet,所以能够配备多个DispatcherServlet。

  开放平台的连串框架是那般的:

DispatcherServlet是置于调整器,配置在web.xml文件中的。拦截匹配的呼吁,Servlet拦截相配规则要自已定义,把拦截下来的伸手,依附某某规则分发到指标Controller(大家写的Action)来拍卖。

皇冠官方网站 1

 

  那是贰个很正统的网址连串框架,基本得以满足当下繁多SOA垂直拆分网址框架结构的需求。项目看重关系是这么的:

“某某规则”:是基于你采纳了哪个HandlerMapping接口的兑现类的两样而各异。

皇冠官方网站 2

 

 客户层ope-web选择的是专门的学业的spring mvc框架结构。定义了多个视图解析器:

先来看率先个例子:

  1>InternalResourceViewResolver  这么些是UrlBasedViewResolver的福利子类。因为前者页面使用的是JSP,那个分明是首选。

Xml代码 

  贰>CommonsMultipartResolver  涉及上传录像和图片,那几个须求。需求注意最大上传大小和最大占用内部存储器大小。

 1   <web-app>  
 2       <servlet>  
 3           <servlet-name>example</servlet-name>  
 4           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
 5           <load-on-startup>1</load-on-startup>  
 6       </servlet>  
 7       <servlet-mapping>  
 8           <servlet-name>example</servlet-name>  
 9           <url-pattern>*.form</url-pattern>  
10      </servlet-mapping>  
11  </web-app>  

  3>SimpleMappingExceptionResolver  定义统20000分管理。我们那些类型中配备的暗中同意跳转页面defaultErrorView是40四,极度时指导的属性exceptionAttribute是ex。在exceptionMappings只定义了四个叫AccessException的这多少个,跳转到errors页面。

<load-on-startup>一</load-on-startup>是运行顺序,让这么些Servlet随Servletp容器一同运营。

提起Spring MVC还是先放一张框架结构图吧

 <url-pattern>*.form</url-pattern>会拦截*.form结尾的请求。

  皇冠官方网站 3

 

 

 <servlet-name>example</servlet-name>这么些Servlet的名字是example,能够有多个DispatcherServlet,是经过名字来差异的。每3个DispatcherServlet有温馨的WebApplicationContext上下文对象。同时保留的ServletContext春日Request对象中,关于key,以往表达。

 由图中能够看来任何spring
mvc大旨是dispatcherServlet,客户端将请求提交给它,它查询web.xml里的mapping定义找到Controller。大家项目mapping定义是

在DispatcherServlet的初始化进度中,框架会在web应用的WEB-INF文件夹下搜索名叫[servlet-name]-servlet.xml的安排文件,生成文书中定义的bean。

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/applicationContext.xml</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>

其次个例证:

  全部的呼吁都走这么些dispatcherServlet,遵照applicationContext.xml的铺排管理,那些中配备了全自动扫描的controller路线和上边提到的视图解释器。来看壹眼dispatcherServlet的骨干源码:

Xml代码 

protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); //文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
initLocaleResolver(context); //本地化解析
initThemeResolver(context);   //主题解析
initHandlerMappings(context); //通过HandlerMapping,将请求映射到处理器
initHandlerAdapters(context); //通过HandlerAdapter支持多种类型的处理器
initHandlerExceptionResolvers(context); //如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
initRequestToViewNameTranslator(context); //直接解析请求到视图名
initViewResolvers(context); //通过ViewResolver解析逻辑视图名到具体视图实现
initFlashMapManager(context); //flash映射管理器     }
 1 <servlet>  
 2       <servlet-name>springMVC</servlet-name>  
 3       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
 4       <init-param>  
 5           <param-name>contextConfigLocation</param-name>  
 6           <param-value>classpath*:/springMVC.xml</param-value>  
 7      </init-param>  
 8       <load-on-startup>1</load-on-startup>  
 9   </servlet>  
10  <servlet-mapping>  
11      <servlet-name>springMVC</servlet-name>  
12      <url-pattern>/</url-pattern>  
13  </servlet-mapping> 

  从命名就足以见见,那中间主要利用了宗旨情势,对差别的视图采纳分裂的计策。ApplicationContext是叁个虚无接口,spring的上下文将框架之中的顺序零部件音信都经过一个context暴光给外部,是三个外衣形式。

指明了布置文件的公文名,不采纳私下认可配置文件名,而使用springMVC.xml配置文件。

  dispatcherServlet在打开呼吁分发的时候还提供了壹部分劳务:

其中<param-value>**.xml</param-value>这里能够选择各个写法
一、不写,使用私下认可值:/WEB-INF/<servlet-name>-servlet.xml
2、<param-value>/WEB-INF/classes/springMVC.xml</param-value>
3、<param-value>classpath*:springMVC-mvc.xml</param-value>
四、多少个值用逗号分隔

  一>保存现场:保存request了然的快速照相,以便能在须要时回涨。

 

  二>将框架须要的目的放入request中,以便view和handler使用。

Servlet拦截相配规则能够自已定义,Servlet拦截哪类U本田CR-VL合适? 

  3>在伸手分发后苏醒现场。

当映射为@RequestMapping(“/user/add”)时:
1、拦截*.do,举例:/user/add.do,弊端:全体的url都要以.do结尾。不会影响访问静态文件。
2、拦截/app/*,比如:/app/user/add,弊端:请求的url都要包涵/app,@RequestMapping(“/user/add”)中不供给包涵/app。
3、拦截/,例如:/user/add,弊端:对jpg,js,css静态文件的访问也被阻挡不能够不奇怪显示。前边有消除办法。
4、拦截/*,能够走到Action中,但转载到jsp时再一次被拦住,不能够访问到jsp。

  提出大家看看DispatcherServlet的源码,平日做spring
mvc项目以来,相信源码轻巧看懂。大家莫有时时遭遇的标题,例如看了<Java并发编制程序施行>那本书,以为这么些事货物种中用不到啊。其实不是这么,那本书很基础,里面包车型地铁东西都用到了,只是封装在框架里了,许多少人没仔细商量而已。记得书里讲安全公布的时候讲到使用Collections.unmodifiableMap来公布1个只读的map。这一个在DispatcherServlet源码里对它的运用极其的标准:将flashmap的二个快速照相保存在request的特性里以备查看用。

 

    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
      request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }

 

皇冠官方网站,  从源码到原理,最基础的,举例:调用构造器来创立多少个Java类的时候,要精晓这一个构造器实际上是1个静态方法。所以率先次调用构造器制造对象的时候,只怕访问那么些类的静态方法可能静态成员的时候,Java解释器先要定位其字节码(class)文件,加载了字段文件后,要拓展具有的静态开始化工作,那个职业只举办1次。

5、双亲上下文的注明

  多研商,从编码到排查难点,相信都不会无从出手。

 

  上边说了在spring里能够安插不行管理页面,这几个不通过spring直接走servlet也足以,只要在web.xml里安顿一下:

一旦你使用了listener监听器来加载配置,一般在Struts+Spring+hibernate的门类中都以运用listener监听器的。如下

皇冠官方网站 4

1 <listener>   
2     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
3   </listener> 

  DispatcherServlet还达成了二个很要紧的功能:拦截器,大家项目中根本用它来做用户身份验证。用户身份验证要走乐视网统1的SSO,在隔着小编工位四,5排的用户中央组那边。只是四个表面接口的调用,然则总无法每趟用户发四个呼吁就调二回sso啊,外部调用network
hops延时很要紧的,所以此时就用到了聚集式缓存。取了一遍之后将表明身份的token存于redis里,限制时间二四时辰。

Spring会创立三个大局的WebApplicationContext上下文,称为根上下文 ,保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTPRADOIBUTE属性的值。能够行使工具类收取上下文:WebApplicationContextUtils.getWebApplicationContext(ServletContext);

  大家组和SSO组中间隔着前端组。JSP的静态页和JS皆在此以前者提供的。为了进一步解耦前后端的工作,数据的加载都走的是js异步调用,数据由前端去渲染。为了酬答前端的退换,jSP中山大学量引进静态分片。那一个静态分片由三个后台服务定期将新型的分配刷新到地头。路线保存在地点缓存中。本地缓存用的google的guava工具包。

 

  再说拦截器,拦截器和servlet的过滤器很像,它们都是AOP变成观念的反映。那地点要专注:在web.xml配置的都是servlet的效益,在applicationContext里布署的是spring
mvc的意义。它们的差距也在那些地方。因为Filter是Servlet的正规,仅能在Servlet前后起效果。而interceptor和spring能够邻近互动,能够浓厚到方法前后,格外抛出上下等,可以访问Action上下文,值栈里的对象,可反复被调用。

DispatcherServlet是叁个Servlet,可以同时安排多少个,每一个 DispatcherServlet有一个和煦的 WebApplicationContext上下文,那么些上下文承继了 根上下文 中兼有东西。 保存在 ServletContext中,key是”org.springframework.web.servlet.FrameworkServlet.CONTEXT”+Servlet名称。当二个Request对象发生时,会把这么些WebApplicationContext上下文物保护存在Request对象中,key是DispatcherServlet.class.getName()
+
“.CONTEXT”。能够利用工具类抽取上下文:RequestContextUtils.getWebApplicationContext(request);

诚如品种中用过滤器的正是utf八字符过滤器,在web.xml的配备如下:

 

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Spring中的 ApplicationContext实例能够被限定在不相同的效用域(scope)中。
在web
MVC框架中,每种DispatcherServlet有它本人的WebApplicationContext ,那么些context承继了根 WebApplicationContext 的具备bean定义。
那一个后续的bean也得以在种种serlvet自己的所属的域中被掩盖(override),覆盖后的bean 能够被安装上唯有这么些servlet实例本人使用的属性。

  Servlet标准中还定义了一种独特类,监听器,用于监听域对象的创造与销毁,以及这一个域对象属性的修改事件。大家项目中它来布局logback日志的监听。

 

  

小结:不使用listener监听器来加载spring的陈设,改用DispatcherServlet来加载spring的布局,不要双亲上下文,只利用1个DispatcherServlet,事情就大致了,什么麻烦事儿也绝非了。

 

 

6、springMVC-mvc.xml配置文件片段讲授 (未选用暗许配置文件名)

 

Xml代码 

 1 <!-- 自动扫描的包名 -->  
 2      <context:component-scan base-package="com.app,com.core,JUnit4" ></context:component-scan>  
 3        
 4      <!-- 默认的注解映射的支持 -->  
 5      <mvc:annotation-driven />  
 6        
 7      <!-- 视图解释类 -->  
 8      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
 9       <property name="prefix" value="/WEB-INF/jsp/"/>  
10      <property name="suffix" value=".jsp"/><!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑  -->  
11      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
12     </bean>  
13       
14  <!-- 拦截器 -->  
15     <mvc:interceptors>  
16      <bean class="com.core.mvc.MyInteceptor" />  
17  </mvc:interceptors>       
18    
19      <!-- 对静态资源文件的访问  方案一 (二选一) -->  
20      <mvc:default-servlet-handler/>  
21        
22      <!-- 对静态资源文件的访问  方案二 (二选一)-->  
23  <mvc:resources mapping="**" location="" cache-period="31556926"/>  
24  <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>  
25  <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>  

<context:component-scan/> 扫描钦命的包中的类上的评释,常用的注脚有:

@Controller 声明Action组件
@Service    声明Service组件   @Service(“myMovieLister”) 
@Repository 声明Dao组件
@Component   泛指组件, 当倒霉归类时. 
@RequestMapping(“/menu”)  请求映射
@Resource  用于注入,(
j二ee提供的 ) 默许按名称装配,@Resource(name=”beanName”) 
@Autowired 用于注入,(srping提供的) 默许按类型装配 
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope(“prototype”)   设定bean的成效域

 

<mvc:annotation-driven
/> 是1种简写情势,完全能够手动配置替代这种简写格局,简写情势能够让初学都连忙利用暗许配置方案。<mvc:annotation-driven
/> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter三个bean,是spring
MVC为@Controllers分发请求所不可不的。
并提供了:数据绑定帮忙,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的补助(JAXB),读写JSON的支撑(杰克逊)。
前面,大家管理响应ajax请求时,就采用到了对json的支撑。
后面,对action写JUnit单元测试时,要从springIOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter三个bean,来成功测试,取的时候要明了是<mvc:annotation-driven/>这一句注册的那多个bean。

 

<mvc:interceptors/> 是一种简写方式。通过看日前的大图,知道,大家能够配备多少个HandlerMapping。<mvc:interceptors/>会为每1个HandlerMapping,注入一个拦截器。其实大家也足以手动配置为各样HandlerMapping注入3个拦截器。

 

<mvc:default-servlet-handler/> 使用暗许的Servlet来响应静态文件。

 

<mvc:resourcesmapping=”**”
location=””cache-period=”31556926″/> 匹配URL 
**  的U陆风X8L被视作静态能源,由Spring读出到内部存款和储蓄器中再响应http。

 

 
7、怎样访问到静态的公文,如jpg,js,css?

 

何以你的DispatcherServlet拦截 *.do那样的ULX570L,就不设有访问不到静态财富的标题。如若你的DispatcherServlet拦截“/”,拦截了有着的请求,同时对*.js,*.jpg的拜会也就被堵住了。

 

目标:能够平日访问静态文件,不要找不到静态文件报40肆。
 
方案1:激活汤姆cat的defaultServlet来拍卖静态文件

Xml代码 

 1 <servlet-mapping>   
 2       <servlet-name>default</servlet-name>  
 3       <url-pattern>*.jpg</url-pattern>     
 4   </servlet-mapping>    
 5   <servlet-mapping>       
 6       <servlet-name>default</servlet-name>    
 7       <url-pattern>*.js</url-pattern>    
 8   </servlet-mapping>    
 9   <servlet-mapping>        
10      <servlet-name>default</servlet-name>       
11      <url-pattern>*.css</url-pattern>      
12  </servlet-mapping> 

要布局八个,每个文件配置贰个   

要写在DispatcherServlet的后面,让 defaultServlet先阻止,这些就不会跻身Spring了,小编想质量是最佳的啊。

 

Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 — “default”
Google App Engine 默认 Servlet的名字 — “_ah_default”
Resin 默认 Servlet的名字 — “resin-file”
WebLogic 默认 Servlet的名字  — “FileServlet”
WebSphere  默认 Servlet的名字 — “SimpleFileServlet” 

 

 

方案贰:在spring3.0.4今后版本提供了mvc:resources 
mvc:resources 的使用办法:

1 <mvc:resources mapping="**" location="" />

**炫丽到ResourceHttpRequestHandler举行拍卖,location内定静态财富的地点.能够是web
application根目录下、jar包里面,这样能够把静态财富收缩到jar包中。cache-period 能够使得静态财富开始展览web
cache 
 
假如出现下边包车型地铁一无所能,恐怕是从未陈设<mvc:annotation-driven
/>的缘故。 
报错WARNING: Nomapping found for HTTP request with URI
[/mvc/user/findUser/lisi/770] inDispatcherServlet with name
‘springMVC’

 

使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
如此那般就高明的把对静态财富的拜访由HandlerMapping转到ResourceHttpRequestHandler管理并赶回,所以就协理classpath目录,jar包内静态能源的访问.
除此以外部要求要注意的少数是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static
uri的defaultHandler正是ResourceHttpRequestHandler,
不然不能够管理staticresources request.

 

 

方案三,使用<mvc:default-servlet-handler/>

 

Xml代码 

1 <mvc:default-servlet-handler/>

会把”/**”url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态能源的走访由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler管理并重回.
DefaultServletHttpRequestHandler使用就是各样Servlet容器自身的暗中同意Servlet.

 

 

增加补充表明:多少个HandlerMapping的奉行各类难点:

DefaultAnnotationHandlerMapping的order属性值是:0

<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 21474836四陆

 

<mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping 的order属性值是: 21474836四柒

 

spring会先施行order值相当小的。当访问一个a.jpg图片文件时,先经过 DefaultAnnotationHandlerMapping 来找管理器,一定是找不到的,大家尚无叫a.jpg的Action。再 按order值升序找,由于最终三个 SimpleUrlHandlerMapping 是匹配 “/**”的,所以自然会同盟上,再响应图片。

 

走访1个图片,还要走层层相配。真不知质量怎样?改天做一下压力测试,与Apache比一比。

 

最后再作证一下,怎么样你的DispatcherServlet拦截 *.do那样的UWranglerL,就不存上述难题了。

 

 

八、请求什么映射到实际的Action中的方法? 方案一:基于xml配置映射,能够使用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射和截留请求。
配备情势略。
 
方案贰:基于注明映射,能够动用DefaultAnnotationHandlerMapping。

Xml代码 

1 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  </bean>

但近些日子大家配备了<mvc:annotation-driven/>,他会自行注册那个bean,就无需大家来得的登记这些bean了。  

 

 
以上都能够注入interceptors,达成权力决定等前置工作。
小编们使用第1种,基于申明来选拔springMVC

 

 

 并在action类上行使:

1 @Controller
2 @RequestMapping("/user")

九、Spring中的拦截器: Spring为大家提供了:
org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,
完毕这一个接口或接二连三此类,能够10分便于的完结和煦的拦截器。
 
有以下多少个主意:
 
Action以前实行:

1 public boolean preHandle(HttpServletRequest request,
2    HttpServletResponse response, Object handler);

变动视图以前实践

1 public void postHandle(HttpServletRequest request,
2    HttpServletResponse response, Object handler,
3    ModelAndView modelAndView);

末段推行,可用来释放能源

1 public void afterCompletion(HttpServletRequest request,
2    HttpServletResponse response, Object handler, Exception ex)

独家完结预管理、后甩卖(调用了Service并回到ModelAndView,但未开始展览页面渲染)、再次回到管理(已经渲染了页面) 
在preHandle中,能够开始展览编码、安控等管理; 
在postHandle中,不常机械修理改ModelAndView; 
在afterCompletion中,能够依靠ex是还是不是为null剖断是还是不是产生了充足,举行日志记录。 
参数中的Objecthandler是下3个拦截器。
 

十、怎么着使用拦截器? 自定义2个拦截器,要贯彻HandlerInterceptor接口:

Java代码 

1 public class MyInteceptor implements HandlerInterceptor { 
2 ////////
3 }

Spring MVC并从未总的拦截器,不可能对负有的请求进行前后拦截。
Spring
MVC的拦截器,是属于HandlerMapping级其余,能够有多少个HandlerMapping ,每一种HandlerMapping能够有投机的拦截器。
当四个请求按Order值从小到大,顺序实行HandlerMapping接口的兑现类时,哪三个先有重返,那就能够终结了,后边的HandlerMapping就不走了,本道工序就成功了。就转到下1道工序了。
拦截器会在怎么时候实践吗?3个请求提交2个HandlerMapping时,那个HandlerMapping先找有未有Computer来拍卖那些请求,怎样找到了,就实践拦截器,推行完拦截后,交给指标Computer。
假如未有找到计算机,那么这么些拦截器就不会被奉行。

 

在spring MVC的陈设文件中配备有三种格局:

方案1,(近似)总拦截器,拦截全部url

Java代码 

1 <mvc:interceptors>  
2      <bean class="com.app.mvc.MyInteceptor" />  
3   </mvc:interceptors>  

为何叫“近似”,前边说了,Spring未有总的拦截器。

<mvc:interceptors/>会为每一个HandlerMapping,注入二个拦截器。总有两个HandlerMapping是能够找到Computer的,最多也只找到一个Computer,所以那几个拦截器总会被实行的。起到了总拦截器的服从。

 

 
方案二, (近似) 总拦截器, 拦截相称的UBMWX伍L。

Xml代码 

1  <mvc:interceptors >    
2    <mvc:interceptor>    
3           <mvc:mapping path="/user/*" /> <!-- /user/*  -->    
4           <bean class="com.mvc.MyInteceptor"></bean>    
5       </mvc:interceptor>    
6   </mvc:interceptors> 

正是比 方案一多了1个USportageL相配。

 

 

 

方案叁,HandlerMappint上的拦截器

Xml代码 

1 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">       
2   <property name="interceptors">       
3        <list>       
4            <bean class="com.mvc.MyInteceptor"></bean>      
5        </list>       
6    </property>       
7   </bean>   

1经利用了<mvc:annotation-driven
/>, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 那四个bean,所以就从未有过机会再给它注入interceptors属性,就不恐怕钦定拦截器。

本来大家得以由这厮为配置方面包车型客车五个Bean,不行使 <mvc:annotation-driven/>,就足以 给interceptors属性 注入拦截器了。

 

其实笔者也不提议利用<mvc:annotation-driven/>,而指出手动写配置文件,来顶替 <mvc:annotation-driven
/>,那就调控力就强了。

 

 

 

 

拾一、怎样贯彻全局的百般管理?

在spring MVC的配备文件中:

Xml代码 

 1 <!-- 总错误处理-->  
 2   <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
 3       <property name="defaultErrorView">    
 4           <value>/error/error</value>  
 5       </property>  
 6       <property name="defaultStatusCode">    
 7           <value>500</value>  
 8       </property>     
 9   <property name="warnLogCategory">    
10         <value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>  
11      </property>     
12  </bean>   

那边最主要的类是SimpleMappingExceptionResolver类,和他的父类AbstractHandlerExceptionResolver类。

实际能够配备怎样属性,笔者是由此翻看源码知道的。

你也足以完结HandlerExceptionResolver接口,写贰个融洽的不胜管理程序。spring的扩张性是很好的。

 

 

透过SimpleMappingExceptionResolver我们能够将差异的那么些映射到差异的jsp页面(通过exceptionMappings属性的布局)。

 

并且我们也可以为富有的极其钦赐1个暗中认可的万分提醒页面(通过defaultErrorView属性的布局),假诺所抛出的非常在exceptionMappings中从未相应的映照,则Spring将用此暗中认可配置显示极度音讯。

小心这里配置的老大展现分界面均仅包涵主文件名,至于文件路线和后缀已经在viewResolver中钦定。如/error/error表示/error/error.jsp

 

 

展现错误的jsp页面:

Html代码 

 1 <%@ page language="java" contentType="text/html; charset=GBK"  
 2       pageEncoding="GBK"%>  
 3   <%@ page import="java.lang.Exception"%>  
 4  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
 5   <html>  
 6   <head>  
 7  <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
 8   <title>错误页面</title>  
 9   </head>  
10  <body>  
11  <h1>出错了</h1>  
12  <%  
13  Exception e = (Exception)request.getAttribute("exception");  
14  out.print(e.getMessage());  
15  %>  
16  </body>  
17  </html> 

中间一句:request.getAttribute(“exception”),key是exception,也是在SimpleMappingExceptionResolver类默许钦点的,是唯恐因而布署文件修改那几个值的,大家能够去看源码。

 

 参照他事他说加以考查小说:

http://www.blogjava.net/wuxufeng8080/articles/191150.html

http://fangjunai.blog.163.com/blog/static/1124970520108102013839/

 

 

 

10二、怎么着把全局拾分记录到日志中?

在前的配备中,在那之中有二天性质warnLogCategory,值是“SimpleMappingExceptionResolver类的全限定名”。作者是在SimpleMappingExceptionResolver类父类AbstractHandlerExceptionResolver类中找到那天性情的。查看源码后获悉:假设warnLogCategory不为空,spring就能够使用apache的org.apache.commons.logging.Log日志工具,记录那一个特别,等级是warn。

值:“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”,是“SimpleMappingExceptionResolver类的全限定名”。那一个值不是无论写的。  因为自己在log4j的配备文件中还要加入log四j.logger.org.springframework.web.servlet.handler.SimpleMappingExceptionResolver=WA昂科拉N,保障这几个等第是warn的日志一定会被记录,纵然log四j的根日志等第是EEvoqueROTucson。

 

 

 

 

 拾3、如何给spring三 MVC中的Action做JUnit单元测试?

 使用了spring3MVC后,给action做单元测试也很方便,小编原先从未有过给action写单元测试的,再在差别了,方便了,所以肯定要写。

 

 JUnitActionBase类是享有JUnit的测试类的父类

 

Java代码 

 1 package test;  
 2   import javax.servlet.http.HttpServletRequest;  
 3   import javax.servlet.http.HttpServletResponse;  
 4   import org.junit.BeforeClass;  
 5   import org.springframework.mock.web.MockServletContext;  
 6   import org.springframework.web.context.WebApplicationContext;  
 7   import org.springframework.web.context.support.XmlWebApplicationContext;  
 8   import org.springframework.web.servlet.HandlerAdapter;  
 9   import org.springframework.web.servlet.HandlerExecutionChain;  
10  import org.springframework.web.servlet.HandlerMapping;  
11  import org.springframework.web.servlet.ModelAndView;  
12  import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;  
13  import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;  
14  /**  
15  * 说明: JUnit测试action时使用的基类 
16  *  
17  * @author  赵磊 
18  * @version 创建时间:2011-2-2 下午10:27:03   
19  */   
20  public class JUnitActionBase {  
21      private static HandlerMapping handlerMapping;  
22      private static HandlerAdapter handlerAdapter;  
23      /** 
24       * 读取spring3 MVC配置文件 
25       */  
26      @BeforeClass  
27   public static void setUp() {  
28          if (handlerMapping == null) {  
29              String[] configs = { "file:src/springConfig/springMVC.xml" };  
30              XmlWebApplicationContext context = new XmlWebApplicationContext();  
31              context.setConfigLocations(configs);  
32              MockServletContext msc = new MockServletContext();  
33              context.setServletContext(msc);         context.refresh();  
34              msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);  
35              handlerMapping = (HandlerMapping) context  
36                      .getBean(DefaultAnnotationHandlerMapping.class);  
37              handlerAdapter = (HandlerAdapter) context.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);     
38          }  
39     }  
40   
41     /** 
42       * 执行request对象请求的action 
43       *  
44       * @param request 
45       * @param response 
46       * @return 
47       * @throws Exception 
48       */  
49      public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response)  
50   throws Exception {  
51          HandlerExecutionChain chain = handlerMapping.getHandler(request);  
52          final ModelAndView model = handlerAdapter.handle(request, response,  
53                  chain.getHandler());  
54         return model;  
55      }  
56  }  

那是个JUnit测试类,我们得以new
Request对象,来涉足测试,太便宜了。给request内定访问的U奥迪Q7L,就能够请求目标Action了。

 

Java代码 

 1  package test.com.app.user;  
 2   import org.junit.Assert;  
 3   import org.junit.Test;  
 4   import org.springframework.mock.web.MockHttpServletRequest;  
 5   import org.springframework.mock.web.MockHttpServletResponse;  
 6   import org.springframework.web.servlet.ModelAndView;  
 7     
 8   import test.JUnitActionBase;  
 9     
10  /**  
11  * 说明: 测试OrderAction的例子 
12  *  
13  * @author  赵磊  
14  * @version 创建时间:2011-2-2 下午10:26:55   
15  */   
16    
17  public class TestOrderAction extends JUnitActionBase {  
18      @Test  
19      public void testAdd() throws Exception {  
20      MockHttpServletRequest request = new MockHttpServletRequest();  
21          MockHttpServletResponse response = new MockHttpServletResponse();  
22          request.setRequestURI("/order/add");  
23          request.addParameter("id", "1002");  
24          request.addParameter("date", "2010-12-30");  
25          request.setMethod("POST");  
26          // 执行URI对应的action  
27          final ModelAndView mav = this.excuteAction(request, response);  
28          // Assert logic  
29          Assert.assertEquals("order/add", mav.getViewName());  
30          String msg=(String)request.getAttribute("msg");  
31          System.out.println(msg);  
32      }  
33  }  

急需说澳优(Ausnutria Hyproca)下 :由于当下最想版本的Spring(Test)
三.0.5还不帮助@ContextConfiguration的声明式context
file注入,所以还需求写个setUp管理下,不然类似于Tiles的加载进程会有不当,因为尚未ServletContext。三.一的本子应该有更加好的减轻方案,参见: https://jira.springsource.org/browse/SPR-5243 

参考:http://www.iteye.com/topic/828513

 

 

 

 

 十4、转载与重定向

可以经过redirect/forward:url格局转到另二个Action举办三番五次的拍卖。

能够通过redirect:url制止表单重复提交 。

写法如下:

1 return "forward:/order/add";
2 return "redirect:/index.jsp";

十五、处理ajax请求

 

一、引进下边八个jar包,作者用的是1.7.2,好像一.四.贰本子以上都足以,下载地址: http://wiki.fasterxml.com/JacksonDownload

jackson-core-asl-1.7.2.jar 

jackson-mapper-asl-1.7.2.jar

 

贰、spring的安排文件中要有那壹行,能力使用到spring内置帮衬的json调换。假设你手工把POJO转成json就能够没有供给使用spring内置协理的json调换。

<mvc:annotation-driven />

 

3、使用@ResponseBody注解

Java代码 

 1   /** 
 2    * ajax测试 
 3   * http://127.0.0.1/mvc/order/ajax 
 4    */  
 5     
 6   @RequestMapping("/ajax")  
 7   @ResponseBody  
 8   public Object ajax(HttpServletRequest request){  
 9       List<String> list=new ArrayList<String>();  
10      list.add("电视");  
11  nbsp;       list.add("洗衣机");  
12      list.add("冰箱");  
13      list.add("电脑");  
14      list.add("汽车");  
15      list.add("空调");  
16      list.add("自行车");  
17      list.add("饮水机");  
18      list.add("热水器");  
19      return list;  
20  }  

 

相关文章