Freemarker自定义方法变量

最近在项目开发中使用了freemarker,并在前台显示文本时遇到这样一个需求,当长度超过10个字时只显示出前面10个字,并在后面加...。这里就可以在freemarker中实现一个自定义方法变量。

实现自定义方法变量基本步骤:
1.先实现TemplateMethodModel或TemplateMethodModelEx接口(TemplateMethodModelEx 继承自TemplateMethodModel 接口,我这里使用的是TemplateMethodModelEx接口),再覆盖该接口的Object exec(java.util.List arguments)方法,该方法里写的就是我们自己想要实现的效果,当使用方法表达式调用一个方法(exec)时,实际上就是在执行这个exec方法,页面中方法表达式的参数就是该方法的参数,方法的返回值就是方法表达式的返回值。
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个字
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,970评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,987评论 19 139
  • FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1...
    年轻小伙程序员阅读 3,066评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,482评论 25 708
  • 三:关于人生 1、悲剧的诞生 三年前在网上看一个知名自媒体人的视频,他说自己的座右铭:“life is a str...
    Ndfbc阅读 461评论 0 2