thymeleaf自定义标签

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>

你可能感兴趣的:(thymeleaf自定义标签)