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");	
	  

这里是验证失败的截图:

失败信息会放到一个列表中,因为有可能一次报出多个错误来。

通常,这类页面需要美工进行处理。