很簡單的一個東西,這里就不做過多介紹了,寫一個小Demo,隨手記錄下。
首先,在搭好SpringMVC工程環境之后,如果想用Spring自帶的Json,需要額外的添加2個JAR包:
1、jackson-core-asl-1.9.9.jar
2、jackson-mapper-asl-1.9.9.jar
我這里使用的是Maven,也相對應的給出pox.xml
1 <dependency> 2 <groupId>org.codehaus.jackson</groupId> 3 <artifactId>jackson-core-lgpl</artifactId> 4 <version>1.8.1</version> 5 </dependency> 6 7 <dependency> 8 <groupId>org.codehaus.jackson</groupId> 9 <artifactId>jackson-mapper-lgpl</artifactId> 10 <version>1.8.1</version> 11 </dependency>
當然也可以不使用Spring自帶的Json,還有很多第三方的Json支持包,比如谷歌的Gson,都是很好用的東西。
關於Gson的使用,之前的文章里也有做介紹,請戳:《Gson簡要使用筆記》http://www.cnblogs.com/lichenwei/p/3987429.html
好了,進入正題,要使用Spring自帶的Json,需要在SpringMVC配置文件里做一些配置:
1 <!-- 處理在類級別上的@RequestMapping注解 --> 2 <bean 3 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 4 <!-- 處理在方法級別上的@RequestMapping注解 --> 5 <bean 6 class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 7 <property name="messageConverters"> 8 <list> 9 <bean 10 class="org.springframework.http.converter.StringHttpMessageConverter"> 11 <property name="supportedMediaTypes"> 12 <list> 13 <!-- 默認是ISO-88859-1,避免亂碼這里設置為UTF-8 --> 14 <value> 15 text/html;charset=UTF-8 16 </value> 17 </list> 18 </property> 19 </bean> 20 <!-- 啟動JSON格式的配置 --> 21 <bean id="jacksonMessageConverter" 22 class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 23 <!-- 解決 HttpMediaTypeNotAcceptableException: Could not find acceptable 24 representation --> 25 <property name="supportedMediaTypes"> 26 <list> 27 <value>application/json;charset=UTF-8</value> 28 </list> 29 </property> 30 </bean> 31 </list> 32 </property> 33 </bean>
有了以上的配置之后,我們只需要在對應處理AJAX請求的方法上加上注解@ResponseBody,這樣Spring就會幫我們把內容或對象作為HTTP響應的正文返回,會跳過視圖處理部分,而調用適合HttpMessageConverter,將返回值(對象、字符串、List集合等)寫入輸出流。
SpringMVC的用法這里就不再多說了,直接給出關鍵代碼:
//向頁面直接輸出Json字符串 @ResponseBody @RequestMapping(value="/showUser",params="json",produces="application/json") public User showUserJson(){ User user=userService.getUserById(1);//獲取數據庫的一條信息 return user; }
@RequestMapping
value: 指定請求的實際地址,指定的地址可以是URI Template 模式(后面將會說明);
produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
params: 指定request中必須包含某些參數值,才讓該方法處理。
看一下頁面輸出:

怎么樣?相比Struts2輸出Json要簡單的多吧,少去了很多配置和通配符的設定。
再來看一下和AJAX的配合使用,服務端的代碼依舊如上,然后我們寫一個JSP頁面進行測試
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme() + "://" 6 + request.getServerName() + ":" + request.getServerPort() 7 + path + "/"; 8 %> 9 <html> 10 <head> 11 <script type="text/javascript" src="<%=basePath %>js/jquery-1.4.4.min.js"></script> 12 <script type="text/javascript"> 13 $(document).ready(function(){ 14 $("#send").click(function(){ 15 $.ajax({ 16 type:"get", 17 url:"<%=basePath %>userController/showUser?json", 18 dataType:" json", 19 success:function(data){ 20 alert(data); 21 } 22 }); 23 }); 24 }); 25 </script> 26 </head> 27 <body> 28 <h3>點擊下面按鈕,輸出Json信息</h3> 29 <input type="button" id="send" name="send" value="獲取json信息"> 30 </body> 31 </html>
這里要提到一個注意事項,我們在整合SpringMVC的時候需要在web.xml進行對DispatcherServlet的配置
1 <!-- SpringMVC配置 --> 2 <servlet> 3 <servlet-name>springDispatcherServlet</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:springmvc.xml</param-value> 8 </init-param> 9 <load-on-startup>1</load-on-startup> 10 </servlet> 11 12 <servlet-mapping> 13 <servlet-name>springDispatcherServlet</servlet-name> 14 <url-pattern>/</url-pattern> 15 </servlet-mapping>
如果你配置DispatcherServlet攔截*.do就不會存在靜態資源訪問的問題,
但如果你和我一樣配置DispatcherServlet攔截 / (所有),那么對*.js,*.css,*.jpg等資源的訪問也就被攔截了,也就訪問不到了。
這里順帶說下解決方法:
激活Tomcat的defaultServlet來處理靜態文件
1 <servlet-mapping> 2 <servlet-name>default</servlet-name> 3 <url-pattern>*.jpg</url-pattern> 4 </servlet-mapping> 5 <servlet-mapping> 6 <servlet-name>default</servlet-name> 7 <url-pattern>*.js</url-pattern> 8 </servlet-mapping> 9 <servlet-mapping> 10 <servlet-name>default</servlet-name> 11 <url-pattern>*.css</url-pattern> 12 </servlet-mapping>
每種文件類型都要配置,要寫在DispatcherServlet的前面, 讓defaultServlet先攔截,這個就不會進入Spring了。
看下實現效果:


