1.0          其他语言
 
 

3.3.3 分发器转发

 
 

当一个请求处理完成,需要调用另一个分发器来进一步处理,可以使用“转发”。

比如,当我们增加了一个新的产品到购物车中,我们需要显示购物车内容。

public class AddItemToCartDispatcher extends QueryDispatcher {

    public boolean process(HttpServletRequest request, WebAppContext webContext, Controller controller)
            throws Exception {

        HttpSession session = request.getSession();
        Cart cart = (Cart) session.getAttribute(Cart.KEY_IN_SESSION);
        if (cart == null) {
            cart = new Cart();
        }
        String productItemId = request.getParameter("item_id");
        if (cart.containsItem(productItemId)) {
            cart.incrementQuantityByItemId(productItemId);
            return forward(ViewCartDispatcher.class, request, webContext, controller);
        }
		...
			  

如果转发的目标分发器需要读取会话(Session)中数据,需要在转发前准备好数据。

一般来说,“转发” 仅用于没有验证的查询请求。对于有验证的请求,失败的时候我们不需要使用转发,成功的时候,我们也使用弹出成功窗口来,通过它来将主窗口转到目标页面。

在切换不同的 HTML 显示页面时,不需要使用“转发”。可以调用 setHtmlTemplateFileName() 。

if (success) {
    setHtmlTemplateFileName(controller.getDispatchSuccessTemplateFileName());
    webContext.put(controller.getDispatchSuccessStaySecondsTag(), "2");
} else {
    setHtmlTemplateFileName(controller.getDispatchFailTemplateFileName());
}