2024.3.13 Wednesday
接上文【WEEK3】 【DAY2】JSON交互处理第一部分【中文版】
目录
6.4.代码优化
6.4.1.乱码统一解决
- 上一种方法比较麻烦,如果项目中有许多请求则每一个都要添加,可以通过Spring配置统一指定,这样就不用每次都处理乱码了。可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置。
- 修改springmvc-servlet.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">
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="P14.controller"/>
<!--JSON乱码问题配置-->
<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>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
- 此时修改UserController.java至没有解决乱码问题(注释掉以下这行)的版本(便于检查该方法的有效性)
//修正乱码问题
// @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
6.4.2.返回JSON字符串统一解决
- 在类上直接使用
@RestController
,使所有的方法都只返回 json 字符串,不用再在每个子方法处都添加@ResponseBody。在前后端分离开发中,一般都使用 @RestController,十分便捷
package P14.controller;
import P14.project.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
//@Controller//经过视图解析器
@RestController//不经过视图解析器,以下方法只会返回json字符串(作用域很广,故无需写第18行的@ResponseBody)
public class UserController {
//修正乱码问题
// @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
@RequestMapping("/j1")
// @ResponseBody //就不会经过视图解析器,会直接返回一个字符串
public String json1() throws JsonProcessingException {
//使用导入的jackson-databind包中的ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("张三",11,"female");
//将一个值转化为字符串
String str = mapper.writeValueAsString(user);
//由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
return str;
}
}
- 运行结果同上,不多赘述
6.5.测试集合输出
6.5.1.在UserController.java中添加一个新方法json2
@RequestMapping("/j2_set")
public String json2() throws JsonProcessingException {
//使用导入的jackson-databind包中的ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建集合
List<User> userList = new ArrayList<>();
User user1 = new User("张三",11,"female");
User user2 = new User("李四",11,"male");
User user3 = new User("王五",11,"female");
//将user加入集合
userList.add(user1);
userList.add(user2);
userList.add(user3);
//将一个集合转化为字符串
String str = mapper.writeValueAsString(userList);
//返回多个对象
return str; //等效于返回new ObjectMapper().writeValueAsString(userList)
}
6.5.2.运行
http://localhost:8080/springmvc_05_json_war_exploded/j2_set
6.6.输出时间对象
6.6.1.在UserController.java中添加一个新方法json3
@RequestMapping("/j3_time")
public String json3() throws JsonProcessingException {
//使用导入的jackson-databind包中的ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//注意导入的是java.util包
Date date = new Date();
//ObjectMapper得到将时间解析后的默认格式,为timestamp
return mapper.writeValueAsString(date);
}
6.6.2.运行
http://localhost:8080/springmvc_05_json_war_exploded/j3_time
运行得到的一串数字是时间戳,是Jackson 默认的时间转换形式。时间戳指:从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。参考链接:https://tool.lu/timestamp/
6.6.3.更改输出时间的方式
在上述基础上添加一个方法,使输出的时间以自定的方式出现
6.6.3.1.Java解决法
- 新建json4
@RequestMapping("/j4_time")
public String json4() throws JsonProcessingException {
//使用导入的jackson-databind包中的ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//注意导入的是java.util包
Date date = new Date();
//使用自定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//ObjectMapper得到将时间解析后的默认格式,为timestamp
return mapper.writeValueAsString(sdf.format(date));
}
6.6.3.2.ObjectMapper格式化输出
- 新建json5
@RequestMapping("/j5_time")
public String json5() throws JsonProcessingException {
//使用导入的jackson-databind包中的ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//使用ObjectMapper格式化输出
//关闭使用时间戳
mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);
//使用自定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//自定义了新的时间戳使用方式
mapper.setDateFormat(sdf);
//注意导入的是java.util包
Date date = new Date();
//ObjectMapper得到将时间解析后的默认格式,为timestamp
return mapper.writeValueAsString(date);
}
标签:mapper,json,DAY3,6.6,JSON,User,new,WEEK3,ObjectMapper
From: https://blog.csdn.net/2401_83329143/article/details/136695372