在沒接觸springmvc以前咱們在servlet中想返回前臺json數據時,都是自定義一個JSONObject和JSONArray,而後調用response.getWriter()對象的方法返回json數據,相似:html
1 jsonObject.element("photoAudit", audit); 2 jsonObject.element("photoAudit2", audit2); 3 jsonObject.element("photoAudit3", audit3); 4 jsonArrayR.add(jsonObject); 5 6 7 PrintWriter out = response.getWriter(); 8 out.print(jsonR.toString()); 9 out.close();
在接觸springmvc項目後,知道能夠springmvc能夠經過配置讓對象、list集合或者map能夠直接返回json格式的數據,很是方便。若是本身配置的話,仍是須要本身多瞭解一些,不要盲目的在網上直接copy代碼就結束了。咱們在配置springmvc配置文件的時候,必定會把controller的包加入的,就是咱們的控制器,以下:web
<context:component-scan base-package="com.example.controller"/>
可是咱們每每不會注意一句很簡單的代碼:spring
1 <mvc:annotation-driven/>
這句代碼通常狀況是直接跟在上面那句掃描controller包後面的。從字面理解的意思就是mvc的註解驅動。<mvc:annotation-driven/>會自動註冊兩個bean,分別爲DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。是springmvc爲@controller分發請求所必須的。除了註冊了這兩個bean,還提供了不少支持,其中一項就提到了讀寫JSON的支持(Jackson)。json
關於配置springmvc的jackson依賴,有主要兩個步驟(除了jackson還能夠配置阿里的fastjson),第一步就是在添加jar包依賴,我配置的是jackson2的版本,以下:瀏覽器
1 <!--jackson--> 2 <dependency> 3 <groupId>com.fasterxml.jackson.core</groupId> 4 <artifactId>jackson-core</artifactId> 5 <version>2.7.0</version> 6 </dependency> 7 <dependency> 8 <groupId>com.fasterxml.jackson.core</groupId> 9 <artifactId>jackson-databind</artifactId> 10 <version>2.7.0</version> 11 </dependency> 12 <dependency> 13 <groupId>com.fasterxml.jackson.core</groupId> 14 <artifactId>jackson-annotations</artifactId> 15 <version>2.7.0</version> 16 </dependency>
第二步就是在springmvc的配置文件中加入轉換器的配置,這裏其實不加配置只有<mvc:annotation-driven/>的話也能夠實現json自動轉化,可是會面臨一個問題,就是在使用IE瀏覽器時,返回的數據格式若是是json的話,會出現提示下載的頁面。咱們要解決這個問題。網上給的幾種方案。mvc
方案一:app
在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纔可以實現。url
方案二:spa
在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都是自定義的,你願意起什麼名字就起什麼名字。可是爲何要這樣才行我還不清楚,先記錄一下,而後再查資料弄懂這個問題。