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

来源:http://www.cnblogs.com/teach/archive/2016/09/24/5903718.html
-Advertisement-
Play Games

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


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

上邊有很好的解釋。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Response對象:響應請求 Response.Write("<script>alert('添加成功!')</script>"); Response.Redirect("Default.aspx"); Request對象:獲取請求 Request["key"]來獲取傳遞過來的值 QueryStri ...
  • 佈局:有2個屬性: Anchor:鎖定位置Dock:填充位置一般Dock是與容器控制項配合使用 容器控制項:Panel:就是一個區域,類似於DIV,可以獨立佈局,還可以讓其它控制項及容器在它的內部再次佈局 FlowLayoutPanel:流式佈局容器,內容會預設從左向右排列,如果寬度不夠了,那麼自動換行 ...
  • The alias cmd list your current aliases. For example : alias Use alias to shorten a long cmd in current shell session: alias [name=['command']] Use un... ...
  • 學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴註入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架的IOC的理解以及談談我對Spring Ioc的理解。 一 ...
  • 2、下載地址:https://github.com/MSOpenTech/redis/releases 3、最新的安裝包: 4、點擊msi文件開始安裝。 5、勾選同意,下一步。 6、使用預設的安裝地址地址,並且將redis安裝路徑添加到系統環境變數。 7、修改埠號為“46379”,添加防火牆例外。 ...
  • import java.util.*;import java.math.*;public class CaculatorLnN { public static void main(String[] args) { // TODO 自動生成的方法存根 int N; System.out.println ...
  • 網上目前還找不到完整的mac下golang環境配置支持,本人配置成功,現在整理分享出來。 mac最好裝下xcode,好像有依賴關係安裝Homebrew打開終端視窗, 粘貼腳本執行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent. ...
  • 1、考慮用靜態工廠方法代替構造器 類的一個實例,通常使用類的公有的構造方法獲取。也可以為類提供一個公有的靜態工廠方法(不是設計模式中的工廠模式)來返回類的一個實例。例如: 使用靜態工廠方法代替構造器的優勢: 靜態工廠方法有名稱,更易讀。靜態工廠方法能夠使用方法名稱進行自註釋,來描述被返回的對象。例如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...