springmvc 对 json 的前后台传输做了很好封装,避免了重复编码的过程,下面来看看常用的 @ResponseBody 和 @RequestBody 注解
springmvc 对 json 的处理依赖 jackson
- <dependency>
- <groupId>
- org.codehaus.jackson
- </groupId>
- <artifactId>
- jackson-core-asl
- </artifactId>
- <version>
- 1.9.11
- </version>
- </dependency>
- <dependency>
- <groupId>
- org.codehaus.jackson
- </groupId>
- <artifactId>
- jackson-mapper-asl
- </artifactId>
- <version>
- 1.9.11
- </version>
- </dependency>
- <mvc:annotation-driven />
- //不要忘了命名空间配置
如果传输的是单层 json 对象,我们后台可以直接用 @RequestParam 接收
- $.ajax({
- type : "post",
- dataType : "json",
- url : "/testRequestBody",
- data:{
- name:"韦德",
- age:35
- },
- success : function(result){
- }
- });
- @RequestMapping("/testRequestBody")publicStringtestRequestBody(@RequestParamMap map) {
- System.out.println(map);// {name=韦德, age=35}
- return "index";
- }
如果传输的是多层嵌套 json 对象,这个时候会就会出现数据丢失问题
@ResponseBody 很好的解决了这个问题,它会把前台传输过来的 json 转化为后台对应的对象
- $.ajax({
- type : "post",
- dataType : "json",
- url : "/testRequestBody",
- contentType:"application/json",
- data:JSON.stringify({
- name:"韦德",
- win:[2006,2012,2013],
- age:35
- }),
- success : function(result){
- }
- });
- @RequestMapping("/testRequestBody")publicStringtestRequestBody(@RequestBodyMap map) {
- System.out.println(map);//{name=韦德, win=[2006, 2012, 2013], age=35}
- return "index";
- }
需要注意的是前台需要指定 contentType 为 "application/json"
同时要把 json 对象转化为 String,否则后台不能识别
ajax 请求返回 json 格式,往常我们可以这样做
- private void writeJson(HttpServletResponse response, Object object) {
- String json = JSON.toJSONString(object);
- response.setCharacterEncoding("UTF-8");
- response.setContentType("application/json; charset=utf-8");
- PrintWriter out =null;try{
- out = response.getWriter();
- out.write(json);
- }catch(IOException e) {
- e.printStackTrace();
- }finally{if(out !=null) {
- out.close();
- }
- }
- }
这个时候 @ResponseBody 就派上用场了,只需要一个注解,全部搞定
- $.ajax({
- type : "post",
- dataType : "json",
- url : "/testResponseBody",
- success : function(result){
- console.info(result);
- }
- });
- @RequestMapping("/testResponseBody")@ResponseBody
- publicMap testRequestBody() {
- Map result = newHashMap();
- result.put("name","韦德");
- result.put("age",35);returnresult;
- }
前台 console 输出
- {
- "age": 35,
- "name": "韦德"
- }
在网上看到很不错的流程图,作为总结吧
来源: http://www.cnblogs.com/zhaoguhong/p/6882776.html