(3)@RequestMapping注解的属性和路径占位符@PathVariable注解的使用

@RequestMapping注解用于映射HTTP请求到处理方法,可以在类或方法级别使用,用于指定请求路径、请求方式、请求参数和请求头等条件。通过value属性设置请求路径,method属性限制请求方式,params属性指定请求参数条件,headers属性则关注请求头信息。此外,文章还提到了@PathVariable用于获取路径参数,以及Ant风格的URL匹配方式。
摘要由CSDN通过智能技术生成

@RequestMapping注解

注解的功能和位置

语法格式:@注解类型名(属性名=属性值, 属性名=属性值, 属性名=属性值…)

  • 使用某个注解的时候,如果注解只有一个属性并且属性名是value的话,value可以省略
  • 使用某个注解的时候,如果注解的属性值是数组并且数组中只有一个元素,大括号可以省略

根据某种关系 将请求路径和处理请求的控制器方法建立映射关系 ,当前端控制器接收到用户请求后根据映射关系找到对应控制类的控制器方法处理这个请求

  • 标识一个类:设置映射请求的请求路径的初始信息,为当前控制器所有的控制器方法的请求地址指定一个基准路径,未标识默认以WEB应用的根目录为起点
  • 标识一个方法:设置映射请求的请求路径的具体信息,初始信息看类上有无@RequestMapping注解
  • @RequestMapping注解设置的属性越多表示匹配的条件就越精确
@Controller
@RequestMapping("/test")
public class RequestMappingController {
	// 此时映射的请求的请求路径为:/test/testRequestMapping
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
        // 返回逻辑视图名称
        return "success";
    }
    // 控制器类可以定义多个处理方法
}

注解的value属性(必须设置)

value属性(String类型的数组)指定标识的控制器方法可以处理请求的请求路径

  • 如果请求地址没有匹配的控制器方法就会报404错误(资源未找到)
<a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性-->/testRequestMapping</a><br>
<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><br>

为了保证前端控制器能够根据请求匹配到请求映射的控制器方法,每个控制器的控制方法所能映射的请求路径是唯一的但映射的请求路径个数不唯一

@RequestMapping(value = {"/testRequestMapping", "/test"})
public String testRequestMapping(){
    return "success";
}

注解的method属性

method属性(RequestMethod枚举类型的数组)指定标识的控制器方法可以处理请求的请求方式(个数不唯一),默认什么请求方式都可以处理

  • 如果请求方式没有匹配的控制器方法就会405错误(前提是value属性已经匹配)
<!--点击超链接或在浏览器地址栏发起的是GET请求-->
<a th:href="@{/test}">测试@RequestMapping的method属性-->GET</a><br>
<!--只有通过form表单设置请求方式为post才能发起POST请求(默认也是get)-->
<form th:action="@{/test}" method="post">
    <input type="submit">
</form>
@RequestMapping(value = {"/testRequestMapping", "/test"},method = {RequestMethod.GET, RequestMethod.POST})
public String testRequestMapping(){
    return "success";
}

注解的派生注解

SpringMVC提供了@RequestMapping的派生注解可以直接指定标识的控制器方法可以处理请求的请求方式不需要再设置method属性

注解名作用
@GetMapping处理get请求的映射
@PostMapping处理post请求的映射
@PutMapping处理put请求的映射
@DeleteMapping处理delete请求的映射

HTTP协议中的所有请求方式GET,HEAD,POS,PUT, PATCH,DELETE,OPTIONS,TRACE,但是目前浏览器只支持发送GET和POST请求

  • 想要发送其他请求需要使用Spring提供的过滤器HiddenHttpMethodFilter将表单原本的POST请求转换为PUT和DELETE请求(具体实现Restful中会讲)
<a th:href="@{/testGetMapping}">测试GetMapping注解-->/testGetMapping</a><br>
@GetMapping("/testGetMapping")
public String testGetMapping(){
    return "success";
}

注解的params属性(了解)

params属性(String类型的数组)指定标识的控制器方法可以处理请求的请求参数条件(是否携带参数,参数的值是否相同)

  • 请求参数要求多个条件都成立,如果有一个条件不成立就会报400错误(前提是value属性method属性都已经匹配)
属性功能
“param”匹配请求必须携带param请求参数
“!param”匹配请求必须不能携带param请求参数
“param=value”匹配请求必须携带param请求参数且值必须为value
“param!=value”匹配请求可以不携带param请求参数,如果携带值一定不能是value
<!--在Thymeleaf使用(name=value,name=value..)的方式发起请求携带参数,也可以直接使用?传参的方式,但IDEA会报错-->
<a th:href="@{/test(username='admin',password=123456)">测试@RequestMapping的params属性-->/test</a><br>
@RequestMapping(
        value = {"/testRequestMapping", "/test"}
        ,method = {RequestMethod.GET, RequestMethod.POST}
    	// 要求请求参数必须携带username请求参数和password请求参数并且它的值不等于123456
        ,params = {"username","password!=123456"}
)
public String testRequestMapping(){
    return "success";
}

注解的headers属性(了解)

HTTP请求协议GET请求的具体报文

GET /servlet05/getServlet?username=lucy&userpwd=1111 HTTP/1.1                           #请求行
Host: localhost:8080                                                                    #请求头
Connection: keep-alive
sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
// 谷歌
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
// 火狐
User-Agent	Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
// Referer具体的来源页面,从a跳转到b,b就是来源页面,直接访问的没有来源页面(防盗链)
Referer: http://localhost:8080/servlet05/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
                                                                                        #空白行
                                                                                        #请求体(在Query String parameters里面)

headers的属性(String类型的数组)指定标识的控制器方法可以处理请求的请求头参数条件不区分大小写(是否携带请求头参数,请求头参数的值是否相同)

  • 即使请求满足注解的value属性method属性,但是只要请求头不匹配就会报404错误(资源未找到)
属性作用
“header”匹配的请求必须携带header请求头信息
“!header”匹配的请求必须不能携带header请求头信息
“header=value”匹配的请求必须携带header请求头信息且值必须是value
“header!=value”匹配请求可以不携带header请求参数,如果携带值值一定不能是value
@RequestMapping(
    value="/testParamsAndHeaders()",
    headers={"User-Agent=Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"}
)
public String handle04(){
    // 火狐能访问但谷歌不能访问 
    return "success";
}

@RequestMapping(
            value = "/testParamsAndHeaders",
            params = {"username","password!=123456"},
    		// 访问的请求路径必须有来源页面(只能通过跳转的方式访问,不能直接访问)
            headers = {"referer"}
    )
public String testParamsAndHeaders(){
    return "success";
}

consumes和produces属性

consumes: 只接受内容类型是哪种的请求,规定请求头中的Content-Type

produces: 告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;charset=utf-8

value属性设置路径的风格

ant风格的URL

Ant风格的请求路径支持3种匹配符进行模糊匹配,在模糊和精确多个匹配的匹配情况下精确优先,匹配的时候请求路径中不能使用特殊符号如?/

匹配符作用举例
匹配任意的单个字符,不写或者写多个都不行/ant?可以匹配/ant1等
*匹配任意的0个或多个字符以及一层路径, 但是没有 ? 精确/ant*可以匹配/ant01
**匹配任意的一层或多层目录(包括零层),使用时前后不能有字符,只能使用/xxx/**/xxx的方式/ant/**可以匹配/ant/01
// 精确匹配
@RequestMapping("/antTest01")
public String antTest01(){
    return "success";
}	

// 匹配一个字符,0个多个都不行
@RequestMapping("/antTest0?")
public String antTest02(){
    return "success";
}

// 匹配任意多个字符,0个或者多个
@RequestMapping("/antTest0*")
public String antTest03(){
    return "success";
}

// 匹配一层路径
@RequestMapping("/a/*/antTest01")
public String antTest04(){
    return "success";
}

// 匹配多层路径
@RequestMapping("/a/**/antTest01")
public String antTest05(){
    return "success";
}

@PathVariable注解

请求路径中携带请求参数的两种方式

  • 使用查询字符串携带数据(传统方式): /deleteUser?id=1
  • 使用路径的方式携带数据(Rest风格): /user/delete/1

@RequestMapping注解映射的请求路径中使用{变量名}占位,然后在控制器方法形参上使用@PathVariable("变量名")获取路径上占位符的值并赋值给形参

  • 使用占位符既可以匹配到正确的请求路径,也可以在控制器方法的形参上获取占位符的值即请求参数的值
  • 浏览器地址栏上的请求路径和占位符是一一对应的关系(多层路径对应多个占位符),发起请求时要求必须为占位符赋值否则报404错误
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>
@RequestMapping("/testRest/{id}/{username}")
// 如果控制器方法形参的变量名和路径占位符中的变量名相同,@PathVariable注解的value属性值可以省略
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
    // id:1,username:admin
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值