spring mvc.docx
- 文档编号:2233396
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:27
- 大小:28.63KB
spring mvc.docx
《spring mvc.docx》由会员分享,可在线阅读,更多相关《spring mvc.docx(27页珍藏版)》请在冰点文库上搜索。
springmvc
使用Spring2.5基于注解驱动的SpringMVC
陈雄华(quickselect@),技术总监,宝宝淘网络科技有限公司
陈雄华,2002年毕业于厦门大学计算机与信息工程学院,获硕士学位。
是宝宝淘科技有限公司的创始人之一(),这是一个服务于全国母婴用户的综合性网站,作者负责网站整体框架设计以及核心代码开发的工作。
技术开发之余,常将经验所得行诸于文字,作者是国内多个著名技术网站的专栏作者,在各大技术网站、报刊杂志发表过数十篇技术文章,广受读者好评。
于2005年出版《精通JBuilder2005》,于2007年出版《精通Spring2.x--企业应用开发详解》,其新作《EXT2.x开发详解――AJAX和Web页面布局王者至尊》即将出版。
简介:
基于注解的配置有越来越流行的趋势,Spring2.5顺应这种趋势,为SpringMVC提供了完全基于注解的配置。
本文将介绍Spring2.5新增的SpingMVC注解功能,讲述如何使用注解配置替换传统的基于XML的SpringMVC配置。
概述
继Spring2.0对SpringMVC进行重大升级后,Spring2.5又为SpringMVC引入了注解驱动功能。
现在你无须让Controller继承任何接口,无需在XML配置文件中定义请求和Controller的映射关系,仅仅使用注解就可以让一个POJO具有Controller的绝大部分功能——SpringMVC框架的易用性得到了进一步的增强.在框架灵活性、易用性和扩展性上,SpringMVC已经全面超越了其它的MVC框架,伴随着Spring一路高唱猛进,可以预见SpringMVC在MVC市场上的吸引力将越来越不可抗拒。
本文将介绍Spring2.5新增的SpingMVC注解功能,讲述如何使用注解配置替换传统的基于XML的SpringMVC配置。
回页首
一个简单的基于注解的Controller
使用过低版本SpringMVC的读者都知道:
当创建一个Controller时,我们需要直接或间接地实现org.springframework.web.servlet.mvc.Controller接口。
一般情况下,我们是通过继承SimpleFormController或MultiActionController来定义自己的Controller的。
在定义Controller后,一个重要的事件是在SpringMVC的配置文件中通过HandlerMapping定义请求和控制器的映射关系,以便将两者关联起来。
来看一下基于注解的Controller是如何定义做到这一点的,下面是使用注解的BbtForumController:
清单1.BbtForumController.java
packagecom.baobaotao.web;
importcom.baobaotao.service.BbtForumService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.ModelAttribute;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importjava.util.Collection;
@Controller//<——①
@RequestMapping("/forum.do")
publicclassBbtForumController{
@Autowired
privateBbtForumServicebbtForumService;
@RequestMapping//<——②
publicStringlistAllBoard(){
bbtForumService.getAllBoard();
System.out.println("calllistAllBoardmethod.");
return"listBoard";
}
}
从上面代码中,我们可以看出BbtForumController和一般的类并没有区别,它没有实现任何特殊的接口,因而是一个地道的POJO。
让这个POJO与众不同的魔棒就是SpringMVC的注解!
在①处使用了两个注解,分别是@Controller和@RequestMapping。
在“使用Spring2.5基于注解驱动的IoC”这篇文章里,笔者曾经指出过@Controller、@Service以及@Repository和@Component注解的作用是等价的:
将一个类成为Spring容器的Bean。
由于SpringMVC的Controller必须事先是一个Bean,所以@Controller注解是不可缺少的。
真正让BbtForumController具备SpringMVCController功能的是@RequestMapping这个注解。
@RequestMapping可以标注在类定义处,将Controller和特定请求关联起来;还可以标注在方法签名处,以便进一步对请求进行分流。
在①处,我们让BbtForumController关联“/forum.do”的请求,而②处,我们具体地指定listAllBoard()方法来处理请求。
所以在类声明处标注的@RequestMapping相当于让POJO实现了Controller接口,而在方法定义处的@RequestMapping相当于让POJO扩展Spring预定义的Controller(如SimpleFormController等)。
为了让基于注解的SpringMVC真正工作起来,需要在SpringMVC对应的xxx-servlet.xml配置文件中做一些手脚。
在此之前,还是先来看一下web.xml的配置吧:
清单2.web.xml:
启用Spring容器和SpringMVC框架
xmlversion="1.0"encoding="UTF-8"?
>
xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation=" version="2.5"> --Spring服务层的配置文件--> applicationContext.xml --Spring容器启动监听器--> --SpringMVC的Servlet,它将加载WEB-INF/annomvc-servlet.xml的 配置文件,以启动SpringMVC模块--> web.xml中定义了一个名为annomvc的SpringMVC模块,按照SpringMVC的契约,需要在WEB-INF/annomvc-servlet.xml配置文件中定义SpringMVC模块的具体配置。 annomvc-servlet.xml的配置内容如下所示: 清单3.annomvc-servlet.xml xmlversion="1.0"encoding="UTF-8"? > xmlns="http: //www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xmlns: p="http: //www.springframework.org/schema/p" xmlns: context="http: //www.springframework.org/schema/context" xsi: schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/spring-beans-2.5.xsd http: //www.springframework.org/schema/context http: //www.springframework.org/schema/context/spring-context-2.5.xsd"> --①: 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能--> component-scanbase-package="com.baobaotao.web"/> --②: 启动SpringMVC的注解功能,完成请求和注解POJO的映射--> AnnotationMethodHandlerAdapter"/> --③: 对模型视图名称的解析,即在模型视图名称添加前后缀--> p: prefix="/WEB-INF/jsp/"p: suffix=".jsp"/> 因为Spring所有功能都在Bean的基础上演化而来,所以必须事先将Controller变成Bean,这是通过在类中标注@Controller并在annomvc-servlet.xml中启用组件扫描机制来完成的,如①所示。 在②处,配置了一个AnnotationMethodHandlerAdapter,它负责根据Bean中的SpringMVC注解对Bean进行加工处理,使这些Bean变成控制器并映射特定的URL请求。 而③处的工作是定义模型视图名称的解析规则,这里我们使用了Spring2.5的特殊命名空间,即p命名空间,它将原先需要通过 启动Tomcat,发送http: //localhost/forum.doURL请求,BbtForumController的listAllBoard()方法将响应这个请求,并转向WEB-INF/jsp/listBoard.jsp的视图页面。 回页首 让一个Controller处理多个URL请求 在低版本的SpringMVC中,我们可以通过继承MultiActionController让一个Controller处理多个URL请求。 使用@RequestMapping注解后,这个功能更加容易实现了。 请看下面的代码: 清单3.每个请求处理参数对应一个URL packagecom.baobaotao.web; importcom.baobaotao.service.BbtForumService; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; @Controller publicclassBbtForumController{ @Autowired privateBbtForumServicebbtForumService; @RequestMapping("/listAllBoard.do")//<——① publicStringlistAllBoard(){ bbtForumService.getAllBoard(); System.out.println("calllistAllBoardmethod."); return"listBoard"; } @RequestMapping("/listBoardTopic.do")//<——② publicStringlistBoardTopic(inttopicId){ bbtForumService.getBoardTopics(topicId); System.out.println("calllistBoardTopicmethod."); return"listTopic"; } } 在这里,我们分别在①和②处为listAllBoard()和listBoardTopic()方法标注了@RequestMapping注解,分别指定这两个方法处理的URL请求,这相当于将BbtForumController改造为MultiActionController。 这样/listAllBoard.do的URL请求将由listAllBoard()负责处理,而/listBoardTopic.do? topicId=1的URL请求则由listBoardTopic()方法处理。 对于处理多个URL请求的Controller来说,我们倾向于通过一个URL参数指定Controller处理方法的名称(如method=listAllBoard),而非直接通过不同的URL指定Controller的处理方法。 使用@RequestMapping注解很容易实现这个常用的需求。 来看下面的代码: 清单4.一个Controller对应一个URL,由请求参数决定请求处理方法 packagecom.baobaotao.web; importcom.baobaotao.service.BbtForumService; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/bbtForum.do")//<——①指定控制器对应URL请求 publicclassBbtForumController{ @Autowired privateBbtForumServicebbtForumService; //<——②如果URL请求中包括"method=listAllBoard"的参数,由本方法进行处理 @RequestMapping(params="method=listAllBoard") publicStringlistAllBoard(){ bbtForumService.getAllBoard(); System.out.println("calllistAllBoardmethod."); return"listBoard"; } //<——③如果URL请求中包括"method=listBoardTopic"的参数,由本方法进行处理 @RequestMapping(params="method=listBoardTopic") publicStringlistBoardTopic(inttopicId){ bbtForumService.getBoardTopics(topicId); System.out.println("calllistBoardTopicmethod."); return"listTopic"; } } 在类定义处标注的@RequestMapping让BbtForumController处理所有包含/bbtForum.do的URL请求,而BbtForumController中的请求处理方法对URL请求的分流规则在②和③处定义分流规则按照URL的method请求参数确定。 所以分别在类定义处和方法定义处使用@RequestMapping注解,就可以很容易通过URL参数指定Controller的处理方法了。 @RequestMapping注解中除了params属性外,还有一个常用的属性是method,它可以让Controller方法处理特定HTTP请求方式的请求,如让一个方法处理HTTPGET请求,而另一个方法处理HTTPPOST请求,如下所示: 清单4.让请求处理方法处理特定的HTTP请求方法 packagecom.baobaotao.web; importcom.baobaotao.service.BbtForumService; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/bbtForum.do") publicclassBbtForumController{ @RequestMapping(params="method=createTopic",method=RequestMethod.POST) publicStringcreateTopic(){ System.out.println("callcreateTopicmethod."); return"createTopic"; } } 这样只有当/bbtForum.do? method=createTopic请求以HTTPPOST方式提交时,createTopic()方法才会进行处理。 回页首 处理方法入参如何绑定URL参数 按契约绑定 Controller的方法标注了@RequestMapping注解后,它就能处理特定的URL请求。 我们不禁要问: 请求处理方法入参是如何绑定URL参数的呢? 在回答这个问题之前先来看下面的代码: 清单5.按参数名匹配进行绑定 @RequestMapping(params="method=listBoardTopic") //<——①topicId入参是如何绑定URL请求参数的? publicStringlistBoardTopic(inttopicId){ bbtForumService.getBoardTopics(topicId); System.out.println("calllistBoardTopicmethod."); return"listTopic"; } 当我们发送http: //localhost//bbtForum.do? method=listBoardTopic&topicId=10的URL请求时,Spring不但让listBoardTopic()方法处理这个请求,而且还将topicId请求参数在类型转换后绑定到listBoardTopic()方法的topicId入参上。 而listBoardTopic()方法的返回类型是String,它将被解析为逻辑视图的名称。 也就是说Spring在如何给处理方法入参自动赋值以及如何将处理方法返回值转化为ModelAndView中的过程中存在一套潜在的规则,不熟悉这个规则就不可能很好地开发基于注解的请求处理方法,因此了解这个潜在规则无疑成为理解SpringMVC框架基于注解功能的核心问题。 我们不妨从最常见的开始说起: 请求处理方法入参的类型可以是Java基本数据类型或String类型,这时方法入参按参数名匹配的原则绑定到URL请求参数,同时还自动完成String类型的URL请求参数到请求处理方法参数类型的转换。 下面给出几个例子: ∙listBoardTopic(intt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- spring mvc