最近项目中使用了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> 我可以出来,获取到后台返回${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权限中的内容没有出来,因此就达到了我们要实现的效果。
相关推荐
1. 创建自定义指令类:你需要创建一个继承自`freemarker.template.TemplateDirectiveModel`的Java类。这个类将定义你的自定义标签的行为,包括如何处理输入参数,如何处理模板模型数据,以及如何生成输出。 2. 注册...
在这个"Freemarker自定义标签简单案例"中,我们将深入探讨如何利用Freemarker进行模板设计,并结合自定义标签来增强模板的功能。 首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它...
开发者可以通过自定义指令和利用开源社区的工具,来优化FreeMarker模板的使用,提高工作效率。对于`FormatDirective.java`这样的代码,我们可以通过分析源码,了解它是如何实现文本格式化的,也可以将其作为参考,为...
一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx
而在Freemarker中,可以通过扩展其API创建自定义指令,实现更复杂的逻辑或功能。 总结一下,Struts2、Spring和Freemarker的组合为Java Web开发提供了强大的工具集,涵盖了MVC模式的各个方面。它们的自定义标签功能...
这里的`#list`是Freemarker的迭代指令,遍历`dropdownList`中的每一项,并将`key`和`value`分别插入到`<option>`的`value`和文本内容中。 为了实现通用性,我们需要一个方法或服务在后端生成这个`dropdownList`,...
本文将深入探讨FreeMarker的标签、指令、插值规则以及表达式。 首先,FreeMarker 模板文件由四个主要部分组成: 1. 文本:这部分内容会被直接输出。 2. 注释:以`<#-- ... -->`形式存在,不会被输出到最终文档中。...
本篇文章将深入讲解FreeMarker的指令学习,包括其基本概念、主要指令以及实际应用。 一、FreeMarker的基本概念 1. 模板:FreeMarker的工作核心是模板,模板是一份HTML或XML文件,其中包含静态文本和FreeMarker...
8. **自定义指令**:Freemarker允许定义自定义指令以扩展其功能,满足特定项目需求。 9. **最佳实践**:合理组织模板文件结构、避免模板过于复杂、正确处理null值等都是使用Freemarker时需要注意的最佳实践。 通过...
FreeMarker允许开发人员定义自定义指令,扩展其功能。自定义指令通常以`<@myDirective>`的形式出现,可以处理更复杂的逻辑。 **8. 国际化(i18n)支持** FreeMarker提供对多语言环境的支持,可以使用资源包...
6. **自定义指令与宏**: 开发者可以创建自定义指令来扩展Freemarker的功能,例如封装复杂的业务逻辑或重用模板片段。宏类似于函数,可以接收参数并嵌入到其他模板中。 7. **错误处理与调试**: Freemarker提供了详细...
自定义指令是 Freemarker 强大的特性之一,通过实现 `freemarker.template.DirectiveBody`、`freemarker.template.DirectiveCallSite` 等接口,开发者可以扩展 Freemarker 语言,创建自己的模板指令,满足特定需求...
通过`<@myDirective ...>`的形式调用自定义指令,其中`myDirective`是自定义指令的名字。 文件名中的"FreeMarker Manual.pdf"很可能是英文原版的手册,对于想要深入理解FreeMarker原理和细节的开发者来说,这是必不...
1. 自定义指令:可以扩展Freemarker,创建自定义指令以满足特定需求。 2. 缓存机制:Freemarker支持缓存模板,提高性能。 3. 国际化支持:通过`#localize`和`#fmt`指令处理多语言内容。 4. 静态文本和HTML转义:`...
同时,Freemarker还支持自定义指令和宏,以满足更复杂的需求。 总之,Freemarker的这些常用指令提供了强大的逻辑控制和数据处理能力,使得开发者能够方便地在模板中进行条件判断、循环遍历以及数据操作,从而实现...
Freemarker有许多内置的指令,如`include`用于包含其他模板,`import`用于导入宏库,`list`用于遍历集合等。同时,还可以自定义函数和宏来扩展功能。 10. **模板调试** Freemarker提供了一个调试模式,可以帮助...
- **自定义指令**是**Freemarker**提供的一种扩展机制,允许用户定义自己的指令。 - 用户可以通过实现特定接口并将其注册到**Freemarker**配置中来定义自定义指令。 ##### 4.2 在模板中定义变量 - **Freemarker**...
5. 自定义指令:通过实现`TemplateDirectiveModel`,可以创建自定义指令,增强模板功能。 四、最佳实践 1. 保持模板简洁:避免在模板中进行复杂的逻辑处理,将业务逻辑留在后端。 2. 使用`ModelAndView`或`Map`...