spring3.0MVC注解(附实例)_第1页
spring3.0MVC注解(附实例)_第2页
spring3.0MVC注解(附实例)_第3页
spring3.0MVC注解(附实例)_第4页
spring3.0MVC注解(附实例)_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、0.提示1)Spri ng 发行版本附带了 PetCIi nic示例,它是一个在简单的表单处理的上下文中,利用了本节中说明的注解支持的Web应用程序。可以在“samples/petclinic” 目录中找到PetCIinic 应用程序。2)另外一个建立在基于注解的Web MVC上的示例应用程序,请见imagedb 。这个示例集中在无状态的multi-acti on控制器,包括多段文件上传的处理。可以在“samples/imagedb ” 目录找到imagedb 应用程序。1. 建立dispatcher 实现注解支持只有对应的 HandlerMapping(为了实现类型级别的注解)和 /或Han

2、dlerAdapter(为了实现方法级别的注解) 出现在dispatcher 中时,RequestMapping 才会被处理。 这在DispatcherServlet和DispatcherPortlet中都是缺省的行为。然而,如果是在定义自己的HandlerMappings 或HandlerAdapters ,就需要确保一个对应的自定义的 DefaultAnnotationHandlerMapping和 / 或 AnnotationMethodHandlerAdapter 同样被定义假设想要使用RequestMapping。. (con troller bea n defi niti ons)

3、 .例 1:雁联 zfpt-servlet.xml配置 DefaultAnnotationHandlerMapping和 / 或 AnnotationMethodHandlerAdapter 1 vlist 例 2 : web.xmlv?xml versio n =1.0en codi ng=ISO-8859-1?Spring PetClinicSpring PetClinic sample application2.1 webAppRootKeywebAppRootKey petclinic.root2.3 log4jC on figLocatio nvparam-name log4jCon

4、figLocationvparam-value /WEB-INF/classes/perties2.4 con textC on figLocati onvparam-name contextConfigLocationvparam-value /WEB-INF/spri ng/applicatio nCon text-jdbc.xml/WEB-INF/applicatio nCon text-security.xml!-/WEB-INF/spr in g/applicati onCon text-hiber nate.xml/WEB-INF/spri ng/applicat

5、i onCon text-jpa.xml-2.5 spri ngSecurityFilterChai nvfilter vfilter-namespringSecurityFilterChainvfilter-classorg.spr in gframework.web.filter.Delegati ngFilterProxyvfilter-mapp ingvfilter- name spri ngSecurityFilterCha invurl-pattern/* 2.6 Log4jC on figListe nerorg.springframework.web.util.Log4jCon

6、figListener2.7 Con textLoaderListe nerorg.spri ngframework.web.c on text.Con textLoaderListe ner/ listener2.8 DispatcherServletpetclinicorg.spri ngframework.web.servlet. DispatcherServlet2load-on-startuppetclinicurl-patter n/ 2.9 excepti on .javajava.lang.Exception/WEB-INF/jsp/uncaughtException.jsp例

7、3 :雁联web.xml如果你想要自定义映射策略,显式的定义一个DefaultA nn otatio nHan dlerMappi ngAnn otatio nM ethodHa ndlerAdapterWebB indingln itializer也有实际意义。例如,指定一个自定义的PathMatcher 或者1. 一个简单的基于注解的Controller使用过低版本 Spri ng MVC的读者都知道:1. 当创建一个Controller 时,我们需要直接或间接地实现org.springframework.web.servlet.mvc.Controller接口。一般情况下,我们是通过继承

8、SimpleFormController 或 MultiActionController 来定义自己的Controller的。2. 在定义 Controller后,一个重要的事件是在Spring MVC 的配置文件中通过HandlerMapping 定义请求和控制器的映射关系,以便将两者关联起来。BbtForumController :3. 来看一下基于注解的Controller是如何定义做到这一点的,下面是使用注解的实现效果:启动 Tomcat ,发送 http:/localhost/forum.doURL请求,BbtForumCo ntrollerlistAIIBoard()方法将响应这个

9、请求,并转向WEB-INF/jsp/listBoard.jsp的视图页面。清单 1. BbtForumC on troller.javapackage com.baobaotao.web;import com.baobaotao.service.BbtForumService;import org.spri ngframework.bea ns.factory.a nn otatio n.Autowired; import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.bi nd.a n

10、n otatio n.ModelAttribute; import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing; import org.spri ngframework.web.b in d.a nno tati on .RequestMethod; import java.util.Collectio n;Co ntroller/ RequestMappi ng(/forum.do)public classBbtForumC on trollerAutowiredprivate BbtForumService

11、bbtForumService;RequestMappi ng / public Stri nglistAllBoard()bbtForumService.getAllBoard();System.out.pri ntl n( call listAIIBoard method.); return listBoard;在 处使用了两个注解,分别是 Controller和 RequestMapping。在使用 Spring 2.5基于注解驱动的loC”这篇文章里,笔者曾经指出过 Controller、Service以及 Repository和 Component注解的作用是等价的: 将一个类成为

12、Spring容器的 Bean。由于 Spring MVC 的Controller必须事先是一个Bean,所以 Controller注解是不可缺少的。真正让BbtForumController具备 Spring MVC Controller 功能的是RequestMapping这个注解。RequestMapping可以标注在类定义处,将Controller和特定请求关联起来;还可以标注在方法签名处,以便进一步对请求进行分流。在处,我们让 BbtForumController关联/forum.do ”的请求,而处,我们具体地指定listAIIBoard()方法来处理请求。所以在类声明处标注的Req

13、uestMapping相当于让POJO实现了Controller接口,而在方法定义处的RequestMapping相当于让 POJO扩展 Spring预定义的 Controller (如SimpleFormController 等)。清单2. web.xml :启用Spri ng 容器和Spri ng MVC 框架为了让基于注解的Spring MVC 真正工作起来,需要在Spring MVC 对应的xxx-servlet.xml配置文件中做一些手脚。在此之前,还是先来看一下web.xml的配置吧Spri ng Anno tati on MVC Samplecon textC on figLoc

14、ati onclasspath:applicati onCon text.xmlorg.spri ngframework.web.c on text.Con textLoaderListe nervservlet-nameannomvc org.spri ngframework.web.servlet.DispatcherServlet2a nno mvc *.do清单 3. annom vc-servlet.xmlweb.xml中定义了一个名为 annomvc的 Spri ng MVC 模块,按照 Spri ng MVC 的 契约,需要在 WEB-INF/a nno mvc-servlet.

15、xml 配置文件中定义 Spri ng MVC 模块的具体配置。 annom vc-servlet.xml的配置内容 如下所示:因为Spring所有功能都在Bean的基础上演化而来,所以必须事先将Controller变成Bean,这是通过在类中标注Controller 并在annomvc-servlet.xml中启用组件扫描机制来完成的,如所示。在处,配置了一个 AnnotationMethodHandlerAdapter,它负责根据 Bean中的 Spring MVC 注解对Bean进行加工处理,使这些Bean变成控制器并映射特定的 URL请求。而处的工作是定义模型视图名称的解析规则,这里我

16、们使用了 Spring 2.5的特殊命名空间,即p命名空间,它将原先需要通过 元素配置的内容转化为 属性配置,在一定程度上简化了 的配置。2. 让一个Controller处理多个URL请求在低版本的 Spring MVC 中,我们可以通过继承 MultiActionController 让一个 Controller处理多个 URL请求。 使用 RequestMapping注解后,这个功能更加容易实现了。请看下面的代码:清单3.每个请求处理参数对应一个URLpackage com.baobaotao.web;import com.baobaotao.service.BbtForumService

17、;import org.spri ngframework.bea ns.factory.a nn otatio n.Autowired;import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;Co ntrollerpublic classBbtForumC on trollerAutowiredprivate BbtForumService bbtForumService;RequestMappi ng(/l

18、istAIIBoard.do)/ public Stri ng listAllBoard() bbtForumService.getAllBoard();System.out.pri ntl n( call listAIIBoard method.);return listBoard;RequestMappi ng(/listBoardTopic.do)/ public String listBoardTopic(i nt topicId) bbtForumService.getBoardTopics(topicld);System.out.pri ntln (call listBoardTo

19、pic method.);return listTopic;在这里,我们分别在 和处为listAIIBoard() 和listBoardTopic()方法标注了 RequestMapping注解,分别指定这两个方法处理的URL 请求,这相当于将BbtForumController 改造为 MultiActionController 。这样/listAIIBoard.do 的 URL 请求将由 listAllBoard()负责处理,而 /listBoardTopic.do?topicld=1 的 URL 请求则由 listBoardTopic()方法处理。清单4. 一个Controller 对应

20、一个URL,由请求参数决定请求处理方法对于处理多个URL请求的 Controller来说,我们倾向于通过一个URL参数指定 Controller处理方法的名称(如 method=listAIIBoard ),而非直接通过不同的URL指定 Controller的处理方法。使用 RequestMapping注解很容易实现这个常用的需求。来看下面的代码package com.baobaotao.web;import com.baobaotao.service.BbtForumService;import org.spri ngframework.bea ns.factory.a nn otatio

21、n.Autowired;import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;Co ntrollerRequestMapping(/bbtForum.do)/ 指定控制器对应 URL 请求public classBbtForumC on trollerAutowiredprivate BbtForumServicebbtForumService ;/ 如果URL请求中包括method=IistAIIBoar

22、d的参数,由本方法进行处理RequestMapp ing(params = method =IistAIIBoard)public Stri ng IistAIIBoard() bbtForumService.getAIIBoard();System.out.pri ntl n( call listAIIBoard method.);return listBoard;/ 如果URL请求中包括method=IistBoardTopic的参数,由本方法进行处理RequestMapp ing(params = method =IistBoardTopic)public String IistBoar

23、dTopic(i nt topicId) bbtForumService.getBoardTopics(topicld);System.out.pri ntln (call listBoardTopic method.);return listTopic;在类定义处标注的RequestM appi ng让 BbtForumC on troller处理所有包含 /bbtForum.do的URL请求,而BbtForumController中的请求处理方法对 URL请求的分流规则在 和处定义分流规则按照URL的method 请求参数确定。所以分别在类定义处和方法定义处使用RequestMapp in

24、g 注解,就可以很容易通过 URL参数指定Controller的处理方法了。清单5.让请求处理方法处理特定的HTTP请求方法RequestMapping注解中除了 params属性外,还有一个常用的属性是method,它可以让Controller方法处理特定 HTTP请求方式的请求,如让一个方法处理HTTP GET请求,而另一个方法处理HTTP POST请求,如下所示:package com.baobaotao.web;import com.baobaotao.service.BbtForumService;import org.spri ngframework.bea ns.factory.

25、a nn otatio n.Autowired;import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;import org.spri ngframework.web.b in d.a nno tati on .RequestMethod;Co ntrollerRequestMappi ng(/bbtForum.do)public classBbtForumC on trollerRequestMapp in

26、g( params = method=createTopic,method = RequestMethod.POST)public String createTopic()System.out.pri ntl n(call createTopic method.);return createTopic;这样只有当 /bbtForum.do?method=createTopic请求以 HTTP POST 方式提交时,createTopic() 才会进行处理。3. 处理 方法入参 如何 绑定URL参数3.1按契约绑定Controller的方法标注了 RequestMapping 注解后,它就能处理

27、特定的 URL请求。我们不禁要问:请求处理方法入参是如何绑定URL参数的呢?在回答这个问题之前先来看下面的代码清单5.按参数名匹配进行绑定RequestMapp in g(params = method=listBoardTopic)/ topicId入参是如何绑定 URL请求参数的?public StringlistBoardTopic (int topicId) bbtForumService.getBoardTopics(topicld);System.out.pri ntln (call listBoardTopic method.);return listTopic;当我们发送 ht

28、tp:/localhost/bbtForum.do?method=listBoardTopic&topicld=10的URL请求时,Spring不但让listBoardTopic()方法处理这个请求,而且还将topicId请求参数在类型转换后绑定到listBoardTopic()方法的topicId 入参上。而listBoardTopic() 方法的返回类型是String,它将被解析为逻辑视图的名称。也就是说Spring在如何给处理方法入参自动赋值以及如何将处理方法返回值转化为ModelA ndView 中的过程中存在一套潜在的规则,不熟悉这个规则就不可能很好地开发基于注解的请求处理方 法,因

29、此了解这个潜在规则无疑成为理解Spring MVC框架基于注解功能的核心问题。我们不妨从最常见的开始说起:请求处理方法入参的类型可以是Java基本数据类型或 String类型,这时方法入参按参数名匹配的原则绑定到URL请求参数,同时还自动完成String类型的URL请求参数到请求处理方法参数类型的转换。下面给出几个例子:listBoardTopic(int topicId):和 topicId URL 请求参数绑定;listBoardTopic(int topicId,String boardName):分别和 topicId、boardName URL 请求参数绑定;特别的,如果入参是基本数

30、据类型(如in t、Io ng、float等),URL请求参数中一定要有对应的参数,否则将抛出TypeMismatchException异常,提示无法将null转换为基本数据类型。清单 6. User.java :一个 JavaBean另外,请求处理方法的入参也可以一个JavaBean,如下面的 User对象就可以作为一个入参package com.baobaotao.web;public class User private int userId;private String userName;/ 省略get/setter 方法public Stri ng toStri ng()return

31、 this.userName +,+this.userld;清单7.使用JavaBea n作为请求处理方法的入参下面是将 User作为listBoardTopic()请求处理方法的入参:RequestMapp in g(params = method=listBoardTopic)public StringlistBoardTopic (int topicId,Useruser ) bbtForumService.getBoardTopics(topicId);System.out.pri ntln (topicld:+topicld);System.out.pri ntl n(user:+u

32、ser);System.out.pri ntln (call listBoardTopic method.);return listTopic;这时,如果我们使用以下的 URL请求:http:/localhost/bbtForum.do?method=listBoardTopic&topicId=1&userld =10& userName =tomtopicId URL参数将绑定到 topicId入参上,而userId 和userName URL参数将绑定到 user 对象的userId 和userName 属性中。和URL请求中不允许没有 topicId参数不同,虽然User 的userI

33、d属性的类型是基本数据类型,但如果URL中不存在userId 参数,Spring也不会报错,此时user.userId 值为0。如果 User 对象拥有一个dept.deptId的级联属性,那么它将和dept.deptId URL参数绑定。3.2通过注解指定绑定的URL参数如果我们想改变这种默认的按名称匹配的策略,比如让listBoardTopic(i nt topicId,User user)中的topicId 绑定到id 这个URL参数,那么可以通过对入参使用RequestParam 注解来达到目的:清单8. 通过RequestParam注解指定这里,对listBoardTopic()请求

34、处理方法的topicId入参标注了RequestParam(id)注解,所以它将和 id的URL参数绑定。package com.baobaotao.web;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;import org.spri ngframework.web.bi nd.a nn otatio n.RequestParam;Co ntrollerRequestMappi ng(/bbtForum.do)public classBbtForumC on trollerRequestMapp in g(params = method=listBoardTopic)public StringlistBoardTopic (RequestParam(id) int topicId,User user) bbtForumService.getBoardTopics(topicld);System.out.pri

温馨提示

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

评论

0/150

提交评论