[Freemarker] freemarker自定义指令

来源:互联网 发布:秦川机床与人工智能 编辑:程序博客网 时间:2024/05/15 13:02

内容

笔者学习自定义指令的笔记
freemarker自定义指令 与 JSP的标签库 类似

自定义指令

<@指令名 key1=value1 key2=value2; result1,result2>

</@指令名>

入参:key,value键值对形式传入,入参之间用空格隔开
出参:可多个,出参变量名之间用,间隔

使用

例:在flt里传入 用户名userName 与 要验证的权限admin
后台验证是否有admin权限,结果存于result1
后台取出该用户其他权限,结果存于result2

  • Spring配置文件中配置自定义指令
    在spring配置文件的property标签配置
    key为标签名
    value-ref为相应的bean,配置bean的方法:①spring配置文件中配置bean②注解方式

    <property name="freemarkerVariables">    <map>        <entry key="role" value-ref="roleDirectiveModel"/>    </map></property>
  • 编写处理该指令的bean类
    env环境变量
    params:指令的入参,params.get(key)用key取value
    loopVars:指令的出参,为一个数组形式
    body:指令内容
    除params外,其他的都能null
    注意:
    ①获得入参时都有TemplateScalarModel类型,要用时需调用相应方法转换成Java类型
    ②写入出参loopVars时需写入freemarker的类型TemplateModel

    @Service //bean注解public class RoleDirectiveModel implements TemplateDirectiveModel {    @Override    //处理逻辑的函数    public void execute(Enviroment env,Map params,TemplateModel[] loopVars,TemplateDirectiveBody body) throws TemplateException,IOException {        //取两个入参        TemplateScalarModel user = (TemplateScalarModel)params.get("user");        TemplateScalarModel role = (TemplateScalarModel)params.get("role);        //模拟数据库操作,查看该用户的权限是否为admin        if ("userName".equals(user.getAsString()) && "admin".equals(role.getAsString()) ) {            //是;给第一个返回值赋值true            loopVars[0] = TemplateBooleanModel.TRUE;        }        //模拟数据库,取出该用户其他权限        List<String> otherRights = new ArrayList<String>();        otherRights.add("add");        otherRights.add("delete");        //给出参赋值        loopVars[1] = new SimpleSequence(otherRights);        //把结果输出到flt页面中        body.render(env.getOut() );    }}
  • flt中使用指令
    传入用户名 与 要验证的权限;返回结果到result1,result2
    result1返回 是否拥有该权限
    result2返回 该用户其他权限
    对结果进行反馈

    <@role user="userName" role="admin";result1,result2>    <#if result1>  <#-- 如果userName的权限是admin,则result1的值为true-->        我的角色是admin<br/>    </#if>    我拥有的权限是:    <#list reulst2 as item>        @{item},    </#list></@role>