應用程序越大,它裏面action mapping的數量也越多,通過使用通配符,我們可以將一些相似的mapping綁在一起,用一個比較通用的mapping來表示,在前面關於action配置的那章裏面也提到了這個通配符的使用,這裏再系統的說一下。
如下所示,有一個配置好了的action mapping:
<action
name="/edit*"
class="org.apache.struts.webapp.example.Edit{1}Action">
<result name="failure"path="/mainMenu.jsp"/>
<result path="/{1}.jsp"/>
</action>
這個action mapping可以用匹配所有以/edit開頭的對action名稱,例如/editSubscription,editRegistration等等,但是/editSubscription/add不會被匹配上。被通配符所匹配的內容將會被替換到action mapping以及result的各個屬性中去,去取代{1}。比方說/editSubscription匹配上了,那麼其中一個result的path屬性就會被框架認爲是Subscription.jsp。
要注意的是,如果一個請求的url和多個action mapping匹配上了,那麼選擇最後面的那個執行,也就是說按照從後往前的順序進行匹配查找,有一個例外就是精確匹配優先,如果有一個action mapping沒用通配符和url給匹配上了,那麼優先選擇精確匹配,摺合servlet中的匹配原則是一樣的。
通配符中幾個特殊的標記,如下所述:
*:可以匹配0個或多個任意字符,但是不包括正斜槓”/”;
**:可以匹配0個或多個任意字符,包括正斜槓’’/”在內
/:反斜槓,轉義字符。
因爲*不能匹配正斜槓,所以前面/editSubscription/add不會被匹配上。
在action mapping中,被通配符所匹配上的值可以用符號{N}來訪問,其中N是一個1到9之間的數,用來表示代替第N個被匹配上的值,說通俗點就是第N個*號所表示的內容,比方說通配符表達式是/edit*/add*/confirm*,它匹配上了/editOrder/addItem/confirmResult,那麼{1}就代表Order,{2}就代表Item,{3}就代表Result,依此類推。