freemarker自定义指令(七)

这里的代码展示是基于freemarder+springmvc的。不懂的可以去我的播客中从第一篇文章开始学习。

前言

         自定义freemarder指令只需要实现TemplateDirectiveModel接口即可。内部只有一个execute方法。但是请注意,TemplateDirectiveModel接口是在FreeMarker.3.11版本时候才加入的,如果你使用的是之前的版本,那么请使用TemplateTransformModel接口。

 

自定义指令类代码

这里是将指令包含的内容转换为大写

package com.rabbit.freemarder.instructions;

import freemarker.core.Environment;
import freemarker.template.*;

import java.io.IOException;
import java.io.Writer;
import java.util.Map;

/**
 * Created by HASEE on 2017/12/22.
 */
public class UpperDirective implements TemplateDirectiveModel {

    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody body) throws TemplateException, IOException {
        if (!map.isEmpty()) {
            throw new TemplateModelException("指令不允许参数为空");
        }

        if (templateModels.length != 0) {
            throw new TemplateModelException("这个指令不允许循环变量");
        }

        if (body != null) {
            body.render(new UpperCaseFilterWriter(environment.getOut()));
        } else {
            throw new RuntimeException("missing body");
        }
    }

    private static class UpperCaseFilterWriter extends Writer {

        private final Writer out;

        public UpperCaseFilterWriter(Writer out) {
            this.out = out;
        }

        @Override
        public void write(char[] cbuf, int off, int len) throws IOException {
            System.out.println("write方法执行了");
            char[] transfromedCbuf = new char[len];
            for (int i = 0; i < len; i++) {
                transfromedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
            }
            out.write(transfromedCbuf);
        }

        @Override
        public void flush() throws IOException {
            System.out.println("flush方法执行了");
            out.flush();
        }

        @Override
        public void close() throws IOException {
            System.out.println("close方法执行了");
            out.close();
        }
    }

}

如何调用自定义的指令

         调用自定义指令和调用自定义方法是一样的过程。第一步需要将自定义的指令告诉程序,第二步就是调用自定义指令。

         第一步有两种方法,第一种就是使用Java代码,第二种就是使用html或者ftl页面文件。

 

第一种保存方式

我这里通过springmvc的ModelMap对象保存,key是upper在调用的时候就是使用upper就可以了。

    @RequestMapping(value = "/upper.action")
    public String upper(ModelMap modelMap) {
//        方式一通过代码创建对象并保存
        modelMap.put("upper", new UpperDirective());
        return "upper";
    }

Html页面调用

<html>
<head>
    <title>FreeMarker Hello World</title>
</head>
<table>
    <@upper>
        <#list ["red", "green", "blue"] as color>
            ${color }
        </#list>
    </@upper>
</table>
</body>
</html>


第二种保存方式

该方法仅仅是跳转到页面,不在这里保存自定义指令

    @RequestMapping(value = "/upper.action")
    public String upper(ModelMap modelMap) {
//        方式一通过代码创建对象并保存
//        modelMap.put("upper", new UpperDirective());
        return "upper";
    }

Html页面

<html>
<head>
    <title>FreeMarker Hello World</title>
</head>
<!--创建这个对象保存好-->
<#assign upper = "com.rabbit.freemarder.instructions.UpperDirective"?new() />
<table>
    <@upper>
        <#list ["red", "green", "blue"] as color>
            ${color }
        </#list>
    </@upper>
</table>
</body>
</html>

这里总结一下,个人是建议使用第二种方式去操作,因为当自定义指令很多的时候可以使用一个ftl文件去保存,在需要使用的页面通过freemarker的include指令包含就可以了。而且将java代码的工作给了html页面。





展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie
应支付0元
点击重新获取
扫码支付

支付成功即可阅读