`
zzc1684
  • 浏览: 1192224 次
  • 性别: 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自定义的通用分页指令(标签)源码和使用示例

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

    freemarker语法完整版

    B 指令 if, else, elseif 语法 Java代码 &lt;#if condition&gt; ... &lt;#elseif condition2&gt; ... &lt;#elseif condition3&gt; ... ... &lt;#else&gt; ... &lt;/#if&gt; ... ... ... ... ... 用例 ...

    freemarker总结

    6、 用户自定义FTL指令:宏和变换器 7、 节点 节点变量表示为树型结构中的一个节点,通常在XML处理中使用。 在模板里对sequences和hashes初始化 sequences 1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey...

    超完整FreeMarker中文教程,代码

    4.1 自定义指令 ................................................................................................ 46 4.2 在模板中定义变量 ...................................................................

    freemarker+struts2仿QQ分页效果

    不过由于小弟资历浅薄,也没心思看,主要是strut2的标签本来我就觉得不大习惯,另外上个月接触了freemarker后,实在是用的爽死了,为什么不用freemarker的macro指令写个通用的分页呢?马上想到模仿TX的...

    freemarker-advance-demo:对freemarker的一些特性的使用demo

    #freemarker demo这是一个介绍freemarker的一些使用方法的demo、目前主要提供了两个freemarker的高级用法:自定义指令及宏

    Java学习指南(11) FreeMarker与MVC框架

    〖主要内容〗包含以下内容,具体以课程目录为准:* 开发环境与API* 基本类型的插值* Hash 与 Sequece类型的插值* 常用的 built-in 用法* 等指令的用法* 自定义函数 Method Variables * 共享变量 Shared ...

    FreeMarker 手册

    4.1 自定义指令 ................................................................................................ 45 4.2 在模板中定义变量 ...................................................................

    PublicCMSV1.0使用手册_20151012.docx

    PublicCMS是一款基于SpringMVC4.2.1,Hibernate5.0.2,FreeMarker2.3.23,hibernate-search5.5.0开发的永久免费开源JAVACMS系统,支持全站静态化,SSI技术,更有多种独创解决方案,FreeMarker自定义指令自动加载,0关联...

    FreeMarker中文指导手册

    4.1 自定义指令 ................................................................................................ 45 4.2 在模板中定义变量 ...................................................................

    深入浅出Struts2(附源码)

    4.4 如何调用字段和方法 55 4.5 如何访问数组类型的属性 56 4.6 如何访问List类型的属性 56 4.7 如何访问Map类型的属性 57 4.8 JSP EL:当OGNL帮不上忙时 58 4.9 小结 58 第5章表单标签 59 5.1 Struts标签的...

    适合作为毕设选题,采用了SpringBoot,VUE,Redis,ElementUI,MySQL等多种新技术

    这是一款适合作为毕设选题,养老院使用的系统管理系统,采用了**SpringBoot,VUE,Redis,ElementUI****MySQL**等多种新...同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    4.4 如何调用字段和方法 55 4.5 如何访问数组类型的属性 56 4.6 如何访问List类型的属性 56 4.7 如何访问Map类型的属性 57 4.8 JSP EL:当OGNL帮不上忙时 58 4.9 小结 58 第5章 表单标签 59 5.1 Struts标签的使用...

    Java Web程序设计教程

    第3章jsp和servlet 33 3.1开发第一个jsp+servlet应用 33 3.1.1创建工程 33 3.1.2编写程序 34 3.1.3部署应用 35 3.2认识jsp 36 3.2.1jsp的工作原理 37 3.2.2jsp注释方式 37 3.2.3jsp声明方式 38 3.2.4jsp...

Global site tag (gtag.js) - Google Analytics