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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWNoaWxsZXMxMjM0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

当中上边被选中的蓝色部分就是让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的源代码和设计思路进行分析。然后来解决问题。

freemarker的TemplateExceptionHandler使用的更多相关文章

  1. Freemarker 程序开发

    Freemarker 程序开发 现在web开发中,多使用freemarker 来描述页面.通常会使用的macro来定义各种组件,从而达到UI组件的复用.结合使用其它的指定,可快速的描述一个html页面 ...

  2. Using FreeMarker templates (FTL)- Tutorial

    Lars Vogel, (c) 2012, 2016 vogella GmbHVersion 1.4,06.10.2016 Table of Contents 1. Introduction to F ...

  3. Java导出Word利用freemarker(含图片)

    制作Word模版 建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码 编码要统一,推荐UTF-8 建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还 ...

  4. freemarker

    一.下载freemarker的jar包,到maven仓库下载 二.引入jar包,参考freemarker的手册写代码 1.Test.ftlh <!DOCTYPE html> <htm ...

  5. freemarker小例子

    1.在D盘下创建一个目录D:\\freemarker 2.在以上目录中放入一个模板文件test.ftl,内容如下:     第一个测试程序:${abc} 3.java代码如下(需要导入freemark ...

  6. Java模板引擎 FreeMarker

    @(编程) [TOC] 1. 简介 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.它是为Java程序员提供的一个开发包.它不是面向最终用户的,而是为程序员 ...

  7. FreeMarker 生成Java、mybatis文件

    FreeMarker 生成Java.mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件. FreeMarker是一款模板引擎: 即一种基于 ...

  8. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  9. freeMarker(八)——程序开发指南之配置(Configuration)

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.基本内容 配置(configuration)就是 freemark ...

随机推荐

  1. phpMyAdmin 手动输入数据库服务器IP

    1 在phpMyAdmin安装目录下查找config.inc.php,如没有则拷贝config.sample.inc.php为config.inc.php 2 修改config.inc.php,加入$ ...

  2. springmvc+mybatis+redis(转)

    最近在学习redis的使用方法,它的本地使用方法比较简单,只需要先启动Redis服务器,然后运行测试代码即可.但是现在我想要在网站上访问数据库的时候采用Redis缓存,问题就出来了.要么是缓存直接失效 ...

  3. GIT分支操作常用命令

    切换分支:git checkout name 撤销修改:git checkout -- file 删除文件:git rm file 查看状态:git status 添加记录:git add file ...

  4. php 原生或curl获取 http headers

    有一个函数: array get_headers ( string $url [, int $format = 0 ] ) Parameters url The target URL. format ...

  5. 单实例支撑每天上亿个请求的SSDB

    SSDB 是一个 C++ 开发的 NoSQL 存储服务器, 支持 zset, map 数据结构, 可替代 Redis, 特别适合存储集合数据. SSDB 被开发和开源出来后, 已经在生产环境经受了3个 ...

  6. 用php 把数组中偶数,选择出来

    我有这种一个小算法,把数组中的全部的偶数或技术分别选择出来.非常多人可能,会循环这个数组,而我恰恰不循环数组就能做到这一点.代码例如以下. function odd($var) { // return ...

  7. Python笔记之基本的语法

    1 变量和赋值 Python是动态类型语言,不须要预先声明变量的类型.变量的类型在赋值的那一刻被初始化. Python变量名是大写和小写敏感的,即"cAsE"与"CaSe ...

  8. MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件

    原文  MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...

  9. 高级特性(7)- 高级AWT

    7.1 绘图操作流程7.2 形状7.3 区域7.4 笔划7.5 着色7.6 坐标变换7.7 剪切7.8 透明与组合7.9 绘图提示7.10 图像的读取器和写入器 7.10.1 获得图像文件类型的读取器 ...

  10. SQL之单行函数

    单行函数语法: function name(column|expression,[arg1,arg2,...]) 参数说明: function name:函数名称 column:数据库列名 expre ...