從文檔:Struts2's Advanced Wildcard Mappings:高級通配符映射參數prepare()方法
高級通配符
從2.1.9+正則表達式可以定義在動作 名定義。要使用這種形式的外卡,下面的常量必須是 集:
<constant name="struts.enable.SlashesInActionNames" value="true"/> <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/> <constant name="struts.patternMatcher" value="regex" />
正則表達式可以有兩種形式,最簡單的一種是
{FIELD_NAME}
,在這種情況下,與FIELD_NAME
領域的 行動將與匹配的文本來填充,例如:<package name="books" extends="struts-default" namespace="/"> <action name="/{type}/content/{title}" class="example.BookAction"> <result>/books/content.jsp</result> </action> </package>
在這個例子中,如果
/fiction/content/Frankenstein
是 請求的URL,BookAction的領域「type
」將被設置爲「fiction
「,並且 字段」title
「將被設置爲」Frankenstein
「。
這是絕對好的,並且如果您在普通的Action方法中讀取這些變量,例如,它就可以正常工作。
如果您嘗試從prepare()
方法中讀取它們,則它們爲空,因爲PrepareInterceptor
在負責設置參數的其他攔截器之前運行;解決這個問題的常用方法是使用貼切的攔截器棧得到執行prepare()
方法時已經填充的參數...
<!-- An example of the paramsPrepareParams trick. This stack
is exactly the same as the defaultStack, except that it
includes one extra interceptor before the prepare interceptor:
the params interceptor.
This is useful for when you wish to apply parameters directly
to an object that you wish to load externally (such as a DAO
or database or service layer), but can't load that object
until at least the ID parameter has been loaded. By loading
the parameters twice, you can retrieve the object in the
prepare() method, allowing the second params interceptor to
apply the values on the object. -->
這對於產生的參數的偉大工程從頁面,但它不適用於由高級通配符設置的參數。他們仍然是空的。
如何解決此問題?