[Freemarker] freemarker自定义指令

吉和同
2023-12-01

内容

笔者学习自定义指令的笔记
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>
    
 类似资料: