@RequestMapping属性设置

RequestMapping属性

  • 控制器中有多个方法对应一个请求的情况

    @Controller
    public class HelloController {
        @RequestMapping("/")
        public String index(){
            return "index";
        }
    
        @RequestMapping("/")
        public String getTarget(){
            return "target";
        }
    }
    

    此时服务器会报500的错误,说明以上这种情况是不可行的

  • RequestMapping注解标识的位置

    此注解可以标识在类上,也可以表示在方法上,实际开发过程中,很容易出现多个方法对应同一个请求名的情况,这个方法可以解决

    @Controller
    @RequestMapping("/hello")
    public class HelloController {
        @RequestMapping("/")
        public String index(){
            return "index";
        }
    	//此时访问target时,需要将路径设置为/hello/target
        @RequestMapping("/target")
        public String getTarget(){
            return "target";
        }
    }
    
  • RequestMapping设置value属性

    @RequestMapping属性设置

    可以看到value属性是一个字符串数组,这也就意味着可以设置多个value属性

    通过以下测试,我们发现两个跳转按钮都可以转发到success页面,这就说明value属性可以设置多个,但只要满足一个即可,相当于一个房间有了多扇门

    @Controller
    public class RequestMappingController {
        @RequestMapping(value = {"/value","/test"})
        public String valueTest(){
            return "success";
        }
    }
    
    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
    <h1>首页</h1>
    <a th:href="@{/test}">跳转--->test</a> <br>
    <a th:href="@{/value}">跳转--->value</a>
    </body>
    </html>
    
  • RequestMapping设置method属性

    method属性是一个RequestMethod数组,也是可以设置多个值,通过请求的请求方式(get或post)匹配请求映射,如果不设置的话默认是不将method作为条件过滤

    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/value","/test"},
            	//设置method属性为get
                method = {RequestMethod.GET}
        )
        public String valueTest(){
            return "success";
        }
    }
    
    <body>
    <h1>首页</h1>
    <a th:href="@{/test}">跳转--->test</a> <br>
    <a th:href="@{/value}">跳转--->value</a> <br>
    <!--get方法-->
    <a th:href="@{/test}">跳转--->test.get</a> <br>
    <!--post方法-->
    <form th:action="@{test}" method="post">
        <input type="submit" value="提交">
    </form>
    </body>
    

    通过以上测试发现get请求可以正常跳转,而表单提交设置为post会报405错误:Request method ‘POST’ not supported

    @RequestMapping属性设置

    我们可以看出method属性还可以设置其他的值,比如delete,put等,常用的请求方式有get,post,put,delete

    但是在表单中method属性只能设置为post或者get,如果设置为其他值,系统会默认他是get请求

    我们还可以使用RequestMapping的派生注解来代替method=?

    • @GetMapping:相当于method=get
    • @PostMapping:相当于method=post
    • @PutMapping:相当于method=put
    • @DeleteMapping:相当于method=delete
  • RequestMapping设置params属性

    params属性值有以下四种写法

    • params:请求参数带有params
    • !params:请求参数不带有params
    • params=value:请求参数params值为value
    • params=!value:请求参数params值不为value
    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/value","/test"},
                params = {"!username"}
        )
        public String valueTest(){
            return "success";
        }
    }
    
    <!--thymeleaf中以下写法相当于 test?username=admin&password=123-->
    <a th:href="@{/test(username=admin,password=123)}">跳转--->test.params</a> <br>
    

    我们设置params属性值不带有username,发起请求时服务器会报400错误:Parameter conditions “!username” not met for actual request parameters: username={admin}, password={123}

    这里需要注意的是如果设置了多个属性,必须同时满足才可以通过

  • RequestMapping设置header属性

    这个一般不是很常用,和params用法类似,我们都知道一次请求,会有请求头、请求体、空行一起发送给服务器,这个head属性设置的是请求头数据

    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/value","/test"},
            	//设置请求头参数为localhost:8081,我们知道tomcat端口为8080
                headers = {"Host=localhost:8081"}
        )
        public String valueTest(){
            return "success";
        }
    }
    

    当条件不符合时,会报404错误

上一篇:浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别


下一篇:spring MVC请求路径设置