`

freemarker中实现自定义方法变量

阅读更多

方法变量通常是实现了 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("取字符串长度")}

 

 

分享到:
评论

相关推荐

    freemarker 自定义freeMarker标签

    这通常是通过`Configuration`对象的`setSharedVariable`方法完成的,将你的自定义指令类实例绑定到一个特定的名字,这个名字就是你在模板中使用的标签名。 3. 使用自定义标签:在模板文件中,你可以像使用内置标签...

    Freemarker 自定义标签 简单案例

    在这个"Freemarker自定义标签简单案例"中,我们将深入探讨如何利用Freemarker进行模板设计,并结合自定义标签来增强模板的功能。 首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它...

    spring boot 和 freemaker 全局变量

    Spring MVC配置Freemarker全局变量,实现应用全路径

    freemarker中文文档与包

    2. **数据模型与变量**: 在Freemarker中,数据模型是由Java对象组成的,这些对象可以通过模板语言访问。模板中的变量通常引用这些数据模型中的属性,例如`${user.name}`将输出用户对象的name属性值。 3. **模板设计...

    freemarker中文手册.rar

    2. 自定义指令:可以扩展Freemarker的功能,实现自定义的逻辑。 3. 数组和集合处理:Freemarker支持对数组和集合进行遍历、索引等操作。 4. 日期和数字格式化:通过`?date`、`?number`等后缀进行格式化。 5. I18N...

    Java FreeMarker+Maven实现代码自动生成

    Java FreeMarker+Maven 实现代码自动生成是一个高效且灵活的方法,可以帮助开发者节省大量手动编写重复性代码的时间。FreeMarker 是一个强大的模板引擎,而Maven作为项目构建工具,能够帮助我们管理和组织项目的构建...

    freemarker中文学习资料

    - **数据模型**:Freemarker模板与应用程序的数据模型进行绑定,模型中的数据可以在模板中被引用和展示。 - **分离关注点**:Freemarker遵循MVC设计模式,负责视图部分,将业务逻辑和表现层分开,使代码更易于维护...

    freemarker格式化缩进文本或include指令

    要实现这个功能,开发者通常需要自定义一个FreeMarker指令或使用已有的扩展库。例如,`FormatDirective.java`可能就是一个实现了自定义格式化的指令。在自定义指令中,你可以根据需要处理模板输出的文本,添加适当的...

    java中freemarker实现对word的操作

    本篇文章将深入探讨如何利用FreeMarker在Java环境中实现对Word文档的操作。 一、FreeMarker简介 FreeMarker是一个基于模板的语言,其主要目标是将数据模型与展示逻辑分离。在Java应用中,开发者通常会创建一个数据...

    非常好的Freemarker中文教程

    1. **基础概念**:Freemarker的工作原理,模板语言的基础元素,如变量、表达式、控制结构(if/else、foreach)以及注释等。 2. **数据模型**:理解如何将Java对象绑定到模板,包括基本类型、集合、Map等数据结构的...

    freemarker中文手册

    2. 自定义指令:通过`&lt;#assign&gt;`定义局部变量,`&lt;#function&gt;`定义函数,实现自定义逻辑。 3. 缓存机制:Freemarker支持缓存模板,提高性能。 4. 国际化支持:可以结合ResourceBundle实现多语言支持。 六、最佳实践 ...

    Freemarker模版实现接口和继承(下)

    本篇我们将深入探讨 Freemarker 中的接口实现与继承,以及相关的类和文件。 1. **Freemarker模板语言基础** Freemarker模板语言(FTL)是Freemarker的核心,由一系列指令、变量和控制结构组成。例如,`&lt;#if&gt;`用于...

    FreeMarker 中文教程 用于 FreeMarker 2.3.19

    - **在 Servlet 中使用 FreeMarker**:提供了在 Web 应用中集成 FreeMarker 的方法。 - **为 FreeMarker 配置安全策略**:解释了如何设置安全策略以避免潜在的安全风险。 - **遗留的 XML 包装实现**:介绍了旧...

    freemarker中文手册.pdf

    - **变量管理**:允许在模板中创建和修改变量,增强数据处理能力。 - **表达式支持**:几乎可以在模板中的任何位置使用复杂表达式来计算或指定值。 - **宏定义**:支持定义命名的宏,可用于函数调用,提升模板复用性...

    freemarker 中文手册 (doc)

    2. **变量和表达式**: Freemarker中的变量表示为`${...}`,其中的`...`可以是任意表达式,比如对象属性、数组索引、方法调用等。变量的值会由与模板关联的数据模型提供。 3. **控制结构**: Freemarker提供了类似...

    freemarker获取数据

    9. 自定义方法:通过实现`TemplateMethodModel`接口,可以在模板中调用自定义方法,扩展Freemarker的功能。 三、Freemarker的高级特性 1. 链接和URL编码:Freemarker提供了`@url`指令和`?html`操作符,用于生成...

    freemark开发指南详解

    6. 用户自定义的FTL指令:在FreeMarker模板语言中,可以定义宏和变换器等用户自定义指令。节点变量通常在XML处理中使用。 7. 注释和文本输出:FreeMarker模板语言中的注释使用注释内容--&gt;,不会被输出。直接文本则...

    Struts2 与Freemarker 的配置方法

    Struts2 和 Freemarker 的整合是企业级Java Web开发中常用的技术组合,它们结合使用能够实现灵活、高效的表现层设计。Struts2 是一个强大的MVC框架,而Freemarker则是一个模板引擎,用于生成动态内容。以下是关于...

Global site tag (gtag.js) - Google Analytics