freemarker自定义函数、指令

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 list = arg0.toList();

        Collections.sort(list,new Comparator(){
            @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>
    ...
  • 实现自定义指令
    • 在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 otherRights = new ArrayList();
        otherRights.add("add");
        otherRights.add("delete");
        otherRights.add("update");
        loopVars[1] = new SimpleSequence(otherRights);

        //body用于最后把结果渲染出来
        body.render(env.getOut());
    }
}

你可能感兴趣的:(JavaWeb表现层)