Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.5.7 为action元素指定method属性

对于图3.17所示的JSP页面,一个表单元素里包含两个按钮,分别提交给不同的处理逻辑。Struts 2还提供了一种处理方法,即将一个Action处理类定义成多个逻辑Action。

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

例如,如下的配置片段:

<!-- 定义名为login的Action,该Action的实现类为LoginAction
    处理用户请求的方法为login -->
<action name="login" class="lee.LoginAction" method="login"/>
    ...
</action>

通过这种方式将一个Action类定义成多个逻辑Action,Action类的每个处理方法被映射成一个逻辑Action。

下面是本示例的struts.xml文件代码。

程序清单:codes\03\3.5\method\WEB-INF\src\struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- Struts 2的Action必须放在指定的包空间下定义 -->
    <package name="struts2qs" extends="struts-default">
          <!-- 配置名为login的Action,该Action采用默认的execute方法处理用户请求 -->
          <action name="login" class="org.crazyit.struts2.action.LoginRegistAction">
                <!-- 下面定义了2个Result映射 -->
                <result name="error">/WEB-INF/content/error.jsp</result>
                <result name="success">/WEB-INF/content/welcome.jsp</result>
          </action>
          <!-- 配置名为regist的Action,该Action采用regist方法处理用户请求 -->
          <action name="regist" class="org.crazyit.struts2.action.LoginRegistAction"
                method="regist">
                <!-- 下面定义了2个Result映射 -->
                <result name="error">/WEB-INF/content/error.jsp</result>
                <result name="success">/WEB-INF/content/welcome.jsp</result>
          </action>
          <action name="*">
                <result>/WEB-INF/content/{1}.jsp</result>
          </action>
    </package>
</struts>

上面定义了login和regist两个逻辑Action,它们对应的处理类都是org.crazyit.struts2.action. LoginRegistAction,该Action类的代码上面已经给出,此处不再赘述。login和regist两个Action虽然有相同的处理类,但处理逻辑不同——处理逻辑通过 method 方法指定,其中名为 login的Action对应的处理逻辑为默认的execute方法,而名为regist的Action对应的处理逻辑为指定的regist方法。

将一个Action处理类定义成两个逻辑Action后,可以再修改JSP页面的JavaScript代码。修改regist函数的代码为如下形式。

function regist()
{
    //获取页面的第一个表单
    targetForm = document.forms[0];
    //动态修改表单的action属性
    targetForm.action = "regist";
    //提交表单
    targetForm.submit();
}

通过这种方式,一样可以实现上面的效果。当浏览者单击“登录”按钮时,将提交给Action类的登录逻辑处理;当浏览者单击“注册”按钮时,将提交给Action类的注册逻辑处理。

再次查看上面struts.xml文件中的两个<action .../>元素定义,我们发现两个<action .../>定义的绝大部分相同,因此,这种定义相当冗余。为了解决这个问题,Struts 2还有另一种更简洁的配置:使用通配符的配置方式。