JFinal学习--04Handler

来源:互联网 发布:淘宝助理csv文件制作 编辑:程序博客网 时间:2024/05/18 14:27

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);
的效果。

这里写图片描述

0 0
原创粉丝点击