方法变量通常是实现了 TemplateMethodModel 接口的类,该接口有一个方法TemplateModel exec(java.util.List arguments)。当你使用方法表达式 (method call expression)调用一个方法(exec)的时候,实际上是在执行 exec。方法表达式的参数其实就是方法参数的变形。方法的返回值也就是方法表达式的返回值。由于方法接口 TemplateMethodModelEx 继承自TemplateMethodModel 接口,所以方法也可以当作变量一样被放置到 root 中。
例子,实现求字符串的长度。
import java.util.List;
import freemarker.template.SimpleNumber;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
public class StringLengthMethod implements TemplateMethodModel {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() != 1) {
throw new TemplateModelException("Wrong arguments");
}
return new SimpleNumber(((String) args.get(0)).length());
}
}
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
*
* 模板工具类
*/
public class FreeMarkertUtil {
/**
* @param templatePath 模板文件存放目录
* @param templateName 模板文件名称
* @param root 数据模型根对象
* @param templateEncoding 模板文件的编码方式
* @param out 输出流
*/
public static void processTemplate(String templatePath, String templateName, String templateEncoding, Map<?,?> root, Writer out){
try {
Configuration config=new Configuration();
File file=new File(templatePath);
//设置要解析的模板所在的目录,并加载模板文件
config.setDirectoryForTemplateLoading(file);
//设置包装器,并将对象包装为数据模型
config.setObjectWrapper(new DefaultObjectWrapper());
//获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
Template template=config.getTemplate(templateName,templateEncoding);
//合并数据模型与模板
template.process(root, out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}catch (TemplateException e) {
e.printStackTrace();
}
}
}
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
/**
*
* 客户端测试模板输入类
*/
public class ClientTest {
public static void main(String[] args) {
Map<String,Object> root=new HashMap<String, Object>();
root.put("length", new StringLengthMethod());
FreeMarkertUtil.processTemplate("src/templates","demo01.ftl", "UTF-8", root, new OutputStreamWriter(System.out));
}
}
模板文件demo01.ftl如下:
${length("取字符串长度")}
分享到:
相关推荐
这通常是通过`Configuration`对象的`setSharedVariable`方法完成的,将你的自定义指令类实例绑定到一个特定的名字,这个名字就是你在模板中使用的标签名。 3. 使用自定义标签:在模板文件中,你可以像使用内置标签...
在这个"Freemarker自定义标签简单案例"中,我们将深入探讨如何利用Freemarker进行模板设计,并结合自定义标签来增强模板的功能。 首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它...
Spring MVC配置Freemarker全局变量,实现应用全路径
2. **数据模型与变量**: 在Freemarker中,数据模型是由Java对象组成的,这些对象可以通过模板语言访问。模板中的变量通常引用这些数据模型中的属性,例如`${user.name}`将输出用户对象的name属性值。 3. **模板设计...
2. 自定义指令:可以扩展Freemarker的功能,实现自定义的逻辑。 3. 数组和集合处理:Freemarker支持对数组和集合进行遍历、索引等操作。 4. 日期和数字格式化:通过`?date`、`?number`等后缀进行格式化。 5. I18N...
Java FreeMarker+Maven 实现代码自动生成是一个高效且灵活的方法,可以帮助开发者节省大量手动编写重复性代码的时间。FreeMarker 是一个强大的模板引擎,而Maven作为项目构建工具,能够帮助我们管理和组织项目的构建...
- **数据模型**:Freemarker模板与应用程序的数据模型进行绑定,模型中的数据可以在模板中被引用和展示。 - **分离关注点**:Freemarker遵循MVC设计模式,负责视图部分,将业务逻辑和表现层分开,使代码更易于维护...
要实现这个功能,开发者通常需要自定义一个FreeMarker指令或使用已有的扩展库。例如,`FormatDirective.java`可能就是一个实现了自定义格式化的指令。在自定义指令中,你可以根据需要处理模板输出的文本,添加适当的...
本篇文章将深入探讨如何利用FreeMarker在Java环境中实现对Word文档的操作。 一、FreeMarker简介 FreeMarker是一个基于模板的语言,其主要目标是将数据模型与展示逻辑分离。在Java应用中,开发者通常会创建一个数据...
1. **基础概念**:Freemarker的工作原理,模板语言的基础元素,如变量、表达式、控制结构(if/else、foreach)以及注释等。 2. **数据模型**:理解如何将Java对象绑定到模板,包括基本类型、集合、Map等数据结构的...
2. 自定义指令:通过`<#assign>`定义局部变量,`<#function>`定义函数,实现自定义逻辑。 3. 缓存机制:Freemarker支持缓存模板,提高性能。 4. 国际化支持:可以结合ResourceBundle实现多语言支持。 六、最佳实践 ...
本篇我们将深入探讨 Freemarker 中的接口实现与继承,以及相关的类和文件。 1. **Freemarker模板语言基础** Freemarker模板语言(FTL)是Freemarker的核心,由一系列指令、变量和控制结构组成。例如,`<#if>`用于...
- **在 Servlet 中使用 FreeMarker**:提供了在 Web 应用中集成 FreeMarker 的方法。 - **为 FreeMarker 配置安全策略**:解释了如何设置安全策略以避免潜在的安全风险。 - **遗留的 XML 包装实现**:介绍了旧...
- **变量管理**:允许在模板中创建和修改变量,增强数据处理能力。 - **表达式支持**:几乎可以在模板中的任何位置使用复杂表达式来计算或指定值。 - **宏定义**:支持定义命名的宏,可用于函数调用,提升模板复用性...
2. **变量和表达式**: Freemarker中的变量表示为`${...}`,其中的`...`可以是任意表达式,比如对象属性、数组索引、方法调用等。变量的值会由与模板关联的数据模型提供。 3. **控制结构**: Freemarker提供了类似...
9. 自定义方法:通过实现`TemplateMethodModel`接口,可以在模板中调用自定义方法,扩展Freemarker的功能。 三、Freemarker的高级特性 1. 链接和URL编码:Freemarker提供了`@url`指令和`?html`操作符,用于生成...
6. 用户自定义的FTL指令:在FreeMarker模板语言中,可以定义宏和变换器等用户自定义指令。节点变量通常在XML处理中使用。 7. 注释和文本输出:FreeMarker模板语言中的注释使用注释内容-->,不会被输出。直接文本则...
Struts2 和 Freemarker 的整合是企业级Java Web开发中常用的技术组合,它们结合使用能够实现灵活、高效的表现层设计。Struts2 是一个强大的MVC框架,而Freemarker则是一个模板引擎,用于生成动态内容。以下是关于...