3.5.6 动态方法调用
Struts 1框架提供了DispatchAction,从而允许一个Action内包含多个处理逻辑。例如对于同一个表单,当用户通过不同的请求按钮提交表单时,应该使用 Action 的不同方法来处理请求。
Struts 2同样提供了这种处理多个请求的Action,JSP页面如图3.17所示。
图3.17 包含两个提交按钮的JSP页面
上面的JSP页面包含两个提交按钮,但分别提交给Action的不同方法处理,其中“登录”按钮希望使用登录逻辑来处理请求,而“注册”按钮则希望使用注册逻辑来处理请求。
此时,可以采用DMI(Dynamic Method Invocation,动态方法调用)来处理这种请求。动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性。
<!-- action属性为action!methodName的形式 --> action="action!methodName.action"
上面JSP页面的“注册”按钮的代码如下:
<!-- “注册”按钮是一个没有任何动作的按钮,但单击该按钮时触发regist函数 --> <input type="button" value="注册" onclick="regist();"/>
单击“注册”按钮时将触发regist函数,该函数的代码如下:
function regist() { //获取JSP页面中的一个表单元素 targetForm = document.forms[0]; //动态修改目标表单的action属性 targetForm.action = "login!regist"; //提交表单 targetForm.submit(); }
上面JavaScript代码的作用是动态地修改<form.../>元素的action属性,修改后的action属性为login!regist,其实质就是将该表单提交给login Action的regist方法处理。该Action对应的处理类如下。
程序清单:codes\03\3.5\dmi\WEB-INF\src\org\crazyit\struts\action\LoginRegistAction.java
public class LoginRegistAction extends ActionSupport { // 封装用户请求参数的两个属性 private String username; private String password; // 封装处理结果的tip属性 private String tip; // username属性对应的setter和getter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } // password属性对应的getter和setter方法 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } // tip属性对应的setter和getter方法 public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } // Action包含的注册逻辑 public String regist() throws Exception { ActionContext.getContext() .getSession().put("user" , getUsername()); setTip("恭喜您," + getUsername() + ",您已经注册成功!"); return SUCCESS; } // Action包含的默认处理逻辑 public String execute() throws Exception { if (getUsername().equals("crazyit") && getPassword().equals("leegang") ) { ActionContext.getContext() .getSession().put("user",getUsername()); setTip("欢迎," + getUsername() + ",您已经登录成功!"); return SUCCESS; } else { return ERROR; } } }
图3.17所示JSP页面中的“登录”按钮就是一个普通按钮,没有任何特殊之处,当浏览者单击“登录”按钮时,系统将提交给对应 Action 的默认方法处理;当浏览者单击“注册”按钮时,系统将提交给login Action的regist方法处理。因此,如果单击“注册”按钮,将看到如图3.18所示的页面。
图3.18 使用动态方法调用
通过这种方式,我们可以在一个 Action 中包含多个处理逻辑,并可以通过为表单元素指定不同的action属性来提交给Action的不同方法。
对于使用动态方法调用的方法,例如regist方法,该方法的方法声明与系统默认的execute方法的方法声明只有方法名不同,其他的如方法参数、返回值类型都应该绝对相同。
注意
使用动态方法调用前必须设置Struts 2允许动态方法调用。开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的,设置该常量的值为true,将开启动态方法调用;否则将关闭动态方法调用。