freemarker的TemplateExceptionHandler使用
系统使用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使用的更多相关文章
- Freemarker 程序开发
Freemarker 程序开发 现在web开发中,多使用freemarker 来描述页面.通常会使用的macro来定义各种组件,从而达到UI组件的复用.结合使用其它的指定,可快速的描述一个html页面 ...
- Using FreeMarker templates (FTL)- Tutorial
Lars Vogel, (c) 2012, 2016 vogella GmbHVersion 1.4,06.10.2016 Table of Contents 1. Introduction to F ...
- Java导出Word利用freemarker(含图片)
制作Word模版 建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码 编码要统一,推荐UTF-8 建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还 ...
- freemarker
一.下载freemarker的jar包,到maven仓库下载 二.引入jar包,参考freemarker的手册写代码 1.Test.ftlh <!DOCTYPE html> <htm ...
- freemarker小例子
1.在D盘下创建一个目录D:\\freemarker 2.在以上目录中放入一个模板文件test.ftl,内容如下: 第一个测试程序:${abc} 3.java代码如下(需要导入freemark ...
- Java模板引擎 FreeMarker
@(编程) [TOC] 1. 简介 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.它是为Java程序员提供的一个开发包.它不是面向最终用户的,而是为程序员 ...
- FreeMarker 生成Java、mybatis文件
FreeMarker 生成Java.mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件. FreeMarker是一款模板引擎: 即一种基于 ...
- springboot中使用freemarker生成word文档并打包成zip下载(简历)
一.设计出的简历模板图以及给的简历小图标切图 二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件: 三.直 ...
- freeMarker(八)——程序开发指南之配置(Configuration)
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.基本内容 配置(configuration)就是 freemark ...
随机推荐
- php language construct 语言构造器
isset和empty看起来像是函数,我们也经常把它当作函数一样使用,但是实际上,它们是语言构造器. php中的语言构造器就相当于C中的预定义宏的意思,它属于php语言内部定义的关键词,不可以被修改, ...
- CMake使用之一
概述 CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目. 通过编写CMakeLists.txt,可以控制生成的Makef ...
- 解决 RichTextBox 文件格式不对问题
RichTextBox文件格式不对: 原因:富文本框的LoadFile方法只支持RTF格式的文件或者标准的ASCII文本本档,,我们一般的文本文档是ANSI或者UTF-8的格式,所以,报这个错. 解决 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- python验证码识别
关于利用python进行验证码识别的一些想法 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类:一类是通过对图片进行处 理,然后 ...
- 基于visual Studio2013解决算法导论之009快速排序随机版本
题目 快速排序随机版本 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...
- 基于visual Studio2013解决C语言竞赛题之0810链表去重
题目
- 基于visual Studio2013解决C语言竞赛题之0809链表排序
题目
- boost库中thread多线程详解2——mutex与lock
1. mutex对象类 mutex类主要有两种:独占式与共享式的互斥量.▲ 独占式互斥量:mutex: 独占式的互斥量,是最简单最常用的一种互斥量类型try_mutex: 它是mutex的同义词,为了 ...
- ASP.NET中操作SQL数据库
在WebConfig中配置数据库连接字符串,代码如下: <connectionStrings> <add name="ConnectionString&qu ...