我是靠谱客的博主 无私蜜粉,最近开发中收集的这篇文章主要介绍【Spring&Freemarker】Freemarker中如何读取jar中的template且支持原生的include引入其他模板,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
写这篇文章主要是考虑到如下问题会困扰大家
- java.io.FileNotFoundException: Template xxx.ftl not found.
- 如何让模板中支持原生的<#include “common.ftl”>
- 如何在编辑ftl文件中变量的时候能够有有效的提示(此处使用的是idea)
解决方案
首先,看下TemplateLoader实现类有哪些
第一种方案以StringTemplateLoader为例简单介绍,直接贴代码演示
/**
* 初始化include模板
*
* @param templateContent
* @param stringTemplateLoader
*/
public static void initCommonTemplate(String templateContent, StringTemplateLoader stringTemplateLoader) {
// 按指定模式在字符串查找
String pattern = "(?<=<#include\s")(.*?)(?="\s*>)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(templateContent);
while (m.find()) {
String childTemplateName = "";
String group = m.group();
if (group.startsWith("/")) {
childTemplateName = group.substring(1);
} else {
childTemplateName = group;
}
stringTemplateLoader.putTemplate(childTemplateName, ResourceHelper.getString(group));
}
}
public static void main(String[] args) throws Exception{
//region 初始化模板过程
Configuration ftlConifg = new Configuration(Configuration.VERSION_2_3_29);
String path = "a.ftl";
//获取文件内容
InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
String content = new BufferedReader(new InputStreamReader(resourceAsStream, StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("n"));
//将其填充到stringTemplateLoader中
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate(path,content);
//填充content中include的模板
initCommonTemplate(content,stringTemplateLoader);
ftlConifg.setTemplateLoader(stringTemplateLoader);
//endregion
//region 获取填充数据后的模板
//读取模板
Template template = ftlConifg.getTemplate(path, StandardCharsets.UTF_8.toString());
//填充数据
Object data = new Object();
var out = new StringWriter();
template.process(Map.of("item", data), out);
String result = out.toString();
//endregion
}
看了上述代码明显看出了其缺陷,第一需要初始化每个模板,第二需要自定义支持原生的include,下面介绍第二种实现方式
第二种方案以ClassTemplateLoader为例简单介绍,直接贴代码演示
public static void main(String[] args){
//region 初始化模板过程
Configuration ftlConifg = new Configuration(Configuration.VERSION_2_3_29);
ftlConifg.setClassForTemplateLoading(this.getClass(), "/templates");
//endregion
//region 获取填充数据后的模板
//读取模板
String path = "a.ftl";
Template template = ftlConifg.getTemplate(path, StandardCharsets.UTF_8.toString());
//填充数据
Object data = new Object();
var out = new StringWriter();
template.process(Map.of("item", data), out);
String result = out.toString();
//endregion
}
此处需要注意的是,模板必须与ftlConifg.setClassForTemplateLoading(this.getClass(), “/templates”);中的
this在同一个项目下
此外补充一点(如何在编辑ftl文件中变量的时候能够有有效的提示)
在ftl文件开头加上如下内容,编辑的时候会有代码提示
<#-- @ftlvariable name="item" type="class路径" -->
最后
以上就是无私蜜粉为你收集整理的【Spring&Freemarker】Freemarker中如何读取jar中的template且支持原生的include引入其他模板的全部内容,希望文章能够帮你解决【Spring&Freemarker】Freemarker中如何读取jar中的template且支持原生的include引入其他模板所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复