第二章 @RequestMapping映射
RequestMapping映射请求注解
@RequestMapping:@RequestMapping("hello") --@RequestMapping("/hello")
- 就是告诉springmvc 这个方法用来处理什么请求
- 这个/是可以省略,即使省略了, 也是默认从当前项目下开始
- 习惯加上比较好/hello
标志处
- 类定义处:提供初步的请求映射信息,相对于web应用的根目录 一个请求只能处理一个同名方法 可以再类定义处进行标记 从而区分方法处
- 方法处:提供进一步的细分映射信息,相对于类定义出的url,如果类定义处为标注@RequestMapping。则方法处标记的URL相对于web应用的根目标
DispatcherServlet截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法
Method:限定请求方式
- HTTP协议中的所有请求方式:【get】、【post】、put、patch、delete、options
- method = RequestMethod.POST 只接受这种类型的请求,默认是什么都可以 ,不是规定的方式就会报错405 Request method 'GET' not supported
4xx 都是客户端错误 - 以get方式请求
《a href="springmvc/testMethord">testMethord《/a>
- 以POST方式请求
《form action="springmvc/testMethord" method="post"> 《input type="submit" value="submit"> 《/form>
params
RequestMapping映射请求方式
标准的 HTTP 请求报头
标准的 HTTP 请求报头
@RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求
@RequestMapping 的 value【重点】、method【重点】、params【了解】 及 heads【了解】
分别表示请求 URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。params 和 headers支持简单的表达式:
param1: 表示请求必须包含名为 param1 的请求参数eg:params={"username"}:发送请求的时候必须带上一个名为username的参数,没带就会404 params={"username=123"} username必须是123 @RequestMapping(value="/hello",params = {"username"}) public String myRequest() { System.out.println("hello"); return "hello"; } ?username= ?
!param1: 表示请求不能包含名为 param1 的请求参数
param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1@RequestMapping(value="/hello",params = {"username"}) public String myRequest() { System.out.println("hello"); return "hello"; }
params={"!username"} 送请求的时候必须没带上一个名为username的参数,带就会404
params={"!username","age","pwd"} 请求参数必须满足以上规则 请求的username不能是123,必须有pwd的值,不能有age
{"param1=value1", "param2"}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
User-Agen 指定浏览器
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36
consumes
只接受内容类型是那种的请求,规定请求头中的Content-Type
produces
告诉浏览器返回的内容类型是什么,响应头中加上Content-Type:text/html;charset=utf-8
RequestMapping映射请求参数&请求头
URL地址可以写模糊的通配符 Ant风格
- ?:代替任意一个字符 0个多个都不行 ?不能代替/ 【多个匹配 精确优先】
- *:能够代替任意多个字符 和一层路径
- **:能够代替多层路径
- 带一个和带多个匹配 优先选带一个
@Controller public class MyController { @RequestMapping(value="/hello0") public String myRequest0() { System.out.println("hello0"); return "hello"; } @RequestMapping(value="/hello?") public String myRequest1() { System.out.println("hello?"); return "hello"; } @RequestMapping(value="/hello*") public String myRequest1() { System.out.println("hello*"); return "hello"; } @RequestMapping(value="hello/*/test") //单层 public String myRequest1() { System.out.println("hello/*/test"); return "hello"; } @RequestMapping(value="/hello/**/test") //多层 public String myRequest1() { System.out.println("hello"); return "hello"; } //路径上可以有占位符,占位符语法就是可以在任意路径的地方写一个{变量名} // /user/admin /user/cznzcai //路径上的占位符只能占一层路径 @RequestMapping(value="/hello/{id}") public String myRequest1(@PathVariable("id")String id) { System.out.println(id); return "hello"; } }
RequestMapping_请求参数&请求头【了解】
//了解: 可以使用 params 和 headers 来更加精确的映射请求. params 和 headers 支持简单的表达式. @RequestMapping(value="/testParamsAndHeaders", params= {"username","age!=10"}, headers = { "Accept-Language=en-US,zh;q=0.8" }) public String testParamsAndHeaders(){ System.out.println("testParamsAndHeaders..."); return "success"; }