1.0          其他語言
 
 

3.3.2 帶成功/失敗驗證的分發器

 
 

有些請求需要在伺服器端進行驗證。比如,當使用者在網頁上建立一個訂單,提交到應用伺服器上。應用伺服器會檢查使用者輸入的資料,如果找到錯誤,就給出出錯資訊,比如訂單已經存在之類。

不止是新建/更新需要顯示成功/失敗頁面。某些其他型態的請求,同樣需要進行驗證。就像我們大家都知道的,當使用者登陸的時候,系統會檢查使用者的密碼。這是一個普通的帶驗證的查詢請求。

VelocityWeb 使用彈出窗口讓使用統一的成功/失敗頁面變得容易。當使用者收到一個失敗資訊,他/她可以關閉彈出窗口,在主窗口修正輸入的錯誤資料。成功要訣頁面會將主頁面導向新的頁面。比如,當使用者增加到一新的訂單到系統中,系統通常會轉到顯示訂單列表的頁面。

當使用者看到失敗要訣時,輸入的資料並不會遺失,因為要訣是位于彈出窗口中。輸入資料的窗口然後保留在那里。

這里有一個登陸的範例代碼,包含資料輸入頁面,登陸處理頁面。

public class LoginInputDispatcher extends QueryDispatcher {

    public boolean process(HttpServletRequest request, WebAppContext webContext, Controller controller)
            throws Exception {
        this.setHtmlTemplateFileName("user/login.htm");
        this.setPageTitle("Login page");

        webContext.put("result_win_url", DispatcherTreeManager.getUrl(ShowProcessResultDispatcher.class));
        webContext.put("target_process_url", DispatcherTreeManager.getUrl(LoginProcessDispatcher.class));
        
        //remember enter url, after login, jump to it.
        webContext.put("enter_url", request.getRequestURL().toString());
        
        return true;
    }

    public String getUrlId() {
        return "login";
    }

}
	  

類 ShowProcessResultDispatcher 會顯示成功或者失敗頁面,要看 LoginProcessDispatcher.process() 的回覆值。

        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // call service to check user name and password
        UserService userService = new UserService(webContext);
        boolean passed = userService.checkPassword(username, password);
        if (!passed) {
            List errorMsgList = new LinkedList();
            errorMsgList.add("Login fail, user does not exist or wrong password.");
            webContext.put(controller.getDispatchFailMessageListTag(), errorMsgList);
            log.debug("LoginProcessDispatcher.process() fail end");
            return false;
        }	  

每個專案/產品都需要有自己的成功/失敗頁面。可以在應用程式控制器的初始化部份指定。

public class PetStoreController extends SimpleController {
    ...
    public boolean initApplication() {
	...
            // set process success template and fail template
            setDispatchFailTemplateFileName("system/dispatcher_fail.htm");
            setDispatchSuccessTemplateFileName("system/dispatcher_success.htm");
            setDispatchFailMessageListTag("fail_msg_list");
            setDispatchSuccessMessageTag("success_msg");
            setDispatchSuccessJumpUrlTag("jump_url");
            setDispatchTargetUrlTag("target_dispatcher_url");
            setDispatchSuccessStaySecondsTag("stay_seconds");	
	  

這里是驗證失敗的截圖︰

失敗資訊會放到一個列表中,因為有可能一次報出多個錯誤來。

通常,這類頁面需要美工進行處理。