03、SpringMVC进阶:获取请求参数的多种方式

前言

在HTTP请求时,参数传递是及获取,是非常重要的一项功能。

SpringMVC提供了很多种方式,具体采用哪种,可以根据实际需求选择。

这里按照常用级别列出几种。

1. 通过方法形参获取

可以在控制器方法的形参位置,设置当前请求的参数。

当访问映射到该方法时,DispatcherServlet会将请求中的参数赋值给相同名字的形参。

    @RequestMapping(value = {
   
     "getUser"}, method = {
   
     RequestMethod.GET})
    public Object getUser(String username, String password) {
   
     
        return username + password;
    }

以上代码,会将请求中的username及password的值赋值给控制器形参,该方法接受到参数后进行后续逻辑处理。

注意事项:

  • 请求参数和控制器参数名称必须一致
  • 参数很多时,不建议使用此方式,三个以上建议封装为java bean传递

2. 通过POJO类获取

可以将多个请求参数封装为对象,需确保对象的属性和请求参数名一致。

请求时,框架会将请求参数封装到形参对象的属性中。


    @RequestMapping(value = {
   
     "getUser"}, method = {
   
     RequestMethod.GET})
    public Object getUser(User user) {
   
     
        return user;
    }

请求后返回的数据:

{
   
     "username":"1111","password":"afasfsa","age":null,"name":null,"userId":null}

3. 通过HttpServletRequest 获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。

    @RequestMapping(value = {
   
     "getUser"}, method = {
   
     RequestMethod.GET})
    public Object getUser(HttpServletRequest request) {
   
     
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username:" + username + ",password:" + password);
        return "user";
    }

4. 使用@RequestParam注解

@RequestParam主要用于将请求参数中的数据映射到控制层方法的形参。

public @interface RequestParam {
   
     
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

@RequestParam的属性解释:

1、 value
请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。
2、 required
该参数是否为必传项,默认是true。
为ture时,未传递参数会抛出MissingServletRequestParameterException异常。
为false时,未传递参数参数,引用及包装类型的参数获取到的值为null,基本类型比如int,会抛出IllegalStateException异常。
3、 defaultValue
参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。
默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"

以下代码表示,该请求接口接受name和id参数,其中id为必传项,name参数未传递时,将使用默认值。

    @RequestMapping(value = "/test001")
    public Object test001(@RequestParam(required = false,value = "name",defaultValue = "#{systemProperties['java.vm.version']}") String name,@RequestParam(required = true)int id) {
   
     
        return name+id;
    }

5. 使用@RequestHeader

@RequestHeader 是获取请求头中的数据,传递给形参。将请求头信息和控制器方法的形参创建映射关系。

@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam。

以下代码表示将请求头中的“User-Agent”属性值赋值给形参agent。

    @GetMapping("/getHeader")
    public String getRequestHeader(@RequestHeader("User-Agent") String agent) {
   
     
        System.out.println(agent);
        return "success";
    }

6. 使用@CookieValue

@CookieValue是将cookie数据和控制器方法的形参创建映射关系。

@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam。

以下代码表示将Cookie中JSESSIONID参数的值,传递给形参jId

    @GetMapping("/getCookie")
    public String getCookieValue(@CookieValue(value = "JSESSIONID",required = false) String jId) {
   
     
        return jId;
    }

7. 使用@PathVariable

@PathVariable可以使用获取URL占位符中的参数和控制器方法的形参创建映射关系。

@PathVariable注解一共有三个属性:name,value、required,用法同@RequestParam。

以下代码表示将URL中的name及id位置的参数值传递给形参name和id。

    @RequestMapping(value = "/test003/{name}/{id}")
    public Object test003(@PathVariable String name,@PathVariable Integer id) {
   
     
        return "test003";
    }

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: