@RequestMapping其他属性
method:限定请求方式,默认为空,也就是说任何请求方法都可以处理
在MappingController中增加方法
@RequestMapping(value = "/handle_post_req", method = RequestMethod.POST) public String handlePostReq(){ String method = Thread.currentThread().getStackTrace()[1].getMethodName(); System.out.println(this.getClass().getSimpleName() + "类的" + method + "方法正在执行"); return "success"; } 复制代码
表单形式发送POST请求,在index.jsp页面的body标签中增加form表达代码
<p>发送POST请求</p> <form action="/mapping/handle_post_req" method="post"> <button type="submit">发送POST请求</button> </form> 复制代码
重新启动Tomcat,点击按钮发送POST请求,成功跳转至success.jsp页面
控制台输出
而在浏览器中输入http://localhost:8080/mapping/handle_post_req, 则会报错,说明请求不支持GET方式
params:指定请求参数
- params是一个数组
- params支持简单的表达式,指出 “!”, “!=”
- params指定请求中必须包含指定名的请求参数
在MappingController类中新增代码
@RequestMapping(value = "/handle_params", params = {"username"}) public String handleParams(){ String method = Thread.currentThread().getStackTrace()[1].getMethodName(); System.out.println(this.getClass().getSimpleName() + "类的" + method + "方法正在执行"); return "success"; } 复制代码
请求不携带params指定的参数,报错404
增加username参数,成功跳转至success页面
!params表示请求中必须不带params参数,修改代码
@RequestMapping(value = "/handle_params", params = {"!username"}) public String handleParams(){ return "success"; } 复制代码
重启tomcat,请求http://localhost:8080/mapping/handle_params?username=stark
规定参数值,params={"username=peter"},修改代码,重新启动Tomcat,再次输入http://localhost:8080/mapping/handle_params?username=stark
输入http://localhost:8080/mapping/handle_params?username=peter
也可以指定非指定值,如params={"username!=peter"},指定多个限制规则,必须同时满足,多个参数之间使用 "," 连接,URL地址多个参数之间使用 "&" 链接,如params={"username="stark",password,!gender}
headers,规定请求头表达式与params一样,也是一个数组
HTTP请求头中User-Agent表示发送请求的浏览器,可以使用headers属性指定User-Agent的值
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:88.0) Gecko/20100101 Firefox/88.0
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
增加代码
@RequestMapping(value = "/handle_headers",headers = {"User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:88.0) Gecko/20100101 Firefox/88.0"}) public String handleHeaders(){ return "success"; } 复制代码
重启Tomcat,谷歌浏览器中访问
火狐浏览器中访问
@RequestMapping的另外两个属性
- consumes:指定接收内容的类型
- produces:指定浏览器返回的内容类型
三、@RequestMapping的模糊匹配
- ? : 支持匹配一个字符
- * : 支持匹配任意字符
- ** : 支持匹配多层路径
新建一个MatchController,测试@RequestMapping的模糊匹配,以及通配符的使用
@Controller public class MatchController { @RequestMapping("/matc?") public String matchOne(){ return "success"; } } 复制代码
“?”匹配一个字符,重启tomcat,输入http://localhost:8080/match
“?”可以表示任意一个字符,但是匹配超过1个字符会报错
“*” 可以匹配多个字符
@RequestMapping("/matc*") public String matchMore(){ return "success"; } 复制代码
匹配0个或多个字符
也可以匹配一层路径
@RequestMapping("/matc*/layer") public String matchOneLayer(){ return "success"; } 复制代码
”**“ 匹配0或者多层
@RequestMapping("/match/**/layers") public String matchMoreLayers(){ return "success"; } 复制代码
四、@PathVariable注解
通过@PathVariable注解可以将URL中占位符参数绑定到控制器处理方法的入参中
新建一个PathVarController
@Controller public class PathVarController { // 路径上可以有站位符,*也是占位符,但是不能获取位置上变量的值,{}可以获取变量的值 // 方法参数中定义变量接收路径中的变量的值,并用@PathVariable指定路径变量的名称,默认参数中的变量名一致 @RequestMapping("/user/{id}") public String userInfo(@PathVariable("id") String id){ System.out.println("路径参数id的值为:" + id); return "success"; } } 复制代码
控制它打印出路径中变量的值
只能占一层路径,如果想要获取两层路径就要定义两个占位符
@RequestMapping("/user/{id}/{orderId}") public String userInfoDetial(@PathVariable("id") String id, @PathVariable("orderId") String orderId){ System.out.println("路径参数id的值为:" + id); System.out.println("路径参数orderId的值为:" + orderId); return "success"; } 复制代码
REST风格URL
REST:即Representational State Transfer,表现层状态转化,是一种软件架构, REST结构清晰,符合标准,易于理解,扩展方便
- 资源(Resources):网络上的资源,如文本图片信息等,可以用一个URI(统一资源定位符)来指向,每种资源对应一个特定的URI,可以通过访问URI或者资源
- 表现层(Representation):把资源具体呈现出来的形式,即表现层,如JSON格式,XML格式,TXT格式
- 状态转化(State Transfer):每发出一个请求,就代表客户端和服务端的一次交互。HTTP协议是一种无状态的协议,所有的状态都保存在服务器端,客户端想要操作服务器,必须通过某种手段,让服务器端状态发生变化,这种转化建立在表现层之上。HTTP协议里有四种操作方式,PUT表示更新资源,GET表示获取资源,POST表示新增资源,DELETE表示删除资源