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

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,将开启动态方法调用;否则将关闭动态方法调用。