struts2的Action配置

action配置
action映射在框架中是基本的工作單元。本質上action將一個標識符映射到一個處理類。
當一個請求匹配action名字的時候,框架使用映射去決定怎麼處理請求
action映射
action映射能指定一系列結果類型,一系列異常處理,一個攔截器棧。只有name屬性需要設置。其他屬性在配置文件中也有提供。
A Logon Action
<action name="Logon" class="tutorial.Logon">
  <result type="redirectAction">Menu</result>
  <result name="input">/Logon.jsp</result>
</action>
action的name屬性
在一個web應用程序中,name屬性會跟瀏覽器(或者其他http客戶端)的請求地址的部分匹配。框架會去除主機和應用名以及擴展名,
然後匹配中間的action名
所以一個http://www.planetstruts.org/struts2-mailreader/Welcome.do請求會映射到Welcome action
在應用程序內,一個到action的鏈接一般都是有struts的tag生成的。這個tag可以通過name指定action,框架會實施默認的擴展和一些其他需要的東西。
表單也可以直接提交到一個struts的action name(而不是 “raw” URI)
<s:form action="Hello">
    <s:textfield label="Please enter your name" name="name"/>
    <s:submit/>
</s:form>
注意:action name的斜槓,點,虛線
如果在你的action的name屬性中有斜槓(如,<action name="admin/home" class="tutorial.Admin"/>)
你就需要在struts.xml中通過constant進行指定
<constant name="struts.enable.SlashesInActionNames" value="true"/>
如果在你的action的name屬性中有點(.)或者虛線(-),可能就會引起錯誤,所以最好命名使用字母或者帶下劃線的名字
action的方法
處理類的默認入口方法由action接口定義
publicinterface Action {
    public String execute() throws Exception;
}
說明:實現這個action接口是可選的,如果action沒有被實現,框架會用反射去尋找一個execute方法
有時候,開發者喜歡給action建立多個入口。如,數據訪問action情況下,開發者可能想分離入口,create,retrieve,update,delete,
每一個不同的入口點可以通過method屬性指定
<action name="delete" class="example.CrudAction" method="delete">
注意:如果沒有execute方法也沒有在配置文件中指定方法,則會拋出異常
如果在action中沒有發現delete方法,DefaultActionInvocation會嘗試調用doDelete
通配符方法
很多時候,一系列的action映射會使用同一個映射模式。列如,所有的edit actions可能會以"edit"開頭,調用action類的edit方法。
Delete actions可能使用同樣的映射模式,但是調用delete方法作爲代替。
不是爲每一個action類各寫一段映射,通過通配符方法,你可以只寫一次。
<action name="*Crud" class="example.Crud" method="{1}">
這樣,引用"editCrud"action時,將會調用Crud action類實例的edit方法。
另外一種共通的方法是讓方法名的前綴一樣,用驚歎號,下劃線,或者其他特殊字符來分離
"action=Crud_input"
"action=Crud_delete"
使用前綴通配符,僅需要去除星號,然後加上下劃線
<action name="Crud_*" class="example.Crud" method="{1}">
從框架的角度看,一個通配符映射將新建了一個新的,所有屬性都相同的"虛"映射,就像一個常規的靜態映射。
所以你可以使用擴展的通配符名字作爲驗證,類型轉換以及信息資源文件的名字,就好像他是一個action name。
Crud_input-validation.xml
Crud_delete-conversion.xml
如果通配符方法映射在action name中使用感嘆號(!),通配符方法將會和另一種靈活的映射方法重疊,動態方法調用。
想要使用包含感嘆號的action name,就要在應用程序配置中
設定struts.enable.DynamicMethodInvocation成FALSE。
動態方法調用
在WebWork2中新加入了一個特性,用感嘆號(!)調用方法而不是execute。在webwork中,他不是真正的有一個名字。就像上面提到的,
使用一個新術語"dynamic method invocation"
去描述WW/S2怎麼使用感嘆號的。
Dynamic Method Invocation (DMI)將會在action name中使用字符串然跟着一個感嘆號(!)作爲一個調用的方法名(代替 execute)。
 "Category!create.action"意味着使用"Category" 映射,調用create方法。
對於struts2,我們因爲兩個原因增加了一個開關去禁用DMI。第一,DMI會導致安全問題。第二,DMI和通配符方法特性重疊了。如果你也有安全意識
或者可能通過通配符方法action使用感嘆號,那就應用程序配置中 struts.enable.DynamicMethodInvocation設定爲FALSE。
在struts2.3中,對於DMI的調用是可選的。第一步,在<package>元素中設置屬性strict-method-invocation="true",這個屬性設置告訴框架拒絕方法,
這個方法沒有通過method屬性(包括通配符)或者<allowed-methods>tag明確設定。
注意,你可以指定<allowed-methods>即使沒有strict-method-invocation。這個約束訪問只爲含有<allowed-method>的特殊action
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
<struts>
  <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  <package name="default" extends="struts-default" strict-method-invocation="true">
    <action name="index" class="org.apache.struts2.examples.actions.Index">
        <result name="success" type="redirectAction">hello</result>
    </action>
    <action name="hello" class="org.apache.struts2.examples.actions.HelloAction">
        <result name="success">/WEB-INF/content/hello.jsp</result>
        <result name="redisplay" type="redirectAction">hello</result>
        <allowed-methods>add</allowed-methods>
    </action>
  </package>
</struts>
ActionSupport 默認
如果類的action mapping屬性爲空,默認使用 com.opensymphony.xwork2.ActionSupport類
<action name="Hello">
   // ...
</action>
注意1:ActionSupport類有個返回"success"的execute方法和一個返回"input"的input方法
注意2:想要指定一個不同的類作爲默認的action類,設定default-class-ref package屬性
Action 默認
通常如果一個action被請求了,但是不能映射到一個action名,這時就會返回"404 - page not found"錯誤.但是如果你想使用另外一種方法處理不匹配的請求
你可以指定一個默認的action。如果沒有action匹配,則會使用默認的action。
<package name="Hello" extends="action-default">
    <default-action-ref name="UnderConstruction"/>
    <action name="UnderConstruction">
        <result>/UnderConstruction.jsp</result>
    </action>
    ...
對於默認的action沒有特殊的需求。每一個package都能有他自己的默認action,但是每一個namespace只能有一個默認的action
通配符 默認
使用通配符是另外一種設定缺省的action的方法。一個在配置最後的通配符action可以被用作捕獲不匹配的應用
<action name="*">
  <result>/{1}.jsp</result>
</action>

翻譯自http://struts.apache.org/docs/action-configuration.html
發佈了43 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章