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>
相关推荐
这通常是通过`Configuration`对象的`setSharedVariable`方法完成的,将你的自定义指令类实例绑定到一个特定的名字,这个名字就是你在模板中使用的标签名。 3. 使用自定义标签:在模板文件中,你可以像使用内置标签...
在这个"Freemarker自定义标签简单案例"中,我们将深入探讨如何利用Freemarker进行模板设计,并结合自定义标签来增强模板的功能。 首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它...
一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx
开发者可以通过自定义指令和利用开源社区的工具,来优化FreeMarker模板的使用,提高工作效率。对于`FormatDirective.java`这样的代码,我们可以通过分析源码,了解它是如何实现文本格式化的,也可以将其作为参考,为...
而在Freemarker中,可以通过扩展其API创建自定义指令,实现更复杂的逻辑或功能。 总结一下,Struts2、Spring和Freemarker的组合为Java Web开发提供了强大的工具集,涵盖了MVC模式的各个方面。它们的自定义标签功能...
这里的`#list`是Freemarker的迭代指令,遍历`dropdownList`中的每一项,并将`key`和`value`分别插入到`<option>`的`value`和文本内容中。 为了实现通用性,我们需要一个方法或服务在后端生成这个`dropdownList`,...
FreeMarker 是一个强大的模板引擎,常...总结来说,FreeMarker 提供了一套强大且灵活的模板语言,通过标签、指令、插值和表达式,能够方便地生成动态内容。理解并熟练掌握这些概念对于构建高效、可维护的模板至关重要。
这些表达式和指令会在运行时由FreeMarker引擎解析并替换为相应的值。 2. 数据模型:数据模型是FreeMarker渲染模板时使用的数据结构,通常来自Java应用程序。它包含了模板需要的所有变量和对象,使得模板可以访问和...
9. **内置指令和函数** Freemarker有许多内置的指令,如`include`用于包含其他模板,`import`用于导入宏库,`list`用于遍历集合等。同时,还可以自定义函数和宏来扩展功能。 10. **模板调试** Freemarker提供了一...
4. **高级特性**: 如模板缓存、自定义指令、宏等进阶话题。 5. **问题解决**: 解答在使用过程中可能遇到的问题和常见错误。 综上所述,Freemarker是一个功能丰富的模板引擎,适用于Java Web开发,通过与数据模型的...
FreeMarker允许开发人员定义自定义指令,扩展其功能。自定义指令通常以`<@myDirective>`的形式出现,可以处理更复杂的逻辑。 **8. 国际化(i18n)支持** FreeMarker提供对多语言环境的支持,可以使用资源包...
8. **自定义指令**:Freemarker允许定义自定义指令以扩展其功能,满足特定项目需求。 9. **最佳实践**:合理组织模板文件结构、避免模板过于复杂、正确处理null值等都是使用Freemarker时需要注意的最佳实践。 通过...
FTL文件包含了一系列的指令和表达式,用于生成最终输出。例如,`<#if>`、`<#foreach>`、`<#assign>`等是常见的控制结构,`${}`则用于插入变量值。 2. **数据模型绑定**: Freemarker的核心概念之一是数据模型,...
2. **语法高亮**:提供Freemarker关键词和语法的色彩突出显示,提高代码可读性,便于快速识别模板中的指令和变量。 3. **代码提示和完成**:在编写模板时,插件能提供智能代码补全功能,根据上下文提示可能的指令和...
FreeMarker支持多种内置指令和表达式,使得模板编写更加灵活和强大。 1. **变量与表达式**:在FreeMarker模板中, `${variable}` 用于表示变量,它会从数据模型中查找对应的值并输出。表达式支持算术运算、比较运算...
FreeMarker的手册是一个详细的指南,它不仅介绍了FreeMarker的基本概念和使用方法,还深入到了高级主题,如自定义指令、命名空间、空白处理等。通过手册的学习,开发者可以掌握如何创建配置实例、定义数据模型、获取...
- **自定义指令**:教授如何根据项目需求创建自定义指令。 - **在模板中定义变量**:讲解如何在模板内部定义变量并使用它们。 - **命名空间**:讨论了命名空间的概念及其在FreeMarker中的应用。 - **空白处理**:...
"freemarker03_常用指令.avi"可能是一个视频教程,详细讲解了这些指令的实际应用和示例。通过学习和熟练掌握这些指令,你可以更好地利用Freemarker进行模板设计,提高开发效率,并生成高质量的动态内容。在实际项目...