Spring---@RequestMapping注解和它的属性

RequestMapping注解

@RequestMapping注解能将请求和处理请求的控制器方法关联起来,建立映射关系。

在SpringMvc接收到请求后就会来找对应的ReuestMapping注解对比,并处理请求。注意:在使用时要确保RequesstMapping注解里面的值唯一

 

RequestMapping注解加载在类和方法上的不同

注解加载类上时,设置的映射路径请求的初始信息

注解加在方法上时,设置的映射路径请求的具体信息

就是说你如果想访问在方法里的具体信息,就先要具备类上面的初始信息

在下面,如果想访问index,这时访问的路径应该是 /user/ 而不再是 / ,访问login就访问的路径就应该为 /user/login。这样的结构可以用在划分权限上面,在类上面进行划分

@Controller
@RequestMapping("/user")
public class HelloMvc {
​
//    将请求和方法创建映射关系通过 value 属性设置当浏览器请求某一地址【value】时,由下面这个方法处理请求,并指向访问资源或别的
    @RequestMapping("/")
    public String helloIndex(){
//        返回视图名称
        return "index";
    }
​
    @RequestMapping("/target")
    public String getTarget(){
        return "target";
    }
​
    @RequestMapping("/login")
    public String goToLogin(){
        return "login";
    }
​
}

 

 

属性设置的越多匹配的越精确但是不要出现为了精致为了精确而精确,要优雅

RequestMapping注解的value

value属性的值是一个String数组,他能设置多个值,使得多个请求地址指向同一个资源

如果出错,会报 404找不到资源

@RequestMapping(
        value = {"/login","/testlogin"}
)
public String goToLogin(){
    return "login";
}
 

 

RequestMapping注解的Method参数

在@RequestMapping中设置调用属性设置参数时,属性之间要用 , 隔开

method在不进行设置时,使用什么请求都能进行匹配执行。

method是一个RequestMethod【枚举】类型的数组,可以添加多个值,从而进行匹配多中请求形式的请求

如果只设置了一个处理请求方式的参数,在使用其他请求方式进行请求目标资源时,就会出现 Completed 405 METHOD_NOT_ALLOWED这类错误,说明就是请求方式不符合条件。这时可以通过有好的报错页面或跳转转发到其他页面。

设置的越多要符合标准就越多,锁定的资源就越准确

在java文件中

@RequestMapping(
        value = {"/login","/testlogin"},
        method = {RequestMethod.GET,RequestMethod.POST}
)
public String goToLogin(){
    return "login";
}

 

 

@RequestMapping注解的派生注解

对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解【生的儿子,功能更细致】

处理get请求的映射-->@GetMapping

处理post请求的映射-->@PostMapping

处理put请求的映射-->@PutMapping

处理delete请求的映射-->@DeleteMapping

因为浏览器只能发送get或post请求,要是强行给form表单添加其他请求方式就会报请求类型不匹配的错,form表单默认是get请求。由于让匹配put请求没匹配到就会说请求方式 get 不匹配.会报错405

 

@RequestMapping注解的params属性

在参数中value值为

" aaa "则表示必须要有aaa参数

" !aaa "则表示不能有参数aaa

" aaa=123 "则表示参数中必须要有aaa,并且值必须是123

" aaa!=123 "则表示参数中必须要有aaa,但是值不能等于123

如果由不匹配的会报错400

java文件中

@RequestMapping(
        value = {"/testParams"},
        params = {"username", "!password"}
)
public String testParams() {
    return "login";
}

 

 

在html文件中

这两种都行

前一种使用的拼接字符串形式实现get请求

后一种使用的是thymeleaf语法实现请求参数传递,达成get请求

<a th:href="@{/testParams?username='heihei'&password='123123'}">测试params属性</a><br>
<a th:href="@{/testParams(username='heihei',password='123123')}">测试params属性</a><br>
 

 

RequestMapping注解的headers属性

headers参数通过设置请求头信息筛选请求

使用headers属性的方法和params属性的方法一样,可以多个参数进行赋值,在赋值规则上面也一样

在参数中value值为

" aaa "则表示必须要有aaa参数

" !aaa "则表示不能有参数aaa

" aaa=123 "则表示参数中必须要有aaa,并且值必须是123

" aaa!=123 "则表示参数中必须要有aaa,但是值不能等于123

如果设置了请求头信息没有被匹配到,而其他的属性都匹配到了,就会报404错误告诉你找不到资源

 

在java中

@RequestMapping(
        value = {"/testParams"},
        params = {"username", "!password"},
        headers = {"Host=localhost:8081"}
)
public String testParams() {
    return "login";
}

 

 

RquestMapping注解的支持ant风格的路径

1、? 占位符,使用时value = "/aa?a?a?a?/请求路径",每一个?代表一个符号,可以用字母、数字、一些符号代替在请求路径上,例如:/a1a#a&a:a/test,但是不能是中文的符号也不能是 ? 、/

2、* 在路径里添加0到多个字符,跟上面的?一样,不能使用中文符号和/、?。例如:/*dasd/test,在 * 的位置能替代多个或者0个字符。/ aaaaaaaaadasd/test。 *后面的内容是不能变的,变了会报错

3、**在路径里添加0或多层目录,只能单独使用.如果和不同的字符混在一起

/**aa/test

就会被当做两个*处理,所以只能 /**/test,这样使用。在里面能用中文符号、/、?都可以。

 

SpringMvc支持请求路径中用占位符

在RequestMapping的value属性中支持设置占位符【 value = {" /请求路径/{ 参数名 }/..... "} 】,在value的请求路径后面可以建立占位符,接收请求参数,在{}里给参数起名,将参数由平时的拼接字符串形式转换成为路径的形式【/..../.../】,在请求控制器接收到请求后会解析Spring配置文件,通过组件扫描找到对应请求,并将请求后的参数值赋给这里起的参数名,在处理请求的方法中添加对应类型的参数,以@PathVariable( "参数名" )注解指定将哪一个参数值传递给当前处理方法的哪一个参数。这个@PathVariable注解只能在方法参数上应用,源码里他的修饰符【@Target({ElementType.PARAMETER})】,而且SpringMvc获取请求参数的注解比较单一就这一个。

 

在java中

@RequestMapping(value = {"/testPath/{id}/{username}"})
public String testPath(@PathVariable("id")Integer id,@PathVariable("username")String username){
    System.out.println("id = " + id+"username = " + username);
    return "login";
}
 

 

 

 

 

 

posted @ 2021-11-16 23:34  优质水  阅读(515)  评论(0)    收藏  举报