目录
1.Controller返回JSON数据
-
Jackson应该是目前比较好的json解析工具了
-
当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等
-
我们这里使用Jackson,使用它需要导入它的jar包
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.2</version> </dependency>
-
配置web.xml(配置dispatcherservlet和过滤器),固定的配置,直接拷贝即可
<?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"> <!--DispatcherServlet注册--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通过初始化指定springMVC配置文件的位置,进行关联--> <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>DispatcherServlet</servlet-name> <!--拦截所有请求--> <url-pattern>/</url-pattern> </servlet-mapping> <!--springMVC提供的字符乱码过滤器--> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/</url-pattern> </filter-mapping> </web-app>
-
创建实体类
package com.thhh.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private int age; }
-
创建controller 【先尝试直接返回对象看效果】
package com.thhh.controller; import com.thhh.pojo.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class UserController { @RequestMapping("u/j") @ResponseBody //使用了这个注解,返回的东西不会走视图解析器,而是直接返回一个字符串给前端 public String json(){ User user = new User(1,"张三",18); return user.toString(); } }
1.测试对象数据通过JSON格式返回
package com.thhh.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.thhh.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("u/j")
@ResponseBody //使用了这个注解,返回的东西不会走视图解析器,而是直接返回一个字符串给前端
public String json() throws JsonProcessingException {
//jackson中的objectMapper类
ObjectMapper mapper = new ObjectMapper();//获取工具对象
User user = new User(1,"张三",18);
String str = mapper.writeValueAsString(user);//调用方法将对象转为JSON字符串
return str;
}
}
- 解决乱码问题
我们可以通过注解 @RequestMapping的produces属性来解决@RequestMapping(path = "/u/j",produces = "text/plain;charset=UTF-8")
- 但是,每返回一个JSON数据我们就需要配置一次,显然还是很麻烦,所以springMVC也为我们提供了一个一劳永逸的方法:在spring容器中添加以下配置,但是注意,这个配置只能解决我们使用jackson处理json数据时的乱码,当我们使用其他的工具,像Alibaba的fastjson的时候,这个配置就没用
<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>
2.测试集合数据通过JSON格式返回
@RequestMapping("/u/j2")
@ResponseBody //使用了这个注解,返回的东西不会走视图解析器,而是直接返回一个字符串给前端
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();//获取工具对象
User user1 = new User(1,"张三1",18);
User user2 = new User(2,"张三2",18);
User user3 = new User(3,"张三3",18);
User user4 = new User(4,"张三4",18);
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
String str = mapper.writeValueAsString(list);//调用方法将对象转为JSON字符串
return str;
}
- ‘[ ]’ 表示JSON中的一个集合
- { } 表示JSON中的一个对象
3.测试时间数据通过JSON格式返回
@RequestMapping("/u/j3")
public String json3() throws JsonProcessingException {
Date date = new Date();//获取时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//控制输出格式
return new ObjectMapper().writeValueAsString(sdf.format(date));//使用jackson返回JSON数据格式的时间字符串到前端显示
}
从输出结果我们又验证了JSON数据格式就是一个字符串
2.小结使用Jackson的步骤
-
导入maven依赖
-
在spring容器中配置乱码处理问题
-
在对应的controller类的方法上添加注解@ResponseBody或在controller类上添加注解@RestController
-
在对应的controller的方法中new一个ObjectMapper对象mapper
-
调用mapper.writeValueAsString(对象的引用),将对象转为一个字符串
-
最后将字符串返回出去即可
- 在对应的controller的方法上添加注解@ResponseBody,让这个方法返回值不走视图解析器,直接返回一个字符串;除了这个注解外,我们还可以使用注解@RestController代替类上的@Controller注解,它的作用就是设置这个controller类中的所有的处理方法返回的值都不走视图解析器,而是直接返回一个字符串
- 在前后端分离的情况下,我们一般就不会走视图解析器,因为视图是前端人员开发的,我们开发的时候拿不到前端页面,所以在前后端分离的情况下,我们一般都是使用@RestController返回一个JSON字符串,这就是一个数据接口,前端直接拿去用就行了
- 而上面说的@ResponseBody它是配合@Controller来使用的,用于controller类中的某些方法返回值不走视图解析器
3.封装JSON工具类
package com.thhh.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
public class JsonUtil {
public static String getJson(Object object,String dateFormat){
ObjectMapper mapper = new ObjectMapper();
//设置mapper存储的日期数据不使用时间戳格式存储时间数据
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
//自定义时间格式
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
mapper.setDateFormat(sdf);//设置mapper中的时间格式为我们指定的格式
try {
return mapper.writeValueAsString(object);//返回转换后的JSON数据格式
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
上面这个工具类就对传入时间数据转JSON数据格式进行了封装,我们可以测试一下
@RequestMapping("/u/j3")
public String json3() throws JsonProcessingException {
Date date = new Date();//获取时间
return JsonUtil.getJson(date,"yyyy-MM-dd HH:mm:ss");
}
但是我们大多数情况下也不是只传递日期数据的,还可能传递其他的数据需要将它们转为JSON数据格式传到前端进行解析,那么此时我们就可以对我们的工具类实现重载
public static String getJson(Object object){
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
直接复用上面的方法即可,这样的思想很重要,在JDK源码中很常见
测试效果
对比使用工具类之前和之后,我们可以发现有了很大的差别,抽象出工具类大大简化了我们的代码,也提高了代码的复用,并且在重载的时候我们尽量调用原来就有的方法,通过修改传入的参数来实现不同的需求