请求参数
当有多个请求参数时,使用键值对都是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&name=zs</a><br>
<a href="${pageContext.request.contextPath}/test4?id=1&name=zs">/test4?id=1&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,因为这些类型参数是该包中的类
在方法的参数列表中定义HttpServletRequest、HttpServletResponse、HttpSession类型的参数,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;
}
}

Comments NOTHING