专栏首页程序猿的大杂烩@RequestMapping与@RequestParam注解

@RequestMapping与@RequestParam注解

@RequestMapping注解

@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。 该注解不仅可以用于方法上,还可以用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,例如可以加个虚拟目录什么的。

代码示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping("/test.do")
    public void method(){
        System.out.println("This is a test output");
    }
}

此时,需要访问到该控制器中的method方法的话,就需要加上 /test 这个虚拟目录,例如:

http://localhost:8090/test/test.do

接下来简单介绍@RequestMapping注解中的属性:

1.value与path属性,这两个属性是一样的,用于指定HTTP请求资源(URI)的实际映射地址,当不指定具体的属性值时,默认是给该属性传递值,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping(value = "/value.do")
    public void value(){
        System.out.println("value");
    }

    @RequestMapping(path = "/path.do")
    public void path(){
        System.out.println("path");
    }

    @RequestMapping("/method.do")
    public void method(){
        System.out.println("method");
    }
}

此时,可以访问以下几个地址:

http://localhost:8090/test/value.do http://localhost:8090/test/path.do http://localhost:8090/test/method.do

这两个属性都可以配置多个URI地址,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping(value = {"","/view.do","index*","/**/jsp.do","/value.do"})
    public void value(){
        System.out.println("value");
    }
}

2.consumes属性,这个属性指定处理何种请求的提交内容类型(Content-Type),例如application/json, text/html;等,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    // 只处理Content-Type的值为application/json的请求
    @RequestMapping(value = "json.do", consumes = "application/json")
    public void json(){
        System.out.println("application/json");
    }

    // 只处理Content-Type的值为text/html的请求
    @RequestMapping(path = "/xml.do", consumes = "text/html")
    public void xml() {
        System.out.println("text/html");
    }
}

我们可以通过Postman来进行测试:

控制台打印结果:

application/json
text/html

3.produces属性,该属性用于指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    // 该方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;
    @RequestMapping(value = "json.do", produces = "application/json")
    public void json(){
        System.out.println("application/json");
    }

    // 该方法仅处理request请求中Accept头中包含了"text/xml"的请求,同时暗示了返回的内容类型为text/xml;
    @RequestMapping(path = "/xml.do", produces = "text/html")
    public void xml() {
        System.out.println("text/html");
    }
}

同样可以使用Postman进行测试:

控制台打印结果:

application/json
text/html

4.method属性,从名称就可以看出这个属性用于指定请求的method类型, 例如GET、POST、PUT、DELETE等,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping(value = "get.do", method = RequestMethod.GET)
    public void get() {
        System.out.println("get");
    }

    @RequestMapping(value = "post.do", method = RequestMethod.POST)
    public void post() {
        System.out.println("post");
    }

    @RequestMapping(value = "delete.do", method = RequestMethod.DELETE)
    public void delete() {
        System.out.println("delete");
    }

    @RequestMapping(value = "put.do", method = RequestMethod.PUT)
    public void put() {
        System.out.println("put");
    }

    @RequestMapping(value = "patch.do", method = RequestMethod.PATCH)
    public void patch() {
        System.out.println("patch");
    }
}

5.params属性,该属性用于指定request里某些参数为某个特定的值时,才让该方法处理,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    // 当user参数为test时执行这个方法
    @RequestMapping(value = "test.do", params = "user=test")
    public void user(String user) {
        System.out.println(user);
    }

    // 当user参数为test以及alias参数为test时执行这个方法
    @RequestMapping(value = "test.do", params = {"user=test","alias=test"})
    public void userAndAlias(String user, String alias) {
        System.out.println(user);
        System.out.println(alias);
    }
}

注:在SpringMVC中,会自动将request中的参数传递到对应的方法参数上。

6.headers属性,该属性指定request中必须包含某些指定的header值,才能让该方法处理请求,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping(value = "test.do", headers = "Referer=http://www.xxx.com/")
    public void test() {
        System.out.println("test");
    }
}

@RequestParam注解

@RequestParam注解比较简单,它用于将请求参数区数据映射到功能处理方法的参数上,自SpringMVC4.2之后,@RequestParam注解内部有4个参数:

  • String name
  • String value
  • boolean required
  • String defaultValue

1.name与value属性,其中name和value分别是URL参数的名称,即二者没区别,我个人比较喜欢用name,因为在HTML的表单中我们都是用name属性来设置URL参数名称的,所以在注解上也使用name这个属性的话,会更直观一些。示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping("test.do")
    // 指定将username参数的值传递到该方法的name参数上
    public void test(@RequestParam(name = "username") String name) {
        System.out.println(name);
    }

    @RequestMapping("user.do")
    // 指定将username参数的值传递到该方法的user参数上,alias参数的值则传递到该方法的a参数上
    public void userAndAlias(@RequestParam(name = "username")String user, @RequestParam(name = "alias")String a) {
        System.out.println(user);
        System.out.println(a);
    }
}

2.required属性,该属性用于指定某个参数是否是必须的,默认值为true,表示请求中一定要有相应的参数,否则将报404错误码,示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping("test.do")
    // 指定username参数是必须的,如果url上没有的话就会报错
    public void test(@RequestParam(name = "username", required = true) String name) {
        System.out.println(name);
    }

    @RequestMapping("user.do")
    // 指定username与alias参数不是必须的,即便url上没有也不会报错
    public void userAndAlias(@RequestParam(name = "username", required = false) String user, @RequestParam(name = "alias", required = false) String a) {
        System.out.println(user);
        System.out.println(a);
    }
}

3.defaultValue属性,该属性用于指定参数的默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。示例:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/test")
public class Test {

    @RequestMapping("test.do")
    // url上没有username参数时,给它设置一个默认值为nothing
    public void test(@RequestParam(name = "username", defaultValue = "nothing") String name) {
        System.out.println(name);
    }

    @RequestMapping("user.do")
    // url上没有username以及alias参数时,给它设置一个默认值为nothing
    public void userAndAlias(@RequestParam(name = "username", defaultValue = "nothing") String user, @RequestParam(name = "alias", defaultValue = "nothing") String a) {
        System.out.println(user);
        System.out.println(a);
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mybatis-Generator插件的使用与Spring集成Mybatis的配置

    Mybatis-Generator是一个用于自动生成dao层接口、pojo以及mapper xml的一个Mybatis插件,该插件有三种用法:命令行运行、Ecl...

    端碗吹水
  • SpringMVC中用于绑定请求数据的注解以及配置视图解析器

    在上一篇文章中我们简单介绍了@RequestMapping与@RequestParam注解,知道了如何去配置地址映射,本篇则介绍一些用于处理request数据的...

    端碗吹水
  • 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory),是23种设计模式之一。DP中是这么定义抽象工厂模式的:

    端碗吹水
  • 爬虫架构|如何设计一款类“即刻”信息订阅推送的爬虫架构(一)

    黄小怪
  • 快速创建SpringBoot+SSM解析

    此处使用IDEA快速搭建SpringBoot应用,首先用SpringBoot搭建WEB工程:

    Dream城堡
  • Spring Boot使用Redis消息队列

    十毛
  • Spring boot 整合dynamic实现多数据源

    Jacob丶
  • 详细介绍SpringBoot整合SpringSecurity

      本文我们来详细给小伙伴们介绍下SpringBoot整合SpringSecurity的过程,用到的技术为:SpringBoot2.2.1+SpringSecu...

    用户4919348
  • 微信原创新规将影响所有自媒体,做号者沉默、抄袭者流泪

    昨晚,微信公众平台公布的一个“小调整”在自媒体圈中炸开了锅,这个调整就是:微信公众账号无授权转载,不能再显示全文,读者要看全文,必须跳转到原公众账号的图文页面。...

    罗超频道
  • Golang高效实践之泛谈篇

    我博客之前的Golang高效实践系列博客中已经系统的介绍了Golang的一些高效实践建议,例如:《Golang高效实践之interface、reflection...

    用户2937493

扫码关注云+社区

领取腾讯云代金券