freemarker 自定义函数
- 调用自定义函数
<#assign var=[1,2,3,4,5]/>
<#assign var1 = sort_int(var)/>
- 实现一个自定义函数
- 在java中定义一个类,实现TemplateMethodModelEx,并实现其exce方法
public class SortMethod implements TemplateMethodModelEx {
@Override
public Object exec(List arguments) throws TemplateMethodException {
//获取第一个参数
SimpleSequence arg0 = (SimpleSequence)arguments.get(0);
List<BigDecimal> list = arg0.toList();
Collections.sort(list,new Comparator<BigDecimal>(){
@override
public int compare(BigDecimal o1, BigDecimal o2){
return o1.intValue() - o2.intValue();//升序
}
});
return list;
}
}
SimpleSequence代表这是freemarker的通用数组
- 在Controller中添加Object
mv.addObject("sort_int", new SortMethod());
freemarker 自定义指令
- 调用自定义指令
- 用户123456是否拥有admin角色,并且返回admin的权限
- result1和result2代表返回值, 返回值之间用,隔开
- user和role代表入参, 入参之间用空格隔开
- 入参和返回值之间用;分开
<@role user='123456' role='admin'; result1, result2>
...
</@role>
- 实现自定义指令
- 在spring-servlet.xml里的freemarkerConfig里添加
<property name="freemarkerVariables">
<map>
<entry key="role" value-ref="roleDirectiveModel"/>
</map>
</property>
- 在Service层添加类实现TemplateDirectiveModel接口
@Service
public class RoleDirectiveModel implements TemplateDirectiveModel {
/**
* env:环境变量
* params:指令参数(储存你所需要的值, 随便是什么key-value, 入参)
* loopVars:循环变量, 返回值
* body:指令内容
* 除了params之外,其他都能使用null。
* 放进loopVars的应该都是TemplateModel的实现类
*/
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
TemplateScalarModel user = (TemplateScalarModel)params.get("user");
TemplateScalarModel role = (TemplateScalarModel)params.get("role");
if("123456".equals(user.getAsString())
&& "admin".equals(role.getAsString())) {
loopVars[0] = TemplateBooleanModel.TRUE;
}
List<String> otherRights = new ArrayList<String>();
otherRights.add("add");
otherRights.add("delete");
otherRights.add("update");
loopVars[1] = new SimpleSequence(otherRights);
//body用于最后把结果渲染出来
body.render(env.getOut());
}
}