SpringMVC请求与响应
请求与响应
请求映射路径
请求映射路径是通过注解: @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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic 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请求乱码处理@Overrideprotected 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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic String toText() {System.out.println("响应文本数据");return "response Text";}
}
响应json数据-实体类对象转json
我们配置的json转换坐标, 会自动将pojo对象转换为json数据
@Controller
public class UserController {@RequestMapping("/toJson")@ResponseBodypublic User toJsonPojo() {System.out.println("返回JSON对象数据");// 创建一个User对象并返回User user = new User("chenyq", 18);return user;}
}
响应json数据-对象集合转json数组
@Controller
public class UserController {@RequestMapping("/toJsonList")@ResponseBodypublic 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再作为响应体