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是捕捉不到这个异常的。

问题找到了,解决思路就很简单了,现在有两种方法:

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!可以使用Freemarker来生成富文本的HTML,并将其转换为Word文档。下面是一个简单的示例代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; public class HtmlToWordConverter { public static void main(String[] args) { Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setClassForTemplateLoading(HtmlToWordConverter.class, "/"); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); try { Template template = cfg.getTemplate("template.ftl"); // 指定Freemarker模板文件的路径 Map<String, Object> data = new HashMap<>(); // 在data中设置需要传递给模板的数据 try (Writer out = new OutputStreamWriter(new FileOutputStream("output.docx"), "UTF-8")) { XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(templateToString(template, data)); document.write(out); } catch (IOException e) { e.printStackTrace(); } } catch (IOException | TemplateException e) { e.printStackTrace(); } } private static String templateToString(Template template, Map<String, Object> data) throws IOException, TemplateException { StringBuilder content = new StringBuilder(); try (Writer out = new StringWriter()) { template.process(data, out); content.append(out.toString()); } return content.toString(); } } ``` 上述代码使用Apache POI库来创建Word文档,并使用Freemarker来填充富文本HTML模板。您需要创建一个名为`template.ftl`的Freemarker模板文件,并在代码中指定其路径。在`data` map中,您可以设置需要传递给模板的数据。 请注意,您需要在项目中添加Apache POI和Freemarker的依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值