电力springmvc学习笔记_第1页
电力springmvc学习笔记_第2页
电力springmvc学习笔记_第3页
电力springmvc学习笔记_第4页
电力springmvc学习笔记_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SpringMVC 学习笔记作者:。一:springmvc 工作流程。1. 首先:springMVC 有三个器,如果不定义Map,那么就会使默认:直接使用:o.do 来。bean class= .springframework.web.servlendler.SimpleUrlHandlerMaptestControllertestController那么上面的这个配置:表示多个*.do 文件可以多个Controller 或者一个Controller。前提是:都必须依赖:bean id=testController name=/o.do class=cn.controller.TestCont

2、roller第三个Map:这个Map一配置:就可以使用Contrller 的 类名.do来这个Controller.2. SpringMvc 的三个控制器。命令控制器dController(命令控制器)public classmandController extendsmandController publicmandController() mandClaser.class);mandName(user);Overrideprotected MAndView handle(HttpServletRequestrequest,HttpServletResponse response, Obje

3、ct BindException errors)throws Exception / TODO Auto-generated method stubd,User u = (User)d;System.out.prln(u.getName();return new MAndView(d,user,u);页面就可以采用如下方式进行获取:public classmandController extendsmandController publicmandController() mandClaser.class);mandName(user);Overrideprotected MAndView h

4、andle(HttpServletRequest request,HttpServletResponse response, Object BindException errors)throws Exception / TODO Auto-generated method stubd,User u = (User) System.out.pr return null;d; ln(u.getName();配置文件:包里面定义User 类:并为User 的name,sex,age 属性生成setter,说明:在 Getter 方法。当使用:继承d.do时,使用get 请求:?name=oo&sex

5、=man&age=17mandController 这个类令控制器将会自动获取并封装这个三个值。d。并放入表单控制器FormController(表单控制器)public class MyFormContrller extends SimpleFormController public MyFormContrller() / TODO Auto-generated constructor stubmandClaser.class);mandName(user);Overrideprotected void doSubmitAction(Objectd) throws Exception/ TO

6、DO Auto-generated method stubUser u = (User) System.out.prd; ln(u.getName()+kkkooo);super.doSubmitAction(d);property name=formView24.2.4 AbstractWizardFormController(1)在使用 Eclipse 或者 Netbeans 之类的IDE 进行开发的时候,如果新建一个工程或者文件,这些 IDE 通常都会提供多步的向导帮助一步一步完成相应的创建。在某些Web 应用程序中,也存在类似的操作场景,比如,要某个的会员,过程可能就包括多步,每一步会

7、提示输入某一方面的信息,以帮助简化操作流程。对于这种向导式的简单的多页面流程实现,可以求助于 AbstractWizardFormController,它可以帮助简化类似场景的开发工作。注意 实际上,AbstractWizardFormController 也只是面向简单的多页面流程处理,它所管理的多个页面表单中的数据,最终都是绑定到一个d 对象上的。只不过是每个页面绑定一部分而已。如果要在 Web 应用程序中处理更复杂的页面流程交互,建议集成Spring Web Flow(http:/ ./Webflow),Expert Spring MVC andWeb Flow 一书对 Spring W

8、eb Flow 进行了详尽的介绍。1. AbstractWizardFormController 浅析批注 h1: Value 的值是jsp 文件的名称。 value=form批注 h2: Suc sView,formView 这是固定的。sucs说白了,AbstractWizardFormController 实现类就是要处理组成向导流程的所有页面所发起的 Web 请求。但与 SimpleFormController 处理单个表单页面不同, AbstractWizardFormController 要管理多个表单页面的显示以及提交数据的处理工作。图 24-12 对 AbstractWizar

9、dFormController 如何管理整个向导流程给出了一个概况,对 AbstractWizardFormController 的认识将在这个的基础上展开。(点击查看大图)图 24-12 AbstractWizardFormController 的Web 请求处理结构Page1、Page2 和 Page3 是组成向导流程的页面,这些页面提交的 Web 请求将由我们的 AbstractWizardFormController 接收并处理。但 AbstractWizardFormController 如何知道当前该显示哪个页面?它又是如何判断哪个页面提交的请求是最终的结束向导流程的Web 请求呢

10、?AbstractWizardFormController 将根据每个页面请求所包含的特定参数来决定如何对当前请求进行处理,这些特定的参数可以分为如下三类。PARAM_ 参数。PARAM_ 参数用于指定目标页面,它的形式为_ 后缀页面索引,比如_ 0、_ 1 等。当 AbstractWizardFormController 实现类接收到这种类型的参数的时候,它只是将当前请求中的相应参数绑定到 d 对象上,然后根据 PARAM_ 参数后缀的目标页面索引显示相应的页面。PARAM_FINISH 参数。PARAM_FINISH 参数的表示形式为_finish。如果 AbstractWizard- F

11、ormController 实现类接收到该参数,则表示整个向导流程结束,可以调用 pros- Finish(.)方法处理最终的表单数据,并将页面转向任何一个想要转到的页面。PARAM_CANCEL 参数。PARAM_CANCEL 参数的表示形式为_cancel。当接收到该参数的时候,表示用户要取消当前的向导流程。默认情况下,AbstractWizardFormController 不支持该参数的处理,但可以通过覆写 prosCancel(.)方法来改变这种默认行为。唯一要做的,可能只是返回一个MAndView 实例,其中只包含了一个逻辑视图名。实际上,AbstractWizardFormCon

12、troller 实现类本质上依然是像SimpleFormController 那样,分两个阶段来管理表单页面的处理,只不过是从逻辑上将单个表单页面划分为了多个表单页面,而最终绑定数据的d 对象却只有一个。AbstractWizardFormController 将根据_X 参数决定显示表单页面的某一部分,对应到视图那就是显示哪个向导页面。在该向导页面提交请求之后,AbstractWizardFormController 会把它显示并提交的那部分数据绑定到唯一的那个d 对象上,只有在所有向导页面都提交之后,d 对象的数据才算绑定完成。从这样的角度来说,AbstractWizardFormCont

13、roller 只不过是将一部分信息划分为多步来显示和处理罢了。在向导(Wizard)最终结束的画面提交_finish 参数之后,AbstractWizardFormController 将从d 对象获取到所有向导页面(Wizard Page)搜集来的数据,然后它就可以调用 pros- Finish(.)方法开始压轴戏了。实际上,在实现AbstractWizardFormController 的时候,也只有 prosFinish(.)方法是需要须去实现的。,以上的分析内容已经足以说明 AbstractWizardFormController 的底细。不过,如果你还意犹未尽的话,不妨再研读一下 E

14、xpert Spring MVC and Web Flow 一书。像如何提供数据验证,如何覆写某些方法以添加扩展逻辑之类的细节,该书都有提及。相信我,因为我已经读过了。2. AbstractWizardFormController 实例我搜刮了 FX 系统的前台和的所有场景,也没有找到一个需要向导的流程。所以,为了演示 AbstractWizardFormController 的使用,我也不能免俗,创造了一个问卷的场景。分三步引导用户完成对购车意愿的问卷。当然,整个问卷看起来有些简单了,但如果需要,也可以在这个基础上提供更加友好、更加全面的问卷向导。为了分步显示的内容,提供了 4 个页面分别显

15、示整体的某一部分内容,它们的关系如下所述。e.jsp。问卷向导的开始页面,提供简单的说明信息,如图 24-13 所示。carManufacturers.jsp。该页面将提供汽车厂商信息列表供用户选择,如图 24-14 所示。(点击查看大图)图 24-13e.jsp 页面(点击查看大图)图 24-14 carManufacturers.jsp 页面击结束问卷提交按钮即结束当前问卷,见图 24-15。(点击查看大图)图 24-15 carPricope.jsp 页面surveyResult.jsp。确切地讲,该页面不能算向导的一部分,它只是结束后的一个 结果显示页面,对应的是图 24-12 中的

16、sucsView。当然,将具体数据转换为柱状图显示或许更爱一些,该页面最终效果如图 24-16 所示。现在让着手实现该向导流程。先来了解一下,几个重要的接口与类。现在不知道他们是干什么的没关系,先混个脸熟,为以后认识他们打个基础。DispatcherServlet- 前置控制器HandlerMap接口 - 处理请求的HandlerMap接口的实现类:SimpleUrlHandlerMap通过配置文件,把一个URL到ControllerDefaultAnno类上ionHandlerMap通过注解,把一个 URL到ControllerHandlerAdapter 接口 - 处理请求的Annoion

17、MethodHandlerAdapter 类,通过注解,把一个 URL到Controller类的方法上Controller 接口 - 控制器由于使用了Controller 注解,添加了Controller 注解注解的类就可以担任控制器(Action)的职责,所以并没有用到这个接口。Handlererceptor 接口-器无图,自己实现这个接口,来完成的器的工作。ViewResolver 接口的实现类UrlBasedViewResolver 类 通过配置文件,把一个视图名交给到一个View 来处理ernalResourceViewResolver 类,比上面的类,加入了JSTL 的支持View

18、接口JstlView 类LocalResolver 接口HandlerExceptionResolver 接口 -异常处理SimpleMapExceptionResolver 实现类MAndView 类无图。三、流程图四、DispatcherServlet 说明使用Spring MVC,配置 DispatcherServlet 是第一步。DispatcherServlet 是一个Servlet,所以可以配置多个DispatcherServlet。DispatcherServlet 是前置控制器,配置在 web.xml 文件中的匹配的请求,Servlet匹配规则要自已定义,把下来的请求,依据某某

19、规则分发到目标Controller(写的Action)来处理。“某某规则”:是根据你使用了哪个HandlerMap同。接口的实现类的不同而不先来看第一个例子:Xml 代码1. 2.3.4.exle DispatcherServlet.springframework.web.servlet..9.10.1exle*.form11.1是启动顺序,让这个Servlet 随Servletp 容器一起启动。*.form 会*.form 结尾的请求。exle这个Servlet 的名字是exle,可以 有多个DispatcherServlet,是通过名字来区分的。每一个 DispatcherS

20、ervlet 有自己的 WebApplicationContext 上下文对象。同时保存的 ServletContext 中和Request 对象中,关于key,以后说明。在DispatcherServlet 的初始化过程中,框架会在web 应用的 WEB-INF 文件夹下寻找名为servlet-name-servlet.xml 的配置文件,生成文件中定义的 bean。第二个例子:Xml 代码1. 2.3.springMVC erServlet.springframework.web.servlet.Dispatch4.5.contextConfigLocation6.classpath*:/

21、springMVC.xml7.8.19. 10.11.12.springMVC/13.指明了配置文件的文件名,不使用默认配置文件名,而使用 springMVC.xml 配置文件。其中*.xml 这里可以使用多种写法1、不写,使用默认值:/WEB-INF/-servlet.xml2、/WEB-INF/classes/springMVC.xml 3、classpath*:springMVC-mvc.xml4、多个值用逗号分隔Servlet匹配规则可以自已定义,Servlet哪种 URL 合适?当1、影响 2、为RequestMap(/user/add)时:*.do,例如:/user/add.do,

22、弊端:所有的url 都要以.do 结尾。不会静态文件。/app/*,例如:/app/user/add,弊端:请求的url 都要包含/app,RequestMap(/user/add)中不须要包含/app。3、/,例如:/user/add,弊端:对 jpg,js,css 静态文件的也被不能正常显示。后面有解决办法。4、/*,可以走到 Action 中,但转发到 jsp 时再次被,不能到jsp。五、双亲上下文的说明如果你使用了listener的项目中都是使用listener器来加载配置,一般在Struts+Spring+Hibernate器的。如下Java 代码1. 2.springframewo

23、rk.web.context.ContextLoaderListener3. Spring 会创建一个全局的WebApplicationContext 上下文,称为根上下文 ,保存在 ServletContext 中,key 是 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 属性的 值。可 以使用工具类取出上下 文: WebApplicationContextUtils.getWebApplicationContext(ServletContext);DispatcherServlet 是一个Servlet,可以同时配

24、置多个,每个 DispatcherServlet 有一个自己的 WebApplicationContext 上下文,这个上下文继承了 根上下文 中所有东西。 保存在 ServletContext 中,key是.springframework.web.servlet.FrameworkServlet.CONTEXT+Servlet名称。当一个 Request 对象产生时,会把这个 WebApplicationContext 上下文保存在Request 对象中,key 是DispatcherServlet.class.getName() + .CONTEXT。可以使用工具类取出上下文:Reqont

25、extUtils.getWebApplicationContext(request);Spring 中的 ApplicationContext 实例可以被限制在不同的作用域(scope)中。在web MVC 框架中,每个 DispatcherServlet 有它自己的 WebApplicationContext ,这个context 继承了根 WebApplicationContext 的所有bean 定义。这些继承的bean 也可以在每个 serlvet 自己的所属的域中被覆盖(override),覆盖后的bean 可以被设置上只有这个 servlet 实例自己使用的属性。总结:不使用lis

26、tener器来加载spring 的配置,改用 DispatcherServlet来加载spring 的配置,不要双亲上下文,只使用一个DispatcherServlet,事情就简单了,什么麻烦事儿也没有了。六、springMVC-mvc.xml 配置文件片段讲解 (未使用默认配置文件名)Xml 代码.?xml verxmlns= xmlns:xsi=5.6.xmlns:tx= xmlns:context=ntext7.xmlns:mvc=8.xsi:schemaLocation= ma/beans9.s-3.0.xsd 10.11.xsd 12.13.ntext-3.0.xsd

27、14.15.0.xsd 9.!-ponent-scan base-package= ponent-scan.core,JUnit4 6./ 27.property name=prefix value=/WEB-INF/jsp/.springf1.32.33.!-erceptors0./41.!- 对静态资源文件的(二选一) - location=/images42. 43.44. 扫描指定的包中的类上的注解,常用的注解有:Controller ServiceAction 组件 S

28、ervice 组件组件Service(myMovieLister)ReitoryComponent RequestMap Resource泛指组件, 当不好归类时.(/)请求用于注入,( j2ee 提供的 ) 默认按名称装配,Resource(name=beanName) Autowired 用于注入,(sr提供的) 默认按类型装配Tranional( rollbackFor=Exception.class) 事务管理ResponseBody Scope(prototype)设定bean 的作用域 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方 案。

29、会自动DefaultAnnoionHandlerMap与AnnoionMethodHandlerAdapter 两个bean,是spring MVC 为Controllers分发请求所必须的。并提供了:数据绑定支持,NumberFormatannoion 支持,DateTimeFormat支持,Valid 支持,读写XML 的支持(JAXB),读写JSON 的支持(Jackson)。后面,处理响应ajax 请求时,就使用到了对json 的支持。后面,对action 写 JUnit 单元测试时,要从spring IOC 容器中取DefaultAnnoionHandlerMap与 AnnoionM

30、ethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是这一句如何替换 ?他到底做了什么工作,请看,最后面的 十九节 到底做了什么工作。 是一种简写形式。通过看前面的大图,知道,可以配置多个HandlerMap。会为每一个HandlerMap,注入一个器。器。其实也可以手动配置为每个 HandlerMap注入一个 使用默认的Servlet 来响应静态文件。 匹配URL/images/*的URL 被当做静态资源,由Spring 读出到内存中再响应http。请注明出处:本文地址:http:/blog/875830七、如何到静态的文件,如 jpg,js,css?如何你的Di

31、spatcherServlet*.do 这样的URL,就不存在不到静态资源。如果你的DispatcherServlet“/”,了所有的请求,同时对*.js,*.jpg 的也就被了。目的:可以正常静态文件,不要找不到静态文件报 404。方案一:激活Tomcat 的defaultServlet 来处理静态文件Xml 代码1. 2.3.default*.jpg/servlet-map6.7.default*.js/servlet-map10.11.default*.css12.13.要配置多个,每种文件配置一个要写在DispatcherServlet 的前面, 让 defaultServlet 先,

32、这个就不会进入Spring 了,性能是最好的吧。Tomcat, Jetty, J defaults, and GlassFish 自带的默认Servlet 的名字 -App Engine 自带的 默认Servlet 的名字 - _ah_default Resin 自带的 默认Servlet 的名字 - resin-fileWebLogic 自带的 默认Servlet 的名字- FileServletWebSphere自带的 默认Servlet 的名字 - SimpleFileServlet方案二: 在spring3.0.4 以后版本提供了 mvc:resour mvc:resour的使用方法:

33、Xml 代码1. =/images/* location=/images/ /2. mvc:resourmap/images/*到ResourceHttpRequesndler 进行处理,location 指定静态资源的位置.可以是 web application 根目录下、jar 包里面,这样可以把静态资源压缩到jar 包中。cache-period 可以使得静态资源进行web cache如果出现下面的错误,可能是没有配置的原因。报错WARNING: No mapfound for HTTP request with URI/mvc/user/findUser/lisi/770 in Dis

34、patcherServlet with name springMVC使用元素,把map的 URI到SimpleUrlHandlerMap的urlMap 中,key 为map的URI pattern 值,而value 为ResourceHttpRequesndler,这样就巧妙的把对静态资源的由HandlerMap转到ResourceHttpRequesndler 处理并返回,所以就支持classpath 目录,jar 包内静态资源的.另外需要注意的一点是,不要对SimpleUrlHandlerMap设置defaulndler.因为对sic uri 的defaulndler 就是 Resourc

35、eHttpReques request.ndler,否则无法处理sic resour方案三 ,使用Xml 代码1. 会把/* url,由HandlerMap到SimpleUrlHandlerMap转到的urlMap 中,把对静态资源的.springframework.web.servlet.resource.DefaultServletHttpRequesn dler 处理并返回.DefaultServletHttpRequesndler 使用就是各个Servlet 容器自己的默认Servlet.补充说明:多个HandlerMap的执行顺序问题:DefaultAnnoionHandlerMap

36、的order 属性值是:0自动的 SimpleUrlHandlerMap的order 属性值是: 2147483646自动的的order 属性值是: 2147483647spring 会先执行order 值比较小的。当一个a.jpg文件时,先通过 DefaultAnnoionHandlerMap来找处理器,一定是找不到的,没有叫a.jpg 的Action。再 按order 值升序找,由于最后一个 SimpleUrlHandlerMap片。是匹配/*的,所以一定会匹配上,再响应图一个Apache,还要走层层匹配。真不知性能如何?改天做一下压力测试,与。最后再说明一下, 如何你的 Dispatch

37、erServlet就不存上述问题了。还是有后缀方便。*.do 这样的 URL 后缀,八、请求如何到具体的 Action 中的方法?方案一:基于xml 配置 BeanNameUrlHandlerMap配置方法略。,可以利用SimpleUrlHandlerMap、进行Url和请求。方案二:基于注解,可以使用DefaultAnnoionHandlerMap。Xml 代码1. 但前面配置了,他会自动这个bean,就不须要显示的这个bean 了。如何替换 ?他到底做了什么工作,请看,最后面的 十九节 到底做了什么工作。以上都可以注入erceptors,实现权限控制等前置工作。使用第 2 种,基于注解来使

38、用spring MVC并在action 类上使用:ControllerRequestMap(/user)请注明出处:本文地址:http:/blog/875830九、Spring 中的器:Spring 为提供了:.springframework.web.servlendlererceptor 接口,.springframework.web.servle配器,ndler.HandlererceptorAdapter 适实现这个接口或继承此类,可以非常方便的实现自己的器。有以下三个方法:Action 之前执行: publicpreHandle(HttpServletRequest request,H

39、ttpServletResponse response, Objecndler);生成视图之前执行public voidndle(HttpServletRequest request,HttpServletResponse response, Objecndler,MAndView mAndView);最后执行,可用于public void资源pletion(HttpServletRequest request,HttpServletResponse response, Objecndler, Exception ex)分别实现预处理、后处理(调用了Service 并返回M面渲染)、返回处理(

40、已经渲染了页面)在preHandle 中,可以进行编码、安全控制等处理;AndView,但未进行页在在志ndle 中,有机会修改MAndView;pletion 中,可以根据 ex 是否为null 判断是否发生了异常,进行日。参数中的Objecndler 是下一个器。请注明出处:本文地址:http:/blog/875830十、如何使用器?自定义一个器,要实现Handlererceptor 接口:Java 代码1. public class Myeceptor implements Handlererceptor 2.3. 略。Spring MVC 并没有总的器,不能对所有的请求进行前后。Spr

41、ing MVC 的器,是属于HandlerMap级别的,可以有多个HandlerMap,每个HandlerMap可以有自己的器。接口的实现类时,就不走了,本道工当一个请求按Order 值从小到大,顺序执行 HandlerMap哪一个先有返回,那就可以结束了,后面的HandlerMap序就完成了。就转到下一道工序了。器会在什么时候执行呢? 一个请求交给一个HandlerMap时,这个HandlerMap器,执行完先找有没有处理器来处理这个请求,如何找到了,就执行后,交给目标处理器。如果没有找到处理器,那么这个器就不会被执行。在spring MVC 的配置文件中配置有三种方法:方案一,(近似)总器

42、,所有urlJava 代码1.2.eceptor /3. /mvc:为什么叫“近似”,前面说了,Spring 没有总的器。会为每一 个HandlerMap,注入一个器。总有一个HandlerMap是可以找到处理器的,最多也只找到一个处理器,所以这个器总会被执行的。起到了总器的作用。方案二, (近似) 总器,匹配的URL。Xml 代码1. 2.3. 4.5.6. /mvc:erceptors就是比 方案一多了一个URL 匹配。方案三,HandlerMapp上的器Xml 代码1. 2.3.4.property name=erceptors5.6.7. 如果使用了, 它会自动DefaultAnnoi

43、onHandlerMap与AnnoionMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入erceptors 属性,就无法指定器。当然可以通过人工配置上面的两个Bean,不使用 ,就可以 给erceptors 属性 注入器其实我也不建议使用 ,而建议手动写详细的配置文件,来替代 ,这就控制力就强了。如何替换 ?他到底做了什么工作,请看,最后面的 十九节 到底做了什么工作。十一、如何实现全局的异常处理?在spring MVC 的配置文件中:Xml 代码1. 2. /error/error5009. .springframework.web.servlendler.

44、ExceptionResolver11.12.这里主要的类是SimpleMapExceptionResolver 类,和他的父类AbstracndlerExceptionResolver 类。具体可以配置哪些属性,我是通过查看源码知道的。你也可以实现HandlerExceptionResolver 接口,写一个自己的异常处理程序。spring 的扩展性是很好的。通过SimpleMapExceptionResolver可以将不同的异常到不同的jsp 页面(通过exceptionMaps 属性的配置)。同时也可以为所有的异常指定一个默认的异常提示页面(通过defaultErrorView 属性的配

45、置),如果所抛出的异常在exceptionMaps 中没有对应的,则Spring 将用此默认配置显示异常信息。注意这里配置的异常显示界面均仅包括主文件名,至于文件路径和后缀已经在viewResolver 中指定。如/error/error 表示/error/error.jsp显示错误的jsp 页面:Html 代码1.html PUBLIC -/W3C/DTD HTML 4.01 Transitional!DOCTYPE/EN 5.6.7.错误页面1.出错了12.16. 17.其中一句:request.getribute(exception),key 是exception,也是在

46、SimpleMapExceptionResolver 类默认指定的,是可能通过配置文件修改这个值的,大家可以去看源码。参考文章:/blog/sic/3839/十二、如何把全局异常到日志中?的配置中,其中有一个属性warnLogCategory,值是 “SimpleMapExceptionResolver 类的全限定名”。我是在SimpleMap AbstracExceptionResolver 类父类ndlerExceptionResolver 类中找到这个属性的。查看源码后得知:如果warnLogCategory 不为 空,spring 就会使用apache 的mons.logging.Lo

47、g 日志工具,这个异常,级别是warn。值: “.springframework.web.servlendler.SimpleMapExceptionResolver”,是“SimpleMapExceptionResolver 类的全限定名”。这个值不是随便写的。因为我在log4j 的配置文 件中还要加入log4j.logger.springframework.web.servlendler.SimpleMapExceptionResolver=WARN, 保证这个级别是warn 的日志一定会被的根日志级别是ERROR。,即使 log4j十三、如何给 spring3 MVC 中的 Action

48、 做 JUnit 单元测试?使用了spring3 MVC 后,给 action 做单元测试变得很方便,我以前从来不给action 写单元测试的,现在可以根据情况写一些了。不用给每个Action 都写单元测试吧,自己把握吧。JUnitActionBase 类是所有JUnit 的测试类的父类Java 代码.5.6.package test;import import import import importjavax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;.junit.Befor

49、eClass;.springframework.mock.web.MockServletContext;.springframework.web.context.WebApplicationContext;7.import onContext; import import.springframework.web.context.support.XmlWebApplicati8.9.springframework.web.servle.springframework.web.servlendlerAdapter; ndlerExecutionChain;10.import 11.import.s

50、pringframework.web.servle.springframework.web.servlet.MndlerMapAndView;12.import.springframework.web.servlet.mvc.annoion.AnnoionMethodHandlerAdapter;13.import nno14./*.springframework.web.servlet.mvc.annoion.DefaultAionHandlerMap;15.*16.*17.*18.*19.*/说明: JUnit 测试action 时使用的基类author ver创建时间:2013-2-2

51、下午 10:27:0320.public 4.25.26.class JUnitActionBase private private/*/s sic HandlerMapic HandlerAdapterhandlerMap;handlerAdapter;spring3 MVC 配置文件BeforeClass27.28.29.publicsic void setUp() if (handlerMap=null) String configs = file:src/springConfig/springMVC.xml ;30.ew 31.XmlWebApplicationCo

52、ntext context = n XmlWebApplicationContext();context.setConfigLocations(configs);32.rvletContext(); 33.MockServletContext msc = new MockSecontext.setServletContext(msc);context.refresh();msc.se34.tribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);35.ntext 36.ionHandlerMap

53、 37.handlerMap= (HandlerMap) co.getBean(DefaultAnno.class);handlerAdapter= (HandlerAdapter) context.getBean(context.getBeanNamesForType(Anno erAdapter.class)0);ionMethodHandl1.42.43./* 执行request 对象请求的 action*7.48.49.*/param request param response returnthrows Exceptionpublic MAnd

54、View excuteAction(HttpServletRequestrequest,50. throws 51.HttpServletResponse response) Exception HandlerExecutionChain chain = handlerMap.ge52.ndler(request);final MAndView m= handlerAdapter.handle(request, 53.54.response,chain.gendler();return m;55.56.这是个JUnit 测试类,可以 new Request 对象,来参与测试,太方便了。给req

55、uest 指定的URL,就可以请求目标 Action 了。Java 代码packageimportimportimport.app.user;.junit.Assert;.junit.Test;.springframework.mock.web.MockHttpServletRequest;5. import.springframework.mock.web.MockHttpServletResponse;6. import 7.8. import 9.10./*.springframework.web.servlet.MAndView;test.JUnitActionBase;11.*12.

56、*13.*14.*15.*/说明: 测试OrderAction 的例子author ver创建时间:2013-2-2 下午 10:26:5516.17.public 18.19.20.class TestOrderAction extends Testpublic void testAdd() throws MockHttpServletRequest requestJUnitActionBase Exception = new MockHttpServletRequest(); 21.MockHttpServletResponseresponse = new MockHttpServletR

57、esponse();22.23.24.request.setServletPath(/order/add); request.addParameter(id, 1002);request.addParameter(date, 2010-12-30);25.26.27.request, 28.29.me(); 30.;31.request.setMethod(T);/ 执行URI 对应的actionfinal MAndView mav = this.excuteAction( response);/ Assert logic Assert.assertEquals(order/add, mav.

58、getViewNaString msg=(String)request.getribute(msg)System.out.prln(msg);32.33.需明一下 :由于当前最想版本的Spring(Test) 3.0.5 还不支持ContextConfiguration 的注解式context file 注入,所以还需要写个setUp处理下,否则类似于Tiles 的加载过程会有错误,因为没有ServletContext。3.1 的版本应该有更 好的解决方案,参见:。十四、转发与重定向可以通过redirect/forward:url 方式转到另一个Action 进行连续的处理。可以通过redir

59、ect:url 防止表单重复提交 。写法如下:return forward:/order/add;return redirect:/index.jsp;十五、处理 ajax 请求1、引入下面两个jar 包,我用的是 1.7.2,好像 1.4.2 版本以上都可以,地址: HYPERLINK http:/w/ http:/w/JacksonDownloadjackson-core-asl-1.7.2.jarjackson-mapper-asl-1.7.2.jar2、spring 的配置文件中要有这一行,才能使用到 spring 内置支持的 json 转换。如果你手工把POJO 转成 json 就可

60、以不须要使用spring 内置支持的 json 转换。3、使用ResponseBody 注解Java 代码1. /*2.3. * 4. 5.* ajax 测试*/RequestMap(/ajax)ResponseBody8. public 9.10.Object ajax(HttpServletRequest request) List list=new ArrayList(); list.add(电视);list.add(洗衣机);list.add(冰箱);list.add(电脑);list.add(汽车);list.add(空调);list.add(自行车);4.15.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论