springMVC-8-jackson使用
springMVC默认的 Json 解决方案是 Jackson, 所以只需要导入 Jackson 的 jar, 即可使用
<!--Jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
jackson 可以通过以下三个注解来实现对 json 数据的处理:
- @ResponseBody
- @RestController
- @RequestBody
一、@ResponseBody
含义:把这个handler的返回值转成json返回给客户端, 所以此handler不会跳转到相关JSP页面, 如果返回的是字符串, 则不会转成Json, 直接返回
示例:
@ResponseBody
@RequestMapping(value="test")
//这个注解的意思是: 把这个handler的返回值转成json返回给客户端, 所以此handler不会跳转到相关JSP页面, 如果返回的是字符串, 则不会转成Json, 直接返回
public byte[] test(@RequestBody String requestBody){
return "testString";
}
乱码问题:
注意: 此时由于未调用springMVC操作转json, 直接返回中文会有乱码问题, 需要我们设置编码格式, 设置方式为在@RequestMapping注解的参数中指定 value = "/test2", produces = "text/html;charset=utf-8"
@ResponseBody
@RequestMapping(value = "/responseBody",produces = "text/html;charset=utf-8" )
public String testResponseBody(){
return "服务器数据";
}
二、@RestController
当我们在一个Controller中的所有handler前都要加@ResponseBody注解时, 我们可以在这个Controller前面加上@RestController注解, 这样, 其下的所有@ResponseBody注解都不需要加了, 同时, @RestController是一个复合注解, 其中集成了@Controller, 所以@Controller注解也可以省略,
@RestController
public class TestControl {
private EmployeeDao employeeDao;
@Autowired
public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
private DepartmentDao departmentDao;
@Autowired
public void setDepartmentDao(DepartmentDao departmentDao) {
this.departmentDao = departmentDao;
}
//--------------------------------------------------//
//测试requestBody
@RequestMapping(value ="/testRequestBody",produces = "text/html;charset=utf-8")
public Collection<Employee> getEmployee(){
return employeeDao.getAll();
}
}
三、@RequestBody
@RequestBody 注解可以用来接收请求的 json 数据
示例:
index.jsp
<button class="btn btn-primary" onclick="send_json();">ajax</button>
<script type="text/javascript">
function send_json() {
//创建要转换成json的对象
var data = {name:"wang"};
//把这个对象转换成json数据
var person = JSON.stringify(data);
//$.ajax()内传入的是一个对象
$.ajax({
//url:"local:8080/testRequestBody
url:"/testRequestBody",
type: "post",
data: person,
dataType:"json",
contentType:"application/json",
success:function (res) {
alert(res);
}
})
}
</script>
control
//测试requestBody
@RequestMapping(value ="/testRequestBody",produces = "text/html;charset=utf-8")
public Collection<Employee> getEmployee(@RequestBody Person person){
System.out.println(person);
return employeeDao.getAll();
}
注意点:
1、我们这里因为转了json,所以之前在@RequestMapping(value = "/responseBody",produces = "text/html;charset=utf-8" )上的produces一定要删掉,不然就会因为不是json数据,客户端姐接受不了,而报406的错误

2、客户端传入的json数据不是一定要和pojo种的属性名一致
jsp中:
var data = {personName:"wang",personAge:"11"};
pojo
private String name;
private Integer age;
四、json的进阶操作
我们可以添加一些 person的注解来处理 Jackson 返回的 json 数据.
修改pojo
@Repository
public class Person {
private String name;
private Integer age;
private Date date;
省略。。。。
}
control
//测试requestBody
@RequestMapping(value ="/testRequestBody")
public Person getEmployee(@RequestBody Person person){
System.out.println(person);
//给jsp传一个带时间的数据,观察在jsp页面会怎么处理
Person newPerson = new Person("zuo", 56, new Date());
System.out.println("-------->>"+newPerson);
return newPerson;
}
会发现
客户端:

服务端:

1、@JsonFormat
用户更改输出的 Date 类型数据的格式
@Repository
public class Person {
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
省略。。。。
}
客户端:

服务端:(可见这种格式化是在实例化对象的时候就会进行的)

访问结果:(日期已显示规范格式, 但默认时区非东八区)
修改
@Repository
public class Person {
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
省略。。。。
}
访问结果:(东八区时间)

2、@JsonIgnore
添加了该属性的值将不会出现在返回的 json 数据中.
@Repository
public class Person {
private String name;
@JsonIgnore
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
省略。。。
}
客户端:

服务端:

会发现:
传过来的json造好的实例化对象也没有给age注入age属性,结论:json数据转实例化对象和实例化对象转json时都会把@JsonIgnore注解的属性给忽略掉
3、@JsonProperty
默认情况下, json 中的 key 值和类中的属性名是相同的, 此注解用来重命名.
主要针对json转成pojo实例的过程
@Repository
public class Person {
private String name;
@JsonProperty(value = "AGE")
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
...
}
传出的数据age属性变成了AGE

4、@JsonSerialize
为展示的数据添加修饰器, 修饰器可自定义
可以理解为在json转成pojo实例的过程中,对一个特定的数据进行自定义的处理
创建 MySerializer.java:(用于将数据进行四舍五入并返回处理后的值)
//要增对哪个数据,就把他的类型写到这个继承类的泛型中
public class Myseralizer extends JsonSerializer<Double>{
//在这个重写方法中处理数据
//入参的Double value即为json中的数据,输出之后就会被用来创建实例化对象
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
//四舍五入的操作
String num = BigDecimal.valueOf(value).setScale(2,BigDecimal.ROUND_HALF_UP).toString();
//用入参JsonGenerator gen进行输出
//用gen的好处:可以选择不同的方法,输出不同类型的数据
gen.writeNumber(num);
}
}
在pojp中配置这个修饰器
@Repository
public class Person {
private String name;
@JsonProperty(value = "AGE")
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
@JsonSerialize(using = Myseralizer.class)
private Double salary;
}
control创建实例化对象给客户端也修改一下
//测试requestBody
@RequestMapping(value ="/testRequestBody")
public Person getEmployee(@RequestBody Person person){
System.out.println(person);
//给jsp传一个带时间的数据,观察在jsp页面会怎么处理
Person newPerson = new Person("zuo", 56, new Date(),100000.873);
System.out.println("-------->>"+newPerson);
return newPerson;
}
index.jsp
var data = {name:"wang",age:"11",salary:"100000.873"};
客户端结果:(会发现数据被处理了,说明正常实例化对象数据也会被处理)
f
服务端:(会发现数据被处理了,说明json实例化对象数据也会被处理)
springMVC-8-jackson使用的更多相关文章
- springmvc配置jackson时遇到的一些问题
在没接触springmvc之前我们在servlet中想返回前台json数据时,都是自定义一个JSONObject和JSONArray,然后调用response.getWriter()对象的方法返回js ...
- springMVC中jackson的使用(包含JsonFormat 时间格式)
前台使用ajax,后台 springMVC Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Ja ...
- 关于springmvc 整合jackson报错问题
spring mvc 在整合jackson中报错如下 Context initialization failed org.springframework.beans.factory.BeanCreat ...
- SpringMVC 整合Jackson报错
最近用spring4.x整合Jackson,结果莫名其妙的一直报错,网上收索的结果都是在maven或者gradle的环境下配置依赖条件解决的:但是eclipseIDE环境下的jar包应该是会自动依赖影 ...
- springmvc 使用Jackson的配置
<!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...
- SpringMVC 集成 jackson,日志格式报错:org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from Str ...
- springmvc 使用Jackson框架的配置
<!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...
- SpringMVC学习笔记(二)
一.导航 复杂类型的参数绑定 校验 异常处理 图片上传 json交互 拦截器 二.复杂类型参数绑定 ①.包装类型的pojo参数绑定 使用场景:实现商品查询条件传入. 实现方法:>通过添加Http ...
- maven构建springmvc项目
1.Eclipse中 NEW ->OTHER->Maven->maven project 2.选择项目路径 3.选择项目类型->next->输入groupid和artif ...
- 教你搭建SpringSecurity3框架( 更新中、附源码)
源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...
随机推荐
- 牛客网论坛最具争议的Java面试成神笔记,牛客网下载量已突破十万
程序员内部一直流传这一句话: 面试看牛客 刷题看力扣 牛客网作为国内最牛的程序员面试网站,一直在程序员内部颇负盛名,其中用户更是卧虎藏龙! 有国内一线大厂的企业招聘 还有一些低调的互联网大牛实力就和天 ...
- SpringBoot2 参数管理实践,入参出参与校验
一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...
- selenium css定位元素
CSS 选择器: 常见符号: #表示 id选择器 .表示 class选择器 >表示子元素,层级 一个空格也表示子元素,但是是所有的后代子元素,相当于 xpath 中的相对路径 一.css:属性定 ...
- 彻底解决Spring mvc中时间类型的转换和序列化问题
在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8时间包下的具体类型参数来直接接收.同时还有一系列的序列化 .反序列化问题,在返回前端带时间类型的同样会出 ...
- 小Z的袜子(hose) &&作业 (莫队)
莫队:一种非常优雅的暴力,时间复杂度一般情况下是n*根号n,还是很优秀的. 今天水了三道莫队题,对普通莫队有了些了解 1.莫队l和r为指针,维护当前区间的某些信息,一般可以是当前区间不同权值的个数,( ...
- 浏览器中js怎么将图片下载而不是直接打开
网上找了好多方法都是不能用的,经过试验在Chrome中都是直接打开. 经过自己的摸索,找到了一套能用的解决方案 var database = "data:image/jpg;base64,& ...
- RPM安装MySQL5.7并更改数据目录
RPM安装MySQL5.7并更改数据目录 文末附MySQL完整配置文件 官网地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 注意 ...
- 实例化Class类的5种方法
实例说明 java的数据类型分为两类:基础数据类型和引用数据类型.对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象.它提供了在运行时检查对象属性的方法,这些属性包括 ...
- 什么样的CRM系统适合以客户为中心的企业?
我们不难发现,现代的企业非常依赖CRM系统,这是因为20%的优质客户能够给企业带来80%的利润,而老客户的推荐可以带来60%的客户增长.那么,什么样的CRM系统适合企业?随着信息技术的发展,客户开始拥 ...
- 通过css实现幻灯片效果
html: css: .box { border: 0px solid white; width: 1520px; height: 480px; margin: 0 auto; position: a ...