文章目录
- 请求与响应
- 请求映射路径
- 请求传参
- 传递普通参数
- 传递实体类参数
- 传递数组参数
- 传递集合参数
- 传递JSON参数
- 传递日期参数
- 响应数据
请求与响应
请求映射路径
请求映射路径是通过注解: @RequestMapping
类型:方法注解, 类注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
属性: value(默认), 请求访问路径,或访问路径前缀
// 当前控制器添加@ResponseBody注解
@ResponseBody
@RequestMapping("/save")
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
// 当前类添加注解, 设置请求访问路径
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save() {
System.out.println("book save...");
return "{'module': 'book save'}";
}
}
请求传参
传递普通参数
GET请求传递普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
地址参数名和形参变量名相同:
示例请求: http://localhost:8080/commonParam?name=chenyq&age=18
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name, int age) {
System.out.println("普通参数传递 name ===> " + name);
System.out.println("普通参数传递 age ===> " + age);
return "{'module': 'common param'}";
}
}
post请求传递普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name, int age) {
System.out.println("普通参数传递 name ===> " + name);
System.out.println("普通参数传递 age ===> " + age);
return "{'module': 'common param'}";
}
}
当请求传递的参数名和形参变量名不一致时, 我们也可以使用@RequestParam注解绑定请求参数与处理器方法形参间的关系
例如url地址传递参数名是name, 形参变量名使用username, 我们可以使用注解将name和username绑定起来
@RequestParam注解参数
- required:是否为必传参数
- defaultValue:参数默认值
示例请求: http://localhost:8080/commonParam?name=chenyq&age=18
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
// @RequestParam注解绑定地址参数名
public String commonParam(@RequestParam("name") String username, int age) {
System.out.println("普通参数传递 name ===> " + username);
System.out.println("普通参数传递 age ===> " + age);
return "{'module': 'common param'}";
}
}
Post请求中文乱码处理
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
// post请求乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
传递实体类参数
POJO参数:请求的参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
User实体类
public class User {
private String name;
private int age;
}
需要保证传递参数的变量名和对象属性名保持一致
示例请求: http://localhost:8080/pojoParam?name=chenyq&age=19
@Controller
public class UserController {
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user) {
System.out.println("pojo参数传递 user ===>" + user);
return "{'module': 'pojo param'}";
}
}
嵌套POJO参数:POJO对象中包含POJO对象
User实体类中嵌套了Address实体类
public class User {
private String name;
private int age;
private Address address;
}
Address实体类
public class Address {
private String province;
private String city;
}
嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
方法中无变化, 通过实体类参数依然可以接收
示例请求: http://localhost:8080/pojoParam?name=chenyq&age=19&address.province=chongqing&address.city=chongqing
@Controller
public class UserController {
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user) {
System.out.println("pojo嵌套参数传递 user ===>" + user);
return "{'module': 'pojo param'}";
}
}
传递数组参数
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数
例如接收用户有哪些爱好: 请求地址中多个参数的变量名都使用同一个数组名即可接收
示例请求: http://localhost:8080/springmvc_03_request/arrayParam?likes=game&likes=music
例如参数1likes, 参数2likes, 与形参的数组名likes一致即可接收
@Controller
public class UserController {
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes) {
System.out.println("数组参数传递 likes ===>" + Arrays.toString(likes));
return "{'module': 'array param'}";
}
}
传递集合参数
集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
传递集合参数需要使用@RequestParam注解绑定关系
示例请求: http://localhost:8080/listParam?likes=aaa&likes=bbb
@Controller
public class UserController {
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes) {
System.out.println("集合参数传递 likes ===>" + likes);
return "{'module': 'list param'}";
}
}
传递JSON参数
接收请求中的JSON数据步骤如下:
添加json数据转换相关坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
开启自动转换json数据的支持
- @EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换
@Configuration
@ComponentScan("com.chenyq.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
设置接收json数据
@RequestBody注解, 将请求中请求体所包含的数据传递给形参参数,此注解一个处理器方法只能使用一次
@Controller
public class UserController {
@RequestMapping("/listJsonParam")
@ResponseBody
public String listJsonParam(@RequestBody List<String> likes) {
System.out.println("集合参数传递 likes ===>" + likes);
return "{'module': 'json list param'}";
}
}
Postman设置发送json数据(请求body中添加json数据)
@RequestBody与@RequestParam区别:
区别:
@RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
@RequestBody用于接收json数据【application/json】
应用:
后期开发中,发送json格式数据为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
传递日期参数
日期类型数据基于系统不同格式也不尽相同
2088-08-18
2088/08/18
08/18/2088
接收形参时,需要使用@DateTimeFormat注解, 根据不同的日期格式设置不同的接收方式
@DateTimeFormat写在控制器方法的形参前面, 通过
属性pattern
日期时间格式字符串, 设定日期时间型数据格式示例请求: http://localhost:8080/dateParam?date=21/09/2022 22:30:00
@Controller
public class UserController {
@RequestMapping("/dateParam")
@ResponseBody
public String dateParam(@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss") Date date) {
System.out.println("date参数传递 date ===> " + date);
return "{'module': 'date param'}";
}
}
响应数据
响应页面(了解)
只需要返回页面名称的字符串
@Controller
public class UserController {
@RequestMapping("/toJumpPage")
public String toJumpPage() {
System.out.println("跳转页面");
return "index.jsp";
}
响应文本数据(了解)
@Controller
public class UserController {
@RequestMapping("/toText")
@ResponseBody
public String toText() {
System.out.println("响应文本数据");
return "response Text";
}
}
响应json数据-实体类对象转json
我们配置的json转换坐标, 会自动将pojo对象转换为json数据
@Controller
public class UserController {
@RequestMapping("/toJson")
@ResponseBody
public User toJsonPojo() {
System.out.println("返回JSON对象数据");
// 创建一个User对象并返回
User user = new User("chenyq", 18);
return user;
}
}
响应json数据-对象集合转json数组
@Controller
public class UserController {
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList() {
System.out.println("返回JSON对象集合数据");
// 创建list集合, 添加User对象并返回
List<User> list = new ArrayList<User>();
User user1 = new User("chenyq", 18);
User user2 = new User("kaisa", 20);
list.add(user1);
list.add(user2);
return list;
}
}
@ResponseBody注解: 设置当前控制器的返回值为响应体, 如果返回值是字符串就返回String, 如果是一个对象, 就转换为JSON再作为响应体