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