前置文章:
一、Spring MVC-简单使用
零、本文纲要
- 一、请求
1、请求参数
补充:GET请求中文乱码问题
补充:POST请求中文乱码问题
2、不同类型参数传递
补充:@RequestParam注解
3、JSON数据参数
补充:@EnableWebMvc注解
补充:@RequestBody注解
补充:@RequestBody与@RequestParam区别
4、日期类型参数传递
补充:@DateTimeFormat注解
5、类型转换实现原理 - 二、响应
1、基础准备
2、响应页面
3、返回文本数据
4、响应JSON数据
补充:@ResponseBody注解
一、请求
1、请求参数
- ① GET发送单个参数
http://localhost/commonParam?name=test
直接使用参数接收即可,如下:
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name){ // 直接使用参数接收即可
System.out.println("普通参数传递 name ==> "+name);
return "{'module':'commonParam'}";
}
}
- ② GET发送多个参数
http://localhost/commonParam?name=test&age=15
直接使用多个参数接收,如下:
@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':'commonParam'}";
}
}
补充:GET请求中文乱码问题
http://localhost/commonParam?name=测试&age=15
IDEA中的Tomcat插件目前只到Tomcat7,所以存在中文乱码现象。Tomcat8.5以后的版本已经处理了中文乱码的问题。
IDEA中,我们通过修改pom.xml来处理中文乱码问题,添加<uriEncoding>UTF-8</uriEncoding>
,如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port><!--tomcat端口号-->
<path>/</path> <!--虚拟目录-->
<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
</configuration>
</plugin>
</plugins>
</build>
- ③ POST请求发送参数
类型信息格式设置:Content-Type
对应application/x-www-form-urlencoded
。
与GET请求一致,可以直接使用参数接收。
补充:POST请求中文乱码问题
通过配置CharacterEncodingFilter处理,如下:
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
//乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8"); // 设置字符集为 UTF-8
return new Filter[]{filter};
}
}
org.springframework.web.filter.CharacterEncodingFilter
在spring-web包中,因此我们需要添加此相关依赖。实际使用时spring-webmvc
包中包含了spring-web
包,如下:
2、不同类型参数传递
- ① 普通参数
要求:参数名与形参变量名相同,具体案例上面已经呈现。
补充:参数名与形参变量名不同的情形,如下:
http://localhost/commonParamDifferentName?name=测试&age=18
通过@RequestParam注解处理,@RequestParam("name") String userName
,如下:
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){
System.out.println("普通参数传递 userName ==> "+userName);
System.out.println("普通参数传递 age ==> "+age);
return "{'module':'common param different name'}";
}
写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能。
- ② POJO数据类型
基础准备,构造User类,如下:
public class User {
private String name;
private int age;
... ...
}
请求参数与形参对象中的属性对应即可完成参数传递,如下:
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo参数传递 user ==> "+user);
return "{'module':'pojo param'}";
}
- ③ 嵌套POJO数据类型
基础准备,构造User、Address类,如下:
public class Address {
private String province;
private String city;
... ...
}
public class User {
private String name;
private int age;
private Address address;
... ...
}
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数,如下:
请求参数设置好层级关系.png接收参数的代码不变,此处省略。
- ④ 数组类型参数
请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数,如下:
参数key设置一致.png接收代码如下:
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
- ⑤ 集合类型参数
请求发送逻辑不变,与上方一致,此处省略。
接收代码使用集合作为形参,如下:
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合参数传递 likes ==> "+ likes);
return "{'module':'list param'}";
}
参数接收是按照属性填充的,而集合类型的属性(如size、isEmpty等)并不适合接收参数。所以此处使用@RequestParam来完成内容映射。
补充:@RequestParam注解
- ① 作用
该注解用于形参位置,用来绑定请求参数与处理器方法形参间的关系。
- ② 常用属性
required:是否为必传参数(true/false);
defaultValue:参数默认值。
3、JSON数据参数
- ① 常见JSON数据类型
JSON普通数组:(["value1","value2","value3",...])
JSON对象:({key1:value1,key2:value2,...})
JSON对象数组:([{key1:value1,...},{key2:value2,...}])
- ② 基础准备
Ⅰ 引入JSON转换所需依赖,如下:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
Ⅱ 开启SpringMVC注解支持,使用@EnableWebMvc注解,如下:
@Configuration
@ComponentScan("com.stone.controller")
@EnableWebMvc //开启json数据类型自动转换
public class SpringMvcConfig {
}
- ③ 参数接收
Ⅰ JSON普通数组,如下:
//使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("list common(json)参数传递 list ==> "+likes);
return "{'module':'list common for json param'}";
}
Ⅱ JSON对象,如下:
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("pojo(json)参数传递 user ==> "+user);
return "{'module':'pojo for json param'}";
}
Ⅲ JSON对象数组,如下:
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)参数传递 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
补充:@EnableWebMvc注解
作用在配置类上,开启SpringMVC多项辅助功能,此处为JSON数据转换。
补充:@RequestBody注解
作用在形参位置,将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
。
补充:@RequestBody与@RequestParam区别
- ① 区别
Ⅰ @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】;
Ⅱ @RequestBody用于接收JSON数据【application/json】。
- ② 应用
Ⅰ 后期开发中,发送JSON格式数据为主,@RequestBody应用较广;
Ⅱ 如果发送非JSON格式数据,选用@RequestParam接收请求参数。
4、日期类型参数传递
- ① 常见日期类型
2022/4/23、2022-4-23、2022.4.23等等
- ② 参数接收
2022/4/23标准的日期形式,我们直接接收即可,如下:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date)
System.out.println("参数传递 date ==> "+date);
return "{'module':'data param'}";
}
其他特殊的类型我们可以使用@DateTimeFormat注解
,如下:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(@DateTimeFormat(pattern="yyyy-MM-dd") Date date)
System.out.println("参数传递 date ==> "+date);
return "{'module':'data param'}";
}
如果日期带有详细时间,我们同样可以使用该注解,如下:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date)
System.out.println("参数传递 date ==> "+date);
return "{'module':'data param'}";
}
补充:@DateTimeFormat注解
作用在形参位置,设定日期时间型数据格式。
5、类型转换实现原理
- ①
org.springframework.core.convert.converter.Converter
接口
/**
* <S> – the source type
* <T> – the target type
*/
public interface Converter<S, T> {
@Nullable
//该方法就是将从页面上接收的数据(S)转换成我们想要的数据类型(T)返回
T convert(S source);
}
- ② @EnableWebMvc注解
为了各类Converter能够生效,我们需要在SpringMVC的配置类上使用该注解。
二、响应
1、基础准备
- ① 编写page.jsp
<html>
<body>
<h2>Hello Spring MVC!</h2>
</body>
</html>
2、响应页面
不使用@ResponseBody注解,返回String类型,如下:
@Controller
public class UserController {
@RequestMapping("/toJumpPage")
//注意
//1.此处不能添加@ResponseBody,如果加了该注入,会直接将page.jsp当字符串返回前端
//2.方法需要返回String
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
}
3、返回文本数据
使用@ResponseBody注解,如下:
@Controller
public class UserController {
@RequestMapping("/toText")
//注意此处该注解就不能省略,如果省略了,会把response text当前页面名称去查找,如果没有回报404错误
@ResponseBody
public String toText(){
System.out.println("返回纯文本数据");
return "response text";
}
}
4、响应JSON数据
- ① 响应JSON对象
需要使用@ResponseBody注解,另外在配置类上开启@EnableWebMvc注解,如下:
@Controller
public class UserController {
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user = new User();
user.setName("测试");
user.setAge(15);
return user;
}
}
- ② 响应JSON对象集合
@Controller
public class UserController {
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
System.out.println("返回json集合数据");
User user1 = new User();
user1.setName("测试1");
user1.setAge(15);
User user2 = new User();
user2.setName("测试2");
user2.setAge(12);
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
return userList;
}
}
补充:@ResponseBody注解
作用在方法/类上,设置当前控制器返回值作为响应体:
Ⅰ 方法的返回值为字符串,会将其作为文本内容直接响应给前端;
Ⅱ 方法的返回值为对象,会将对象转换成JSON响应给前端。
内部还是通过Converter接口
的实现类完成的,对象转Json数据(POJO -> json),集合转Json数据(Collection -> json)。
三、结尾
以上即为Spring MVC-请求与响应的全部内容,感谢阅读。
网友评论