一、创建 Configuration 实例
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); cfg .setClassForTemplateLoading(this.getClass(), "ftl"); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
不需要重复创建 Configuration
实例; 它的代价很高,尤其是会丢失缓存。Configuration
实例就是应用级别的单例。
二、获取模板
Template temp = cfg.getTemplate("hashes.ftl");
Configuration
缓存 Template
实例,当再次获得 hashes.ftl
的时候,它可能再读取和解析模板文件了, 而只是返回第一次的 Template
实例。
三、数据模型
在内部,模板中可用的变量都是实现了freemarker.template.TemplateModel
接口的Java对象。 但在数据模型中,可以使用基本的Java集合类作为变量,因为这些变量会在内部被替换为适当的 TemplateModel
类型,类freemarker.template.ObjectWrapper的职责
A、标量
有4种类型的标量:
- 布尔值
- 数字
- 字符串
- 日期类型(子类型: 日期(没有时间部分),时间或者日期-时间)
每一种标量类型都是 TemplateTypeModel
接口的实现,这里的 Type
就是类型的名称。这些接口只定义了一个方法: typegetAsType();
。 它返回变量的Java类型(boolean
, Number
, String
和 Date
各自代表的值)。
B、哈希表 对应TemplateHashModel
C、序列对应TemplateSequenceModel
D、集合 对应TemplateCollectionModel
E、方法对应TemplateMethodModel
方法示例:
public class IndexOfMethod implements TemplateMethodModel { public TemplateModel exec(List args) throws TemplateModelException { if (args.size() != 2) { throw new TemplateModelException("Wrong arguments"); } return new SimpleNumber( ((String) args.get(1)).indexOf((String) args.get(0))); } }
如果将一个实例放入根数据模型中,像这样:
root.put("indexOf", new IndexOfMethod());
那么就可以在模板中调用:
<#assign x = "something"> ${indexOf("met", x)} ${indexOf("foo", x)}
将会输出:
2 -1
F、指令 对应TemplateDirectiveModel
我们来创建一个指令,这个指令可以一次又一次地执行其中的嵌套内容, 这个次数由指定的数字来确定(就像 list
指令), 可以使用<hr>
将输出的重复内容分开。 这个指令我们命名为"repeat"。示例模板如下:
<#assign x = 1> <@repeat count=4> Test ${x} <#assign x++> </@repeat> <@repeat count=3 hr=true> Test </@repeat> <@repeat count=3; cnt> ${cnt}. Test </@repeat>
输出为:
Test 1 Test 2 Test 3 Test 4 Test <hr> Test <hr> Test 1. Test 2. Test 3. Test指令的实现类为:
public class RepeatDirective implements TemplateDirectiveModel { private static final String PARAM_NAME_COUNT = "count"; private static final String PARAM_NAME_HR = "hr"; public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // --------------------------------------------------------------------- // Processing the parameters: int countParam = 0; boolean countParamSet = false; boolean hrParam = false; Iterator paramIter = params.entrySet().iterator(); while (paramIter.hasNext()) { Map.Entry ent = (Map.Entry) paramIter.next(); String paramName = (String) ent.getKey(); TemplateModel paramValue = (TemplateModel) ent.getValue(); if (paramName.equals(PARAM_NAME_COUNT)) { if (!(paramValue instanceof TemplateNumberModel)) { throw new TemplateModelException( "The \"" + PARAM_NAME_HR + "\" parameter " + "must be a number."); } countParam = ((TemplateNumberModel) paramValue) .getAsNumber().intValue(); countParamSet = true; if (countParam < 0) { throw new TemplateModelException( "The \"" + PARAM_NAME_HR + "\" parameter " + "can't be negative."); } } else if (paramName.equals(PARAM_NAME_HR)) { if (!(paramValue instanceof TemplateBooleanModel)) { throw new TemplateModelException( "The \"" + PARAM_NAME_HR + "\" parameter " + "must be a boolean."); } hrParam = ((TemplateBooleanModel) paramValue) .getAsBoolean(); } else { throw new TemplateModelException( "Unsupported parameter: " + paramName); } } if (!countParamSet) { throw new TemplateModelException( "The required \"" + PARAM_NAME_COUNT + "\" paramter" + "is missing."); } if (loopVars.length > 1) { throw new TemplateModelException( "At most one loop variable is allowed."); } // Yeah, it was long and boring... // --------------------------------------------------------------------- // Do the actual directive execution: Writer out = env.getOut(); if (body != null) { for (int i = 0; i < countParam; i++) { // Prints a <hr> between all repetations if the "hr" parameter // was true: if (hrParam && i != 0) { out.write("<hr>"); } // Set the loop variable, if there is one: if (loopVars.length > 0) { loopVars[0] = new SimpleNumber(i + 1); } // Executes the nested body (same as <#nested> in FTL). In this // case we don't provide a special writer as the parameter: body.render(env.getOut()); } } } }四、实用类
BeansWrapper wrapper = BeansWrapper.getDefaultInstance(); TemplateHashModel staticModels = wrapper.getStaticModels(); TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get("java.io.File");2、访问枚举类型
BeansWrapper wrapper = BeansWrapper.getDefaultInstance(); TemplateHashModel enumModels = wrapper.getEnumModels(); TemplateHashModel roundingModeEnums = (TemplateHashModel) enumModels.get("java.math.RoundingMode");3、自定义模版加载
FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates")); FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates")); ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), ""); TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl }; MultiTemplateLoader mtl = new MultiTemplateLoader(loaders); cfg.setTemplateLoader(mtl);
相关推荐
Apache FreeMarker是一个强大的、开源的模板引擎,常用于生成HTML和其他动态内容,尤其在Web应用程序中,如...通过熟练掌握FreeMarker,开发者可以更高效地构建和维护Web应用程序的前端部分,提高开发效率和用户体验。
综上所述,这个"FreeMarkerDemo-java.rar"项目是一个实用的学习资源,它教你如何在Spring Boot环境中利用FreeMarker来处理Word文档,这对于那些需要生成动态报告或文档的系统来说非常有价值。通过研究这个示例,...
Freemarker是一个强大的模板引擎,常用于Java Web开发中,特别是在Struts框架中...总之,学习并熟练运用Freemarker在Struts中的应用,对于Java Web开发者来说是一项重要的技能,它有助于构建高效、易维护的Web应用。
通过对`freemarker-2.3.8`源码的学习,开发者可以更好地掌握Freemarker的工作机制,从而更高效地利用它来构建应用程序的视图层,同时也能为自定义扩展和解决特定问题提供参考。此外,对于Java开发者来说,阅读源码也...
Freemarker是一个强大的...综上所述,Freemarker是一个功能丰富的模板引擎,适用于Java Web开发,通过与数据模型的结合,可以生成动态内容。提供的中文手册和jar包,使得中文开发者能够更便捷地学习和使用这一工具。
为了提高开发效率,你还可以安装Freemarker的编辑器插件。官方提供的插件可能不包含所有功能,比如没有智能提示。推荐使用hudson.freemarker_ide_0.9.14,这是一个既能高亮显示关键词又能提供智能提示的插件。不过,...
Freemarker是一个强大的模板引擎,常用于Web开发中生成动态HTML页面。它是Java语言的一个开源项目,遵循Apache软件基金会的Apache License。...通过深入学习和实践,你可以熟练掌握Freemarker,提升Web应用的开发效率。
数据模型则是程序传递给Freemarker的变量和对象集合,用于填充模板中的占位符。在处理时,Freemarker会解析模板,结合数据模型,生成最终的输出。 在Java中,使用Freemarker通常涉及以下几个步骤: 1. 创建一个`...
在FreeMarker中,模板文件通常以`.ftl`为扩展名,它们包含了一系列控制结构(如条件语句和循环)以及占位符,这些占位符会被程序中的实际数据替换。 **FreeMarker的基本概念:** 1. **模板(Template)**:FTL文件...
FreeMarker 是一个强大的模板引擎...总之,FreeMarker_2.3.23 中文版的资源为开发者提供了全面的学习材料,无论是初学者还是有经验的用户,都能从中受益,提升自己的技能,更好地利用FreeMarker进行高效的Web应用开发。
FreeMarker 是一个强大的模板引擎,主要用于生成HTML或其他类型的文本输出,尤其在Web开发中被...通过学习FreeMarker,开发者可以更好地实现MVC架构中的视图层,提高开发效率,并创建出更加灵活、可维护的Web应用程序。
#### 四、程序开发指南 **4.1 创建配置实例** - **步骤**: 初始化FreeMarker配置对象,设置参数如默认编码等。 **4.2 创建数据模型** - **构建**: 构建一个包含所需数据的对象模型。 - **传递**: 将数据模型传递给...
总的来说,FreeMarker是一个强大的工具,它简化了动态内容的生成,使得设计人员和开发人员能够各自专注于他们的专业领域,从而提高效率和协作效果。通过理解FreeMarker的基本概念,如模板、数据模型以及各种数据类型...
Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个强大的MVC(Model-View-Controller)框架,它极大地简化了构建基于Java的Web应用程序的过程。而FreeMarker则是一种模板引擎,主要用于生成...
2.1 通过例子来学习:通过具体示例,学习如何在FreeMarker模板中处理XML。 2.2 形式化描述:对如何处理XML给出了形式化的定义。 三、声明的XML处理 3.1 基础内容:讲述了如何在FreeMarker中进行声明式的XML处理。 ...
FreeMarker是一个广泛应用于Java开发领域的模板引擎,它的主要任务是根据预先定义的模板和动态数据生成HTML或者其他格式的文本...通过不断实践和学习,你将能够充分利用FreeMarker的强大功能,提高开发效率和代码质量。
Freemarker是一个强大的Java模板引擎,常用于动态生成HTML或其他类型的文档。在使用Freemarker的过程中,遇到乱码问题...通过实践和学习,你将能够有效地避免和解决Freemarker的乱码问题,提升你的开发效率和代码质量。
### FreeMarker 中文教程知识点概览 #### 一、FreeMarker 概述 ...通过以上知识点的概览,读者可以全面了解 FreeMarker 的基本概念、使用方法及高级特性,为后续深入学习和应用 FreeMarker 奠定坚实的基础。