项目背景:springboot+thymeleaf
thymeleaf两种方式处理自定义标签:AbstractAttributeTagProcessor 和 AbstractElementTagProcessor
一、AbstractAttributeTagProcessor :
1. 定义dialog
package com.spt.im.web.config; import java.util.HashSet; import java.util.Set; import org.springframework.beans.factory.annotation.Value; import org.thymeleaf.dialect.AbstractProcessorDialect; import org.thymeleaf.processor.IProcessor; public class CustomDialect extends AbstractProcessorDialect{ private static final String DIALECT_NAME = "staticFile"; private static final String PREFIX = "W"; public static final int PROCESSOR_PRECEDENCE = 1000; @Value("${im.static.resources}") private String filePath; protected CustomDialect() { super(DIALECT_NAME, PREFIX, PROCESSOR_PRECEDENCE); } @Override public Set<IProcessor> getProcessors(String dialectPrefix) { final Set<IProcessor> processors = new HashSet<IProcessor>(); processors.add(new SampleJsTagProcessor(dialectPrefix, filePath)); processors.add(new SampleCssTagProcessor(dialectPrefix, filePath)); processors.add(new SampleSrcTagProcessor(dialectPrefix, filePath)); return processors; } }
2. 定义处理器
package com.spt.im.web.config; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.context.ITemplateContext; import org.thymeleaf.engine.AttributeName; import org.thymeleaf.model.IProcessableElementTag; import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; import org.thymeleaf.processor.element.IElementTagStructureHandler; import org.thymeleaf.standard.expression.IStandardExpression; import org.thymeleaf.standard.expression.IStandardExpressionParser; import org.thymeleaf.standard.expression.StandardExpressions; import org.thymeleaf.templatemode.TemplateMode; public class SampleJsTagProcessor extends AbstractAttributeTagProcessor{ private static final String ATTR_NAME = "js"; private static final String ELE_NAME = "script"; private static final int PRECEDENCE = 10000; private String filePath; protected SampleJsTagProcessor(String dialectPrefix, String filePath) { super( TemplateMode.HTML, dialectPrefix, ELE_NAME, false, ATTR_NAME, true, PRECEDENCE, true); this.filePath = filePath; } @Override protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler structureHandler) { final IEngineConfiguration configuration = context.getConfiguration(); final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration); final IStandardExpression expression = parser.parseExpression(context, attributeValue); final String url = (String) expression.execute(context); structureHandler.setAttribute("src", filePath + url); } }
3. 添加到配置中
package com.spt.im.web.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WorkImport { @Bean public CustomDialect testDialect(){ return new CustomDialect(); } }
4. 页面中使用
<script W:js="@{/static/js/pinyin.js}" type="text/javascript"></script>
OK,完毕,项目运行,上述标签会被替换成相应的链接。
二、AbstractElementTagProcessor 待测试补充。。