最近在項目開發(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個字