`
zzc1684
  • 浏览: 1223142 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Freemarker自定义方法和指令

阅读更多

1.  自 定义 方法,继承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中添加以后即可在模板中直接使用:
root.put("indexOf", new IndexOfMethod());
调用 方法如下
<#assign x = "something">
${indexOf("met", x)}
${indexOf("foo", x)} 

 


2.  自 定义 指令,继承TemplateDirectiveModel 即可。
例子如下:

package com.example;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;

import freemarker .core.Environment;
import freemarker .template.TemplateDirectiveBody;
import freemarker .template.TemplateDirectiveModel;
import freemarker .template.TemplateException;
import freemarker .template.TemplateModel;
import freemarker .template.TemplateModelException;

/**
* FreeMarker user-defined directive that progressively transforms
* the output of its nested content to upper-case.
*
*
* <p>Directive info </p>
*
* <p>Directive parameters: None
* <p>Loop variables: None
* <p>Directive nested content: Yes
*/
public class UpperDirective implements TemplateDirectiveModel {

public void execute(Environment env, Map params, TemplateModel[] loopVars,
               TemplateDirectiveBody body) throws TemplateException, IOException {
// Check if no parameters were given:
    if (!params.isEmpty()) {
        throw new TemplateModelException("This directive doesn't allow parameters.");
    }
    if (loopVars.length != 0) {
    throw new TemplateModelException("This directive doesn't allow loop variables.");
    }

// If there is non-empty nested content:
    if (body != null) {
// Executes the nested body. Same as <#nested> in FTL, except
// that we use our own writer instead of the current output writer.
        body.render(new UpperCaseFilterWriter(env.getOut()));
    } else {
        throw new RuntimeException("missing body");
    }
}

/**
* A {@link Writer} that transforms the character stream to upper case
* and forwards it to another {@link Writer}.
*/
private static class UpperCaseFilterWriter extends Writer {

    private final Writer out;

    UpperCaseFilterWriter (Writer out) {
        this.out = out;
    }

    public void write(char[] cbuf, int off, int len) throws IOException {
        char[] transformedCbuf = new char[len];
        for (int i = 0; i < len; i++) {
            transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
        }
        out.write(transformedCbuf);
    }

    public void flush() throws IOException {
        out.flush();
    }

    public void close() throws IOException {
        out.close();
    }
}

}

 
在root中添加就可以直接在模板中调用:
root.put("upper", new com.example.UpperDirective()); 
也可如下方法初始化后也同样可以在模板中调用:
<#assign upper = "com.example.UpperDirective"?new()> 
调用方法如下:
<@upper>
bar
<#-- All kind of FTL is allowed here -->
<#list ["red", "green", "blue"] as color>
${color}
</#list>
baaz
</@upper>

分享到:
评论

相关推荐

    freemarker 自定义freeMarker标签

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

    Freemarker 自定义标签 简单案例

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

    freemarker自定义的通用分页指令(标签)源码和使用示例

    一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx

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

    开发者可以通过自定义指令和利用开源社区的工具,来优化FreeMarker模板的使用,提高工作效率。对于`FormatDirective.java`这样的代码,我们可以通过分析源码,了解它是如何实现文本格式化的,也可以将其作为参考,为...

    Struts2、Spring、Freemarker自定义标签

    而在Freemarker中,可以通过扩展其API创建自定义指令,实现更复杂的逻辑或功能。 总结一下,Struts2、Spring和Freemarker的组合为Java Web开发提供了强大的工具集,涵盖了MVC模式的各个方面。它们的自定义标签功能...

    Freemarker通用select下拉框

    这里的`#list`是Freemarker的迭代指令,遍历`dropdownList`中的每一项,并将`key`和`value`分别插入到`&lt;option&gt;`的`value`和文本内容中。 为了实现通用性,我们需要一个方法或服务在后端生成这个`dropdownList`,...

    FreeMarker标签、指令

    FreeMarker 是一个强大的模板引擎,常...总结来说,FreeMarker 提供了一套强大且灵活的模板语言,通过标签、指令、插值和表达式,能够方便地生成动态内容。理解并熟练掌握这些概念对于构建高效、可维护的模板至关重要。

    FreeMarker指令学习

    这些表达式和指令会在运行时由FreeMarker引擎解析并替换为相应的值。 2. 数据模型:数据模型是FreeMarker渲染模板时使用的数据结构,通常来自Java应用程序。它包含了模板需要的所有变量和对象,使得模板可以访问和...

    freemarker Demo 适用于freemarker初学

    9. **内置指令和函数** Freemarker有许多内置的指令,如`include`用于包含其他模板,`import`用于导入宏库,`list`用于遍历集合等。同时,还可以自定义函数和宏来扩展功能。 10. **模板调试** Freemarker提供了一...

    Freemarker-2.3.19中文手册和jar包

    4. **高级特性**: 如模板缓存、自定义指令、宏等进阶话题。 5. **问题解决**: 解答在使用过程中可能遇到的问题和常见错误。 综上所述,Freemarker是一个功能丰富的模板引擎,适用于Java Web开发,通过与数据模型的...

    FreeMarker_Programmer Guide

    FreeMarker允许开发人员定义自定义指令,扩展其功能。自定义指令通常以`&lt;@myDirective&gt;`的形式出现,可以处理更复杂的逻辑。 **8. 国际化(i18n)支持** FreeMarker提供对多语言环境的支持,可以使用资源包...

    freemarker-2.3.22

    8. **自定义指令**:Freemarker允许定义自定义指令以扩展其功能,满足特定项目需求。 9. **最佳实践**:合理组织模板文件结构、避免模板过于复杂、正确处理null值等都是使用Freemarker时需要注意的最佳实践。 通过...

    freemarker-2.3.28.jar

    FTL文件包含了一系列的指令和表达式,用于生成最终输出。例如,`&lt;#if&gt;`、`&lt;#foreach&gt;`、`&lt;#assign&gt;`等是常见的控制结构,`${}`则用于插入变量值。 2. **数据模型绑定**: Freemarker的核心概念之一是数据模型,...

    eclipse的freemarker插件

    2. **语法高亮**:提供Freemarker关键词和语法的色彩突出显示,提高代码可读性,便于快速识别模板中的指令和变量。 3. **代码提示和完成**:在编写模板时,插件能提供智能代码补全功能,根据上下文提示可能的指令和...

    FreeMarker

    FreeMarker支持多种内置指令和表达式,使得模板编写更加灵活和强大。 1. **变量与表达式**:在FreeMarker模板中, `${variable}` 用于表示变量,它会从数据模型中查找对应的值并输出。表达式支持算术运算、比较运算...

    FreeMarker 手册

    FreeMarker的手册是一个详细的指南,它不仅介绍了FreeMarker的基本概念和使用方法,还深入到了高级主题,如自定义指令、命名空间、空白处理等。通过手册的学习,开发者可以掌握如何创建配置实例、定义数据模型、获取...

    FreeMarker实例教程,手把手教你FreeMarker的方方面面

    - **自定义指令**:教授如何根据项目需求创建自定义指令。 - **在模板中定义变量**:讲解如何在模板内部定义变量并使用它们。 - **命名空间**:讨论了命名空间的概念及其在FreeMarker中的应用。 - **空白处理**:...

    freemarker03

    "freemarker03_常用指令.avi"可能是一个视频教程,详细讲解了这些指令的实际应用和示例。通过学习和熟练掌握这些指令,你可以更好地利用Freemarker进行模板设计,提高开发效率,并生成高质量的动态内容。在实际项目...

Global site tag (gtag.js) - Google Analytics