JFinal学习--04Handler

JFinal中,所有请求统一通过JFinalFilter这个过滤器处理,当然我们也可以写自己的过滤器,但是必须放在 JFinalFilter之前,否则,有可能不会执行。这是因为,在JFinalFilter中,会判断 Handler是否执行完,执行完的话,会直接跳出过滤器,而不执行之后的过滤器。代码如下:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)res;
        request.setCharacterEncoding(encoding);

        String target = request.getRequestURI();
        if (contextPathLength != 0)
            target = target.substring(contextPathLength);

        boolean[] isHandled = {false};
        try {
            handler.handle(target, request, response, isHandled);
        }
        catch (Exception e) {
            if (log.isErrorEnabled()) {
                String qs = request.getQueryString();
                log.error(qs == null ? target : target + "?" + qs, e);
            }
        }

        if (isHandled[0] == false)
            chain.doFilter(request, response);
    }

其实JFinal中没有必要定义过滤器,可以使用JFinal中的Handler。

JFinal中的Handler使用了责任链模式,一个handler持有下一个handler,形成一个链条,链条的最后一个则是ActionHandler,用来处理 AOP、Action方法执行以及页面生成。

Handler 是一个抽象类,它包含一个属性 next(持有的下一个Handler),以及一个抽象方法handle, 我们自定义Handler可以通过实现这个方法,来做一些个性化处理,比如访问权限。

在过滤器中,我们可以通过
next.handle(target, request, response, isHandled);
来实现类似过滤器中
chain.doFilter(request, response);
的效果。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/leoxyk/article/details/50961074
今日推荐