`

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>
我可以出来,获取到后台返回${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权限中的内容没有出来,因此就达到了我们要实现的效果。

 

  • 大小: 16.4 KB
分享到:
评论

相关推荐

    freemarker自定义的通用分页指令(标签)源码和使用示例

    一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx

    PublicCMSV1.0使用手册_20151012.docx

    PublicCMS是一款基于SpringMVC4.2.1,Hibernate5.0.2,FreeMarker2.3.23,hibernate-search5.5.0开发的永久免费开源JAVACMS系统,支持全站静态化,SSI技术,更有多种独创解决方案,FreeMarker自定义指令自动加载,0关联...

    freemarker语法完整版

    B 指令 if, else, elseif 语法 Java代码 &lt;#if condition&gt; ... &lt;#elseif condition2&gt; ... &lt;#elseif condition3&gt; ... ... &lt;#else&gt; ... &lt;/#if&gt; ... ... ... ... ... 用例 ...

    freemarker总结

    6、 用户自定义FTL指令:宏和变换器 7、 节点 节点变量表示为树型结构中的一个节点,通常在XML处理中使用。 在模板里对sequences和hashes初始化 sequences 1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey...

    freemarker-advance-demo:对freemarker的一些特性的使用demo

    #freemarker demo这是一个介绍freemarker的一些使用方法的demo、目前主要提供了两个freemarker的高级用法:自定义指令及宏

    超完整FreeMarker中文教程,代码

    4.1 自定义指令 ................................................................................................ 46 4.2 在模板中定义变量 ...................................................................

    freemarker+struts2仿QQ分页效果

    不过由于小弟资历浅薄,也没心思看,主要是strut2的标签本来我就觉得不大习惯,另外上个月接触了freemarker后,实在是用的爽死了,为什么不用freemarker的macro指令写个通用的分页呢?马上想到模仿TX的...

    Java学习指南(11) FreeMarker与MVC框架

    〖主要内容〗包含以下内容,具体以课程目录为准:* 开发环境与API* 基本类型的插值* Hash 与 Sequece类型的插值* 常用的 built-in 用法* 等指令的用法* 自定义函数 Method Variables * 共享变量 Shared ...

    FreeMarker中文指导手册

    4.1 自定义指令 ................................................................................................ 45 4.2 在模板中定义变量 ...................................................................

    FreeMarker 手册

    4.1 自定义指令 ................................................................................................ 45 4.2 在模板中定义变量 ...................................................................

    适合作为毕设选题,采用了SpringBoot,VUE,Redis,ElementUI,MySQL等多种新技术

    这是一款适合作为毕设选题,养老院使用的系统管理系统,采用了**SpringBoot,VUE,Redis,ElementUI****MySQL**等多种新...同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。

    深入浅出Struts2(附源码)

    24.1 JSP include指令/标签的不足 302 24.2 Tiles布局和定义 303 24.2.1 布局页面 303 24.2.2 Tiles定义 304 24.3 Struts Tiles插件 305 24.4 Struts Tiles示例 306 24.5 小结 309 第25章 JFreeChart插件 310...

    Java Web程序设计教程

    3.2.7jsp的动作指令 41 3.2.8jsp的内置对象 43 3.3认识servlet 46 3.3.1servlet的开发 46 3.3.2使用httpservlet 47 3.3.3servlet的生命周期 49 3.3.4load-on-startupservlet 50 3.4自定义标签库 51 3.5...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    24.1 JSP include指令/标签的不足 302 24.2 Tiles布局和定义 303 24.2.1 布局页面 303 24.2.2 Tiles定义 304 24.3 Struts Tiles插件 305 24.4 Struts Tiles示例 306 24.5 小结 309 第25章 JFreeChart插件 310 25.1 ...

Global site tag (gtag.js) - Google Analytics