SpringMVC中的Json交互
1.控制器向前端响应json数据
这种形式在程序中使用最为广泛,也是现在前后端分离项目开发的必选方式。我们以实例的形式来展示一下json的使用。
直接访问index.jsp页面,以ajax异步的形式访问控制器,控制器中返回一个user对象给index.jsp页面。在这里必须注意一个问题,User类要实现序列化接口Serializable。实现这个接口,表示这个类可以是被序列化了。项目搭建,如下所示:
User类
package com.gxy.entity;
import java.io.Serializable;
/**
* @className: PACKAGE_NAME.com.gxy.entity.User
* @description: TODO
* @author: ych
* @create: 2021-06-02 21:31
*/
public class User implements Serializable {
String username;
String userpwd;
int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", userpwd='" + userpwd + '\'' +
", age=" + age +
'}';
}
}
1.添加依赖
我们采用的是阿里的fastjson来转换对象数据成json字符串,在pom.xml文件中添加fastjson的依赖。
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
2.修改配置文件
替换掉SpringMVC默认的信息转换器,在spring-mvc文件中添加如下配置:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!-- 添加支持的数据类型 -->
<property name="supportedMediaTypes">
<list>
<!-- 注意顺序不能反,避免ie出现下载情况 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
3.添加controller代码
在控制器controller中,我们需要把controller的返回值设置为User,添加上注解 @ResponseBody,该注解的作用其实是将Java对象转为json格式的数据。
@RequestMapping("/getUser.do")
@ResponseBody
public User test() {
User user = new User();
user.setUsername("张三");
user.setUserpwd("123");
user.setAge(18);
return user;
}
4.添加前台代码
在index.jsp中,使用ajax向控制器请求数据,直接获取json格式的数据。
<script>
$(function () {
$.ajax({
url:"${pageContext.request.contextPath}/getUser.do",
type:"post",
dataType:"json",
success:function (result) {
console.log(result);
}
})
})
</script>
5.控制台结果
2.前端向控制器响应json数据
在前后端分离的项目中,前端提交的数据也可能是json格式的,我们在前面已经使用 @RequestParam 注解,这个注解只能获取key-value形式的参数,如果要获取json格式中的参数,就需要使用注解 @RequestBody。简单做一个总结,@RequestBody主要用来接收前端传递给后端的json字符串中的数据(请求中的数据)。GET方式无请求体,所以 @RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
在后端的同一个接收方法里,@RequestBody与 @RequestParam()可以同时使用,@RequestBody最多只能有一个,用来接收请求体中的json字符串,而 @RequestParam() 可以有多个,用于接收url中k-v参数的传递。
示例:
package com.gxy.entity;
import java.io.Serializable;
import java.util.Date;
/**
* @className: PACKAGE_NAME.com.gxy.entity.User
* @description: TODO
* @author: ych
* @create: 2021-06-02 21:31
*/
public class User implements Serializable {
int id;
String username;
Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
'}';
}
}
1.添加依赖
在这里使用fastjson完成数据的转换处理,在pom.xml文件中添加fastjson的依赖。
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
2.添加前台代码
在index.jsp中添加上以下的 jquery代码,其中data是我们定义的一个 json对象,这个 json对象中封装了数据,使用ajax把处理之后的json对象提交到控制器controller中。如下所示:
$(function () {
var data = {"username":"张三","userpwd":"123","age":18}
$.ajax({
url:"${pageContext.request.contextPath}/toUser.do",
type:"post",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(data),
success:function (result) {
console.log(result);
}
})
})
3.格式处理
在这个页面的 json对象中有属性是日期对象,如果不做处理,会出现不能解析的问题。我们需要在实体类User 对应的属性上添加注解@JSONField(format=“yyy/MM/dd”)来进行处理,其中format对应的就是解析字符串日期的格式。如下所示:
int id;
String username;
@JSONField(format = "yyyy/MM/dd")
Date birthday;
4.添加controller代码
在controller中,我们定义以下方法类接收json格式的数据,@ReauestBody注解使用在参数之前,可以获取json格式的数据直接封装到user对象中。如下所示:
@RequestMapping("/toUser.do")
@ResponseBody
public User toUser(@RequestBody User user) {
System.out.println("user = " + user);
return user;
}