struts2学习之---配置Action

来源:互联网 发布:淘宝必买清单怎么报名 编辑:程序博客网 时间:2024/06/04 20:56

实现了Action处理类之后,就可以在struts.xml文件中配置该Action了。

1.包和命名空间

struts2使用包来组织Action,因此,将Action定义放在包定义下完成,定义Action通过使用<package.../>下的<action.../>子元素来完成,而每个package元素配置一个包。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
配置<package.../>元素时必须指定name属性,这个属性是引用该包的唯一标识,除此之外,还可以指定一个可选的extends属性,extends属性值必须是另一个包的name属性。指定extends属性表示让该包继承另一个包,子包可以从一个或多个父包中继承到拦截器、拦截器栈、action等配置。namespace属性,定义该包的命名空间;abstract属性,指定该包是否为一个抽象包。
struts2的配置文件是从上到下处理的,所以父包应该在子包前面定义。

    <struts>        <package name="default" extends="struts-default">            <interceptors>            </interceptors>            <action >                <resault></resault>            </action>        </package>    </struts>

struts-default 在struts2-core-2.3.16.3.jar文件中,这里已经定义了struts-default抽象包,该包下包含了大量结果类型定义、拦截器定义、拦截器引用定义等。
struts2提供命名空间,主要是为了处理同一个Web应用中包含同名Action的情形,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。
当某个包指定了命名空间后,该包下所有的Action处理的URL应该是命名空间+Action名。
struts2还可以显示指定根命名空间,通过设置某个包的namespace=”/”来指定根命名空间。
默认命名空间里的Action可以处理任何命名空间下的Action请求,但是根命名空间下的Action只处理根命名空间下的Action请求。命名空间只有一个级别。

2.Action的基本配置

  定义Action时,至少需要指定该Action的name属性,该name属性既是该Action的名字,也是指定了该Action所处理的请求的URL。还需要class属性指定该Action的实现类,如果没有指定,默认使用系统的ActionSupport类。
  Action只是一个逻辑控制器,它并不直接对浏览者生成任何响应。因此,Action处理完用户请求后,Action需要将指定的视图资源呈现给用户。因此,配置Action时应该配置逻辑视图和物理视图资源之间的对应关系。
  配置逻辑视图和物理视图之间的映射关系是通过<result.../>元素来定义的,每个<result.../>元素定义逻辑视图和物理视图之间的一次映射。
  设置允许Action name中出现斜线通过struts.enable.SlashesInActionNames常量指定,该常量的值为true,即允许Action名中使用斜线。

3.使用Action的动态方法调用

对于同一个表单,当用户通过不同的提交按钮来提交同一个表单时,系统需要使用Action的不同方法来处理用户请求,这就需要让同一个Action里包含对个控制处理逻辑。

    动态调用    <!--action属性为actionName!methodName的形式,其中actionName指定提交到哪个Action,而methodName指定提交到指定方法-->    action="actionName!methodName"    jsp    <input type="submit" value="注册" onclick="regist();"/>    function regist(){        //获取页面的第一个表单        targetForm = document.forms[0];        //动态修改表单的action属性        targetForm.action="login!regist";    }

4.指定method属性及使用通配符

在配置<action.../>元素时,可以为它指定method属性,则可以让Action调用指定方法,而不是execute()方法来处理用户请求。

    <action name="" class="" method="">    </action>

即Action类的每个处理方法都映射成一个逻辑Action,前提是这些方法具有相似的方法签名:方法形参列表为空,方法返回值是String
在配置<action.../>元素时,允许在指定name属性时使用模式字符串(即用”“代表一个或多个任意字符),接下来就可以在class、method属性及<result.../>子元素中使用{N}的形式来代表前面第N个星号()所匹配的子串。

        <!--该method属性使用了一个表达式{1},该表达式的值就是name属性值    中第一个*的值-->    <action name="*Action" class="" method="{1}">    </action>

<action.../>元素的name属性使用了*之后,class属性也可以使用{N}表达式。

    <action name="*Action" class="com.hyq.{1}Action">    </action>

struts2完全可以在class属性和method属性中同时使用{N}表达式:

<action name="*_*" method="{2}" class="com.hyq.{1}Action"></action>

如果有URL为Book_save.action的请求,因为匹配了*_*的模式,且第一个*的值为Book,第二个*的值为save。
实际上struts2允许指定校验文件时准确到处理方法,即ActionName-methodName-validation.xml,所有对Book_save.action的请求,系统将优先使用BookAction-save-validation.xml校验文件。
struts2还可以在<result.../>子元素中使用{N}表达式。

    <action name="*">        <result>/WEN-INF/content/{1}.jsp</result>    </action>

假设有URL为abcAction.action请求,在struts.xml文件中配置了如下三个Action,分别为abcAction、*Action和*该使用哪个呢?而是在struts.xml文件中先找到哪个Action,就会由哪个Action来处理用户请求。除非请求的URL与Action的name属性绝对相同,否则将按先后顺序来决定由哪个Action来处理用户请求。因此将name=”*”的Action配置放在最后。

5.配置默认Action

    <package name="" extends="struts-default">        <default-action-ref name="simpleViewResultAction"/>        <action name="simpleViewResultAction" class="">        </action>    </package>

将默认Action配置在默认命名空间里就可以让该Action处理所有用户请求,因为默认命名空间的Action可以处理任何命名空间的请求。

6.配置Action的默认处理类

在struts2-core-2.3.16.3.jar压缩包的struts-default.xml文件中有如下配置:

    <package name="" extends="struts-default">        <default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>    </package>