目录
1、SpringMVC的返回JSON数据
2、SpringMVC的获取JSON数据
1、以@RequestBody接收
2、以实体类方式接收
3、以Map接收
4、以List接收
json数据格式回顾:
java转换为json 的过程一般会称为 “序列化”
json转换为java 的过程一般会称为 “反序列化”
Json的属和字符串值 必须要用双引号“” 不能用单引号
java | json |
String | "xxx" |
Integer | 123 |
javaBean\Map User 属性:id 、 name | {"id":1,"name":"xushu"} |
数组、集合: String[] \ List | ["a","b","c"] |
List List | [ {"id":1,"name":"xushu"}, {"id":1,"name":"xushu"}, {"id":1,"name":"xushu"} ] |
User 属性 id name Role role | {"id":1,"name":"xushu","role":{"id":1,"name":"管理员"}} |
User 属性 id name List | {"id":1,"name":"xushu","role":[ {"id":1,"name":"管理员"} {"id":2,"name":"普通员工"} ]} |
1、SpringMVC的返回JSON数据
到目前为止我们编写的所有Controller的方法的返回值都是String类型,但是大家应该都知道,我们有时候数据传递特别是在ajax中,我们返回的数据经常需要使用json,那么如何来保证返回的数据的是json格式呢?
使用@ResponseBody注解
* ·响应json
* 1. 加入jackson依赖
* 2. 将jackson 的jar包加入WEB-INF的lib文件夹
* 3.在对应处理方法上面加上@ResponseBody用于标记该处理方法返回json
* 将@Controller改成@RestController
//@RestController // 相当于控制器类中所有的处理方法都加上了@ResponseBody, 适用于web api
pom.xml
<!--1.加入依赖-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.3</version>
</dependency>
</dependencies>
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="cn.tulingxueyuan"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
JsonController.java
@Controller
public class JsonController {
@ResponseBody
@RequestMapping("/json")
public List<User> json(){
List<User> list = new ArrayList<User>();
list.add(new User(1,"zhangsan",12,"男",new Date(),"1234@qq.com"));
list.add(new User(2,"zhangsan2",12,"男",new Date(),"1234@qq.com"));
list.add(new User(3,"zhangsan3",12,"男",new Date(),"1234@qq.com"));
return list;
}
}
User.java
public class User {
private Integer id;
private String name;
private Integer age;
private String gender;
@JsonFormat( pattern = "yyyy-MM-dd")
private Date birth;
@JsonIgnore
private String email;
public User() {
}
public User(Integer id, String name, Integer age, String gender, Date birth, String email) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.birth = birth;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", birth=" + birth +
", email='" + email + '\'' +
'}';
}
}
同时@ResponseBody可以直接将返回的字符串数据作为响应内容
@Controller
public class OtherController {
@ResponseBody
@RequestMapping("/testResponseBody")
public String testResponseBody(){
return "<h1>success</h1>";
}
}
@JsonIgnore // 当返回javaBean 的json时 会忽略该属性
@JsonFormat(pattern = "yyyy-MM-dd") // 用户转换json时格式化数据 JsonFormat和DateTimeFormat只需要设置一个可以了
2、SpringMVC的获取JSON数据
ajax我们经常用到,传的数据是json数据,json数据又有对象,数组。以下给大家总结了4种常用的获取json方式:
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript">
// 也没加载事件简写方式
$(function(){
$("#btnJson1").click(function(){
$.ajax({
url:"${pageContext.request.contextPath}/json/request01",
method:"post",
data:"张三",
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
$("#btnJson2").click(function(){
var user={'id':'1','name':'张三'}; // 定义js对象
var jsonValue=JSON.stringify(user); // 对象转换为json字符串
console.log(jsonValue)
$.ajax({
url:"${pageContext.request.contextPath}/json/request02",
method:"post",
data:'{"id":"1","name":"张三","birthady":"2019-01-01"}',
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
$("#btnJson3").click(function(){
$.ajax({
url:"${pageContext.request.contextPath}/json/request03",
method:"post",
data:'{"idxx":"1","namexx":"张三","birthadyxx":"2019-01-01"}',
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
$("#btnJson4").click(function(){
var listUser=new Array();
var user1={"id":"1","name":"张三","birthady":"2019-01-01"};
var user2={"id":"2","name":"李四","birthady":"2019-01-01"};
listUser.push(user1)
listUser.push(user2)
$.ajax({
url:"${pageContext.request.contextPath}/json/request04",
method:"put",
//data:'[{"id":"1","name":"张三","birthady":"2019-01-01"},{"id":"2","name":"李四","birthady":"2019-01-01"}]',
data:JSON.stringify(listUser),
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
})
</script>
</head>
<body>
<input type="button" value="发送单个参数的json数据" id="btnJson1"/><br/>
<input type="button" value="发送对象的json数据用javaBean接收" id="btnJson2"/><br/>
<input type="button" value="发送对象的json数据用Map接收" id="btnJson3"/><br/>
<input type="button" value="发送数组对象的json数据用List<User>接收" id="btnJson4"/><br/>
</body>
</html>
* 请求Json接收
* 使用 @RequestBody,提前是一定要保证请求过来的参数数据一定json数据,并且内容类型也必须要是"application/json"
1、以@RequestBody接收
单个参数的json数据
@PostMapping("/json/request01")
@ResponseBody
public User responseJson(@RequestBody String name){
User user = new User(1, "徐庶","12346",new Date());
System.out.println(name);
return user;
}
2、以实体类方式接收
前端传来的是一个json对象时:{ id:1,name:xx},可以用实体类直接进行自动绑定
@PostMapping(value="/json/request02",consumes = "application/json")
@ResponseBody
public User requestJson02(@RequestBody User user){
User user2 = new User(1, "fztx","12346",new Date());
System.out.println(user);
return user2;
}
3、以Map接收
前端传来的是一个json对象时:{ id:1,name:xx},可以用Map来获取
@PostMapping(value="/json/request03",consumes = "application/json")
@ResponseBody
public User requestJson03(@RequestBody Map<String,String> map){
User user2 = new User(1, "fztx","12346",new Date());
System.out.println(map);
return user2;
}
4、以List接收
当前端传来这样一个json数组:[{ id:1,name:xx},{ id:1,name:xx},{ id:1,name:xx},...]时,用List接收
@PostMapping(value="/json/request04",consumes = "application/json")
@ResponseBody
public User requestJson04(@RequestBody List<User> list){
User user2 = new User(1, "fztx","12346",new Date());
System.out.println(list);
return user2;
}