Freemarker自定義方法變量

最近在項目開發(fā)中使用了freemarker,并在前臺顯示文本時遇到這樣一個需求,當長度超過10個字時只顯示出前面10個字,并在后面加...。這里就可以在freemarker中實現(xiàn)一個自定義方法變量。

實現(xiàn)自定義方法變量基本步驟:
1.先實現(xiàn)TemplateMethodModel或TemplateMethodModelEx接口(TemplateMethodModelEx 繼承自TemplateMethodModel 接口,我這里使用的是TemplateMethodModelEx接口),再覆蓋該接口的Object exec(java.util.List arguments)方法,該方法里寫的就是我們自己想要實現(xiàn)的效果,當使用方法表達式調(diào)用一個方法(exec)時,實際上就是在執(zhí)行這個exec方法,頁面中方法表達式的參數(shù)就是該方法的參數(shù),方法的返回值就是方法表達式的返回值。
2.new一個該方法變量的實例添加到freemarker的Configuration配置中。

例子代碼:

/**
 * 截取顯示字符串,當字符串長度超過指定長度時,顯示截取部分加...
 */
public class StringSub implements TemplateMethodModelEx {

    @Override
    public Object exec(@SuppressWarnings("rawtypes") List args) throws TemplateModelException {
        if (args == null || args.size() < 2) {
            throw new RuntimeException("missing arg");
        }

        if (args.get(0) == null || args.get(1) == null) {
            return "";
        }

        SimpleScalar simpleScalar = (SimpleScalar) args.get(0);
        String content = simpleScalar.getAsString();
        SimpleNumber simpleNumber = (SimpleNumber) args.get(1);
        Integer length = simpleNumber.getAsNumber().intValue();

        if (content.length() > length) {
            content = content.substring(0, length);
            return content + "...";
        }

        return content;
    }

}

freemarker工具類(只顯示部分代碼):

public class FreemarkerUtil {
    public static final Configuration cfg = new Configuration();
    static {
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
        cfg.setNumberFormat("###########.##");
        cfg.setSharedVariable("StringSub", new StringSub());
    }

    public static String process(String template, Map<String, ?> model) throws Exception {
        StringWriter out = new StringWriter();
        String result = null;
        try {
            FreemarkerUtil.cfg.getTemplate(template + ".ftl").process(model, out);
            result = out.toString();
        } catch (Exception ex) {
            throw ex;
        } finally {
            StreamUtil.close(out);
        }
        return result;
    }
}

最終在前臺頁面使用:

StringSub(${person.introduce}, 100)  // 截取個人介紹前100個字
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,276評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,616評論 19 139
  • FreeMarker的模板文件并不比HTML頁面復雜多少,FreeMarker模板文件主要由如下4個部分組成: 1...
    年輕小伙程序員閱讀 3,163評論 0 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,150評論 25 708
  • 三:關于人生 1、悲劇的誕生 三年前在網(wǎng)上看一個知名自媒體人的視頻,他說自己的座右銘:“l(fā)ife is a str...
    Ndfbc閱讀 486評論 0 2

友情鏈接更多精彩內(nèi)容