4.1 概览
4.1.1 简介
? JSON是一种数据交换格式,其实就是一种文本格式。其层次结构清晰,并且易于阅读,能够有效地调高网络传输效率。由一对键值对组成,二者使用冒号分开,各自分别使用引号包裹。花括号表示对象,方括号表示数组。
{"name":"爱情"}
{"tips":"啥也不是"}
4.1.2 JS对JSON的支持
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON演示页面</title>
</head>
<body>
<script>
var user ={
name:"猪大肠",
age:3,
gender:"男"
}
var json = JSON.stringify(user)
console.log("js转换为JSON"+json)
var object = JSON.parse(json)
console.log(object)
</script>
</body>
</html>
提示: 从上面的例子中可以看出来,前端页面对JSON文件是完美支持的,数据可以在JS对象与JSON文件之间进行转化。因此,JSON文件可以作为前后端交互的媒介。值得一提的是,在控制台输出的JSON是文本格式,不可展开。而输出的js对象,则可以展开。
4.2 Jackson的使用
4.2.1 简介
? Jackson是一个将字符串处理为JSON文件的工具,当后端接口需要返回给前端字符串时,便可以通过该工具,将字符传进行格式化。
4.2.2 依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
4.2.3 数据环境
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
User.java:
package com.yun.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String job;
}
4.2.4 使用
JsonController.java:
package com.yun.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yun.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class JsonController {
@RequestMapping("/json")
@ResponseBody
public String getJson() throws Exception{
ObjectMapper mapper = new ObjectMapper();
User user = new User(2,"猪刚烈","天蓬元帅");
String str = mapper.writeValueAsString(user);
return str;
}
}
提示: URL栏访问:http://localhost:8080/SpringMVC_05_json_war_exploded/json。便会返回user对象文本格式的JSON数据。但这里值得注意的是,ObjectMapper 是一个JSON格式处理工具类,可以把文本输出成为Json格式。但是,我们通过toString方法同样可以实现相应的功能。并且 @ResponseBody 注解的作用是,不使当前请求返回给视图解析器,而是单纯返回一个文本。当然除了 @ResponseBody ,我们也可以使用 @RestController 来代替 @Controller 注解。但是,上述返回的json数据,很有可能出现中文乱码。
4.2.5 Jackson数据乱码问题
@RequestMapping(value = "/json", produces = "application/json;charset=utf8")
提示: 此方式,是配置在 控制器 文件中。
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
提示: 此方式,是配置在 springmvc-servlet.xml 文件中。
4.2.6 关于Jackson对于时间的处理
JacksonController.java:
package com.yun.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yun.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.text.SimpleDateFormat;
import java.util.Date;
@Controller
public class JsonController {
@RequestMapping("/jsondate")
@ResponseBody
public String getJsonDate() throws Exception{
ObjectMapper mapper = new ObjectMapper();
Date date = new Date();
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sim.format(date);
str = mapper.writeValueAsString(str);
return str;
}
@RequestMapping("/jsondate1")
@ResponseBody
public String getJsonDate1() throws Exception{
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,true);
Date date = new Date();
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(sim);
String str = mapper.writeValueAsString(date);
return str;
}
}
提示: 上述使用了两种Jackson对时间的支持,如果不使用格式,那么输出的则是时间戳,而不是格式化的时间。所谓时间戳,是指自1970年1月1日 00:00:00 到目前为止的毫秒数。
4.2.7 Jackson工具类
JsonController.java:
package com.yun.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yun.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
@Controller
public class JsonController {
@RequestMapping("/jsonlist")
@ResponseBody
public String getJsonList() throws Exception{
ObjectMapper mapper = new ObjectMapper();
List list = new ArrayList<User>();
User user = new User(2,"猪刚烈","天蓬元帅");
User user1 = new User(2,"猪刚烈","天蓬元帅");
User user2 = new User(2,"猪刚烈","天蓬元帅");
User user3 = new User(2,"猪刚烈","天蓬元帅");
list.add(user);
list.add(user1);
list.add(user2);
list.add(user3);
String str = mapper.writeValueAsString(list);
return str;
}
}
提示: 上面的例子证明了,Jackson可以将集合也转换为json数据,于是,我们可以将该方法抽象成为一个Jackson工具类。
JacksonUtil.java:
package com.yun.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JacksonUtil {
public static String getJson(Object object){
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Object object,String dateFormate){
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
SimpleDateFormat sim = new SimpleDateFormat(dateFormate);
Date date = new Date();
mapper.setDateFormat(sim);
try {
return mapper.writeValueAsString(date);
}catch (Exception e){
return null;
}
}
}
写在最后,如果遇见index.jsp页面可以访问成功,但是控制器死活访问不了的情况,在排除代码问题之后,可以当前项目的war包里是否有lib文件夹,其内是否有相应的jar包。
|