Struts學習--DMI

      假如以下頁面, 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

相關文章
相關標籤/搜索