文章目录
本篇示例基于第一个SpringMVC程序。
@RequestMapping的定义
//RequestMapping.class
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 org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
@RequestMapping注解的作用
@RequestMapping
的作用是,将请求、处理请求的控制器方法关联起来,建立映射关系。
@RequestMapping注解的位置
@Target({ElementType.TYPE, ElementType.METHOD})
@RequestMapping
注解既可以标识在类上(ElementType.TYPE),也可以标识在方法(ElementType.METHOD)。比如,
@Controller
@RequestMapping("/test")
public class HelloController {
@RequestMapping("/hello")
public String testHello(){
return "hello";
}
}
<!-- hello.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>Hello</title>
</head>
<body>
<h1>Here is hello page</h1>
</body>
</html>
此时,控制器方法testHello()
映射的请求路径为/test/hello
。
@RequestMapping的属性
RequestMapping
有如下属性:
name():String
value():String[]
path():String[]
method():RequestMethod[]
params():String[]
headers():String[]
consumers():String[]
produces():String[]
value属性
@RequestMapping(value=xxx)
,通过请求地址匹配请求。
value():String[]
,即 value属性值既可以是一个字符串,也可以是一个字符串数组。
@Controller
public class TestController {
@RequestMapping(value = {"/test","/test/value"})
public String testValue(){
return "success";
}
}
<!-- success.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>success</title>
</head>
<body>
<h1>请求成功!</h1>
</body>
</html>
示例中,@RequestMapping(value = {"/test","/test/value"})
,value属性值是一个字符串数组,表示同时匹配多个请求地址:/test
和/test/value
。
@RequestMapping(value = {"/test","/test/value"})
同@RequestMapping({"/test","/test/value"})
。
另外,关于请求地址的匹配,以下两点需要注意。
第一点:ant风格中的通配符
ant风格,是请求地址的一种匹配方式,用于模糊匹配,有如下3种通配符,
?
,用于匹配单个字符。比如@RequestMapping("/a?a/test")
,可匹配/aaa/test
、/aba/test
,/a1a/test
等请求地址。*
,用于匹配零个或多个字符。比如@RequestMapping("/a*a/test")
,可匹配/aa/test
、/aca/test
、/abcdefa/test
等请求地址。**
,用于匹配一层或多层路径,用于@RequestMapping("/**/xxxx")
方式。比如/**/test
,可匹配/test
、/user/test
、/a/b/c/d/test
等请求地址。
第二点:rest风格中的占位符
请求路径上的占位符{xxx}
,常见于restful风格中。
把要传输给服务器的数据放到请求路径的占位符上,如@RequestMapping("/test/{id}")
。
使用@PathVariable
注解,可将占位符表示的数据赋值给控制器方法的形参。
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("/test/{id}")
public String test(@PathVariable("id") Long id){
System.out.println("id:"+id);
return "success";
}
}
method属性
@RequestMapping(method=xxx)
,通过请求方法匹配请求。
method():RequestMethod[]
,method属性值既可以是一个RequestMethod
类型的方法,也可以是RequestMethod
类型的数组。
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping(value = "/test",method = RequestMethod.GET)
public String test(){
return "success";
}
@RequestMapping(value = "/target",method = {RequestMethod.GET,RequestMethod.POST})
public String target(){
return "target";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<form th:action="@{/test}" method="get">
<input type="submit" value="method属性是一个字符串,method为get,访问success页面"/>
</form>
<form th:action="@{/target}" method="post">
<input type="submit" value="method属性是一个字符串组,method为get,访问target页面"/>
</form>
<form th:action="@{/target}" method="post">
<input type="submit" value="method属性是一个字符串组,method为post,访问tareget页面"/>
</form>
</body>
</html>
<!-- success.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>success</title>
</head>
<body>
<h1>here is success</h1>
</body>
</html>
<!-- target.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>target</title>
</head>
<body>
<h1>here is target</h1>
</body>
</html>
示例中,@RequestMapping(value = "/test",method = RequestMethod.GET)
,请求路径匹配/test
,请求方法匹配get方法;
@RequestMapping(value = "/target",method = {RequestMethod.GET,RequestMethod.POST})
,请求路径匹配/target
,可匹配多个请求方法:get和post。
常用的请求方法有:get、post、put和delete,针对这些方法,Spring提供了@RequestMapping
对应的派生注解,如下,
@GetMapping
,同@RequestMapping(method = RequestMethod.GET)
@PostMapping
,同@RequestMapping(method = RequestMethod.POST)
@PutMapping
,同@RequestMapping(method = RequestMethod.PUT)
@DeleteMapping
,同@RequestMapping(method = RequestMethod.DELETE)
params属性
@RequestMapping(params=xxx)
,通过请求参数匹配请求。
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping(value = "/test",params = {"username"})
public String test(){
return "success";
}
@GetMapping(value = "/test2",params = {"!username"})
public String test2(){
return "success";
}
@GetMapping(value = "/test3",params = {"username=tom"})
public String test3(){
return "success";
}
@GetMapping(value = "/test4",params = {"username!=tom"})
public String test4(){
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<a th:href="@{/test(username='tom')}">@{/test(username='tom')}<-->@GetMapping(value = "/test",params = {"username"}),测试:Yes</a><br/>
<a th:href="@{/test}">@{/test}<-->@GetMapping(value = "/test",params = {"username"}),测试:No</a><br/><br/>
<a th:href="@{/test2}">@{/test2}<--->@GetMapping(value = "/test2",params = {"!username"}),测试2:Yes</a><br/>
<a th:href="@{/test2(username='tom')}">@{/test2(username='tom')}<--->@GetMapping(value = "/test2",params = {"!username"}),测试2:No</a><br/><br/>
<a th:href="@{/test3(username='tom')}">@{/test3(username='tom')}<--->@GetMapping(value = "/test3",params = {"username=tom"}),测试3:Yes</a><br/>
<a th:href="@{/test3(username='jack')}">@{/test3(username='jack')}<--->@GetMapping(value = "/test3",params = {"username=tom"}),测试3:No</a><br/><br/>
<a th:href="@{/test4(username='jack')}">@{/test4(username='jack')}<--->@GetMapping(value = "/test4",params = {"username!=tom"}),测试4:Yes</a><br/>
<a th:href="@{/test4(username='tom')}">@{/test4(username='tom')}<--->@GetMapping(value = "/test4",params = {"username!=tom"}),测试4:No</a>
</body>
</html>
<!-- success.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>success</title>
</head>
<body>
<h1>here is success</h1>
</body>
</html>
params = {"username"}
,请求参数必须携带username。params = {"!username"}
,请求参数不能携带username。params = {"username=tom"}
,请求参数必须携带username,且username的值是tom。params = {"username!=tom"}
,请求参数必须携带username,且username的值不能是tom。
如果需要匹配多个请求参数,将params设置为字符串数组即可,如params = {"username","password"}
。
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping(value = "/test",params = {"username","password"})
public String test(){
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<a th:href="@{/test(username='tom',password=123456)}">测试</a>
</body>
</html>
headers属性
@RequestMapping(headers=xxx)
,通过请求头匹配请求。
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping(value = "/test",headers = {"Host"})
public String test(){
return "success";
}
@GetMapping(value = "/test2",headers = {"!Host"})
public String test2(){
return "success";
}
@GetMapping(value = "/test3",headers = {"Host=localhost:8080"})
public String test3(){
return "success";
}
@GetMapping(value = "/test4",headers = {"Host!=localhost:8080"})
public String test4(){
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<a th:href="@{/test}">测试</a>
<a th:href="@{/test2}">测试2</a>
<a th:href="@{/test3}">测试3</a>
<a th:href="@{/test4}">测试4</a>
</body>
</html>
<!-- success.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>success</title>
</head>
<body>
<h1>here is success</h1>
</body>
</html>
headers = {"Host"}
,表示请求头信息必须携带Host。headers = {"!Host"}
,表示请求头信息不能携带Host。headers = {"Host=localhost:8080"}
,表示请求头信息必须携带Host,且Host的值必须为localhost:8080。headers = {"Host!=localhost:8080"}
,表示请求头信息必须携带Host,且Host的值不能是localhost:8080。