1. 程式人生 > >springmvc<一>一種資源返回多種形式【ContentNegotiatingViewResolver】

springmvc<一>一種資源返回多種形式【ContentNegotiatingViewResolver】

restful服務中一個重要的特性就是一種資源可以有多種表現形式,在springmvc中可以使用ContentNegotiatingViewResolver這個檢視解析器來實現這種方式。

描述資源的三種形式

    一、使用副檔名

http://localhost:8080/test/user.xml   以xml格式呈現

http://localhost:8080/test/user.json  以json格式呈現

http://localhost:8080/test/user     以預設檢視呈現,如jsp

    二、使用http request header的Accept

GET /user HTTP/1.1

Accept:application/xml   請求時設定返回形式是xml,如使用ajax請求,則需要設定contentType:application/xml

GET /user HTTP/1.1

Accept:application/json  請求時設定返回形式是json,如使用ajax請求,則需要設定contentType:application/json

    三、使用引數

http://localhost:8080/test/user?format=json

http://localhost:8080/test/user?format=xml

上面瞭解了同一種資源的三種呈現方式,即json、xml、jsp,那麼我們要如何使用ContentNegotiatingViewResolver類配置,使客戶端請求的方式不同,返回同一種資源的三種方式呢?

ContentNegotiatingViewResolver配置

ContentNegotiatingViewResolver是檢視解析器,我們在使用jsp這個檢視的時候也配置了一個檢視解析器InternalResourceViewResolver,他們都是檢視解析器,後者著重在配置一個預設的檢視解析即jsp;ContentNegotiatingViewResolver本身不會解析,他會分配其他的viewResolver去解析,並選擇一個看起來像是客戶端請求需要返回的一種 View 返回。

下面是ContentNegotiatingViewResolver的具體配置

<!--springmvc中根據字尾不同返回不同格式的配置 
        如,XXX.json  返回json格式
           XXX.xml   返回xml格式
           xxx       返回jsp
        
--> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <!--這裡是解析器的執行順序,如果有多個的話,配置的數值越小,則越早執行--> <property name="order" value="1" /> <!-- 這裡是是否啟用副檔名支援,預設就是true 例如 /user/{userid}.json --> <property name="favorPathExtension" value="true"></property> <!--這裡是是否啟用引數支援,預設就是true 例如 /user/{userid}?format=json --> <property name="favorParameter" value="false"></property> <!--這裡是否忽略掉accept header,預設就是false 例如 GET /user HTTP/1.1 Accept:application/json --> <property name="ignoreAcceptHeader" value="true"></property> <!-- 這裡是副檔名到mimeType的對映, 例如 /user/{userid}.json 中的 .json 就會對映到 application/json --> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </map> </property> <!--檢視--> <property name="defaultViews"> <list> <!--json檢視--> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean> <!--xml檢視--> <bean class="org.springframework.web.servlet.view.xml.MarshallingView" <constructor-arg> <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="classesToBeBound"> <list> <value>com.cn.my.entity.Course</value> <value>com.cn.my.entity.CourseList</value> </list> </property> </bean> </constructor-arg> </bean> </list> </property> </bean>

order:如果存在多個viewResolver則order值小的被使用,如果沒有合適的viewResolver則會使用另外的;

favorPathExtension:是否支援副檔名,預設為true(支援),副檔名指的xxx.json、xxx.xml等形式

favorParameter:是否啟用引數支援,預設為true(支援),即xxx?format=json、xxx?format=xml等形式,這裡的引數名預設為format,可以通過配置改變。

ignoreAcceptHeader:是否忽略accept header,預設是false(不忽略),即請求時指定的contentType:application/json等,由於我這裡要使用副檔名的形式返回,所以把另外兩項都關閉了,可視不同情況,使用不同設定;

mediaTypes:配置副檔名到mimeType的對映,這裡配置了json和xml的對映;

defaultViews:配置檢視,這裡配置了json和xml的檢視,json使用的jackson;

最後,我還配置一個另外一個檢視解析器,InternalResourceViewResolver,

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2" />
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    </bean>

這是jsp的檢視解析器,order屬性配置為了2,在無法匹配到json、xml的情況下,會返回jsp的檢視。

下面是controller的方法

package com.cn.my.controllor;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.cn.my.entity.Course;
import com.cn.my.entity.CourseList;

@Controller
@RequestMapping("/mul")
public class MultiView {

    @RequestMapping("/simple/{coursId}")
    public String method1(@PathVariable("coursId") String coursId,ModelMap model){
        Course c=new Course();
        c.setId(coursId);
        c.setContent("這是測試內容");
        c.setName("李四");
        model.put("course", c);
        return "course";
    }
}

這裡使用的restful服務中的uri的格式,用到了@PathVariable註解,這裡方法返回的String,且沒有@ResponseBody註解,在前邊的返回json一文中有返回json的配置,需要@ResponseBody註解,詳細的可以參看前邊,同時在方法引數中有ModelMap,為什麼這裡要返回一個字串呢,目的是為了統一,我們知道如果要返回到jsp檢視,那麼這裡要返回的一個代表邏輯檢視名的字串,為了使三種方式統一,這裡返回的是字串,如果不返回到jsp也可以返回一個實際的物件。

下面看測試結果,

請求:http://localhost:8081/springmvc/mul/simple2/1212.json

請求:http://localhost:8081/springmvc/mul/simple2/1212.xml

請求:http://localhost:8081/springmvc/mul/simple2/1212

最後一個jsp的檢視,本來是要在jsp頁面中輸出內容的,我這裡沒做,只是輸出了一段話。請諒解!

從上邊的測試結果來看,我們分別使用了三種不同的請求方式去請求同一個資源,返回了各自的形式,這種方式很適合用在不同的系統呼叫同一個系統時,可能別的系統處理資料的方式不一樣,我們使用上邊的配置可以實現一套程式碼,返回不同的形式。

最後

在配置預設的jsp解析器的時候也可以照下面的配置方式,

<!--springmvc中根據字尾不同返回不同格式的配置 
        如,XXX.json  返回json格式
           XXX.xml   返回xml格式
           xxx       返回jsp
        -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <!--這裡是解析器的執行順序,如果有多個的話,配置的數值越小,則越早執行-->
        <property name="order" value="1" />
        <!--
        這裡是是否啟用副檔名支援,預設就是true
                    例如  /user/{userid}.json
             -->
        <property name="favorPathExtension" value="true"></property>
 
        <!--這裡是是否啟用引數支援,預設就是true
        例如  /user/{userid}?format=json
             -->
        <property name="favorParameter" value="false"></property>
        <!--這裡是否忽略掉accept header,預設就是false
                   例如     GET /user HTTP/1.1
        Accept:application/json
        -->
 
        <property name="ignoreAcceptHeader" value="true"></property>
        <!--
        
        這裡是副檔名到mimeType的對映,
        例如 /user/{userid}.json  中的   .json  就會對映到   application/json
        -->
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
 
                <entry key="xml" value="application/xml" />        
            </map>
        </property>
        
        <!--檢視解析器-->
        <property name="viewResolvers">
            <list>
                
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
                    <property name="prefix" value="/WEB-INF/jsp/"></property>
                    <property name="suffix" value=".jsp"></property>
                    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
                </bean>
            </list>
           
        </property>
 <!--檢視-->
        <property name="defaultViews">
            <list>
            <!--json檢視-->
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
            <!--xml檢視-->
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView"
                    <constructor-arg>
                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                            <property name="classesToBeBound">
                                <list>
                                    <value>com.cn.my.entity.Course</value>
                                    <value>com.cn.my.entity.CourseList</value>
                                </list>
                            </property>
                        </bean>
                    </constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

宣告:我這裡的環境是spring4.1

參考:

http://blog.csdn.net/z69183787/article/details/41654603

上邊有很好的解釋。

有不正之處歡迎指正,謝謝!

相關推薦

springMVC資源返回多種形式ContentNegotiatingViewResolver

estful服務中一個重要的特性就是一種資源可以有多種表現形式,在springmvc中可以使用ContentNegotiatingViewResolver這個檢視解析器來實現這種方式。 描述資源的三種形式 一、使用副檔名 二、使用http r

springmvc<>資源返回多種形式ContentNegotiatingViewResolver

restful服務中一個重要的特性就是一種資源可以有多種表現形式,在springmvc中可以使用ContentNegotiatingViewResolver這個檢視解析器來實現這種方式。 描述資源的三種形式     一、使用副檔名 http://localhost:8080/test/user.xml

Linux I2C()之常用的幾實例化(i2c_client )

掃描 sent near 通過 完成 check 根據 pup views 轉自:http://blog.csdn.net/lugandong/article/details/48092397 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)

、微服務(Microservices)翻譯

1、說明 本文轉載自 http://www.cnblogs.com/liuning8023/p/4493156.html 經典好文! 2、微服務 “微服務架構(Microservice Architecture)”一詞在過去幾年裡廣泛的傳播,它用於描述一種設計應用程式的特別方式,作為一套獨

####jquery click點選次執行兩次解決方法遇到解決(先接觸繫結,再繫結):$('#addImg').unbind('click').click(function () {})

====專案例項: <%--$("body").on("click", "#toggle-button${activityDTO.id}", function (e) {--%> // 一次點選兩次觸發事件 <%--$("body").on("click", "#switc

支付寶鍵跳轉分站託管教程附圖

【分站託管】 我們提供伺服器,域名請自行購買,解析A記錄到分配給你的ip,記錄值填* http://t.cn/E7NCiB0 (註冊完後回到首頁-產品-域名註冊) 支援泛解析(*),每個頂級域名下無限個

Datafarne按照某列的特定規則進行排序Python

import pandas as pd if __name__ == '__main__': df = pd.DataFrame({'AAA': range(5), 'BBB': list('

java虛擬機器記憶體管理機制():JVM記憶體管理總結分享

近期看了看Java記憶體洩露的一些案例,跟原來的幾個哥們討論了一下,深入研究發現JVM裡面還是有不少以前不知道的細節,這裡稍微剖析一下。先看一看JVM的內部結構——如圖所示,JVM主要包括兩個子系統和兩個元件。兩個子系統分別是Class loader子系統和Execution

隻爬蟲帶你看世界6

10. 使用正則表示式來匹配 ip 地址 準備工作:Python中使用正則表示式時,是呼叫 re模組,“import re”,使用其search()方法,該方法用於在字串中搜索正則表示式模式第一次出現的位置。 舉個栗子 >>> import re >

python編程(python開發的三運行模式)

阻塞 data tail 驗證 目錄 pro 什麽 read bus 轉自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[-]

asp.net mvc 使用Ajax調用Action 返回數據

action 書寫格式 處理 cli 屬性和方法 根據 txt gif 一個 使用asp.net mvc 調用Action方法很簡單。 一、無參數方法。 1、首先,引入jquery-1.5.1.min.js 腳本,根據版本不同大家自行選擇。 <script src=

Mysql Binlog三格式介紹及分析

delete -s 字符 ID color fine alt lte pan 一.Mysql Binlog格式介紹 Mysql binlog日誌有三種格式,分別為Statement,MiXED,以及ROW! 1.Statement:每一條會修改數據的sql

oracle(使用TRUACTE刪除數據時,提示資源正忙)

ESS 正常 HERE sign order by where terminal spi ora 查詢記錄的鎖定對象,select * from v$locked_object(身份必須是DBA權限),然後找到對應的sid和serial#殺掉了會話;

mysql的五日期和時間型別轉載

[mysql的五種日期和時間型別] mysql(5.5)所支援的日期時間型別有:DATETIME、 TIMESTAMP、DATE、TIME、YEAR。 幾種型別比較如下: 日期時間型別 佔用空間 日期格式 最小值 最大值 零值表示

Android--利用相機或相簿擷取使用者頭像(解決了miui無法擷取,以及部分機型拍照無返回Uri)

宣告:本文的Demo可用於從本地獲取使用者頭像時使用,解決了有些手機系統相機拍照後獲取不到拍攝照片的問題,以及解決小米miui系統呼叫系統裁剪圖片功能camera.action.CROP後崩潰或重新開啟app的問題。 主活動檔案ChooseImageMain

Android--利用相機或相簿擷取使用者頭像(解決了miui無法擷取,以及部分機型拍照無返回Uri)

宣告 本文的Demo可用於從本地獲取使用者頭像時使用,解決了有些手機系統相機拍照後獲取不到拍攝照片的問題,以及解決小米miui系統呼叫系統裁剪圖片功能camera.action.CROP後崩潰或重新開啟app的問題。 修改了部分機型拍照後返回的是縮圖的臨時

Cocos Creator 資源載入流程剖析——Load部分

Load流程是整個資源載入管線的最後一棒,由Loader這個pipe負責(loader.js)。通過Download流程拿到內容之後,需要對內容做一些“載入”處理。使得這些內容可以在遊戲中使用。這裡並不是所有的資源都需要進行一個載入處理,目前只有圖片、Json、Plist、Uuid(Prefab、場景)等資

Cocos Creator 資源載入流程剖析——從編輯器到執行時

我們在編輯器中看到的資源,在構建之後會進行一些轉化,本章將揭開Creator對資源進行的處理。 資源處理的整體規則 首先我們將Creator的開發和執行劃分為以下幾個場景: 編輯器 當我們將資源放到編輯器中時,Creator會為每個資源生成唯一的uuid以及meta檔案,並在專案的library目錄下生成對應

Cocos Creator 資源載入流程剖析——場景切換流程

這裡討論場景切換的完整流程,從我們呼叫了loadScene開始切換場景,到場景切換完成背後發生的事情。整個流程可以分為場景載入和場景切換兩部分,另外還簡單討論了場景的預載入。 載入場景的流程 loadScene主要做了3件事,通過_getSceneUuid獲取要載入場景的資訊,對於原生平臺的非啟動場景

unity5打包機制下,資源打ab和資源管理的方案

remove 自己 return game tor 基礎 resource mea easyn unity5打包機制下,一種資源打ab和資源管理的方案。1.打ab:   1.設置平臺   2.清楚所有資源的assetbundlename:     string[] abN