The action mappings are the basic "unit-of-work" in the framework.
Essentially, the action maps an identifier to a handler class. When a
request matches the action's name, the framework uses the mapping to
determine how to process the request.
Action映射是框架的最基本的工作單元,本質上,action映射一個id到處理類,當一個請求匹配action名稱,框架用映射來決定怎樣處理這個請求。
Action Mappings
The action mapping can specify a set of result types, a set of exception handlers, and an interceptor stack. But, only the name attribute is required. The other attributes can also be provided at package scope.
Action映射能夠描述N多的result type,n多的Exception handle,和一個interceptor棧,但是,只有name屬性是需要的,其他屬性也能夠在package級別提供。
<action name="Logon" class="tutorial.Logon">
<result type="redirect-action">Menu</result>
<result name="input">/tutorial/Logon.jsp</result>
</action>
Action Names
In a web application, the name attribute is matched a part
of the location requested by a browser (or other HTTP client). The
framework will drop the host and application name and the extension,
and match what's in the middle. So, a request for http://www.planetstruts.org/struts2-mailreader/Welcome.do
will map to the Welcome action.
在一個Web應用中,name屬性匹配來自瀏覽器的一系列本地請求。框架能夠去掉主機和應用名,以及擴展名,來比配中間的那個名稱,所以請求.....將映射Welcome Action。
Within an application, the link to an action is usually generated by
a Struts Tag. The tag can specify the action by name, and the framework
will render the default extension and anything else that is needed.
在一個應用里面,action的link通常有StrutsTag產生,tag能夠用名字描述,框架將渲染默認擴展和其他它需要的任何東西。
<s:form action="Hello">
<s:textfield label="Please enter your name" name="name"/>
<s:submit/>
</s:form>
 |
Action Names With Slashes
If your action names have slashes in them (for example, <action name="admin/home" class="tutorial.Admin"/>) you need to specifically enable that functionality via the struts.xml file by specifying <constant name="struts.enable.SlashesInActionNames" value="true"/>. See JIRA Issue WW-1383 for discussion as there are side effects to setting this property to true.
|
Action Methods
The default entry method to the handler class is defined by the Action interface.
Handler類的默認入口方法被定義在Action 接口里。
public interface Action {
public String execute() throws Exception;
}
Implementing the Action interface is optional. If Action is not implemented, the framework will use reflection to look for an execute method.
實現Action接口是可選的,如果沒有實現,框架自動用反射技術來搜尋execute方法。
Sometimes, developers like to create more than one entry point to an
Action. For example, in the case of of a data-access Action, a
developer might want separate entry-points for create, retrieve, update, and delete. A different entry point can be specified by the method attribute.
有時,在Action里,開發者喜歡創建多于一個入口,例如,在data-access Action案例中,一個developer可能象區分Create,retrieve,update和delete等各種入口點。一個不同的入口點可以被教書在method屬性中。
<action name="delete" class="example.CrudAction" method="delete">
If there is no execute method, and no other method, specified in the configuration, the framework will throw an exception.
Wildcard Method
Many times, a set of action mappings will share a common pattern. For example, all your edit actions might start with the word "edit", and call the edit method on the Action class. The delete actions might use the same pattern, but call the delete method instead.
很多時候,一系列的action因設將給一個通用模式共用,例如,你的所有edit action可能用“edit”開頭,調用Action里的ecit方法。Delete Action可能用同樣的方式,調用所有delete方法。
Rather than code a separate mapping for each action class that uses this pattern, you can write it once as a wildcard mapping.
不用為每個action以同樣的模式寫映射,你可以以疲憊符的方式只寫一遍。
<action name="*Crud" class="example.Crud" method="{1}">
Here, a reference to "editCrud" will call the edit method on an instance of the Crud Action class. Likewise, a reference to "deleteCrud" will call the delete method instead.
Another common approach is to postfix the method name and set it off
with an exclamation point (aka "bang"), underscore, or other special
character.
另一個通用的方式是使用前綴
- "action=Crud_input"
- "action=Crud_delete"
To use a postfix wildcard, just move the asterisk and add an underscore.
<action name="Crud_*" class="example.Crud" method="{1}">
From the framework's perspective, a wildcard mapping creates a new
"virtual" mapping with all the same attributes as a conventional,
static mapping. As a result, you can use the expanded wildcard name as
the name of validation, type conversion, and localization files, just
as if it were an Action name (which it is!).
- Crud_input-validation.xml
- Crud_delete-conversion.xml
The postfix "!" notation is also available in WebWork 2, but it is implemented differently. To use the old implementation, set struts.enable.DynamicMethodInvocation=TRUE in the struts.properties file. To use wildcards instead (preferred), set struts.enable.DynamicMethodInvocation=FALSE.
ActionSupport Default
If the class attribute in an action mapping is left blank, the com.opensymphony.xwork.ActionSupport class is used as a default.
如果不寫class屬性,com.opensymphony.xwork.actionSupport類默認被使用。
<action name="Hello">
</action>
The ActionSupport class has execute and input methods that return "success".
ActionSupport類有execute和input方法,并且都返回"success".
To specify a different class as the default Action, set the package attribute.
設置package的attribute,可以指定其他類為默認Action
For more about using wildcards, see Wildcard Mappings.
Post-Back Default
A good practice is to link to actions rather than pages. Linking to
actions encapsulates which server page renders, and ensures that an
Action class can fire before a page renders.
Another common workflow stategy is to first render a page using an alternate method, like input and then have it submit back to the default execute method.
Using these two strategies together creates an opportunity to use a
"post-back" form that doesn't specify an action. The form simply
submits back to the action that created it.
一個最佳實踐是鏈接一個action而不是page,鏈接到一個被server page渲染器包裝的action,確保頁面渲染之前,action類能被渲染。
另一個通常的工作流策略是用一個變通的方法渲染頁面,例如input,然后使它提交返回到默認的execute方法。
把這兩中策略結合起來,創建一個條件來使用沒有action的“Post-back” Form,那個Form簡單地返回創建它的他個action。
<s:form>
<s:textfield label="Please enter your name" name="name"/>
<s:submit/>
</s:form>
Action Default
Usually, if an action is requested, and the framework can't map the
request to an action name, the result will be the usual "404 - Page not
found" error. But, if you would prefer that an ominbus action handle
any unmatched requests, you can specify a default action. If no other
action matches, the default action is used instead.
通常,如果一個action被請求,而fromework不能映射那個請求到一個action名字,結果通常使一個“404-Page not found ”錯誤。但是,如果你更熱衷于一個能處理任何不匹配請求的萬能action,你能描述一個默認的action。如果沒有其他action匹配,默認的action被使用。
<package name="Hello" extends="action-default">
<default-action-ref name="UnderConstruction">
<action name="UnderConstruction">
<result>/UnderConstruction.jsp</result>
</action>
There are no special requirements for the default action. Each
package can have its own default action, but there should only be one
default action per namespace.
 |
One to a Namespace
The default action features should be setup so that there is only
one default action per namespace. If you have multiple packages
declaring a default action with the same namespace, there is no
guarantee which action will be the default.
|
Wildcard Default
Using wildcards is another approach to default actions. A wildcard
action at the end of the configuration can be used to catch unmatched
references.
<action name="*" >
<result>/{1}.jsp</result>
</action>
When a new action is needed, just add a stub page.