JFinal之404页面渲染问题

Jetmark 发布于 2013/05/15 09:36
阅读 918
收藏 1

在JFinal的配置文件中,设置了全局的404页面,代码 如:setError404View("/404.html")。同时定义了全局的SiteInterceptor用来初始化网站的一些路径变量如:setAttr("urlroot","xxx")。当访问的页面地址不存在时,JFinal会自动导向该404页面,但其中设置的变量${urlroot}却不能正常解析,而在controller中使用render("/404.html")却是可以的。
如何让404页面也能通过拦截器解析网页内容?@JFinal

加载中
0
JFinal
JFinal

    这种情况是因为请求不是actoin,还没走SiteInterceptor,建议改用 SiteHandler来实现,在调用nextHandler.handle之前来设置值:

public class SiteHandler extends Handler {
  public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
    request.setAttribute("urlroot", "xxx");
    nextHandler.handle(target, request, response, isHandled);
  }
}

JFinal
JFinal
回复 @Jetmark : 虽然 Handler不能象拦截器那样清除掉,但是你可以在Handler判断哪些请求是应该处理的,可以跳过不想处理的请求,相当于清除了
Jetmark
Jetmark
采用Handler也可以的,但是如果我有的页面不需要这个Handler,是否也可以象清除拦截器那样(ClearInterceptor),也可以禁止某个Handler呢,又该如何禁止或灵活设置呢?
0
JFinal
JFinal

    如果上面这个方案觉得不够完美,现在提供一个完美的方案给你:

public class MyErrorRenderFactory implements IErrorRenderFactory {
  public Render getRender(int errorCode, String view) {
      return new MyErrorRender(errorCode, view);
  }

  class MyErrorRender extends ErrorRender {
      public MyErrorRender(int errorCode, String view) {
          super(errorCode, view);
      }
      public void render() {
          request.setAttribute("urlroot", "xxx");
          super.render();
      }
  }
}
然后在 YourJFinalConfig 中注册一下:
me.setErrorRenderFactory(new MyErrorRenderFactory());

解决后反馈给我

PS:JFinal 1.4 才支持的新特性

Jetmark
Jetmark
OK,这个方案对404应该是可以的。一般来说,404错误的页面是需要一些环境或数据变量的,Handler在POST等方式下也还是执行的,对页面众多的情况下采用条件判断不太可行。这个类也就是单独对404页进行了处理,比用Handler要好得多。那505页面呢,是否也要单独做一个类进行处理,对这些特殊页面的渲染是否这就是最完美的解决方案?
返回顶部
顶部