關於SpringMVC Json使用


很簡單的一個東西,這里就不做過多介紹了,寫一個小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了。

 

看下實現效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM