@RequestMapping
Spring MVC 使用 @RequestMapping 注解为控制器指定该控制器可以处理那些 URL 请求
在控制器的类定义及方法定义处都可标注 @RequestMapping
1. 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
2. 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于WEB 应用的根目录
DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法
常用属性值:value:指定url,method 指定请求的方式,heasers : 指定请求头信息
映射请求参数、请求方法或请求头
@RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求
@RequestMapping 的 value、method、params 及 heads 分别表示请求 URL、请求方法、请求参数及请求头的映射条
件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。
params 和 headers支持简单的表达式:
param1: 表示请求必须包含名为 param1 的请求参数
!param1: 表示请求不能包含名为 param1 的请求参数
param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2的两个请求参数,且 param1 参数的值必须为 value1
使用 @RequestMapping 映射请求
• Ant 风格资源地址支持 3 种匹配符:
?:匹配文件名中的一个字符
*:匹配文件名中的任意字符
**:** 匹配多层路径
• @RequestMapping 还支持 Ant 风格的 URL:
/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
@PathVariable 映射 URL 绑定的占位符
带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable("xxx") 绑定到操作方法的入参中。
代码示例
index.jsp
<%@ 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>
<a href="testPathVariable/1">Test PathVariable</a>
<br>
<br>
<a href="testAntPath/123/abc">Test ParamsAndHeaders</a>
<br>
<br>
<a href="testParamsAndHeaders?username=shagou&age=11">Test
ParamsAndHeaders</a>
<br>
<br>
<form action="testMethod" method="post">
<input type="submit" value="submit">
</form>
<br>
<br>
<a href="testMethod">Test Method</a>
<br>
<br>
<a href="testRequestMapping">Test RequestMapping</a>
<!-- 为书写方便,这里讲 @RequestMapping 注解标注在类上面的方式去掉 -->
<!-- <a href="springmvc/testRequestMapping">Test RequestMapping</a> -->
<br>
<br>
<a href="helloworld">Hello SpringMVC</a>
</body>
</html>
Controller 测试类
//@RequestMapping("/springmvc") 为书写方便这里去掉其对类的注解
@Controller
public class SpringMvcTest {
private static final String SUCCESS = "success";
/**
* 测试 @PathVariable 注解
* 可以映射 URL 中的占位符到目标方法的参数中
* @param id
* @return
*/
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.println("SpringMvcTest.testPathVariable() : " + id);
return SUCCESS;
}
/**
* 测试 @RequestMapping("/testAntPath/*\/abc") 支持通配符的方式,即在请求的时候那个 * 可以写任意字符,例如:http://localhost:8080/springmvc-1/testAntPath/12xx3/abc也可以访问
* @return
*/
@RequestMapping("/testAntPath/*/abc")
public String testAntPath() {
System.out.println("SpringMvcTest.testAntPath()");
return SUCCESS;
}
/**
* 测试 可以使用 params 和 headers 属性
* 添加更精确的请求. params 和 headers 支持简单的表达式
*
* PS: 这里注意下,如果指定了 heasers 属性,就不能使用 eclipse 内置的浏览器进行测试,因为会报错,使用外置的浏览器即可
* @return
*/
@RequestMapping(value = "/testParamsAndHeaders", params= {"username", "age!=10"}, headers= {"Connection=keep-alive"})
public String testParamsAndHeaders() {
System.out.println("SpringMvcTest.testParamsAndHeaders()");
return SUCCESS;
}
/**
* 测试 @RequestMapping 注解 method 属性
* 指定请求的方式
* @return
*/
@RequestMapping(value = "/testMethod", method=RequestMethod.POST)
public String testMethod() {
System.out.println("SpringMvcTest.testMethod()");
return SUCCESS;
}
/**
* 测试 @RequestMapping 注解既可以修饰方法,也可以修饰类,这点可以看 该注解源码上面的元注解对其进行的修饰
* @java.lang.annotation.Target(value={java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.TYPE})
*
* 1. 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
* 2. 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用根目录
*
* @return
*/
@RequestMapping("/testRequestMapping")
public String testRequestMapping() {
System.out.println("testRequestMapping");
return SUCCESS;
}
}
注解 @RequestMapping method 属性的取值范围
@RequestParam
绑定请求参数值,在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
value:参数名称
required:是否必须。默认为true,表示请求参数中必须包含对应的参数,若不存在,则抛出异常。
代码示例:
index.jsp
<a href="testRestParam?username=ergou&age=11">Test RestParam</a>
Controller 类
/**
* @RequestParam 映射请求参数
*
* value 值,即请求参数的参数名
* required 该参数是否必传,默认为 true
* defalutValue 请求参数默认值
*
* @param username
* @param age
* @return
*/
@RequestMapping(value="/testRestParam")// 注意这里如果 age 的类型为 int ,并且没有传值会报错,可以通过属性 defalutValue为其设置默认值为0
public String testRequstParam(@RequestParam("username") String username, @RequestParam(value="age", required=false) Integer age) {
System.out.println("SpringMvcTest.testRestParam() : username = " + username + ", age = " + age);
return SUCCESS;
}
@RequestHeader 映射请求头信息
index.jsp
<a href="testRequestHeader">Test RequestHeader</a>
Controller 类
/**
* 测试 @RequestHeader 同 @RequestPara 映射请求头信息
* @param al
* @return
*/
// Accept-Language: zh-CN,zh;q=0.9
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader("Accept-Language") String al) {
System.out.println("SpringMvcTest.testRequestHeader():" + al);
return SUCCESS;
}
@CookieValue
index.jsp
<a href="testCookieValue">Test CookieValue</a>
Controller 类
/**
* @CookieValue 映射一个 Cookie值
*
* @param sessionId
* @return
*/
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
System.out.println("SpringMvcTest.testCookieValue():" + sessionId);
return SUCCESS;
}