1. 模板文件 test04.ftl

foo
<@customUpper>
bar f
<#-- 这里同意使用全部的 FTL -->
<#list ["red", "green", "blue"] as color>
${color}
</#list>
baaz
</@customUpper>
wombat

2. 自己定义指令类 UpperDirective.java

ps: 一个把字符串变为大写的指令

package com.freemarker.test04.Directives;

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 的用户自己定义指令在逐步改变
* 它嵌套内容的输出转换为大写形式
* <p><b>指令内容</b></p>
* <p>指令參数:无
* <p>循环变量:无
* <p>指令嵌套内容:是
*/
public class UpperDirective implements TemplateDirectiveModel { public void execute(Environment env,
Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body)
throws TemplateException, IOException {
// 检查參数是否传入
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 (body != null) {
// 执行嵌入体部分,和 FTL 中的<#nested>一样,除了
// 我们使用我们自己的 writer 来取代当前的 output writer.
body.render(new UpperCaseFilterWriter(env.getOut()));
} else {
throw new RuntimeException("missing body");
}
} /**
* {@link Writer}改变字符流到大写形式,
* 并且把它发送到另外一个{@link Writer}中。 */
private static class UpperCaseFilterWriter extends Writer { private final Writer out; UpperCaseFilterWriter (Writer out) {
this.out = out;
} @Override
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();
}
} }

3. 測试类文件 Test.java

package com.freemarker.test04.Directives;

import freemarker.template.*;
import java.util.*;
import java.io.*; public class Test { public static void main(String[] args) throws Exception { // 创建 Freemarker 配置实例
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
// 指定模板文件从何处载入的数据源,这里设置成一个文件文件夹。 cfg.setDirectoryForTemplateLoading(new File("templates"));
cfg.setDefaultEncoding("UTF-8");
// 简单地又一次抛出异常; 这应该在大多数生产系统中使用。 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // 创建一个数据模型
Map root = new HashMap();
// 測试自己定义指令 --------------------------------
root.put("customUpper", new UpperDirective()); // 获取模板(使用内部缓存)
Template temp = cfg.getTemplate("test04.ftl"); // 合并数据模型模板
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
out.close();
// 注意: ------------
// 为了简单起见,这里压制了异常(在方法签名中声明了异常,译者注),而在正式执行的产品中不要这样做。 }
}

执行结果

foo
BAR F
RED
GREEN
BLUE
BAAZ
wombat

FreeMarker 自己定义指令(三)的更多相关文章

  1. freemarker 自己定义指令

    1 简单介绍 自己定义指令能够使用 macro 指令来定义,这是模板设计者所关心的内容. Java 程序猿若不想在模板中实 现定义指令 ,而是在 Java 语言中实现指令 的定义,这时 能够使用fre ...

  2. freemarker自己定义标签报错(三)

    freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Encountered " " at line 14, colu ...

  3. AngularJS--自定义指令和模板

    一.自定义指令: 1. 先创建模块    var app=angular.module("myApp",[]); 2. 创建自定义指令 (directive后面的参数一:自定义指令 ...

  4. 你知道用AngularJs怎么定义指令吗?

    前言 最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方.   Angularjs指令定义的API AngularJs的指令定义大致如下 ang ...

  5. [转]你知道用AngularJs怎么定义指令吗?--很详细

    前言 最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方.   Angularjs指令定义的API AngularJs的指令定义大致如下 ang ...

  6. freemarker自己定义标签报错(七)

    1.错误描写叙述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template pr ...

  7. freemarker自己定义标签(一)

    freemarker自己定义标签 1.自己定义标签说明 宏变量存储模板片段能够被用作自己定义指令macro 2.演示样例说明 <html> <head> <meta ht ...

  8. AngularJS---自定义指令

    AngularJS提供了一系列的内置指令,如ng开头的指令,同时AngularJS也允许用户自定义指令. 目录: 1.自定义指令 2.使用自定义指令 3.自定义指令的内嵌使用 自定义指令 Angula ...

  9. 工作流学习——Activiti流程定义管理三步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...

随机推荐

  1. oracle sqlldr控制文件模板

    Sqlldr userid=lgone/tiger control=a.ctl LOAD DATA INFILE 't.dat' // 要导入的文件 // INFILE 'tt.date' // 导入 ...

  2. 一个简单的Hibernate工具类HibernateUtil

    HibernateUtil package com.wj.app.util; import org.hibernate.Session; import org.hibernate.SessionFac ...

  3. List<Map<String, Object>>相关

    2016年8月6日13:53:00 --------------------------- List<Map<String, Object>> List集合新增列 则需要: L ...

  4. Hibernate 使用说明

    Eclipse中hibernate连接mySQL数据库练习(采用的是hibernate中XML配置方式连接数据库,以后在更新其他方式的连接) Hibernate就是Java后台数据库持久层的框架,也是 ...

  5. C# C/S系统软件开发平台架构图(原创)

    企业版V4.0 - 架构图 企业版V4.0 - 桥接功能.后台连接策略 桥接功能是指应用策略模式,由用户配置本地INI文件选择ADO直连(ADO-Direct)或者调用WCF服务接口访问远程服务器后台 ...

  6. 读书笔记-《Training Products of Experts by Minimizing Contrastive Divergence》

    Training Products of Experts by Minimizing Contrastive Divergence(以下简称 PoE)是 DBN 和深度学习理论的 肇始之篇,最近在爬梳 ...

  7. Xcode-01ARC / Block

    1.nonatomic 2.assign 3.strong 4.weak 5.instancetype 6.@class @property 使部分类在编译时不使用ARC -(可以让这们支持 reta ...

  8. Dataguad RAC配置【一】

    Data Guard配置步骤 生产端配置步骤 1.关闭一个实例. 用oracle用户登录192.166.1.190,执行以下SQL关闭其上的实例: SQL>shutdown immediate; ...

  9. Html和JS基础

    1.body:bgcolor,background(背景图片),bgproperities=fixed(图片水印),text(正文颜色). 2.hr:水平分割线,正文标题<h?>自动换行了 ...

  10. 《深度探索c++对象模型》chapter3 Data语意学

    一个空的class:如 class X{} ; sizeof(X)==1; sizeof为什么为1,他有一个隐晦的1 byte,那是被编译器安插进去的一个char,这使得class2的两个object ...