• freemarker的TemplateExceptionHandler使用


    系统使用freemarker作为页面展示层,为了解决系统统一异常的问题。于是配置了struts2的统一异常解决的方法(这个网上资料非常多,大家能够查看),但是发现freemarker出现异常后,struts2的全局异常处理仍然捕捉不到这个异常。分析源代码之后发现struts2的FreemarkerResult在解析FTL文件的时候依据Configuration的属性去推断其属性TemplateExceptionHandler是否为"RETHROW_HANDLER"。也就是说是否抛出这个异常,假设抛出则因为FremarkerResult的这些代码是由struts2操作的(大家能够看源代码,事实上上终于是由DefaultActionInvocation的executeResult来调用的,这个类是贯穿拦截器、action、result的一个核心调动类。详细的这里我们不做讨论)。所以假设一旦Freemarker抛出异常,则这个异常会被struts2的全局异常处理来解决。否则就会由freemarker自己解决,就会报那种黄色的非常恶心的页面。FreemarkerResult代码截图例如以下:


    当中上边被选中的蓝色部分就是让freemarker自己来处理这个异常。这样struts2就捕捉不到了。那么,默认情况下struts设置的是HTML_DEBUG_HANDLER的,大家能够在TemplateExceptionHandler这个接口的成员变量定义中看到这个静态属性的详细实现代码,顾名思义或者大家去看这个代码,实际上这样的方式就是输出我们平时看到的FTL报空指针等时输出的那堆非常恶心的东西,这个struts2是捕捉不到这个异常的。

    问题找到了。解决思路就非常easy了,如今有两种方法:

             1)在freemarker.properties中设置:template_exception_handler=rethrow,这个rethrow也是在TemplateExceptionHandler接口中定义的。
             2)想办法设置freemarker的Configuration中该变量,比方我们项目中我扩展了struts2的FreemarkerManger。然后在当中设置了这个属性。

            好了。以上的问题就说完了。这样处理后struts的全局异常问题就能攻克了。那么万一你使用了sitemesh。并且你在装饰模板的FTL文件里使用了session的属性,相同万一你的session被清空后,也会报一堆黄色的东西,这个struts2也不会捕捉到。这是由于当sitemesh运行自己的逻辑时,strust2的逻辑已经运行完成,所以再抛什么异常struts2是无法获取到的,那么究竟该怎么处理呢?我们会在还有一个博文中对sitemesh的源代码和设计思路进行分析。然后来解决问题。

  • 相关阅读:
    [ActionScript3.0] 运用JPEGEncoderOptions或者PNGEncoderOptions保存图片到本地
    [AIR] 在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持
    [ActionScript 3.0] flash如何访问父级或者舞台上的变量、函数等的方法
    [ActionScript 3.0] 自定义顶级类
    [ActionScript&Flex] FlashBuilder编译条件之如何屏蔽调试代码
    [ActionScript 3.0] LocalConnection示例
    [ActionScritp 3.0] 使用LocalConnection建立通信
    [AIR] Screen 的应用
    [ActionScript 3.0] AS3 对XML的操作,创建、删除、增加节点方法
    [ActionScript 3.0] AS3.0 水面波纹效果
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5075572.html
Copyright © 2020-2023  润新知