1. 模板文件 test04.ftl

  1. foo
  2. <@customUpper>
  3. bar f
  4. <#-- 这里同意使用全部的 FTL -->
  5. <#list ["red", "green", "blue"] as color>
  6. ${color}
  7. </#list>
  8. baaz
  9. </@customUpper>
  10. wombat

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

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

  1. package com.freemarker.test04.Directives;
  2. import java.io.IOException;
  3. import java.io.Writer;
  4. import java.util.Map;
  5. import freemarker.core.Environment;
  6. import freemarker.template.TemplateDirectiveBody;
  7. import freemarker.template.TemplateDirectiveModel;
  8. import freemarker.template.TemplateException;
  9. import freemarker.template.TemplateModel;
  10. import freemarker.template.TemplateModelException;
  11. /**
  12. * FreeMarker 的用户自己定义指令在逐步改变
  13. * 它嵌套内容的输出转换为大写形式
  14. * <p><b>指令内容</b></p>
  15. * <p>指令參数:无
  16. * <p>循环变量:无
  17. * <p>指令嵌套内容:是
  18. */
  19. public class UpperDirective implements TemplateDirectiveModel {
  20. public void execute(Environment env,
  21. Map params, TemplateModel[] loopVars,
  22. TemplateDirectiveBody body)
  23. throws TemplateException, IOException {
  24. // 检查參数是否传入
  25. if (!params.isEmpty()) {
  26. throw new TemplateModelException(
  27. "This directive doesn't allow parameters.");
  28. }
  29. if (loopVars.length != 0) {
  30. throw new TemplateModelException(
  31. "This directive doesn't allow loop variables.");
  32. }
  33. // 是否有非空的嵌入内容
  34. if (body != null) {
  35. // 执行嵌入体部分,和 FTL 中的<#nested>一样,除了
  36. // 我们使用我们自己的 writer 来取代当前的 output writer.
  37. body.render(new UpperCaseFilterWriter(env.getOut()));
  38. } else {
  39. throw new RuntimeException("missing body");
  40. }
  41. }
  42. /**
  43. * {@link Writer}改变字符流到大写形式,
  44. * 并且把它发送到另外一个{@link Writer}中。
  45. */
  46. private static class UpperCaseFilterWriter extends Writer {
  47. private final Writer out;
  48. UpperCaseFilterWriter (Writer out) {
  49. this.out = out;
  50. }
  51. @Override
  52. public void write(char[] cbuf, int off, int len)throws IOException {
  53. char[] transformedCbuf = new char[len];
  54. for (int i = 0; i < len; i++) {
  55. transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
  56. }
  57. out.write(transformedCbuf);
  58. }
  59. public void flush() throws IOException {
  60. out.flush();
  61. }
  62. public void close() throws IOException {
  63. out.close();
  64. }
  65. }
  66. }

3. 測试类文件 Test.java

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

执行结果

  1. foo
  2. BAR F
  3. RED
  4. GREEN
  5. BLUE
  6. BAAZ
  7. 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. js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法

    http://blog.csdn.net/deepwishly/article/details/6670942  ajaxPro.dll基础教程(前台调用后台方法,后台调用前台方法) 1. javaS ...

  2. Safari浏览器的调试

    最近做浏览器兼容的时候发现Safari的脚本调试工具比较难找,因此与大家分享一下 1.找到脚本调试的选项 2.勾选此选项 3.在页面空白处右击打开调试窗口 4.看到下方的调试窗口了 细心的读者会发现, ...

  3. PHP IP互换数字[转]

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. hw-text1

    Text 1 测试题 python是什么类型的语言? 解释型语言,是脚本语言 百娘(脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语 ...

  5. python【第十四篇】HTML与CSS初遇

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  6. Xcode-01ARC / Block

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

  7. 【C语言】重定向和文件

    重定向和文件 一.相关基础知识 重定向:在计算机领域,重定向是大多数命令行解释器所具有的功能,包括各种可以将标准流重定向用户规定地点的Unix shells. 输入重定向:可以使程序能够使用文件代替键 ...

  8. Python如何进行cross validation training

    以4-fold validation training为例 (1) 给定数据集data和标签集label 样本个数为 sampNum = len(data) (2) 将给定的所有examples分为1 ...

  9. 【技术贴】SqlServer2008 R2 安装失败提示出现以下错误 服务 MSSQLSERVERO

    Feature: Analysis Services  Status: 失败: 请查看日志了解详细信息  MSI status: 已通过  Configuration status: 失败: 请查看下 ...

  10. hadoop-2.0.0-cdh4.2.1源码编译总结

    经过一个星期多的努力,这两个包的编译工作总算告一段落. 首先看一下这一篇文章: 在eclipse下编译hadoop2.0源码 http://www.cnblogs.com/meibenjin/arch ...