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

springMVC一種資源返回多種形式【ContentNegotiatingViewResolver】

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

描述資源的三種形式

一、使用副檔名
二、使用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

三、使用引數

上面瞭解了同一種資源的三種呈現方式,即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也可以返回一個實際的物件。

下面看測試結果,

最後

在配置預設的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>

相關推薦

springMVC資源返回多種形式ContentNegotiatingViewResolver

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

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

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

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

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

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

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

獲取九宮格index的方式

mgr function public add 正方形 stop ron spa -- <1>由來: 在做一些需求的時候,我們可能需要把地圖劃分成均勻網格,隨機找一個格子A,需要取到這個A格子九宮格內的所有格子索引 例如我們把地圖劃分成3x3網格(從左下開始

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=

.Select 函數詳細介紹

perror socket編程 這樣的 發生 結構體 阻塞 get 成功 系統 轉自:http://www.cnblogs.com/hjslovewcl/archive/2011/03/16/2314330.html Select在Socket編程中還是比較重

Mysql Binlog三格式介紹及分析

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

排元素往下掉 總結

分析 ret get 否則 其中 adding 延遲 當前 tee 需求 點擊當前元素,看看是否有上個兄弟節點或者下個兄弟節點,如果有,就讓他們依次下落(當前元素也會下落),否則就不用下落 需求分析: 可以用之前做的那個拿來改改,重新做個也不難,就是用js生成一下div,再

基於springboot+bootstrap+mysql+redis搭建套完整的許可權架構完善整個專案

上一章我們已經完成了選單模組的開發工作,那麼到了本章我們將完成我們角色管理模組的開發工作,在本章開始一個全新的模組進行開發的時候我們需要遵守一定的命名和開發規範如下: 1、我們的Controller的RequestMapping的命名要和我們的資料夾的命名一致,且增加的頁面要

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

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

文理解Netty模型架構

本文基於Netty4.1展開介紹相關理論模型,使用場景,基本元件、整體架構,知其然且知其所以然,希望給讀者提供學習實踐參考。 1 Netty簡介     Netty是 一個非同步事件驅動的網路應用程式框架,用於快速開發可維護的高效能協議伺服器和

訊息中介軟體入門「」:初識訊息中介軟體ActiveMQ

訊息中介軟體入門「一」:初識訊息中介軟體【ActiveMQ】 背景介紹 訊息中介軟體相當於程序間通訊的信託,可以降低複雜系統中各個模組間的耦合度。對於信託:你只需要把Message給我,就沒你的事兒了。我負責給你送到目的地,就不需要你必須實時的守著,等待所有通訊細節的完成。

基於springboot+bootstrap+mysql+redis搭建套完整的許可權架構編寫基礎程式碼快速生成工具

 首先我們在我們的com.csdn包底下我們新建一個codeUtil包如下所示: 首先我們新建一個我們的列的模型(ColumnModel.java)如下: /**  * 列模型  */ public class ColumnModel {     private bool

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

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

文徹底搞清 Gradle 依賴

來源:曾是放牛娃 www.jianshu.com/p/59fd653a54d2 轉自:https://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=2652262838&idx=1&sn=e160fb15de0518fd20

PHP漏洞全解()PHP網站的安全性問題

轉自 https://www.cnblogs.com/pingliangren/p/5586940.html 本文主要介紹針對PHP網站常見的攻擊方式,包括常見的sql注入,跨站等攻擊型別。同時介紹了PHP的幾個重要引數設定。後面的系列文章將站在攻擊者的角度,為你揭開PHP安全問題,同

docker學習:Linux系統安裝docker

最近在學習springboot微服務的開發,順便學了下docker: Docker的三大核心概念:映象、容器、倉庫 映象:類似虛擬機器的映象、用俗話說就是安裝檔案。 容器:類似一個輕量級的沙箱,容器是從映象建立應用執行例項, 可以將其啟動、開始、停止、刪除、而這些容器都是相互

ac自動機最詳細的講解,讓你次學會ac自動機。轉載

在沒學ac自動機之前,覺得ac自動機是個很神奇,很高深,很難的演算法,學完之後發現,ac自動機確實很神奇,很高深,但是卻並不難。  我說ac自動機很神奇,在於這個演算法中失配指標的妙處(好比kmp演算法中的next陣列),說它高深,是因為這個不是一般的演算法,而是建立在兩