SpringMVC(四)_功能处理方法的映射
前言:本文主要介绍控制器上的功能处理方法映射,包括URL路径映射,请求方法映射,请求参数映射,请求头映射。
本篇文章重点关注以下问题:
- 简述Http请求信息
- URL路径映射限定
- 请求方法映射限定
- 请求参数映射限定
- 请求头映射限定
1. HTTP请求信息
Http请求信息主要包括五部分信息:
- 请求方法:如GET、POST等,表示提交方式;
- URL:请求的地址信息;
- 协议及版本;
- 请求头信息:包括Cookie等;
- 请求内容:请求的内容或数据,如表单提交时的参数数据、URL请求参数(?abc=123 ?后边的)等。
分析上述五部分信息,可以看到1,2,4,5是可变的,因此可以将这些信息进行请求到处理器的功能处理方法的映射,因此请求的映射分为如下几种:
- URL路径映射:使用URL映射请求到处理器的功能处理方法;
- 请求方法映射限定:如限定功能处理方法只处理GET请求;
- 请求参数映射限定:如限定只处理包含“abc”请求参数的请求;
- 请求头映射限定:如限定只处理“Accept=application/json”的请求。
2. 功能处理方法映射
功能处理方法映射使用注解:@RequestMapping。@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。其有六个属性:
属性 | 作用 |
value | 指定请求的实际地址,指定的地址可以是URI Template 模式。 |
method | 指定请求的method类型, GET、POST、PUT、DELETE等。 |
params | 指定request中必须包含某些参数值时,才让该方法处理。 |
headers | 指定request中必须包含某些指定的header值时,才能让该方法处理请求。 |
consumes | 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; |
produces | 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; |
2.1 URL路径映射
@RequestMapping注解的value属性指明URL值,其值有三种类型:
- 普通URL路径映射:指定为普通的具体值;
- 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
- 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);
2.1.1 普通URL路径映射
这种映射类型很简单,需要说明的是多个URL路径可以映射到同一个处理器的功能处理方法的情况(或的关系):
@RequestMapping(value={"/test1", "/user/create"})
2.1.2 URI 模板模式映射
第二种类型样例如下,{ownerId}为占位符,可通过@PathVariable提取URI模板模式中的{×××}中的×××变量。
@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET) public String findOwner(@PathVariable String ownerId, Model model) { Owner owner = ownerService.findOwner(ownerId); model.addAttribute("owner", owner); return "displayOwner"; }
2.1.3 正则表达式风格的URL路径映射
从Spring3.0 开始支持正则表达式风格的URL路径映射,格式为{变量名:正则表达式},可以通过@PathVariable提取模式中的{×××:正则表达式匹配的值}中的×××变量。
@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}")
上述URL可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,这样可以设计更加严格的规则。
正则表达式风格的URL路径映射是一种特殊的URI模板模式映射:URI模板模式映射是{userId},不能指定模板变量的数据类型,如是数字还是字符串;正则表达式风格的URL路径映射,可以指定模板变量的数据类型,可以将规则写的相当复杂。
2.1.4 Ant 风格的URL
Ant 风格资源地址支持 3 种匹配符:
- ?:匹配文件名中的一个字符
- *:匹配文件名中的任意字符
- **:** 匹配多层路径
/user/*/createUser: 匹配 ==> /user/aaa/createUser、/user/bbb/createUser 等 URL /user/**/createUser: 匹配 ==> /user/createUser、/user/aaa/bbb/createUser 等 URL /user/createUser??: 匹配 ==> /user/createUseraa、/user/createUserbb 等 URL
2.2 请求方法映射限定
@RequestMapping注解的method属性指明请求方法,包括以下8种,GET、POST是我们开发中常见的,DELETE、PUT在REST风格中较为常见,后续文章也会讲解SpringMVC对RESTful风格的支持。
public enum RequestMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE }样例如下,即请求方法可以是GET 或POST。
@RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET})
提示:
1、一般浏览器只支持GET、POST请求方法,如想通过浏览器发送PUT、DELETE 等请求方法,介可以在前台添加隐含域实现,后续章节介绍。
2、除了GET、POST,还有HEAD、OPTIONS、PUT、DELETE、TRACE、PATCH。
3、DispatcherServlet默认开启对GET、POST、PUT、DELETE、HEAD 的支持;
4、如果需要支持OPTIONS、TRACE,请添加DispatcherServlet 在web.xml 的初始化参数:dispatchOptionsRequest 和dispatchTraceRequest 为true。
2.3 请求参数数据映射限定
@RequestMapping注解的params属性指明请求参数映射的限制,params和headers一样,支持简单的表达式:
- param1: 表示请求必须包含名为 param1 的请求参数;
- !param1: 表示请求不能包含名为 param1 的请求参数;
- param1 != value1: 表示请求包含名为 param1 的请求参数,但其–值不能为 value1;
- {“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2的两个请求参数,且 param1 参数的值必须为 value1;
@Controller @RequestMapping("/owners/{ownerId}") public class RelativePathUriTemplateController { @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue") public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) { // implementation omitted } }
2.4 请求头数据映射限定
@RequestMapping注解的headers属性指明请求头数据映射的限制,和params一样,支持简单的表达式:
- param1: 表示请求头必须包含名为 param1 的请求头参数;
- !param1: 表示请求头不能包含名为 param1 的请求头参数;
- param1 != value1: 表示请求头包含名为 param1 的请求头参数,但其值不能为 value1;
- {“param1=value1”, “param2”}: 请求头必须包含名为 param1 和param2的两个请求头参数,且 param1 参数的值必须为 value1;
http://www.ifeng.com/
”的请求;@Controller @RequestMapping("/owners/{ownerId}") public class RelativePathUriTemplateController { @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/") public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) { // implementation omitted } }
2.5 生产者、消费者限定
@RequestMapping注解的consumes属性指明功能处理方法能消费的媒体类型(其通过请求头的“Content-Type”来判断),此方式等价于使用@RequestMapping的“headers = 'Content-Type=application/json'”,但更为简明。
cousumes的样例如下,方法仅处理request Content-Type为“application/json”类型的请求:
@Controller @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json") public void addPet(@RequestBody Pet pet, Model model) { // implementation omitted }
@RequestMapping注解的produces属性指明功能处理方法能产生的媒体类型(其根据请求头中的Accept进行匹配),此方式等价于使用@RequestMapping的“headers = 'Accept=application/json'”,但更为简明。
produces的样例如下,方法仅处理request Content-Type为“application/json”类型的请求:
@Controller @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json") @ResponseBody public Pet getPet(@PathVariable String petId, Model model) { // implementation omitted }
代码下载来源:http://super-wangj.iteye.com/blog/2388430
上一篇: junit学习(七)——参数化设置:同时测试一组数据
下一篇: 验证码安全方式对比
推荐阅读
-
深入理解在JS中通过四种设置事件处理程序的方法
-
深入理解在JS中通过四种设置事件处理程序的方法
-
SQL Server 2008R2编写脚本时智能提示功能丢失的处理方法
-
处理好婆媳矛盾的四种方法
-
PHP+Mysql基于事务处理实现转账功能的方法
-
SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器
-
SpringMVC四种controller接收参数的方式,三种controller向界面传递参数的方法
-
springmvc代码详细(五种映射,绑定参数,处理json数据,文件上传,转发,拦截器的实现)
-
iis7.5 批量删除处理程序映射的方法
-
cdr怎么处理矩形的四个角? cdr圆角/倒棱角/扇形角的制作方法