0.说在前面
1.在原项目的基础上再导入需要的jar包,并Build Path
2.新建包com.springmvc.demo.bean,并新建People类
packagecom.springmvc.demo.bean;public classPeople {privateString name;privateInteger age;publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicInteger getAge() {returnage;
}public voidsetAge(Integer age) {this.age =age;
}
@OverridepublicString toString() {return "People [name=" + name + ", age=" + age + "]";
}
}
3.新建JsonController类
packagecom.springmvc.demo.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importcom.springmvc.demo.bean.People;
@Controllerpublic classJsonController {
@RequestMapping("/initJson.action")publicString init(){return "json";
}/*** @RequestBody: 注解用于将json字符串信息映射到People类的字段上进行转换
* @ResponseBody: 注解用于将实体对象转换成json格式
*@parampeople
*@return
*/@RequestMapping(value="/json.action")public@ResponseBody People jsonTest(@RequestBody People people){
System.out.println(people);returnpeople;
}
}
4.新建json.jsp页面
Insert title here年龄:
发送
functiondoPost(){varname=document.getElementById("name").value;varage=document.getElementById("age").value;
$.ajax({
url:"json.action",
type:"post",//请求信息是严格的json字符串形式
data:JSON.stringify({"name":name,"age":age}),//设置请求参数为json字符串,编码为UTF-8
contentType:"application/json;charset=utf-8",//设置返回值为json格式,也可以不设置
dataType:"json",
success:function(data){
alert(data.name+"---"+data.age);
}
});
}
5.由于原来的项目配置了拦截器,里面的postHandle方法中对controller返回的ModelAndView对象中设置了新的信息,这对返回json数据的请求是不合适的,因为这里的ModelAndView对象是null,会报空指针异常,所以把设置信息的那一块注释掉
@Overridepublic voidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView)throwsException {
System.out.println("postHandle在Controller被调用返回ModelAndView之后被调用......");//在返回的ModelAndView对象中新加一个数据对象//modelAndView.addObject("currentDate", new Date());
}
从页面信息和后台打印信息可以看出ajax发送json数据和返回json数据都得到实现.
7.踩坑
以本例来说:
(1). ajax请求
data属性的值要是严格的Json字符串形式,不能写成{"name":name,"age":age}这种形式,要是双引号包围的字符串,可以使用JSON.stringify({"name":name,"age":age})进行转换;
contentType属性值要设置成"application/json;charset=utf-8";
(2). jar包
新导入的三个jar包是必须的.这一块填坑花了好一段时间,搜了好些教程有说部分jar包不需要的,自己试的死活不行,不知道为啥,这三个jar包都导入了请求就通过了;
(3). springmvc.xml
这里面要添加标签项,添加这个不仅会添加上注解形式的处理器映射器和处理器适配器,还会添加一系列的消息转换器,其中就包括json格式的消息转换器
如果不添加这个标签,需要声明注解适配器以及为配置json格式的消息转换器:spring3与spring4及以上配置稍微不同,就是消息转换器名称里Jackson后面多了一个2
spring4以及以上
spring3
从工作量上来说还是添加标签项比较容易.
(4).Controller中的方法上
将json字符串映射到实体类属性上要使用注解@RequestBody;
返回值类型为实体类,要转化成json格式,需要在方法上或者方法的返回值类型之前使用注解@ResponseBody.