喜欢
ddekany
提到你可以创建你自己的方法。下面是一个如何做到这一点的示例:
Java代码
import freemarker.template.*;
import java.util.List;
import java.util.TreeMap;
public class RomanNumerals implements TemplateMethodModelEx {
private final static TreeMap<Integer, String> map = new TreeMap<>();
static {
map.put(1000, "M");
map.put(900, "CM");
map.put(500, "D");
map.put(400, "CD");
map.put(100, "C");
map.put(90, "XC");
map.put(50, "L");
map.put(40, "XL");
map.put(10, "X");
map.put(9, "IX");
map.put(5, "V");
map.put(4, "IV");
map.put(1, "I");
}
// Copied from Stackoverflow https://stackoverflow.com/a/19759564/2735286
private static String toRoman(int number) {
int l = map.floorKey(number);
if (number == l) {
return map.get(number);
}
return map.get(l) + toRoman(number - l);
}
@Override
public Object exec(List arguments) throws TemplateModelException {
final boolean upperCase = ((TemplateBooleanModel) arguments.get(0)).getAsBoolean();
final Integer number = ((SimpleNumber) arguments.get(1)).getAsNumber().intValue();
String roman = toRoman(number);
return new SimpleScalar(upperCase ? roman : roman.toLowerCase());
}
}
在处理模板之前,必须将其插入到数据模型映射中:
HashMap<String, Object> dataModel = new HashMap<>();
dataModel.put("date", new Date());
dataModel.put("roman", new RomanNumerals());
testTemplate.process(dataModel, new PrintWriter(System.out));
这就是你在
模板引擎
:
${roman(true, 1234)}