在Struts 1.1之後,很多的請求分配職責都落入了RequestProcessor的手上,ActionServlet則專責於組態配置及應用程式模組的設定。
RequestProcessor採取 Command 模式,根據客戶端的請求呼叫Action物件,其分配的依據是客戶端請求的URI及Action物件的對應,這些都設定在struts- config.xml的<action-mappings>標籤中。
<action-mappings>用來描述一組ActionMapping物件,當中的每一個<action> 標籤都對應一個ActionMapping物件,當客戶端發出請求至RequestProcessor時,請求的URI對應於< action>標籤中設定的path屬性,而要呼叫的Action物件則是type屬性所設定的物件,RequestProcessor會將請求的 執行工作交給該Action物件來執行。
舉個例子來說,如果<action-mappings>設定如下的話:
...
<action-mappings>
<action
path="/hello"
type="onlyfun.caterpillar.HelloAction">
....
</action>
<action
path="/login"
type="onlyfun.caterpillar.LoginAction">
....
</action>
</action-mappings>
...
<action-mappings>
<action
path="/hello"
type="onlyfun.caterpillar.HelloAction">
....
</action>
<action
path="/login"
type="onlyfun.caterpillar.LoginAction">
....
</action>
</action-mappings>
...
則當請求的URL是http://localhost:8080/strutsapp/hello.do時, RequestProcessor會使用/hello.do來確認對應的ActionMapping物件(實際上即找出path設定為/hello的 <action>標籤),該ActionMapping物件告知RequestProcessor要使用 onlyfun.caterpillar.HelloAction,而後RequestProcessor會將呼叫HelloAction的 execute()方法,並將ActionMapping物件當作參數傳遞給它。
RequestProcessor實際上將工作交給Action物件,Action物件在第一次被呼叫時產生,之後一直使用它。 Action物件的運作必須提供一些參數來描述工作的細節,諸如使用哪一個ActionForm、forward對象的查找、錯誤發生時的頁面對象等等, Struts將這些資訊包裝在ActionMapping中,並作為參數傳送給Action物件,以使得Action在需要相關的資訊時可以從 ActionMapping中取得。
如果客戶端請求了struts-config.xml中沒有定義的資源,Struts會丟出 404 Invalid path 的訊息,您可以撰寫匿名的ActionMapping來提供自己的錯誤訊息:
...
<action>
name="error"
unknown="true"
forward="/WEB-INF/pages/error.jsp"/>
...
<action>
name="error"
unknown="true"
forward="/WEB-INF/pages/error.jsp"/>
...
如果RequestProcessor遇到沒有定義的Action請求,則會交由匿名的ActionMapping來處理。
在<action>標籤中會使用<forward>標籤,用於查找與指定Action物件完成之後,要轉發請求回應的去向,您使 用ActionMapping的findForward()方法來查找對應的forward對象,另外,您也可以提供一個< global-forward>設定,如果ActionMapping的findForward()方法找不到指定的forward對象,則會查找 <global-forward>所設定的對象,一個設定例子如下:
- struts-config.xml
...
<struts-config>
<global-forwards>
<forward
name="welcome"
path="/welcome.do"/>
</global-forwards>
<action-mappings>
<action
path="/welcome
type="onlyfun.caterpillar.WelcomeAction">
<forward
name="welcomeUser"
path="/WEB-INF/pages/welcome.jsp"/>
</action>
<action
path="/hello"
type="onlyfun.caterpillar.HelloAction">
<forward
name="helloUser"
path="/WEB-INF/pages/hello.jsp"/>
</action>
<action-mappings>
</struts-config>
...
<global-forward>提供一個全局可查找的forward對象,在Struts的組態中,可以為每一個< action>標籤指定forward對象,如果在<action>中查找不到,就會至<global- forward>中查找。對於一些共同使用的forward對象,您可以集中於<global-forward>中管理。
在Struts中,ActionMapping繼承自ActionConfig,大部份的屬性定義實際上都已經在ActionConfig 中完成,在將來ActionMapping有可能會被AutoConfig所取代,不過在目前ActionMapping仍舊存在,根據線上API的說 明,存在的事實基於它仍是現存應用程式所使用到的類別。