第三章 控制器的實現(二)

2021-06-22 12:58:54 字數 3444 閱讀 6777

矩陣變數

uri規範rfc 3986

定義了可以在路徑塊中使用鍵值對。我們把它稱為「

matrix uris

」。在spring mvc

中,則稱作矩陣變數。矩陣變數可以出現在任何乙個路徑塊中,每個矩陣變數之間以分號分隔。比如,「

/cars;color=red;year=2012

」,變數如果有多個值的話則以逗號分隔,如「

color=red,green,blue

」或重複變數名-值對,如「color=red;color=green;color=blue」。

如果乙個

url需要包含矩陣變數,請求對映的模式需要以

uri模板的形式表示。這樣是為了確保無論是否存在矩陣變數以及它們的順序如何都可以正確地對請求進行對映。下面是乙個提取矩陣變數

「q」的示例:

// get /pets/42;q=11;r=22

public

void

findpet(

@pathvariable

string petid, 

@matrixvariable

intq) 

因為有可能多個路徑塊都會包含矩陣變數,在某些情況下我們還需要更明確地指明該矩陣變數是附屬於哪個

uri模板變數上,比如下面的例子:

// get /owners/42;q=11/pets/21;q=22

public

void

findpet(

@matrixvariable(value="q", pathvar="ownerid")

intq1,

@matrixvariable(value="q", pathvar="petid")

intq2) 

有時矩陣變數也可能是可選的,因此需要乙個預設值,我們就可以像下面的例子這樣:

// get /pets/42

public

void

findpet(

@matrixvariable(required=false, defaultvalue="1")

intq) 

我們也可以通過乙個

map來獲取到矩陣變數的值,如下面的例子所示:

// get /owners/42;q=11;r=12/pets/21;q=22;s=23

public

void

findpet(

@matrixvariable

mapmatrixvars,

@matrixvariable(pathvar="petid"")

mappetmatrixvars) 

」命名空間來進行設定,這是通過把

元素的enable-matrix-variables

屬性值設定為

true

來實現的,預設地,它的值為

false

。例子如下所示:

<?xml version="1.0" encoding="utf-8"?>

xmlns

=""xmlns:mvc

=""xmlns:xsi

=""xsi:schemalocation="

/spring-beans.xsd

/spring-mvc.xsd"

>

enable-matrix-variables

="true"

/>

可接收的客戶端請求媒介型別

控制器處理方法對客戶端請求的過濾還可以通過指定可接收的媒介型別來進行。只有請求頭中的

content-type

字段匹配了指定的媒介型別,才會對映到相應的處理方法上,比如下面的例子:

@controller

"/pets"

public

void

addpet(

@requestbody

pet pet, model model) 

媒介型別的值還可以通過「

!」非操作符來做取反操作,比如「

!text/plain

」就表示該處理器方法可接收所有

content-type

的值不為「

text/plain

」的請求。對媒介型別的指定在類層面和方法層面均可以使用。不同於其他條件的設定,當用在類層面上時,如果方法上也指定了則會覆蓋類層面的值而不是繼承下來。

可輸出的響應媒介型別

與可接收的請求媒介型別類似,我們也可以指定可輸出的響應媒介型別。這是通過匹配請求頭中的

accept

欄位的值來實現的。而且,指定了響應媒介型別的話,框架會根據該媒介型別來生成相應的響應內容型別。比如下面的例子:

@controller

"/pets/"

@responsebody

public

pet getpet(

@pathvariable

string petid, model model) 

getpet

方法的返回值pet物件將會以json的形式響應給客戶端。

關於「!

」操作符的使用以及方法覆蓋類層面指定的值與上面的相同,不再贅述。

指定請求引數和請求頭

我們還可以通過指定具體的請求引數和請求頭的值來過濾請求,比如

"myparam"

、"!myparam"

、"myparam=myvalue"

等形式。前面兩個是檢測該名稱的請求引數是否存在,而第3個則是檢測該名稱的請求引數值是否與指定的值相同。下面為乙個示例:

@controller

public

class

relativepathuritemplatecontroller "

, method = requestmethod.get, params="myparam=myvalue")

public

void

findpet(

@pathvariable

string ownerid, 

@pathvariable

string petid, model model)  }

同樣地,也可以檢測請求頭中的某個字段是否存在以及值是否匹配,示例如下:

@controller

public

class

relativepathuritemplatecontroller  }

儘管我們可以使用模糊匹配來指定

content-type

和accept

欄位的值,比如「

content-type=text/*

」將會匹配「

text/plain

」和「text/html

」兩種請求,但不建議這樣使用。在媒介型別上,我們應該分別使用

consumes

和produces

條件進行明確地指明。

第三章 (分組控制)

分組控制 group control 是 web 框架應提供的基礎功能之一。所謂分組,是指路由的分組。如果沒有路由分組,我們需要針對每乙個路由進行控制。但是真實的業務場景中,往往某一組路由需要相似的處理。例如 大部分情況下的路由分組,是以相同的字首來區分的。因此,我們今天實現的分組控制也是以字首來區...

第三章 流程控制

流程控制結構 這就是語法了 1 了解流程控制語句 實現對程式的執行流程進行控制的一種語句。包括 順序結構 選擇結構 迴圈結構 是否有選擇結構 迴圈結構可以稱為是界定一種語言是否是程式語言的標準。順序流程 順序 程式預設就是這種流程語句,自上而下挨個執行。選擇結構 又稱為分支 轉向 多種條件情況,對應...

第三章控制語句上

條件語句可以給定乙個判斷條件,並在程式執行過程中判斷該條件是否成立。程式根據判斷結果執行不同的操作,這樣就可以改變 的執行順序,從而實現更多功能。1 if語句 if語句用於在程式中有條件的執行某些語句,其語法格式如下 if 條件表示式 語句塊 當條件表示式的值為true,執行語句塊 如果條件表示式的...