springboot2+thymeleaf3.0自定义标签

前言

 有时候我们需要实现一些自定义的页面标签,比如实现精确到按钮级的权限控制,你需要在没有权限时将页面相关按钮隐藏.这时就可以依靠自定义标签来解决,当然也可以利用一些现有的开源框架解决.我这里使用前者,因为比较轻量化.

申明方言

springboot2与springboot不一样了,你需要这样,当然不完全是这样.springboot2中的接口类别比较多,根据不同的情况选择实现哪个.

import java.util.HashSet;
import java.util.Set;

import org.springframework.stereotype.Component;
import org.thymeleaf.dialect.AbstractProcessorDialect;
import org.thymeleaf.dialect.IProcessorDialect;
import org.thymeleaf.processor.IProcessor;
import org.thymeleaf.standard.StandardDialect;

/**
 * _声明方言
 * @author sly
 * @time 2019年1月24日
 */
@Component
public class MyTagDialect extends AbstractProcessorDialect implements IProcessorDialect {

	private static final String PREFIX = "mt";

	public MyTagDialect() {
		super("My tag", PREFIX, StandardDialect.PROCESSOR_PRECEDENCE);
	}

	@Override
	public Set<IProcessor> getProcessors(String dialectPrefix) {
		Set<IProcessor> processors = new HashSet<IProcessor>();
		processors.add(new MyTagProcessor(PREFIX));
		return processors;
	}

}

 实现处理器

处理器是用来处理标签的,这里我处理的是MyTag标签,当标签内的url等于"/haha"时不显示该元素,如果用来做权限控制的话,这里要判断标签url是否是在用户权限中,不在就移除标签及其内容,权限在用户权限中就移除标签不移除内容.

package com.sly.demo.thymeleaf.tag;

import javax.servlet.http.HttpServletRequest;

import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.context.WebEngineContext;
import org.thymeleaf.model.IAttribute;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.templatemode.TemplateMode;

/**
 * _处理器
 * @author sly
 * @time 2019年1月24日
 */
public class MyTagProcessor extends AbstractElementTagProcessor {
	private static final int PRECEDENCE = 10000;
	private static final String TAG_NAME = "MyTag";
	
	public MyTagProcessor(String dialectPrefix) {
		super(
				// 此处理器将仅应用于HTML模式
				TemplateMode.HTML,
				// 要应用于名称的匹配前缀
				dialectPrefix,
				// 标签名称:匹配此名称的特定标签
				TAG_NAME,
				// 没有要应用于标签名称的前缀
				false,
				// 无属性名称:将通过标签名称匹配
				null,
				// 没有要应用于属性名称的前缀
				false,
				// 优先(内部方言自己的优先)
				PRECEDENCE);
	}

	@Override
	protected void doProcess(ITemplateContext context, IProcessableElementTag tag,
			IElementTagStructureHandler structureHandler) {
		//获取元素名称
		System.out.println(tag.getElementCompleteName());
		WebEngineContext context2 = (WebEngineContext)context;
		HttpServletRequest request = context2.getRequest();
		
		System.out.println("用户:" + request.getSession().getAttribute("username"));
		
		
		IAttribute url = tag.getAttribute("url");
		System.out.println("匹配上:" + url.getValue());
		if (url.getValue().equals("/haha")) {
			structureHandler.removeElement();
		} else {
			structureHandler.removeTags();
		}
		
	}

}

结果 

页面上第一个标签没有,第二个标签存在.使用版本为springboot 2.0.6.RELEASE

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值