在上篇《数据转换&数据格式化&参数校验》的文章中介绍了json处理的底层原理问题,原理只是便于理解,主要的还是如何使用?
写一个前后端分析的页面展示,数据写死
先导入fastjsnjar包
配置web.xml和servlet。xml
写一个pojo()
写一个controller去获取数据库数据
写一个list。html用以接收js获取的后端信息(以后看不到jsp都是HTML,通过js去取值再显示给html)
写一个listpage.js用于法ajax请求去获取数据
访问html下的listHTML
》》》所有的前后端交互都是通过发送数据接受数据实现的,而只有json才能实现数据的交互,所以就要解决对象和json的相互转换问题。
1,jackson:
HttpMessageConverter
这个对象是为了将请求参数转换为你想要的的对象,也可以将响应参数转为你想要的的对象。
发送数据
//@ResponseBody//就是声明该方法不走视图解释器,走HttpMessageConverter
1 导入依赖
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.8version>
dependency>
2 使用@ResponseBody
@Controller
public class JsonController{
@RequestMapping("/test1")
@ResponseBody //将handler的返回值,转换成json(jackson),并将json响应给客户端。
public User hello1(){
System.out.println("hello world");
User user = new User();
return user;
}
// @ResponseBody还可以用在handler的返回值上
@RequestMapping("/test2")
public @ResponseBody List<User> hello2(){
System.out.println("hello world");
List<User> users = Arrays.asList(new User(),new User());
return users;
}
// 如果返回值已经是字符串,则不需要转json,直接将字符串响应给客户端
@RequestMapping(value="/test3",produces = "text/html;charset=utf-8") //produces 防止中文乱码
@ResponseBody
public String hello2(){
System.out.println("hello world");
return "你好";
}
}
3,使用@RestController
Controller类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody
@RestController//@Controller+@ResponseBody
public class JsonController{
@RequestMapping("/test1")
public User hello1(){
System.out.println("hello world");
User user = new User();
return user;
}
//@ResponseBody还可以用在handler的返回值上
@RequestMapping("/test2")
public List<User> hello2(){
System.out.println("hello world");
List<User> users = Arrays.asList(new User(),new User());
return users;
}
}
接收数据
1,使用@RequestBody
一般用于插入数据
@RequestBody, 接收Json参数
1 定义Handler
class User{
private Integer id;
private String name;
private Boolean gender;
//set get
}
@RequestMapping("/users")
public String addUser(@RequestBody User user){//@RequestBody将请求体中的json数据转换为java对象
System.out.println("cap2");
System.out.println("Post user :"+user);
return "index";
}
2 Ajax发送json(一般如果发的是单个id,就直接发个get请求拼接的形式传给后端,{ url: “user/del?id=”+data.id,};如果发的是一个对象,比如修改是发一个修改的对象,这时就用post请求,以json字符串的形式传给后端)
//ajax
var user = {id:1,name:"shine"};
$.ajax({
/* 执行过程:前端接收到修改的请求,这时是一个js对象,把js对象传给data,这时把js对象转为
json字符串并告诉我传的是一个json字符串(不是json对象);后端拿到json字符串因为接受的是一个对象所有
要用@requestbody转为对象,再进行mvc操作。把处理结果返还给前端的msg*/
url:'${pageContext.request.contextPath}/json2/test4',
type:'post',
contentType:"application/json",//声明请求参数类型为 json
data:JSON.stringify(user),// 转换js对象成json
success:function(ret){
console.log(ret);
}
});
以上使用的是jackjson完成的,但是要是使用fastjson就要自己配置HttpMessageConverter
因为springmvc整合时没有给Jackjson加HttpMessageConverter这个对象,所有要自己去配,才能象jackjson一样完成数据类型转换为对象。
2,fastjson
1 导入依赖
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.54version>
dependency>
2,安装fastjson
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/jsonvalue>
list>
property>
bean>
mvc:message-converters>
mvc:annotation-driven>
3 使用
@ResponseBody @RequestBody @RestController 使用方法不变
4 常用注解
- 日期格式化:@JSONField(format=“yyyy/MM/dd”)
- 属性名修改:@JSONField(name=“birth”)
- 忽略属性:@JSONField(serialize = false)
- 包含null值:@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) 默认会忽略所有null值,有此注解会输出null
- @JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为""
- 自定义序列化:@JSONField(serializeUsing = MySerializer2.class)