找到所設定的路徑並分派到所指定的 Action 處理。
如果你有一連串或是較相關的動作須執行,假如有四個動作
那你就可能必須分別撰寫四個 Action 來處理不同的動作....是有點麻煩
不過如果透過 DispatchAction 的話就會變的更加容易
首先運作原理是透過繼承 Action 的子類別 DispatchAction
緊接著你不必覆寫 execute() 這個 method
你可以透過請求參數決定你要的實際操作方法
簡單說如果你有個動作需要登入,那你可以在 form 標籤的 action 這樣寫
action="/.......do?method=login"
以上我直接給他一個 請求參數叫method,參數值叫 login
接著看一下組態檔(struts-config.xml) 的 action 標籤的設定需加入 parameter 屬性
<action name="User" path="/login" type="test.Login" parameter="method" >
.......
</action>
接著你再建立一個 DispatchAction 並實做你真正處理請求的方法
public class Login extends org.apache.struts.actions.DispatchAction
{
//login 為請求參數值
public ActionForward login(ActionMapping map,
ActionForm actionform,
HttpServletRequest request,
HttpServletResponse response){
//deal with something........
}
}
以上是簡單的說明,接下來我以一個範例再加以說明他的好處
以下程式可以讓你進行建立使用者 > 更新帳號密碼 > 刪除使用者
此為一個一連串動作,同在 show.jsp 進行
show.jsp
//...html 省略部份...
<h1>Use to add, update and delete</h1>
<c:if test="${sessionScope.step eq null || sessionScope.step eq 'step1'}">
Step 1 : create User<br /> //建立新的帳號
<form action="/funinStruts/process.do?method=create" method="post">
Username : <input type="text" name="username" /><br />
Password : <input type="text" name="password" /><br />
<input type="submit" value="create" /><br />
</form>
</c:if>
<c:if test="${sessionScope.step eq 'step2'}">
<form action="/funinStruts/process.do?method=update" method="post">
Step 2 : update a new<br /> //更新帳號
Username : <input type="text" name="username" value="${sessionScope.user}"/><br />
Password : <input type="text" name="password" value="${sessionScope.pawd}"/><br />
<input type="submit" value="update" /><br />
</form>
</c:if>
<c:if test="${sessionScope.step eq 'step3'}">
<form action="/funinStruts/process.do?method=delete" method="post">
Step 3 : delete now !!<br /> //請刪除此帳號
Your new Username : ${sessionScope.user}<br />
Yuor new Password : ${sessionScope.pawd}<br />
<input type="submit" value="delete" /><br />
</form>
</c:if>
<c:if test="${sessionScope.step eq 'step4'}">
bye bye !! //結束
</c:if>
以上以 if 判斷是判斷目前的步驟,當 session 的 step 屬性
為 null 或是 step1 時就是代表使用者第一次拜訪此網頁或是
帳號密碼沒填寫完成都會停留在 step1
要注意的是每個請求路徑後面都有加一個 method="XXX" 代表不同的操作
接下來看一下組態檔的設定(struts-config.xml)
<action name="User" path="/process" scope="session"
type="fsc.dispatchAction.Process" validate="false"
parameter="method">
<forward name="success" path="/dispatchAction/show.jsp" />
</action>
最後是 DispatchAction 的撰寫
package fsc.dispatchAction;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class Process extends org.apache.struts.actions.DispatchAction{
private static final String SUCCESS = "success";
//method=create
public ActionForward create(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
User user = (User)form;
HttpSession sess = request.getSession();
//如果沒傳入或是沒填寫 username 以及 password 參數時則返回到 step1
if(user.getUsername().equals("") || user.getPassword().equals("") || user.getUsername() == null || user.getPassword() == null){
sess.setAttribute("step", "step1");
return mapping.findForward(SUCCESS);
}else{
sess.setAttribute("user",user.getUsername());
sess.setAttribute("pawd", user.getPassword());
sess.setAttribute("step", "step2");
return mapping.findForward(SUCCESS);
}
}
//method=update
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
User user = (User)form;
HttpSession sess = request.getSession();
sess.setAttribute("user",user.getUsername());
sess.setAttribute("pawd", user.getPassword());
sess.setAttribute("step", "step3");
return mapping.findForward(SUCCESS);
}
//method=delete
public ActionForward delete(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
User user = (User)form;
HttpSession sess = request.getSession();
sess.removeAttribute("user");
sess.removeAttribute("pawd");
sess.setAttribute("step", "step4");
return mapping.findForward(SUCCESS);
}
}
沒有留言:
張貼留言