Chinaunix首页 | 论坛 | 博客
  • 博客访问: 794783
  • 博文数量: 247
  • 博客积分: 166
  • 博客等级: 入伍新兵
  • 技术积分: 2199
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-15 16:10
文章分类

全部博文(247)

文章存档

2017年(1)

2015年(63)

2014年(80)

2013年(94)

2012年(9)

分类: Java

2015-07-15 12:17:38

spring mvc 返回json格式数据的方式主要有五种: 

一、第一种方式使用JSON工具将对象序列化成json,常用工具Jackson,fastjson,gson。

利用HttpServletResponse,然后获取response.getOutputStream()或response.getWriter()直接输出。

二、使用Spring内置的支持,利用spring mvc3的注解@ResponseBody,然后使用spring mvc的默认配置就可以返回json了,不过需要jackson的jar包哦。

1. Spring MVC 配置

点击(此处)折叠或打开

  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  2.  <property name="messageConverters">
  3.   <list>
  4.    <bean
  5.     class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
  6.   </list>
  7.  </property>
  8. </bean>

2. WEB-INF/lib 中添加
jackson-mapper-asl-1.6.4.jar
jackson-core-asl-1.6.4.jar
3. Controller 中 使用:@ResponseBody 标注方法,该方法返回 Java对象(支持复杂对象),MappingJacksonHttpMessageConverter 会将对象转换为 JSON 输出

例如:

点击(此处)折叠或打开

  1. @ResponseBody
  2.   @RequestMapping(\"/list\")
  3.   public List<String> list(ModelMap modelMap) {
  4.     String hql = \"select c from Clothing c \";
  5.     Page<Clothing> page = new Page<Clothing>();
  6.     page.setPageSize(6);
  7.     page = clothingServiceImpl.queryForPageByHql(page, hql);
  8.     
  9.     return page.getResult();
  10.   }


三、spring2时代的产物,也就是每个json视图controller配置一个Jsonview。

如:<bean id="defaultJsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 

或者<bean id="defaultJsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

同样要用jackson的jar包。

四、自定义
// 以下是实现方法,仅仅是个演示
// 配置 BeanNameViewResolver

点击(此处)折叠或打开

  1. <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
  2.  <property name="order" value="1" />
  3. </bean>
  4. <bean id="jsonView" class="test.TestJsonView" />
// 实现 TestJsonView

点击(此处)折叠或打开

  1. public class TestJsonView extends AbstractView {
  2.  @Override
  3.  protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
  4.          HttpServletResponse response) throws Exception {
  5.   JsonBuilder jb = new JsonBuilder();
  6.   PrintWriter out = response.getWriter();
  7.   out.print(jb.encode(model));
  8.  }
  9. }
// 配置 View

点击(此处)折叠或打开

  1. <bean id="jsonView" class="test.TestJsonView" />
// Controller 中可以这样写

点击(此处)折叠或打开

  1. ModelAndView mav = new ModelAndView("jsonView");
  2. // mav.addObject ...
  3. return mav

五、 使用 spring-json.jar

// 就是第4种方法,但是强大的多。。。



注意:


  1. 第一步当然创建一个新项目,加入spring啦^-^  貌似现在只有3.0版本以上才支持整合json哦。
  2. 在项目中加入两个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。




阅读(615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~