03-请求参数

nobility 发布于 2022-10-03 05-SpringMVC 1529 次阅读


请求参数

当有多个请求参数时,使用键值对都是String类型的Map进行接收,即可自动将其封装成Map对象

queryString请求参数

作用与Get请求,当请求参数与方法参数数据类型不一样时,SpringMVC会自动转化,数据类型校验应该在前端进行,否则可能会出现类型转化异常的400客户端错误

简单参数

  • 请求参数与方法的参数一一对应即可
  • 若该参数有多个值,可使用List集合进行接收
  • 若请求参数与方法参数不能一一对应时,可使用@RequestParam注解进行对应,若此参数不是必须的,就将该注解的required设置为fasle
package com;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class Main {
  @GetMapping("/test1")
  @ResponseBody
  public String test1(Integer id) {  //请求参数与方法参数一一对应,数据类型自动转化
    return "id: " + id;
  }

  @GetMapping("/test2")
  @ResponseBody
  public String test2(@RequestParam("abc") String id) {
    //使用@RequestParam注解手动对应,默认是必须参数,未传入参数时会报错
    return "abc: " + id;
  }

  @GetMapping("/test3")
  @ResponseBody
  public String test3(@RequestParam(value = "abc", required = false) String id) {
    //使用@RequestParam注解手动对应,可设置非必须参数,未传入参数时该参数值为null,
    return "abc: " + id;
  }
}

使用下面JSP页面进行测试

<a href="${pageContext.request.contextPath}/test1?id=1">/test1?id=1</a><br>
<a href="${pageContext.request.contextPath}/test2?abc=1">/test2?abc=1</a><br>
<a href="${pageContext.request.contextPath}/test3">/test3</a><br>

对象参数

  • 对于方法参数是复杂类型时,请求参数与对象属性一一对应即可,对象属性还是对象时支持级联方式进行对应(强制要求,无法使用@RequestParam注解)
  • 若方法参数既有复杂数据类型又有简单数据类型,并且还有冲突的情况下,SpringMVC会同时注入两个值
  • 该对象也可以是Map数据结构,会依次解析成Map中的键值对
package com;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

class Student {
  private String id;
  private String name;
  //setter getter toString 省略
}

@Controller
public class Main {

  @GetMapping("/test1")
  @ResponseBody
  public String test1(Student student) {  //请求参数与对象属性一一对应
    return "student: " + student;
  }

  @GetMapping("/test2")
  @ResponseBody
  public String test2(Student student, String id) {  //冲突情况下,同时注入两个值
    return "student: " + student + " | id: " + id;
  }
}

使用下面JSP页面进行测试

<a href="${pageContext.request.contextPath}/test3?id=1&name=zs">/test3?id=1&amp;name=zs</a><br>
<a href="${pageContext.request.contextPath}/test4?id=1&name=zs">/test4?id=1&amp;name=zs</a>

path请求参数

@Controller
  public class Main {  
    @GetMapping("/test/{id}")  //使用花括号包裹路径请求参数
    @ResponseBody
    public String test(@PathVariable("id") Integer id) {  //使用@PathVariable注解对应路径请求参数
      return "id: " + id;
    }
}

使用下面JSP页面进行测试

<a href="${pageContext.request.contextPath}/test/1">/test/1</a>

queryBody请求参数

请使用至少2.9.x版本,因为之前的版本与MySQL同时使用时存在很严重的安全隐患

作用与Post请求,为了将JSON数据转化为Java对象,首先需要引入JSON序列化包jackson-databind,之后不需要任何配置,因为Spring全局配置文件中配置过<mvc:annotation-driven/>注解开发模式,由SpringMVC自动创建该类中的转换器对象(该包转换器类实现了HttpMessageConverter接口,转化返回值类型),所以就会自动转化

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>x.x.x</version>
</dependency>

参数上使用@RequestBody注解,该组件会自动将JSON格式字符串序列化成Java对象

package work.nobility.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Map;

class User {
    private Integer id;
    //setter getter toString 省略
}
@Controller
public class Main {
    @PostMapping("/test1")
    @ResponseBody
    public String test1(@RequestBody User user) {
        return user.toString();
    }
    @PostMapping("/test2")
    @ResponseBody
    public String test2(@RequestBody Map<String,Object> map) {
        return map.toString();
    }
}

Http请求元信息

@Controller
public class Main {
  @GetMapping("/test1")
  @ResponseBody
  public String test(@RequestHeader("User-Agent") String userAgent) {  //使用@RequestHeader注解获取对应请求头信息
    return "userAgent: " + userAgent;
  }
  
  @GetMapping("/test2")
  @ResponseBody
  public String test(@CookieValue("Idea-efd34b6e") Cookie cookie) {  //使用@CookieValue注解对应路Cookie对象,这里使用的是开发工具自带的Cookie
    return "cookie: " + cookie.getValue();
  }
}

使用下面JSP页面进行测试

<a href="${pageContext.request.contextPath}/test1">/test1</a><br>
<a href="${pageContext.request.contextPath}/test2">/test2</a>

使用ServletAPI

若是Maven项目,需要引入javax.servlet-api包,注意要将依赖范围设置为provided,因为这些类型参数是该包中的类

在方法的参数列表中定义HttpServletRequestHttpServletResponseHttpSession类型的参数,SpringMVC会根据类型自动注入这些参数,直接使用即可

对于请求转发可使用@RequestAttribute注解快速获取

@Controller
public class Main {
  @GetMapping("/test1")
  @ResponseBody
  public String test(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
    return "hello world";
  }

  @GetMapping("/test2")
  public String test2(HttpServletRequest request) {
    request.setAttribute("message", "hello world");  //设置请求参数
    return "/test3";  //未加@ResponseBody注解,会进行请求转发到test3地址上
  }

  @GetMapping("/test3")
  @ResponseBody
  public String test3(@RequestAttribute("message") String message) {
    return "test3: " + message;
  }
}
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2022-10-03