thymeleaf自定义标签方言处理

 项目背景: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 待测试补充。。

原文地址:https://www.cnblogs.com/eric-fang/p/8376575.html