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
|
struts2的Action配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.