2010年10月6日 星期三

Struts 教學 - DispatchAction 運用

在 Struts 處理請求過程中,處理請求的過程通常都是透過組態檔(struts-config.xml)

找到所設定的路徑並分派到所指定的 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);
    }
}

沒有留言:

張貼留言