RequestMapping:将Web请求映射到特定的处理程序类和/或处理程序方法的注释。在servlet和Portlet环境之间提供一致的风格,用语义适应具体环境。
RequestMapping源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.Callable;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
/**
*
* @return
*/
String name() default "";
/**
* 支持URL路径映射模式
* 支持Ant占位符匹配映射
* 支持portlet环境映射的Portlet模式
* 支持类级别及方法级别上的映射支持,当类级别进行映射支持时,所有子方法都继承主映射,缩小处理方法
* @return
*/
String[] value() default {};
/**
* HTTP请求方法映射,缩小主映射,支持 GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
* @return
*/
RequestMethod[] method() default {};
/**
* 映射请求参数,缩小主映射
* 支持表达式匹配模式进行参数请求映射
* 支持类级别映射,当为类级别映射时,所有子方法都继承主映射参数限制
* @return
*/
String[] params() default {};
/**
* 映射请求头
* 指定request中必须包含某些指定的header值,才能让该方法处理请求。
* @return
*/
String[] headers() default {};
/**
* 指定处理请求的提交内容类型(Content-Type)
* @return
*/
String[] consumes() default {};
/**
* 指定返回的内容类型
* @return
*/
String[] produces() default {};
}
通过RequestMapping源码中不难看到 RequestMapping 基于Mapping注解,我们看下Mapping注解的源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 表示web映射注释的元注释
*/
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Mapping {
}
通过两个源码不难理解 所有的web映射注解都属于元注解,RequestMapping在做了进一步的划分,可缩小查找范围,具体有name(),value(),method(),params(),headers(),consumes(),produces()这几类,除了name()我们又可以把余下的做些分类,1:consumes(),produces() 2:params(),headers() 3:value(),method()
针对这些分类我们做如下案例去解释
pom.xml,web.xml,springmvc.xml配置
请参考博文: https://my.oschina.net/LevelCoder/blog/912107
value作用于类级别上,在方法体中缩小查找范围
package com.levelcoder.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* 描述:@RequestMapping 作用于类级别上
*
* 作者:LevelCoder
*
* 邮箱:LevelCoder@126.com
*
* 日期:2017年6月1日 下午4:44:32
*
* 版本:V1.0.0
*/
@Controller
@RequestMapping(value="/type")
public class RMTypeController {
@RequestMapping(value="/testType")
public String type(){
return "successType";
}
}
测试index页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>初识@RequestMapping</p>
<a href="type/testType"> TYPE</a>
</body>
</html>
测试结果返回页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC : RequestMapping Type</title>
</head>
<body>
恭喜LevelCoder:RequestMapping Type请求模式 程序跑通了,继续学习吧
</body>
</html>
执行结果
通过上面案例,我们不难分析出,当请求时,首先通过类级别 @RequestMapping(value="/type") 进行第一次过滤,然后通过方法级别上@RequestMapping(value="/testType") 在次过滤确认要执行的方法是哪一个,这样做的好处是在同一个控制器下可同时存在多个请求方法,可通过类查找到指定类,在通过方法下的值过滤到指定方法上。
value()中Ant风格请求模式
Ant风格支持3中匹配方式
? | 匹配文件中一个字符 |
* | 匹配文件中任意字符 |
** | 匹配文件中多层路径 |
package com.levelcoder.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* 描述::@RequestMapping注解:Ant通配符
*
* 作者:LevelCoder
*
* 邮箱:LevelCoder@126.com
*
* 日期:2017年6月1日 上午9:43:37
*
* 版本:V1.0.0
*/
@Controller
public class RMAntController {
/**
* 通配符模式映射
*
* *:匹配文件中任意字符
* **:匹配文件中多层路径
* @return
*/
@RequestMapping(value="/rm/?evelCoder")
public String ant1(){
System.out.println("通配符 '?' 模式映射成功");
return "successAnt";
}
/**
* ?:匹配文件中一个字符
* @return
*/
@RequestMapping(value="/rm/*/LevelCoder")
public String ant2(){
System.out.println("通配符 '*' 模式映射成功");
return "successAnt";
}
/**
* **:匹配文件中多层路径
* @return
*/
@RequestMapping(value="/rm/**/LevelCoder")
public String ant3(){
System.out.println("通配符 '**' 模式映射成功");
return "successAnt";
}
}
测试index页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>Ant风格通配符请求</p>
<a href="rm/lc/LevelCoder">Ant风格通配符*</a>
<a href="rm/PevelCoder">Ant风格通配符?</a>
<a href="rm/a/b/LevelCoder">Ant风格通配符**</a>
</body>
</html>
测试返回界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC : RequestMapping ANT</title>
</head>
<body>
恭喜LevelCoder:RequestMapping Ant风格 程序跑通了,继续学习吧
</body>
</html>
测试结果
通过上面案例 当请求时通过@RequestMapping 值在做*匹配时,头尾保持一致,中间的请求参数可以为任意值即可访问到方法中, 在做?匹配时,只需所有参数保持一致,在?占位符位置可以替换为任意字符串即可访问到方法中,在做**匹配时,只需头尾保持一种,中间请求方法可为多层嵌套模式
value()还支持含某一个变量,正则表达式等请求模式,涉及@PathVariable注解,在后续博文及案例中在做讲解
method() 中 GET,POST方法请求模式
package com.levelcoder.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
*
* 描述:@RequestMapping注解 GET/POST请求模式
*
* 作者:LevelCoder
*
* 邮箱:LevelCoder@126.com
*
* 日期:2017年5月31日 下午11:58:42
*
* 版本:V1.0.0
*/
@Controller
public class RMGetPostController {
/**
* 根据请求方法进行映射 GET方式
* @return
*/
@RequestMapping(value="/rm/method",method=RequestMethod.GET)
public String get(){
System.out.println("GET请求方式成功");
return "successget";
}
/**
* 根据请求方法进行映射POST方式
* @return
*/
@RequestMapping(value="/rm/method",method=RequestMethod.POST)
public String post(){
System.out.println("POST请求方式成功");
return "successpost";
}
}
测试index页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>RequestMappingMethod的请求方式</p>
<form action="rm/method" method="POST">
<input type="submit" value="post请求" />
</form>
<form action="rm/method" method="GET">
<input type="submit" value="get请求" />
</form>
</body>
</html>
测试返回界面GET
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC : RequestMapping GET</title>
</head>
<body>
恭喜LevelCoder:RequestMapping GET请求模式 程序跑通了,继续学习吧
</body>
</html>
测试返回界面POST
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC : RequestMapping POST</title>
</head>
<body>
恭喜LevelCoder:RequestMapping POST 程序跑通了,继续学习吧
</body>
</html>
测试结果
通过上面案例 当请求时通过@RequestMapping value=rm/method 找到执行方法,再次根据method方法进行GET/POST请求过滤确认执行方法,这样可以在同一个HTML页面中嵌套多个form表单,根据表单中请求方法及请求类型判断在控制器中所对应的执行方法
method()剩余,HEAD, PUT, PATCH, DELETE, OPTIONS, TRACE 请求模式中涉及HiddenHttpMethodFilter,REST 在后续博文及案例中做讲解
params():映射请求参数,缩小主映射,支持表达式匹配模式进行参数请求映射
params支持简单表达式
params | 必须包含params参数 |
!params | 不能包含params参数 |
params != values | 必须包含params参数且params不能等于values |
{"params=value" ,params2} | 必须包含params,params2参数,且params参数必须等于value |
package com.levelcoder.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* 描述::@RequestMapping注解:带参数的注解
*
* 作者:LevelCoder
*
* 邮箱:LevelCoder@126.com
*
* 日期:2017年6月1日 上午9:38:17
*
* 版本:V1.0.0
*/
@Controller
public class RMParamsController {
/**
* 带参数请求方式 Paramers
* @return
*/
@RequestMapping(value="/rm/paramers", params={"name"})
public String paramers1(){
System.out.println("带参数请求方式成功");
return "successParamers";
}
/**
*
* @return
*/
@RequestMapping(value="/rm/paramers", params={"!name"})
public String paramers2(){
return "successParamers";
}
/**
*
* @return
*/
@RequestMapping(value="/rm/paramers", params={"name!=1"})
public String paramers3(){
return "successParamers";
}
/**
*
* @return
*/
@RequestMapping(value="/rm/paramers", params={"name=1","age!=10","sex"})
public String paramers4(){
return "successParamers";
}
}
测试index页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>带参数的请求方式</p>
<a href="rm/paramers?name=LevelCoder">name参数</a>
<a href="rm/paramers?age=LevelCoder">!name参数</a>
<a href="rm/paramers?name=LevelCoder">name!=1参数</a>
<a href="rm/paramers?name=1&age=9&sex=man">"name=1","age!=10","sex"}参数</a>
</body>
</html>
测试结果页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC : RequestMapping Paramers</title>
</head>
<body>
恭喜LevelCoder:RequestMapping 带参数请求模式 程序跑通了,继续学习吧
</body>
</html>
测试结果
通过上面案例 当请求时通过@RequestMapping value=rm/paramers 找到执行方法,再次根据params进行过滤确认到执行方法
header():过滤请求头
@RequestMapping注解我们就介绍到这里
demo地址: http://git.oschina.net/LevelCoder/demos