黃金的導電性最好,為什麼電腦主機闆還是要用銅? 飛機最快,為什麼還有人做火車? 清華大學最好,為什麼還有人去普通學校? 因為資源都是有限的,我們現實生活中必須兼顧成本與産出的平衡
上文 介紹了<code>spring mvc</code>用于處理入參的處理器:<code>handlermethodreturnvaluehandler</code>它的作用,以及介紹了最為常用的兩個參數處理器子類:<code>pathvariablemethodargumentresolver</code>和<code>requestparammethodargumentresolver</code>。由于該體系的重要以及龐大,本文将接着繼續講解~
<code>@requestheader</code>注解,可以把request請求header部分的值綁定到方法的參數上。
此處理器能處理的是我們這麼來使用:
請求頭截圖:
結果列印(集合封裝成功了,證明逗号分隔是可以被封裝成集合/數組的):
tip:注解指定的value值(key值)是<code>不</code>區分大小寫的
處理必須标注有<code>@requestattribute</code>注解的參數,原理說這一句話就夠了。
同上(注解不一樣,scope不一樣而已)
對解析标注有<code>@cookievalue</code>的做了一層抽象,子類負責從request裡拿值(該抽象類不合請求域綁定)。
指定了從<code>httpservletrequest</code>去拿cookie值。
一般我們這麼來用:
手動設定一個cookie值,然後請求
控制台列印如下:
tips:在現在restful風格下,cookie使用得是很少的了。一般用于提升使用者體驗方面~
标注有<code>@matrixvariable</code>注解的參數的處理器。<code>matrix:矩陣</code>,這個注解是spring3.2新提出來的,增強restful的處理能力(配合<code>@pathvariable</code>使用),比如這類url的解析就得靠它:<code>/owners/42;q=11/pets/21;s=23;q=22</code>。
關于<code>@matrixvariable</code>它的使用案例,我找了兩篇靠譜文章給你參考:
參考一
參考二
它用于處理标注有<code>@value</code>注解的參數。對于這個注解我們太熟悉不過了,沒想到在web層依舊能發揮作用。本文就重點來會會它~
通過<code>@value</code>讓我們在配置檔案裡給參數指派,在某些特殊場合(比如前端不用傳,但你想給個預設值,這個時候用它也是一種方案)
說明:這就相當于在controller層使用了@value注解,其實我是不太建議的。因為@value建議還是隻使用在業務層~
根本原理其實隻是利用了<code>defaultvalue</code>支援占位符和<code>spel</code>的特性而已。給個使用示例:
請求:<code>/test</code>,列印:<code>28</code>。
注意:若你寫成<code>@value("#{'${test.myage:10}' + 10}</code>,那你得到的答案是:<code>1810</code>(成字元串拼接了)。
另外,我看到網上有不少人說如果把這個<code>@propertysource("classpath:my.properties")</code>放在根容器的config檔案裡導入,controller層就使用<code>@value</code>/占位符擷取不到值了,其實這是**<code>不正确</code>**的。理由如下:
<code>spring mvc</code>子容器在建立時:<code>initwebapplicationcontext()</code>
這就是為什麼說即使你是在根容器裡使用的<code>@propertysource</code>導入的外部資源,子容器也可以使用的原因(因為子容器會把父環境給<code>merge</code>一份過來)。
但是,但是,但是:如果你是使用形如<code>propertyplaceholderconfigurer</code>這種方式導進來的,那是會有容器隔離效應的~
資料來源同上,隻是參數類型是map
這類解析器我認為是對第一類的有些處理器的一種補充,它依賴上面的相關注解。
你是否想過通過<code>@requestparam</code>一次性全給封裝進一個<code>map</code>裡,然後再自己分析?同樣的本類處理器給<code>@requestheader</code>、<code>@pathvariable</code>、<code>@matrixvariable</code>都賦予了這種能力~
它依賴的方法是:<code>httpservletrequest#getparametermap()</code>、<code>multipartrequest#getmultifilemap()</code>、<code>multipartrequest#getfilemap()</code>等,出現于<code>spring 3.1</code>。
示範一把:
請求:<code>/test?name=fsx&age=18&age=28</code>。列印
從結果看出:
它不能傳一key多值情況
若出現相同的key,以在最前面的key的值為準。
map執行個體是一個<code>linkedhashmap<string,string></code>執行個體
一次性把請求頭資訊都拿到:資料類型支出寫<code>multivaluemap(linkedmultivaluemap)/httpheaders/map</code>。執行個體如下:
請求列印:
不過強烈不建議直接使用<code>map</code>,而是使用<code>httpheaders</code>類型。這麼寫<code>@requestheader httpheaders headers</code>,擷取的時候更為便捷。
略。
它處理map類型,但沒有标注任何注解的情況,它的執行順序是很靠後的,是以有點兜底的意思。
使用案例:略。
這個處理器同時也解釋了:為何你方法入參上寫個<code>map、hashmap、modelmap</code>等等就可以非常便捷的擷取到模型的值的原因~
參數比如是<code>sessionstatus, servletresponse, outputstream, writer, webrequest, multipartrequest, httpsession, principal, inputstream</code>等
這種方式使用得其實還比較多的。比如平時我們需要用servlet源生的api:<code>httpservletrequest, httpservletresponse</code>腫麼辦? 在<code>spring mvc</code>内就特别特别簡單,隻需要在入參上聲明:就可以直接使用啦~
看到這你應該明白,以後你需要使用這些參數的話,直接在方法上申明即可,不需要自己再去get了,又是一種依賴注入的效果展現有木有~
支援<code>sessionstatus</code>。值為:<code>mavcontainer.getsessionstatus();</code>
通過<code>uricomponentsbuilder</code>來得到url的各個部分,以及建構url都是非常的友善的。
和重定向屬性<code>redirectattributes</code>相關。
如果涉及到重定向:多個視圖見傳值,使用它還是比較友善的。
允許你入參裡寫:<code>org.springframework.ui.model</code>、<code>redirectattributes</code>、<code>redirectattributesmodelmap</code>、<code>concurrentmodel</code>、<code>extendedmodelmap</code>等等
在本文末尾,說一個特殊的處理器:<code>modelattributemethodprocessor</code>:主要是針對 被 <code>@modelattribute</code>注解修飾且不是普通類型(通過 <code>!beanutils.issimpleproperty</code>來判斷)的參數。
關于<code>@modelattribute</code>這塊的使用,參見這裡
本文介紹完了四大類的前面三種類型,其中最為常用的是前兩種類型的使用,希望大家可以掌握,和好好發揮~
handlermethodargumentresolver:controller入參自動封裝器(将方法參數parameter解析為參數值)【享學spring mvc】
從原理層面掌握@modelattribute的使用(核心原理篇)【享學spring mvc】
從原理層面掌握@modelattribute的使用(使用篇)【享學spring mvc】
handlermethodargumentresolver(一):controller方法入參自動封裝器(将參數parameter解析為值)【享學spring mvc】
handlermethodargumentresolver(二):map參數類型和固定參數類型【享學spring mvc】
handlermethodargumentresolver(三):基于httpmessageconverter消息轉換器的參數處理器【享學spring mvc】