一、 用macro实现自定义指令,例如:

自定义指令可以使用macro指令来定义。
     <#macro greet person>
            <font size="+2">Hello ${person}!</font>
     </#macro>
     macro指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为greet的变量。
使用这个宏:
    <@greet person="Fred"/>
会打印出:
    <font size="+2">Hello Fred!</font>

二、用java代码标签实现自定义指令:

可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。
简单示例如下:

1、实现TemplateDirectiveModel接口。
            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(
                               "parameters 此处没有值!");
                            }
                           if (loopVars.length != 0) {
                           throw new TemplateModelException(
                          " variables 此处没有值!");
                          }
                         if (body != null) {
                         //执行nested body  与FTL中 <#nested> 类似。
                     body.render(new UpperCaseFilterWriter(env.getOut()));
                         } else {
                        throw new RuntimeException("missing body");
                         }
                    }
           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();
                }
           }
       }

说明:<#nested>指令执行位于开始和结束标记指令之间的模板代码段。

2、注入FreeMarkerConfigurer的freemarkerVariables中。
     例如:在applicationContext.xml
    <entry key="upper" value-ref="upper"/>
    <bean id="upper" class="com.example.UpperDirective" />

说明:
   FreeMarkerConfigurer. 、setFreemarkerVariables(Map<String,Object> variables)
   底层调用了FreeMarker的Configuration.setAllSharedVariables()方法。
   因为更好的实践是将常用的指令作为共享变量放到Configuration中。

3、调用自定义指令:

[@upper]
            bar
            [#list ["red", "green", "blue"] as color]
                  ${color}
            [/#list]
            baaz
     [/@upper]

4、显示输出结果:
      BAR RED GREEN BLUE BAAZ

转载于:https://www.cnblogs.com/pengw/p/3944429.html

Freemarker自定义标签相关推荐

  1. freemarker自定义标签(二十一)

    一,讲解一 假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术 ...

  2. FreeMarker自定义标签编写

    一.freemarker 实现自定义标签的方法 : 使用  <macro></macro>  宏定定义标签 实现  TemplateDirectiveModel的 execut ...

  3. Springboot freemark自定义标签

    spring-boot里使用freemarker自定义标签 时间 2017-06-08 08:00:00   Tomoya 原文   https://tomoya92.github.io/2017/0 ...

  4. FreeMarker 自定义 TemplateDirectiveModel(一)

    FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...

  5. spring mvc项目中利用freemarker生成自定义标签

    2019独角兽企业重金招聘Python工程师标准>>> spring mvc项目中利用freemarker生成自定义标签 博客分类: java spring mvc +freemar ...

  6. JEECMS 自定义标签

    CMS 是"Content Management System" 的缩写,意为" 内容管理系统". 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较 ...

  7. freemarker自定义指令及方法

    "一节复一节,千枝攒万叶"竹子每生长一段就会总结一下打个节,今天我也总结一下最近处理的一个小问题,希望我的小节,对各位看官有所帮助. 背景描述: 最近项目做了一个月报功能,由于生产 ...

  8. javaweb学习总结(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  9. [PHP] JQuery+Layer实现添加删除自定义标签代码

    JQuery+Layer实现添加删除自定义标签代码 实现效果如下: 实现代码如下: <!doctype html> <html> <head> <meta c ...

最新文章

  1. html word-wrap,CSS3 Word-wrap
  2. Spring boot + Redis
  3. jet nano 车道识别
  4. 感知算法论文(七):DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(2019)
  5. 指令打印与驱动打印随笔
  6. 插入文件找不到桌面了?
  7. placeholder=请输入用户名(六位数字加英文字母)
  8. jquery ajax json转换出错Invalid JSON
  9. 【codevs1690】开关灯,线段树练习
  10. Python编程:从入门到实践 - pygal篇 - Die
  11. android crash没有日志_App测试之monkey(四)-调试参数及日志
  12. 考虑题4所示的日志记录_基于Log4Net实现日志信息双向存储
  13. java反编译的语句_Java开发网 - 请教,java反编译的问题
  14. 机器学习算法汇总:人工神经网络、深度学习及其它
  15. 书单|互联网企业面试案头书之数据分析师篇
  16. 一文搞懂 UndeclaredThrowableException
  17. Jetpack Compose 从入门到入门(七)
  18. 魔兽对战平台修改服务器数据,《魔兽争霸3》1.29补丁上线官方对战平台:平衡性大做改动...
  19. 分布式事务框架 Seata 与 Hmily 横向比较
  20. Error Code: 1175. You are using safe update...

热门文章

  1. C++使用Windows API CreateMutex函数多线程编程
  2. React-native键盘遮挡输入框问题的解决
  3. SQL Server表分区【转】
  4. [9]UITableView表视图1
  5. 俊鸟的数据输入校验专题(三) WPF 的五种输入校验概述
  6. 百老汇原版音乐剧《摇滚学校》2月开启中国巡演
  7. C#2.0 从sql server 中读取二进制图片
  8. 微软官方windows phone开发视频教程第二天视频(附下载地址)
  9. J2EE后台UI系统框架搭建-EXTJs使用(4.1 GPL版本)
  10. 关于iOS APP 需要支持ipv6-only 开发者需要做的事情