首页 > 代码库 > struts2 action详解

struts2 action详解

action映射是struts2框架的基本工作单元,通常,action配置将一个标识符映射到一个业务逻辑的class,当一个请求同action的名字匹配时,框架通过这种映射决定怎么处理请求。一个通常的action如下
<action name="Logon" class="tutorial.Logon">
  <result >welcome.jsp</result>
  <result name="input">/Logon.jsp</result>
</action>
    注意,如果一个action的name中需要有/例如<action name="admin/home" class="tutorial.Admin"/> ,需要在配置文件中struts.xml添加如下<constant name="struts.enable.SlashesInActionNames" value="http://www.mamicode.com/true"/> 同时,action的name中最好别使用.和/     通常由一个表单连接到一个action用来处理表单提交的数据。
<s:form action="Login">
    <s:textfield label="UserName" name="name"/>
    <s:submit/>
</s:form>
    默认的,action执行时会执行actioin的execute()方法。但是,我们可以手动的指定action的执行方法。
<action name="delete" class="example.CrudAction" method="delete">将会在指派到action时执行action的delete()方法。如果action中没有execute()方法并且也没指定别的方法,则框架会抛出一个异常。

      通配符:很多时候,我们需要不同的action name指向同一个class并执行与该action name相关的方法,
<action name="*Crud" class="example.Crud" method="{1}"> 其中*就是通配符,该action可以匹配任何形如*Crud.action的请求,同时执行该action的*方法。例如一个请求如deleteCrud.action,则会执行该actiond的delete()方法。*可以在name的任意位置如Crud_*。当我们需要为这种通配符方式的action使用校验框架或转换框架时时,可以这样 Crud_input-validation.xml Crud_delete-conversion.xml    动态方法调用:我们可以在填写表单的action时使用例如Login!login.action动态的指派调用Login的login方法。不过,还是推荐使用通配符的方式进行动态匹配。因为使用通配符方式可以为不同的请求单独的建立检验文件等
    如果一个action的class属性未指定,则默认将com.opensymphony.xwork2.ActionSupport 作为class属性
<action name="Hello">
     //....</action>      ActionSupport类有一个execute()方法返回SUCCESS和一个input()方法返回INPUT,我们可以通过
在packaeg里写上<default-class-ref name=”default.class”>指定我们自定义的默认类

    默认action:有时候请求的action没有找到,服务器就会返回404错误,我们可以指定一个默认action,当所有其他的action都没匹配上时就会执行那个默认的action。方法如下
<package name="Hello" extends="action-default">
    <default-action-ref name="UnderConstruction">
    <action name="UnderConstruction">
        <result>/UnderConstruction.jsp</result>
    </action>
</package>
    我们可以在不同的package中定义不同的默认action,但是一个命名空间只能指定一个默认action

    一个好习惯就是永远不要从一个页面直接链接到另一个页面,而是通过action链接到别的页面。我们可以通过通配符的方式实现
<action name="*">
  <result>/{1}.jsp</result>
</action>
    关于通配符的使用*代表一或多个字符除了/
**代表一或多个字符包括/
    若想在在action name中使用特殊字符例如*而不是用*来表示匹配可以用 \ 来转义。例如\*name就代表名字为*name的action

struts2 action详解