在没接触springmvc之前我们在servlet中想返回前台json数据时,都是自定义一个JSONObject和JSONArray,然后调用response.getWriter()对象的方法返回json数据,类似:

 jsonObject.element("photoAudit", audit);
jsonObject.element("photoAudit2", audit2);
jsonObject.element("photoAudit3", audit3);
jsonArrayR.add(jsonObject); PrintWriter out = response.getWriter();
out.print(jsonR.toString());
out.close();

在接触springmvc项目后,知道可以springmvc可以通过配置让对象、list集合或者map可以直接返回json格式的数据,非常方便。如果自己配置的话,还是需要自己多了解一些,不要盲目的在网上直接copy代码就结束了。我们在配置springmvc配置文件的时候,一定会把controller的包加入的,就是我们的控制器,如下:

<context:component-scan base-package="com.example.controller"/>

但是我们往往不会注意一句很简单的代码:

 <mvc:annotation-driven/>

这句代码一般情况是直接跟在上面那句扫描controller包后面的。从字面理解的意思就是mvc的注解驱动。<mvc:annotation-driven/>会自动注册两个bean,分别为DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。是springmvc为@controller分发请求所必须的。除了注册了这两个bean,还提供了很多支持,其中一项就提到了读写JSON的支持(Jackson)。

关于配置springmvc的jackson依赖,有主要两个步骤(除了jackson还可以配置阿里的fastjson),第一步就是在添加jar包依赖,我配置的是jackson2的版本,如下:

 <!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.0</version>
</dependency>

第二步就是在springmvc的配置文件中加入转换器的配置,这里其实不加配置只有<mvc:annotation-driven/>的话也可以实现json自动转化,但是会面临一个问题,就是在使用IE浏览器时,返回的数据格式如果是json的话,会出现提示下载的页面。我们要解决这个问题。网上给的几种方案。

方案一:

在springmvc的配置文件中添加如下代码

<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>

这种一看就觉得不对,定义了一个转化器,但是只是定义了一个转化器而已,什么关联都没有。首先我们要了解问题出现的原因,才能够解决问题。springmvc返回json数据在IE浏览器中访问,会出现下载现象是因为IE10以下不支持application/json格式的Response响应,也就是说低于IE10版本的IE浏览器都需要使用text/html的Response响应。所以我们知道了转换器肯定要绑定response才能够实现。

方案二:

在springmvc的配置文件中添加如下代码

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list >
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>

这种感觉已经很对了,而且查了一下大多数网上给的都是这种。我在添加了如上代码后测试还是会提示下载,然后就在想会不会是RequestMappingHandlerAdapter的问题,上网查了一下RequestMappingHandlerAdapter的作用。RequestMappingHandlerAdapter的作用大概是简单来说就是采用反射机制调用url请求对应的Controller中的方法(这其中还包括参数处理等等操作没有介绍),返回执行结果值,这样就完成了HandlerAdapter的使命。看来RequestMappingHandlerAdapter的作用就是负责分发到controller并返回的过程,这么看的话添加上面的代码应该可以才对,不明白为什么不行。最后把代码改为:

<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="stringHttpMessageConverter"/>
<ref bean="mappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven> <bean id="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter"/> <!--解决IE浏览器json文件下载和json数据中午乱码的问题-->
<bean id="mappingJackson2HttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>

其实就是相当于把jackson的转化器从原来添加到RequestMappingHandlerAdpter改为直接添加到注解驱动<mvc:annotation-driven>里,在<mvc:annotation-driven></mvc:annotation-driven>添加<mvc:message-converters>消息转化器,将自定义的转换器加入其中就OK了。注:这里定义的转化器bean的id都是自定义的,你愿意起什么名字就起什么名字。但是为什么要这样才行我还不清楚,先记录一下,然后再查资料弄懂这个问题。

springmvc配置jackson时遇到的一些问题的更多相关文章

  1. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。

    springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...

  2. [转]SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

    一.SpringMVC使用@ResponseBody时返回json的日期格式 前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.co ...

  3. SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

    一.SpringMVC使用@ResponseBody时返回json的日期格式 前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.co ...

  4. Spring-MVC配置Gson做为Message Converter解析Json

    Spring-MVC配置Gson做为Message Converter解析Json 在学习Spring的时候看到可以使用@RequestBody 和@ResponseBody注解来是的Spring自动 ...

  5. springmvc配置mybatis与hibernate的不同点

    相信每个人对springmvc+hibernate或者springmvc+mybatis都不会陌生,拿来一个项目也都会开发.但是自己配置的情况下却很少,即使自己配置过,长时间不写也会忘,在这里记录一下 ...

  6. springMVC 配置和使用

    springMVC相对于Struts2学习难度较为简单,并且更加灵活轻便. 第一步:导入jar包 spring.jar.spring-webmvc.jar.commons-logging.jar.sp ...

  7. SpringMVC配置与使用

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  8. springmvc配置之mvc:annotation-driven

    为了简化springmvc配置,spring同时引入了mvc namespace, 配置了 <mvc:annotation-driven/> spring会默认注册a RequestMap ...

  9. SpringMVC配置多视图-内容协商原理

    SpringMVC配置多视图-内容协商原理 2014年03月06日 16:46:59 日积月累_滴水石穿 阅读数:10964更多 个人分类: SpringMVC   Spring Framework ...

随机推荐

  1. MySQL数据库的创建&删除&选择

    1.MySQL数据库的创建 方法1和2      方法3.使用PHP脚本 PHP中使用mysqli_query函数来创建或删除MySql数据库 mysqli_query函数:两个参数 返回值:执行成功 ...

  2. wakelock查看

    Android的wakelock分为两层 待机异常https://wenku.baidu.com/view/6b765c8802020740be1e9bd8.html Linux层和应用层 查看Lin ...

  3. Linux用户管理——useradd

    除了useradd还有一个命令adduser,两者是链接关系 [root@51cto ~]# which adduser /usr/sbin/adduser [root@51cto ~]# which ...

  4. MySQL数据库的基本认识与操作

    Mysql是一个数据库,但是我们安装的mysql数据库服务,服务就会有状态,启动,停止,重启.我们使用mysql必须保证mysql启动. 使用mysql数据库需要连接数据库 Mysql -u -p - ...

  5. python链接sql server 乱码问题

    import pymssql import sys import os reload(sys) sys.setdefaultencoding('utf-8') os.environ['NLS_LANG ...

  6. Java 中的多态,一次讲个够之继承关系中的多态

    多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...

  7. Python 文件操作(2)

    上一篇学习了用内置函数 open() 来打开文件,并且用 f.close() 来关闭文件. 今天来学习对这个文件对象的其他操作:读.写.找到文件当前位置-- 1.读取文件 三种方法: read([si ...

  8. MySQL中的with rollup的作用

    个人理解: 文字性理解 ---> 大分组 group by 之后 在进行组内汇总with rollup.下面的例子我觉得写的不错,理解也很容易. 例子: 转  http://www.cnblog ...

  9. vue2 父子组件数据更改

    父级以对象的形式传递数据给子级,子级更改此数据时,父级同步更改

  10. EMF中复制对象属性

    1.简单的场景就是复制一个EObject,可以用工具类中的方法EcoreUtil.copy(). 2.场景:自己的TO类继承了EMF创建出的类,需要复制父类中的所有属性. /** * 将父类所有的属性 ...