- 浏览: 543637 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jsdsh:
自己写的就是不一样.
Spring3 MVC 注解(二)---@RequestMapping -
jsdsh:
吼,非常吼.学习了
Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释 -
爱情是一种错觉:
我爱你 i love 你[color=red][/color] ...
Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释 -
fs08ab:
大哥,目前这个问题有什么可靠的解决方案吗
@ResponseBody注解 -
lhs295988029:
说的很清楚,明白了~
Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释
13.12. 基 于注解的控制器配置
现时对于一些类型的配置数据有一个趋势,就是偏爱注解方式而不是XML文件。为了方便实现,Spring现在(从2.5开始)提供了使用注解配置 MVC框架下的组件的支持。
Spring 2.5为MVC控制器引入了一种基于注解的编程模型,在其中使用诸如@RequestMapping
、@RequestParam
、@ModelAttribute
,
等等。
这种注解支持在Servlet MVC和Portlet
MVC中均可使用。通过这种方式实现的控制器不必由特定的基类继承而来,或者实现特定的接口。
更进一步的,它们通常并不直接依赖于Servlet或Portlet
API,虽然如果需要,它们可以方便的访问Servlet或Portlet的功能。
提示
Spring发行版本附带了PetClinic
示例,它是一个在
简单的表单处理的上下文中,
利用了本节中说明的注解支持的Web应用程序。
可以在“samples/petclinic
”目录中找到PetClinic
应用程序。
另外一个建立在基于注解的Web MVC上的示例应用程序,请见imagedb
。
这个示例集中在无状态的multi-action控制器,包括多段文件上传的处理。
可以在“samples/imagedb
”目录找到imagedb
应用程序。
下面的章节记录了这些注解以及通常如何使用它们。
只有对应的HandlerMapping
(为了实现类型级别的注解)和/
或HandlerAdapter
(为了实现方法级别的注解)出现在
dispatcher中时,
@RequestMapping
才
会被处理。
这在DispatcherServlet
和DispatcherPortlet
中都是缺省的行为。
然而,如果是在定义自己的HandlerMappings
或HandlerAdapters
,
就需要确保一个对应的自定义的DefaultAnnotationHandlerMapping
和
/或AnnotationMethodHandlerAdapter
同样被定义——假设
想要使用@RequestMapping
。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean class="org.springframework.web.servlet.mvc.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.AnnotationMethodHandlerAdapter"/> ... (controller bean definitions) ... </beans>
如果你想要自定义映射策略,显式的定义一个DefaultAnnotationHandlerMapping
和
/或AnnotationMethodHandlerAdapter
也有实际意义。
例如,指定一个自定义的PathMatcher
或者WebBindingInitializer
(见下面)。
注解@Controller
指明一个特定的类承担控制器
的职责,
而没有扩展任何控制器基类或者引用Servlet API的必要。当然,如果需要还是可以引用特定Servlet功能。
注解@Controller
的基本目标是担任所注解的类的原型的角色,指
明它的职责。
Dispatcher将会在这样被注解的类中扫描映射的方法,探测注解@RequestMapping
(见
下一节)。
所注解的控制器bean可以被显式定义,这个过程是在dispatcher的上下文中使用一个标准的Spring bean定义完成的。
然而,@Controller
原型也允许自动探测,就像
Spring 2.5对探测组件的类以及为它们自动注册bean定义的普遍支持一样。
要实现对这样的所注解的控制器的自动探测,必须要向配置中加入组件扫描的部分。 通过使用在下面的XML片段中所展示出的spring-context schema,这很容易实现:
<?xml version="1.0" encoding="UTF-8"?> <beans 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"> <context:component-scan base-package="org.springframework.samples.petclinic.web"/> ... </beans>
注解@RequestMapping
被用于映射如
“/editPet.do”这样的URL到一个完整的类或者一个特定的处理方法。
典型的,顶层的注解映射一个特定的请求路径(或者路径模式)到一个表单控制器,另外的方法一级的注解可以缩小这个主要映射的范围,包括对于一个特定的
HTTP请求方法(“GET/POST”)或者特定的HTTP请求参数。
提示
@RequestMapping
在类型一级也可以被用于Controller
接口的普通实现。
在这种情况下,请求处理的代码会遵循传统的handleRequest
模
样,而控制器的映射将会通过一个@RequestMapping
注解体现。
这对于预先构建的Controller
基类,诸如SimpleFormController
,也一样有效。
在下面的讨论中,我们将会关注基于通过注解实现的处理方法的控制器。
下面是一个使用了这种注解的表单控制器的例子,它选自PetClinic:
@Controller @RequestMapping("/editPet.do") @SessionAttributes("pet") public class EditPetForm { private final Clinic clinic; @Autowired public EditPetForm(Clinic clinic) { this.clinic = clinic; } @ModelAttribute("types") public Collection<PetType> populatePetTypes() { return this.clinic.getPetTypes(); } @RequestMapping(method = RequestMethod.GET) public String setupForm(@RequestParam("petId") int petId, ModelMap model) { Pet pet = this.clinic.loadPet(petId); model.addAttribute("pet", pet); return "petForm"; } @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { new PetValidator().validate(pet, result); if (result.hasErrors()) { return "petForm"; } else { this.clinic.storePet(pet); status.setComplete(); return "redirect:owner.do?ownerId=" + pet.getOwner().getId(); } } }
对于一个传统的multi-action控制器,由于控制器会响应多个URL,URL就通常被直接映射到方法上。
下面是一个使用了@RequestMapping
的multi-
action控制器的例子,它选自PetClinic:
@Controller public class ClinicController { private final Clinic clinic; @Autowired public ClinicController(Clinic clinic) { this.clinic = clinic; } /** * Custom handler for the welcome view. * Note that this handler relies on the RequestToViewNameTranslator to * determine the logical view name based on the request URL: "/welcome.do" * -> "welcome". */ @RequestMapping("/welcome.do") public void welcomeHandler() { } /** * Custom handler for displaying vets. * Note that this handler returns a plain {@link ModelMap} object instead of * a ModelAndView, thus leveraging convention-based model attribute names. * It relies on the RequestToViewNameTranslator to determine the logical * view name based on the request URL: "/vets.do" -> "vets". * * @return a ModelMap with the model attributes for the view */ @RequestMapping("/vets.do") public ModelMap vetsHandler() { return new ModelMap(this.clinic.getVets()); } /** * Custom handler for displaying an owner. * Note that this handler returns a plain {@link ModelMap} object instead of * a ModelAndView, thus leveraging convention-based model attribute names. * It relies on the RequestToViewNameTranslator to determine the logical * view name based on the request URL: "/owner.do" -> "owner". * * @param ownerId the ID of the owner to display * @return a ModelMap with the model attributes for the view */ @RequestMapping("/owner.do") public ModelMap ownerHandler(@RequestParam("ownerId") int ownerId) { return new ModelMap(this.clinic.loadOwner(ownerId)); } }
使用@RequestMapping
注解的处理器方法允许具有非常灵活的外
观。
它们可以拥有下面类型的参数,在任意的顺序下(除非是对于验证结果,它需要紧跟在对应的命令对象后面,如果需要):
-
请求和/或响应对象(Servlet API或者Portlet API)。 可以选择任何特定的请求/响应类型,例如,ServletRequest/HttpServletRequest或者PortletRequest /ActionRequest/RenderRequest。 注意那个Portlet的例子里,一个被显式声明了的action/render参数被用于映射特定的请求类型到一个处理方法(在没有提供其他信息来区分 action和render requests的情况下)。
-
会话对象(Servlet API或者Portlet API):不管是HttpSession还是PortletSession。 一个此种类型的参数将会保证出现一个对应的会话。这样就造成,这样一个参数永远也不可以是
null
。 注意会话访问可以并不是线程安全的,特别是在Servlet环境中:如果允 许多个请求同时访问一个会话,就考虑把AnnotationMethodHandlerAdapter
的 “synchronizeOnSession”旗标置为“true” -
org.springframework.web.context.request.WebRequest
或org.springframework.web.context.request.NativeWebRequest
。 允许像访问请求/会话属性一样的访问一般的请求参数,而不是锁定在原生的Servlet/Portlet API上。 -
java.util.Locale
用于当前请求区域属性(由可用的最接近 的区域属性解析器决定,也就是, 在Servlet环境中配置好的LocaleResolver
以 及在Portlet环境中的portal locale)。 -
java.io.InputStream
/java.io.Reader
用于访问请求的内容。 这将是Servlet/Portlet API暴露出的天然的InputStream/Reader。 -
java.io.OutputStream
/java.io.Writer
用于生成响应的内容。 这将是Servlet/Portlet API暴露出的天然的OutputStream/Writer。 -
以
@RequestParam
注解的参数用于访问特定的 Servlet/Portlet请求参数。 参数的值将被转换为声明的方法参数类型。 -
java.util.Map
/org.springframework.ui.Model
/org.springframework.ui.ModelMap
用于充实将被暴露到Web视图的隐 含模型。 -
绑定参数到的命令/表单对象:带有自定义的类型转换的bean属性或者域,依赖于
@InitBinder
方 法和/或HandlerAdapter配置——参见AnnotationMethodHandlerAdapter
的“webBindingInitializer
”属性。 这样的命令对象,包括它们的验证结果,将会暴露为模型属性,默认的会在属性注解中使用非限定的命令类名(例如,对于类型 “mypackage.OrderAddress”使用“orderAddress”)。 为声明一个特定的模型属性名称指定一个参数级别的ModelAttribute
注 解。 -
org.springframework.validation.Errors
/org.springframework.validation.BindingResult
验证 结果用于前面的一个命令/表单对象(前面紧接的参数)。 -
org.springframework.web.bind.support.SessionStatus
状 态处理用于把表单处理过程标记为已完成(触发会话属性的清理,这些会话属性是在句柄类型级别由@SessionAttributes
注 解指示出的)。
@RequestParam
注解是用于在控制器中绑定请求参数到方法参数。
下面取自PetClinic实例程序的代码片段说明了这种用法:
@Controller @RequestMapping("/editPet.do") @SessionAttributes("pet") public class EditPetForm { // ... @RequestMapping(method = RequestMethod.GET) public String setupForm(@RequestParam("petId") int petId , ModelMap model) { Pet pet = this.clinic.loadPet(petId); model.addAttribute("pet", pet); return "petForm"; } // ...
使用这个注解的参数默认是必需的,但是可以把@RequestParam
的required
属性置为false
从而
让这个参数可选(例如,@RequestParam(value="id",
required="false")
)。
@ModelAttribute
在控制器中有两种使用场景。
当作为一个方法参数时,@ModelAttribute
用于映射一个模型属
性到特定的注解的方法参数(见下面的processSubmit()
方法)。
这是控制器获得持有表单数据的对象引用的方法。另外,这个参数也可以被声明为特定类型的表单支持对象,而不是一般的java.lang.Object
,这就增加了类型安全性。
@ModelAttribute
也用于在方法级别为模型提供引用数据
(见下面的populatePetTypes()
方
法)。
在这种用法中,方法编写可以包含与上面描述的@RequestMapping
注
解相同的类型。
注意:
使用@ModelAttribute
注
解的方法将会在选定的使用@RequestMapping
注解的方法之前
执行。
它们有效的使用特定的属性预先填充隐含的模型,这些属性常常来自一个数据库。
这样一个属性也就可以通过在选定的方法中使用@ModelAttribute
注
解的句柄方法参数来访问了,潜在的可以应用绑定和验证。
下面的代码片段展示了此注解的这两种用法:
@Controller @RequestMapping("/editPet.do") @SessionAttributes("pet") public class EditPetForm { // ... @ModelAttribute("types") public Collection<PetType> populatePetTypes() { return this.clinic.getPetTypes(); } @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet , BindingResult result, SessionStatus status) { new PetValidator().validate(pet, result); if (result.hasErrors()) { return "petForm"; } else { this.clinic.storePet(pet); status.setComplete(); return "redirect:owner.do?ownerId=" + pet.getOwner().getId(); } } }
类型级别的@SessionAttributes
注解使用一个特定的句柄声明会话
属性。
这通常会列出模型属性的名称,这些属性应被透明的保存在会话或者对话存储中,用于在后续的请求之间作为表单支持beans。
下面的代码片段展示了此注解的这种用法:
@Controller @RequestMapping("/editPet.do") @SessionAttributes("pet") public class EditPetForm { // ... }
为了通过Spring的WebDataBinder
使用
PropertyEditors等自定义请求参数绑定,可以或者使用@InitBinder
——
在控制器之内的注解的方法,
或者通过提供一个定制的WebBindingInitializer
把
配置具体化。
使用@InitBinder
注解控制器方法,可以在控制器类内部直接配置
Web数据绑定。
@InitBinder
指定初始化WebDataBinder
的方法,
后者被用于填充注解的句柄方法的命令和表单对象参数。
这个init-binder方法支持@RequestMapping
支持
的全部参数,除了命令/表单对象和对应的验证结果对象。
Init-binder方法必须没有返回值。因此,它们常被声明为void
。
典型的参数,包括 WebDataBinder
以及WebRequest
或者java.util.Locale
,
允许代码注册上下文特定的编辑器。
下面的例子说明了@InitBinder
的用法,为所有的java.util.Date
表单属性配置一个CustomDateEditor
。
@Controller public class MyFormController { @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); } // ... }
为了外化数据绑定初始化的过程,可以提供一个WebBindingInitializer
接
口的自定义实现。
通过为一个AnnotationMethodHandlerAdapter
提
供一个定制的bean配置可以使它启用,这样就覆盖了默认配置。
下面取自PetClinic应用的例子展示了一个使用WebBindingInitializer
接
口的自定义实现的配置——org.springframework.samples.petclinic.web.ClinicBindingInitializer
,
完成多个PetClinic控制器都需要的PropertyEditors的配置。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="webBindingInitializer"> <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" /> </property> </bean>
发表评论
-
Spring @Transactional
2011-08-01 11:53 1808Spring事务的传播行为 在service类前加上@ ... -
spring mvc java.lang.IllegalStateException: Errors/BindingResult argument declar
2011-01-21 10:21 5052关于BindingResult Spring ... -
kaptcha 验证码在spring mvc 中的使用
2010-11-11 14:46 15403kaptcha 是一个非常实用的验证码生成工具。有了它,你可 ... -
@ResponseBody注解
2010-11-04 17:44 29820在SpringMVC中可以在Contr ... -
spring 标签介绍
2010-10-27 14:42 3034Spring 标记库分类如下: 1、spring:has ... -
spring roo
2010-10-22 14:50 3153Spring Roo 是一种 Spring 开发的辅助工具,当 ... -
spring mvc 实现的验证码功能
2010-10-19 15:56 8810import java.awt.BasicStroke; i ... -
spring3 Validation, Data Binding, and Type Conversion
2010-10-18 17:52 38075. Validation, Data Binding, ... -
打散 <mvc:annotation-driven>
2010-10-18 13:10 4761Spring3.0的基于注解的MVC非常好用,特别在加入了新的 ... -
spring mvc使用注解后的校验和绑定处理
2010-10-12 15:18 1389spring mvc使用注解后,依然可以使用自带的Valida ... -
使用 Spring 2.5 基于注解驱动的 Spring MVC
2010-10-12 10:45 1559概述 继 Spring 2.0 对 Spring MV ... -
Spring MVC的表单控制器
2010-10-11 15:36 3927概述 大多数Web应 ... -
context:component-scan
2010-10-08 13:33 44601. 扫描过滤方式 过滤器类型 说明 注释 假如 com.ba ... -
Spring MVC
2010-09-21 16:12 4404Spring提供了一个细致完整的MVC框架。该框架为模型、视图 ... -
领略Spring 3.x 时代的Spring MVC
2010-09-21 16:07 2000鼎鼎大名的Spring框架3.0版在12月5日由其作者之 ... -
Spring入门之三: 进入Spring MVC
2010-09-13 11:04 2434Spring入门之三: 进入Sprin ... -
Spring3 MVC Restful 多请求类型(json,xml,k-v),多视图配置(Json,Xml,JSP,Freemarker,Volacity等)
2010-09-13 10:59 5850beans xmlns="http://www.sp ... -
Spring3 MVC (三)---请求处理方法 参数及返回值总结
2010-09-13 10:50 8559@RequestMapping("/xx ... -
Spring3 MVC 注解(二)---@RequestMapping
2010-09-13 10:47 155621 问题:有多个 @RequestMapping @ ... -
Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释
2010-09-13 10:46 93107一:配置web.xml 1)问题:spri ...
相关推荐
,Spring Web编程模型,基于权限配置的方式:核心是1个拦截器,基于注解的权限控制:核心是1个切面,WebFlux编程模型,基于权限配置的方式:核心是1个过滤器,基于注解的权限控制:核心是1个切面
也包含新版Spring3.0,3.1 基于注解的MVC配置方法 总之绝对值得下载 学习 并以后查阅 目录 第一章 Web MVC简介.pdf 第二章 Spring MVC入门 .pdf 第三章 DispatcherServlet详解.pdf 第四章 Controller接口控制器详解...
16、Spring基于注解方式声明式事务控制 SpringMVC部分: 1、SpringMVC简介 2、SpringMVC组件解析 3、SpringMVC数据响应 4、SpringMVC数据请求 5、SpringMVC文件上传 6、SpringMVC+Spring完成练习 7、SpringMVC拦截...
本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理...
1. 什么是 spring? 2. 使用 Spring 框架的好处是什么? 3. Spring 由哪些模块组成? 4. 核心容器(应用上下文) 模块 ...67. 什么是 Spring MVC 框架的控制器? 68. @Controller 注解 69. @RequestMapping 注解
2,使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率,比如@Configuration和@bean注解结合,基于@Configuration完成类扫描,基于@bean注解把返回值...
* * * * Spring MVC的核心类和注解 请输入您的部门/机构名称 12.1 DispatcherServlet DispatcherServlet的全名是org.springframework.web.servlet.DispatcherServlet,它在程序中充当着前端控制器的角色。...
后台全注解式的开发(除了必要的spring和hibernate的xml配置以外) 03. 后台通过自定义注解结合一个访问拦截器实现整个系统的权限控制 04. 系统前台采用全采用的Html+jQuery开发 05. 系统前台与后台的交互全部...
13.12. 基于注解的控制器配置 13.12.1. 建立dispatcher实现注解支持 13.12.2. 使用@Controller定义一个控制器 13.12.3. 使用@RequestMapping映射请求 13.12.4. 使用@RequestParam绑定请求参数到方法参数 13.12....
13.12. 基于注解的控制器配置 13.12.1. 建立dispatcher实现注解支持 13.12.2. 使用@Controller定义一个控制器 13.12.3. 使用@RequestMapping映射请求 13.12.4. 使用@RequestParam绑定请求参数到方法参数 13.12....
这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency injection),使用注解而非XML元数据来自动侦测classpath上的Spring组件,注解对生命周期方法的支持,一个新的web控制器模型将请求映射到加...
Spring Framework 开发参考手册 目录 1. 简介 1.1. 概览 1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 ...2.5.3. 基于Annotation的控制器 ......
13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: RequestToViewNameTranslator 13.12. 其它资源 14. 集成视图技术 14.1. ...
4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 ...
13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: RequestToViewNameTranslator 13.12. 其它资源 14. 集成视图技术 ...
本文将主要关注于简化的配置和在Spring应用程序上下文(application context)核心新增的基于注解的功能;第二篇文章将涵盖web层可用的新特性;最后一篇文章将着重介绍集成和测试的新增性能。这一系列的三篇文章中...
项目结构: 我们将展示一个标准的Spring MVC项目结构,包括控制器、模型、视图、配置文件等。您将了解如何组织项目以便更好地管理和扩展。 请求处理流程: 我们将详细解释Spring MVC中的请求处理流程,包括请求映射...
13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: RequestToViewNameTranslator 13.12. 其它资源 14. 集成视图技术 ...
4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 ...
4.4.2 拦截器配置 89 4.4.3 @ControllerAdvice 91 4.4.4 其他配置 94 4.5 Spring MVC 的高级配置 98 4.5.1 文件上传配置 98 4.5.2 自定义HttpMessageConverter 101 4.5.3 服务器端推送技术 106 4.6 Spring MVC 的...