Spring MVC学习笔记之json格式的输入和输出
Springmvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用
org.codehaus.jackson jackson-core-lgpl 1.8.1 org.codehaus.jackson jackson-mapper-lgpl 1.8.1
先修改之前的helloworld.jsp,增加客户端json格式的数据输入。
varcfg={ type:'POST', data:JSON.stringify({userName:'winzip',password:'password',mobileNO:'13818881888'}), dataType:'json', contentType:'application/json;charset=UTF-8', success:function(result){ alert(result.success); } }; functiondoTestJson(actionName){ cfg.url=actionName; $.ajax(cfg); }
根据前面的分析,在springmvc中解析输入为json格式的数据有两种方式1:使用@RequestBody来设置输入
@RequestMapping("/json1") @ResponseBody publicJsonResulttestJson1(@RequestBodyUseru){ log.info("getjsoninputfromrequestbodyannotation"); log.info(u.getUserName()); returnnewJsonResult(true,"returnok"); }
2:使用HttpEntity来实现输入绑定
@RequestMapping("/json2") publicResponseEntitytestJson2(HttpEntity u){ log.info("getjsoninputfromHttpEntityannotation"); log.info(u.getBody().getUserName()); ResponseEntity responseResult=newResponseEntity (newJsonResult(true,"returnok"),HttpStatus.OK); returnresponseResult; }
Json格式的输出也对应有两种方式1:使用@responseBody来设置输出内容为contextbody2:返回值设置为ResponseEntity>类型,以返回contextbody另外,第三种方式是使用ContentNegotiatingViewResolver来设置输出为json格式,需要修改servletcontext配置文件如下
但这种格式的输出会返回{model类名:{内容}}的json格式,例如,以下代码
@RequestMapping("/json3.json") publicJsonResulttestJson3(@RequestBodyUseru){ log.info("handlejsonoutputfromContentNegotiatingViewResolver"); returnnewJsonResult(true,"returnok"); }
期望的返回是{success:true,message:”returnok”};但实际返回的却是{"jsonResult":{"success":true,"msg":"returnok"}}原因是MappingJacksonJsonView中对返回值的处理未考虑modelMap中只有一个值的情况,直接是按照mapName:{mapResult}的格式来返回数据的。修改方法,重载MappingJacksonJsonView类并重写filterModel方法如下
protectedObjectfilterModel(Mapmodel){ Map,?>result=(Map,?>)super.filterModel(model); if(result.size()==1){ returnresult.values().iterator().next(); }else{ returnresult; } }
对应的ContentNegotiatingViewResolver修改如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。