假如以下頁面, form中指定action爲login, 當點擊"登陸"按鈕時,會調用login這個action的execute方法, 如今但願當點擊"註冊"按鈕時, 能調用action的另一個方法, 也就是但願login這個action中有多個處理邏輯, 當用戶作某一個操做時, 可以調用相應的處理邏輯, 問題是form元素中只能指定一個action, 默認操做是調用Action的execute方法, 那麼其它的操做若是調用Action中相應的方法呢?javascript
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib prefix="s" uri="/struts-tags" %> <html> <head> <script type="text/javascript" src="js/login.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login</title> </head> <body> <s:form action="login" method="post"> <s:textfield name="username" key="user"/> <s:textfield name="password" key="pass"/> <tr> <td><s:submit key="login"/></td> <td><s:submit key="regist" onclick="regist();" /></td> </tr> </s:form> </body> </html>
Struts2的動態方法調用(DMI)能夠解決這樣的問題, DMI使得表單元素的action屬性並非直接等於某個Action的名字, 而是以以下形式指定表單元素的action屬性:
action="ActionName!MethodName"
使用DMI的具體步驟以下:
1 設置Struts容許DMI, 即設置常量struts.enable.DynamicMethodInvocation值爲true, 方式爲在struts.xml中添加加配置<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
2 配置action對應的方法, 方法是在struts.xml文件中action標籤下的<allowed-methods>標籤下指定方法, 例如這裏要指定login這個action的regist方法, 在struts.xml中配置以下:html
<package name="action" extends="struts-default" namespace="/"> <action name="login" class="action.LoginAction"> <result name="input">/login.jsp</result> <result name="error">/view/error.jsp</result> <result name="success">/view/welcome.jsp</result> <allowed-methods>regist</allowed-methods> </action> </package>
3 完善login這個Action, 代碼以下:java
package action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{ private String username; private String password; private String tip; //省略屬性的set和get方法 public String regist() throws Exception{ ActionContext.getContext().getSession().put("user", getUsername()); setTip("恭喜您, " + getUsername() + ", 您已成功註冊!"); return SUCCESS; } public String execute() throws Exception{ ActionContext ctx = ActionContext.getContext(); Integer counter = (Integer) ctx.getApplication().get("counter"); if(counter == null){ counter = 1; }else{ counter += 1; } ctx.getApplication().put("counter", counter); if(getUsername().equals("toby") && getPassword().equals("toby")){ ActionContext.getContext().getSession().put("user", getUsername()); ctx.put("tip", "服務器提示:您已成功登陸"); return SUCCESS; } else{ ctx.put("tip", "服務器提示:登陸失敗"); return ERROR; } } }
4 增長js腳本, 當用戶點擊註冊時, 將表單的action設置爲login!regist, 方法是在頁面中引入以下腳本:服務器
function regist() { targetForm = document.forms[0]; targetForm.action = "login!regist"; }
這樣就完成了DMI配置, 當在登陸頁面點擊"登陸"時,執行login這個action的execute方法, 當點擊
"註冊時", 執行login這個Action的regist方法.jsp