一. JSON
关于JSON,可以看老蝴蝶以前的文章: JSON简介及前端简单解析(一)
二. SpringMVC对JSON的处理
SpringMVC 对JSON的处理,主要是通过 @RequestBody 和@ResponseBody 两个注解进行的。
SpringMVC中默认的JSON转换使用的是 jackson, 所用的类是 MappingJackson2HttpMessageConverter . 故需要先下载jackson.jar 包。
有两种形式。 借鉴网上的图片,老蝴蝶重新画了一下。为了加深印象。
最常用的是第二种, key/value 的形式。
二.一 下载后导入 jackson有关的jar包。
把这几个jackson 的jar包都引入进来,否则会类找不到的错误。
如:
二.二 springMVC配置文件 springmvc.xml 写原先的映射器和适配器
<!-- 先用以前的复杂形式 --> <!-- 处理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> 处理器适配器 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <!--可添加其他的转换器--> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> </list> </property> </bean>
二.三 后端处理JSON (原始的方式) ,返回值为 void
@RequestMapping(value="toLogin") public String toLogin(){ return "user/login"; } @RequestMapping(value="/voidJson") public void getJsonUser(@RequestBody User user,HttpServletResponse response){ System.out.println("前台传过来的值是:"+user.toString()); //以void的形式返回 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); ObjectMapper object=new ObjectMapper(); user.setName("我是老蝴蝶"); //改变前台传过来的值 user.setId(1); //添加新的属性值 try { System.out.println("输出值为:"+object.writeValueAsString(user)); response.getWriter().println(object.writeValueAsString(user)); } catch (JsonGenerationException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (JsonMappingException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }
二.四 前台传入json ,注意路径和返回数据类型
<body> <h2>两个蝴蝶飞欢迎你</h2> <span id="name"></span> <br> <span id="sex"></span> <br> <span id="description"></span> <br> <span id="id"></span> <br> <button onclick="execVoidJSON()">执行voidjson</button> <script type="text/javascript"> function execVoidJSON(){ //1。 定义对象 var user={"name":"两个蝴蝶飞","sex":24,"description":"一个快乐的程序员"}; //2。 执行ajax程序 $.ajax({ type:"post", contentType:"application/json;charset=utf-8", url:"voidJson.action", //注意请求路径 data:JSON.stringify(user), success:function(data){ //接收过来的是字符串 var jsonData=JSON.parse(data); $("#name").html(jsonData.name); $("#sex").html(jsonData.sex); $("#description").html(jsonData.description); $("#id").html(jsonData.id); } }) } </script> </body>
二.五 运行服务器,测试结果
点击 按钮, 控制台打印输出
前台页面展示,
响应数据类型
还需要将 json字符串转换成json数据,太麻烦。
下面,开始进行相应的优化。
二.六 springmvc.xml 配置文件优化
直接将 二.二 步骤中的内容转换成
<!-- 适配器和映射器简写 --> <mvc:annotation-driven></mvc:annotation-driven>
即可。 会自动注入 json 转换器。 一般开发中常用这种形式。
二.七 利用@ResponseBody 注解进行将java 对象转换成 json串,返回值为java 对象。
@RequestMapping(value="toLogin") public String toLogin(){ return "user/login"; } @RequestMapping(value="/responseJson") public @ResponseBody User getResponseUser(@RequestBody User user){ System.out.println("前台传过来的值是:"+user.toString()); user.setName("我是老蝴蝶"); //改变前台传过来的值 user.setId(1); //添加新的属性值 return user; //很简单的写法。 }
二.八 前台传入json
<body> <h2>两个蝴蝶飞欢迎你</h2> <span id="name"></span> <br> <span id="sex"></span> <br> <span id="description"></span> <br> <span id="id"></span> <br> <button onclick="execResponseJSON()">执行Responsejson</button> <script type="text/javascript"> function execResponseJSON(){ //1。 定义对象 var user={"name":"两个蝴蝶飞","sex":24,"description":"一个快乐的程序员"}; //2。 执行ajax程序 $.ajax({ type:"post", contentType:"application/json;charset=utf-8", url:"responseJson.action", //注意请求路径 data:JSON.stringify(user), success:function(data){ //可直接使用data $("#name").html(data.name); $("#sex").html(data.sex); $("#description").html(data.description); $("#id").html(data.id); } }) } </script> </body>
二.九 运行服务器,进行查看
控制台打印输出:
前台数据展示:
响应数据类型
上面就是 请求 json字符串的形式。 当然,响应的时候,也可以响应集合。 这个在下面讲解。
二.十 JSON 的key/value 形式传入。
1 . 在后端的时候,不用@RequestBody 注解了,只需要用@ResponseBody 注解即可。
@RequestMapping(value="toLogin") public String toLogin(){ return "user/login2"; } @RequestMapping(value="/keyJson") public @ResponseBody User getKeyUser(User user){ System.out.println("前台传过来的值是:"+user.toString()); user.setName("我是老蝴蝶Key"); //改变前台传过来的值 user.setId(1); //添加新的属性值 return user; }
2 .前台页面
<body> <h2>两个蝴蝶飞欢迎你</h2> <span id="name"></span> <br> <span id="sex"></span> <br> <span id="description"></span> <br> <span id="id"></span> <br> <button onclick="execKeyValueJSON()">执行keyValueJson</button> <script type="text/javascript"> function execKeyValueJSON(){ //注意,这个时候传入的是字符串。 var user="name='两个蝴蝶飞KeyValue'&sex=24&description='一个快乐的程序员keyValue'"; //2。 执行ajax程序 $.ajax({ type:"post", url:"keyJson.action", //注意请求路径 data:user, success:function(data){ $("#name").html(data.name); $("#sex").html(data.sex); $("#description").html(data.description); $("#id").html(data.id); } }) } </script> </body>
3 . 运行服务器,进行测试。
控制台打印输出
前端数据展示
响应数据类型返回
二.十一 返回集合类型 如List
采用 key/value 的形式进行讲解。
1 . 后端数据 返回
@RequestMapping(value="toLogin") public String toLogin(){ return "user/login2"; } @RequestMapping(value="/listJson") public @ResponseBody List<User> getUserList(User user){ List<User> userList=new ArrayList<User>(); User user0=new User(); user0.setName("两个蝴蝶飞"); user0.setDescription("一个快乐的程序员"); userList.add(user0); User user1=new User(); user1.setName("精灵妹"); user1.setDescription("一个快乐的精灵"); userList.add(user1); User user2=new User(); user2.setName("老蝴蝶"); user2.setDescription("一个快乐的老蝴蝶"); userList.add(user2); User user3=new User(); user3.setName("精小妹"); user3.setDescription("一个快乐的精小妹"); userList.add(user3); return userList; }
2 . 前端页面展示
<body> <h2>两个蝴蝶飞欢迎你</h2> <div id="listJson"> </div> <button onclick="execListJSON()">执行listJson</button> <script type="text/javascript"> function execListJSON(){ //1。定义对象 var user="name='两个蝴蝶飞KeyValue'&sex=24&description='一个快乐的程序员keyValue'"; //2。 执行ajax程序 $.ajax({ type:"post", url:"listJson.action", //注意请求路径 data:user, success:function(data){ var str="<table><tr><th>姓名</th><th>描述</th></tr>"; $.each(data,function(idx,item){ str+="<tr>"; str+="<td>"+item.name+"</td>"; str+="<td>"+item.description+"</td>"; str+="</tr>"; }) str+="</table>"; $("#listJson").append(str); } }) } </script> </body>
3 . 运行服务器
前端数据展示为:
响应数据类型
响应数据:
三. SpringMVC与fastjson 进行整合
三.一 添加fastjson 的jar包。
注意,在添加fastjson jar包之前,一定要去除掉以前的jackson 的jar包,不然还是会默认加载的。这一点是非常重要的。
三.二 修改json 方式为fastjson
<!-- 设置fastjson的配置方案 --> <mvc:annotation-driven> <!-- 设置不使用默认的消息转换器 --> <mvc:message-converters register-defaults="false"> <!-- 配置Spring的转换器 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/> <!-- 配置fastjson中实现HttpMessageConverter接口的转换器 --> <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <!-- 加入支持的媒体类型:返回contentType --> <property name="supportedMediaTypes"> <list> <!-- 这里顺序不能反,一定先写text/html,不然ie下会出现下载提示 --> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> <!-- 可添加其他的属性来扩展功能,如日期 --> <property name="features"> <list> <!-- 默认的意思就是不配置这个属性,配置了就不是默认了 --> <!-- 是否输出值为null的字段 ,默认是false--> <value>WriteMapNullValue</value> <value>WriteNullNumberAsZero</value> <value>WriteNullListAsEmpty</value> <value>WriteNullStringAsEmpty</value> <value>WriteNullBooleanAsFalse</value> <value>WriteDateUseDateFormat</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
三.三 后端处理
@RequestMapping(value="/listJson",produces={"application/json"}) public @ResponseBody List<User> getUserList(User user){ List<User> userList=new ArrayList<User>(); User user0=new User(); user0.setName("两个蝴蝶飞"); user0.setDescription("一个快乐的程序员"); userList.add(user0); User user1=new User(); user1.setName("精灵妹"); user1.setDescription("一个快乐的精灵"); userList.add(user1); User user2=new User(); user2.setName("老蝴蝶"); user2.setDescription("一个快乐的老蝴蝶"); userList.add(user2); User user3=new User(); user3.setName("精小妹"); user3.setDescription("一个快乐的精小妹"); userList.add(user3); return userList; }
注意,此时一定不要忘记用 produces 的属性,否则会按照 springmvc.xml 中的supportedMediaTypes 第一个属性值即text/html 进行解析。
三.四 前端页面显示
与 二.十一 的前端显示是一样的,回过来的数据就是 json对象了。
三.五 重启服务器,进行验证。
在这里插入图片描述
当然,也可以返回单个bean 对象值。 也需要写 produces 的属性值。
@RequestMapping(value="/responseJson",produces={"application/json"}) public @ResponseBody User getResponseUser(@RequestBody User user){ System.out.println("前台传过来的值是:"+user.toString()); user.setName("我是老蝴蝶"); //改变前台传过来的值 user.setId(1); //添加新的属性值 return user; }
前端的话,与 二.八 章节的前端的值一致。 这里不再重复写。
谢谢!!!