找到所設定的路徑並分派到所指定的 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); } }
沒有留言:
張貼留言