FreeMarker 自定义方法(二)

来源:互联网 发布:手机我的世界拔刀剑js 编辑:程序博客网 时间:2024/05/16 05:46

1. 模板文件 test303.ftl

<#assign x = "something">${indexOf("met", x)}${indexOf("foo", x)}

2. 自定义方法 IndexOfMethod.java

ps: 返回第一个字符串在第二个字符串第一次出现时的索引位置,如果第二个字符串中不包含第一个字符串。

package com.freemarker.test03.Method;import java.util.List;import freemarker.template.SimpleScalar;import freemarker.template.TemplateMethodModelEx;import freemarker.template.TemplateModelException;import freemarker.template.TemplateScalarModel;public class IndexOfMethod implements TemplateMethodModelEx {    @Override    public Object exec(List args) throws TemplateModelException {        String s1 = "";        String s2 = "";        if (args.size() != 2) {            throw new TemplateModelException(                    "Error: Expecting 2 string arguments here");        }        try {            TemplateScalarModel tsm = (TemplateScalarModel) args.get(0);            s1 = tsm.getAsString();            TemplateScalarModel tsm2 = (TemplateScalarModel) args.get(1);            s2 = tsm2.getAsString();        } catch (ClassCastException cce) {            String mess = "Error: Expecting string argument here";            throw new TemplateModelException(mess);        }        // 返回第一个字符串在第二个字符串第一次出现时的索引位置        return new SimpleScalar(getStrPosition(s1, s2));    }    /**     *      * deception: 返回第一个字符串在第二个字符串第一次出现时的索引位置, 如果第二个字符串中不包含第一个字符串,则返回“-1”     * function: author:hsl data:Jul 13, 2015     *      * @param s1     * @param s2     * @return String     */    private String getStrPosition(String s1, String s2) {        return String.valueOf(s2.indexOf(s1));    }}

3. 测试类文件 Test.java

package com.freemarker.test03.Method;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("indexOf", new IndexOfMethod());        // 获取模板(使用内部缓存)        Template temp = cfg.getTemplate("test03.ftl");        // 合并数据模型模板        Writer out = new OutputStreamWriter(System.out);        temp.process(root, out);        out.flush();        out.close();        // 注意: ------------        // 为了简单起见,这里压制了异常(在方法签名中声明了异常,译者注),而在正式运行的产品中不要这样做。    }}

运行结果

2-1
0 0
原创粉丝点击