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.它不 ...
随机推荐
- IKEv1协商安全联盟的过程
IKEv1协商安全联盟的过程 采用IKEv1协商安全联盟主要分为两个阶段: 第一阶段,通信双方协商和建立IKE协议本身使用的安全通道,即建立一个IKE SA: 第二阶段,利用第一阶段已通过认证和安全保 ...
- MySQL数据库初体验
一.数据库的基本概念1.数据(Data) 描述事物的符号记录 包括数字,文字,图形,图像,声音,档案记录等 以"记录"形式按统一的格式进行存储 2.表 将不同的记录组织在一起 用来 ...
- Markdown主要语法及使用
最近,我发现使用Markdown这一标记语言的人越来越多了,我也去试了一下,感觉确实在编辑文档上方便了很多.于是我将一些关于Markdown的语法和编写时的快捷键整理在这里,方便以后查阅,也欢迎评论区 ...
- Java比较两个浮点数
浮点数的基本数据类型不能用==比较,包装数据类型不能用 equals 比较 浮点数的表示 在计算机系统中,浮点数采用 符号+阶码+尾数 进行表示.在Java中,单精度浮点数float类型占32位,它的 ...
- 解决使用tomcat服务器发布web项目时出现URL中文乱码的问题
打开Tomcat的安装路径 打开server.xml文件 在修改端口号的一行既是下图中位置添加 URIEncoding="UTF-8" 就能替换在用eclipse或者myeclip ...
- 记一次docker compose的低级错误
记一次docker compose的低级错误 问题 今天在学习dockercompose的时候,启动docker compose up,结果却出现异常 Error response from da ...
- javascript/html 禁止图片缓存
更新图片, 如果图片的url没有改变, 刷新页面之后图片会使用缓存的图片 Solutions: * js改变图片链接 (添加get参数) // 假设当前这个图片的dom对象为img img.src + ...
- Centos7安装配置Gitlab-CE
GitLab介绍 GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业.学校等内部网络搭建git私服. 功能:Gitl ...
- 『GoLang』数组与切片
数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构):这种类型可以是任意的原始类型例如整型.字符串或者自定义类型. 数组长度必须是一个常量表达式,并且必须是一个非负 ...
- P4245-[模板]任意模数多项式乘法
正题 题目链接:https://www.luogu.com.cn/problem/P4245 题目大意 两个多项式,求它们的乘积模\(p\). 解题思路 方法好像挺多,我用的是最简单的一种就是,先定一 ...