thymeleaf自定义标签
初学thymeleaf,实现自定义标签,发现网上很少描述标签的,经过试验,把自己学习的东西写出来,方便以后学习
创建标签类
/**
* 自定义标签
* @author: HIAPAD
* @date: 2020年1月2日
*/
public class UserRoleCheck extends AbstractProcessorDialect {
/** 标签名称,似乎没啥用,自定义 */
private static final String USER_ROLE = "userRoleTag";
/** 标签 */
private static final String PREFIX = "userRole";
protected UserRoleCheck() {
super(USER_ROLE, PREFIX, StandardDialect.PROCESSOR_PRECEDENCE);
}
/**
* 添加标签处理类
*/
@Override
public Set<IProcessor> getProcessors(String arg0) {
Set<IProcessor> processors = new HashSet<>();
processors.add(new UserRoleTagProcessor(arg0));//标签处理类,如果存在多个,可以继续往下添加
return processors;
}
}
标签处理类
/**
* 自定义用户权限校验,按工地来判断
* @author: HIAPAD
* @date: 2020年1月2日
*/
public class UserRoleTagProcessor extends AbstractAttributeTagProcessor {
/** 标签属性值 */
private static final String TEXT_ATTRIBUTE = "check";
/** 标签优先级 */
private static final int PRECEDENCE = 10000;
/**
* templateMode: 模板模式,这里使用HTML模板。
dialectPrefix: 标签前缀。即xxx:text中的xxx。在此例子中prefix为thSys。
elementName:匹配标签元素名。举例来说如果是div,则我们的自定义标签只能用在div标签中。为null能够匹配所有的标签。
prefixElementName: 标签名是否要求前缀。
attributeName: 自定义标签属性名。这里为text。
prefixAttributeName:属性名是否要求前缀,如果为true,Thymeeleaf会要求使用text属性时必须加上前缀,即thSys:text。
precedence:标签处理的优先级,此处使用和Thymeleaf标准方言相同的优先级。
removeAttribute:标签处理后是否移除自定义属性。
*/
protected UserRoleTagProcessor(String dialectPrefix) {
super(TemplateMode.HTML, dialectPrefix, null, false, TEXT_ATTRIBUTE,
true, PRECEDENCE, true);
}
/**
* ITemplateContext:上下文
* IProcessableElementTag:标签属性,修改当前标签的样式等操作
* attributeName:标签内属性
* attributeValue:标签传递的值
* IElementTagStructureHandler:当前标签的元素处理类
*/
@Override
protected void doProcess(ITemplateContext context,
IProcessableElementTag tag, AttributeName attributeName,
String attributeValue, IElementTagStructureHandler structureHandler) {
String id = ShiroUtils.getUser().getId();//从Shiro获取用户信息
WebEngineContext webContest = (WebEngineContext)context;
String userId= (String)webContest.getSession()
.getAttribute(“userId”);//从session获取信息
ApplicationContext appContest = WebApplicationContextUtils
.getWebApplicationContext(webContest.getServletContext());
SysPermissionService sysPermissionService = (SysPermissionService)appContest
.getBean("sysPermissionService");//获取业务处理Bean
if (***) {//判断逻辑
structureHandler.removeAttribute(attributeName);//清除权限属性
} else {
structureHandler.removeElement();//删除按钮
}
}
}
加载自定义标签
/**
* 加载自定义标签
* @author: HIAPAD
* @date: 2020年1月2日
*/
@Configuration
public class ThymeleafConfig {
@Bean
public UserRoleCheck userRoleCheck() {
return new UserRoleCheck();
}
}
html页面使用
<div userRole:check="web:user:add">
<button id="add_btn">新增</button>
</div>