freemarker自定义指令
最近项目中使用了spring boot搭建项目,使用spring security管理项目中的权限,使用freemarker作为视图层。为了将权限控制到按钮上,因此考虑直接使用spring security的标签实现,但是在整合的过程中,没有整合出来,突然想到freemarker可以自定义指令实现一些功能,因此记录一下,在freemarker中如何实现一个自定义指令,来达到实现部分内容的显示和隐藏。
需求:自定义一个freemarker标签,当满足某些条件的时候显示标签体中的内容,否则不进行显示。
实现步骤:
1、编写一个类实现 TemplateDirectiveModel 接口(freemarker实现自定义标签需要实现这个接口)
2、编写一个freemarker的配置类,在freemarker的Configuration中注册这个自定义标签
3、页面上进行使用
一、编写一个类实现TemplateDirectiveModel接口
public class AuthDirective implements TemplateDirectiveModel {
private static final String AUTH = "auth";
@Override
public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
// 1.获取用户所有的权限
Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
// 2.获取标签中auth属性的值,此处我知道前台页面传递过来的是String类型,所以可以直接强制转换成SimpleScalar类型
SimpleScalar auth = (SimpleScalar) map.get(AUTH);
// 3、给页面上的循环变量设置值
if (null != templateModels && templateModels.length > 0) {
templateModels[0] = new SimpleScalar("<span style='color:red'>这个是后台返回的值</span>"); // 返回给前台一个String的类型
templateModels[1] = new StringArraySequence(new String[]{"张三", "李四", "王五"}); // 返回给前台一个Sequence类型
}
// 4.判断用户是否拥有这个权限
if (authorities.contains(new SimpleGrantedAuthority(auth.getAsString()))) {
// 显示指令包含的中间的内容
templateDirectiveBody.render(environment.getOut());
}
}
}
注:1、map中的key是String类型,value是TemplateModel类型
2、key可以简单的理解为自定义标签中的属性值,value为属性对应的值, key和value是可以有多个的。
3、eg <@auth auth="03"></@auth> ===> key=auth value=03
4、templateDirectiveBody可以简单理解为标签体中的内容
5、templateModels这个是循环变量<@auth auth="03";loopVar01></@auth> loopVar01这个就是一个循环变量,后台赋值之后,前台可以获取到这个值
二、注册这个自定义标签
@Configuration
public class FreemarkerConfig implements InitializingBean {
@Autowired
@Qualifier("freeMarkerConfiguration")
private freemarker.template.Configuration freeMarkerConfiguration;
@Bean
public AuthDirective authDirective() {
return new AuthDirective();
}
@Override
public void afterPropertiesSet() throws Exception {
freeMarkerConfiguration.setSharedVariable("auth", authDirective());
}
}
注:上方的auth表示页面上的自定义的标签标签名是auth
三、页面上使用(我页面上登录的用户是有03权限,没有01权限)
<@auth auth="03";loopVar01,loopVar02>auth auth="03";loopVar01,loopVar02>
我可以出来,获取到后台返回${loopVar01}<br/>
<#list loopVar02 as loop>
per : ${loop_index}-${loop}
</#list>
</@auth>
<@auth auth="01">
因为我没有这个权限,所以出不来
</@auth>
我可以出来,获取到后台返回${loopVar01}<br/>
<#list loopVar02 as loop>
per : ${loop_index}-${loop}
</#list>
</@auth>
<@auth auth="01">
因为我没有这个权限,所以出不来
</@auth>
注:@auth 这个就是自定义标签,此处表示是auth标签 auth="03" 表示有一个属性是auth,并且它的值是03
loopVar01和loopVar02都是后台返回给前台的数据
四、运行效果
注: 可以看到拥有03权限中的内容出来了,而01权限中的内容没有出来,因此就达到了我们要实现的效果。
freemarker自定义指令的更多相关文章
- 基于SSM3框架FreeMarker自定义指令(标签)实现
通过之前的Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解系列文章,我们已经成功的整合到了一起,这次大象将在此基础上对框架中的FreeMarker模板 ...
- freemarker自定义标签(三)-nested指令
freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...
- [freemarker篇]06.超级强大的自定义指令
Freemarker的自定义指令是很强大的,非常强大,在之后的教程中我会简单的做一个示例,让大家对其有所了解!如果做Freemarker编程,请好好看看API手册,可以说里面的内容很多!也是一门独立的 ...
- freemarker实现自定义指令和自定义函数
自定义指令: 1.指令在前台实现 <#macro name param1,param2,param3...paramN> </#macro> 2.指令在后台实现 1.实现Tem ...
- freemarker自定义标签(一)
freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...
- freemarker自定义标签报错(七)
1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- freemarker自定义标签(二十一)
一,讲解一 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-equiv=" ...
- Freemaker 自定义指令和函数
自定义函数和指令都可以在前台或者后台进行指定. 个人理解:指令的作用,主要是进行页面调整之后进行输出:函数的作用,主要是为了进行运算,返回运算结果供前台展示. (一) 自定义指令 使用以下格式调用自定 ...
- FreeMarker 自定义 TemplateDirectiveModel(一)
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...
随机推荐
- python库--tensorflow
方法 返回值类型 参数 说明 张量 .constant() Tensort 张量 实例t value 创建一个常量tensor dtype=None 输出类型 shape=None 返回tens ...
- ysoserial CommonsColletions4分析
ysoserial CommonsColletions4分析 其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点. 不过要注意的是,CC4和CC2一样需要在commons- ...
- WPF 第三方资源
1.XCeed 开发的Extended WPF Toolkit http://wpftoolkit.codeplex.com/ http://www.csdn123.com/html/blogs/20 ...
- k8s 部署elasticsearch报 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
1.由于登不上云的节点 不采用修改节点配置的方式 修改部署的stateful 加上 initContainers 它和 containers 同一层级的 initContainers: - name: ...
- 自制计算器 v1.1
之前的v1.0版本功能还不够完善,这个版本一并做了修改. 代码,每个sub表示哪个按钮做了注释. Dim a, temp, ans As Integer Dim op As String Sub sh ...
- 数据结构逆向分析-Map
数据结构逆向分析-Map map是一个典型的二叉树结构,准确的来说是一个平衡二叉树或者红黑树,特点是数据存储是有序的存储. 参考侯杰老师的stl源码剖析,map里面采用的是RB-TREE也就是红黑树 ...
- Loadrunner拼装唯一值方法
由于Loadrunner函数有限性,唯一值需要几个函数的字符串进行拼装,可实现流水号.订单号等等数值的唯一性.具体可见下列方法: 方法一: char OraderID[15];srand(time{N ...
- P5012-水の数列【并查集,RMQ】
正题 题目链接:https://www.luogu.com.cn/problem/P5012 题目大意 \(n\)个数字的一个序列,\(T\)次询问给出\([l,r]\)要求 找出一个最大的\(x\) ...
- 千位分隔符的JS实现
$.extend({ //千位分割符 MoneySeparator: function numFormat(num){ if(num==null){ return num; }else { num=n ...
- IdentityServer4[5]简化模式
Implicit简化模式(直接通过浏览器的链接跳转申请令牌) 简化模式是相对于授权码模式而言的.其不再需要[Client]的参与,所有的认证和授权都是通过浏览器来完成的. 创建项目 IdentityS ...