笔者学习自定义指令的笔记
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>