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还有另一种更简洁的配置:使用通配符的配置方式。