spring mvc整合json
- 作者 firedragonpzy
- 3 六月, 2016
- 暂无评论
欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
Software MyZone 2群(山东):204954191
Software MyZone【Java群】:162865493
【加群请写:Software MyZone或者是firedragonpzy】
淘宝店:【应小心的易淘屋】初次开店,大家多多支持……
群论坛:【火龙论坛】正试运营阶段,欢迎大家多提些建设性意见……
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
Software MyZone 2群(山东):204954191
Software MyZone【Java群】:162865493
【加群请写:Software MyZone或者是firedragonpzy】
淘宝店:【应小心的易淘屋】初次开店,大家多多支持……
群论坛:【火龙论坛】正试运营阶段,欢迎大家多提些建设性意见……
群问答:【火龙问答】正试运营阶段,欢迎大家多提些建设性意见……
我的digitalocean推广链接:https://www.digitalocean.com/?refcode=65dfdb158f1a,Everyone you refer gets $10 in credit,从此链接注册,你将获得10美元。
最近team要开发一个App,负责server端。原本准备是用SSH2框架的,但是感觉struts2还是比较适合用来与jsp结合使用,想了又想决定用spring mvc整合json来做。网上查了很多资料,调试了一整天,终于把调通。在这里分享一下我的经验:
- 第一步当然创建一个新项目,加入spring啦^-^ 貌似现在只有3.0版本以上才支持整合json哦。
- 在项目中加入两个json的jar包:jackson-core-asl-x.x.x.jar和jackson-mapper-asl.x.x.x.jar。其中xxx是jar包的版本,网上很多说用1.4.2,但是我加入1.4.2版本后,部署会出错。在请求中会出现ObjectMapper:NoClassDefFoundException的错,仔细查看原来tomcat启动的时候就错了,报的是isFullyTyped:NoSuchMethodError的错误。这个错真心纠结了很久,最后在官网上看到原来是core包里里面一个类没有这个方法。查看jar包,1.4.2真的没有这个方法。仔细查看官网API,尼玛json竟然不是向下兼容的,伤不起….最后看到了1.1版本还是支持的,于是就下载了1.1.2的版本。于是两个jar包就是:jackson-core-asl-1.1.2.jar和jackson-mapper-asl.1.1.2.jar。
- 在web.xml添加spring mvc
<context -param> <param -name>contextConfigLocation</param> <param -value> /WEB-INF/classes/applicationContext.xml, /WEB-INF/classes/spring-servlet.xml </param> </context> <listener> </listener><listener -class> org.springframework.web.context.ContextLoaderListener </listener> <!-- spring mvc的servlet,处理所有.json请求 --> <servlet> </servlet><servlet -name>spring</servlet> <servlet -class>org.springframework.web.servlet.DispatcherServlet</servlet> <init -param> <param -name>contextConfigLocation</param> <param -value>/WEB-INF/classes/spring-servlet.xml</param> </init> <load -on-startup>1</load> <servlet -mapping> </servlet><servlet -name>spring</servlet> <url -pattern>*.json</url>
- 编写spring-servlet.xml,配置spring mvc
- 编写Controller类,返回的ModelAndView会自动将数据转换成json数据
- service层的代码就不贴了,大家都懂的^-^
- 结果:
- 观察一下,数据冗余有木有!没关系,定义我们自己的数据转换类:
< ?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation -config /> <!-- Controller 类注解标识 --> <context:component -scan base-package="com.gswtek.controller" /> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <!-- 告诉视图解析器,返回的类型为json格式 --> <entry key="json" value="application/json" /> </map> </property> <property name="defaultViews"> <list> <!-- ModelAndView里的数据变成JSON --> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> </list> </property> </bean> </beans>
package com.gswtek.controller; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.portlet.ModelAndView; import com.gswtek.service.UserService; import com.gswtek.service.UserServiceImpl; @Controller /注解这个是个Controller public class UserController { public static Logger log = Logger.getLogger(UserController.class); @Autowired @Qualifier("UserServiceImpl") private UserServiceImpl userService; public void setUserService(UserServiceImpl userService) { this.userService = userService; } /* * @RequestMapping配置请求地址 * @RequestParam将请求中的参数注入 */ @RequestMapping(value="/register") public ModelAndView register(@RequestParam("username") String username ,@RequestParam("password") String password) { log.debug("register a new user"); ModelAndView modelView = new ModelAndView(); Map<string , Object> modelMap = new HashMap</string><string , Object>(); boolean status = userService.addUser(username, password); /*if(status) { modelMap.put("status", true); } else { modelMap.put("status", false); }*/ modelMap.put("status",status);//感谢二楼的指正,已修改 modelMap.put("date", new Date()); modelView.addAllObjects(modelMap); return modelView; } }
{"modelAndView":{"empty":false,"reference":false,"viewName":null,"view":null,"modelMap":{"status":true,"date":1358091863067},"model":{"status":true,"date":1358091863067}}}
package com.gswtek.util; import java.util.Map; import org.springframework.web.portlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJacksonJsonView; public class MappingJacksonJsonViewExd extends MappingJacksonJsonView { @Override protected Object filterModel(Map</string><string , Object> model) { Map< ?, ?> result = (Map< ?, ?>) super.filterModel(model); ModelAndView mav = (ModelAndView) (result.size() != 1 ? result : result.values().iterator().next()); return mav.getModelMap(); } }
更改spring-servlet.xml:
<property name="defaultViews"> <list> <!-- ModelAndView里的数据变成JSON --> <bean class="com.gswtek.util.MappingJacksonJsonViewExd" /> </list> </property>
- 再次布局,测试:
{"status":true,"date":1358092422728}