thymeleaf教程-springboot項目中實現thymeleaf自定義標簽


轉載: http://www.9191boke.com/466119140.html    91博客網

開始:

在使用thymeleaf的過程中有時候需要公共部分渲染頁面,這個時候使用自定義標簽實現自動查詢數據進行渲染比較方便,不用額外在每個頁面渲染中去分別查詢。已網站底部的友情鏈接設置為例子,下面開始教程。

1.html

html如下:

<div id="friend_link">
            友情鏈接:
            <div amlink:text="''" style="display: inline">
            </div>
        </div>

可以看出我們需要定義的自定義標簽為amlink。

2.實現自定義標簽處理器

ThSysTagProcessor

package webapp.customlabel;

import com.baomidou.mybatisplus.mapper.SqlRunner;
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;

import java.util.List;
import java.util.Map;

/**
 * 自定義標簽
 */
public class ThSysTagProcessor extends AbstractAttributeTagProcessor {
    private static final String TEXT_ATTRIBUTE  = "text";
    private static final int PRECEDENCE = 10000;

    /*
     templateMode: 模板模式,這里使用HTML模板。
     dialectPrefix: 標簽前綴。即xxx:text中的xxx。
     elementName:匹配標簽元素名。舉例來說如果是div,則我們的自定義標簽只能用在div標簽中。為null能夠匹配所有的標簽。
     prefixElementName: 標簽名是否要求前綴。
     attributeName: 自定義標簽屬性名。這里為text。
     prefixAttributeName:屬性名是否要求前綴,如果為true,Thymeeleaf會要求使用text屬性時必須加上前綴,即xxx:text。
     precedence:標簽處理的優先級,此處使用和Thymeleaf標准方言相同的優先級。
     removeAttribute:標簽處理后是否移除自定義屬性。
     */
    public ThSysTagProcessor(String dialectPrefix) {
        super(
                TemplateMode.HTML,
                dialectPrefix,
                null,
                false,
                TEXT_ATTRIBUTE,
                true,
                PRECEDENCE,
                true);
    }

    @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 title = (String) expression.execute(context);

        SqlRunner sqlRunner = new SqlRunner();
        List<Map<String, Object>> mapList = sqlRunner.selectList("select * from amlink order by sort");
        StringBuilder links = new StringBuilder();
        String alink = "<a href=\"#link#\" target=\"_blank\" title=\"#a_title#\">#title#</a>";
        for (Map<String, Object> map : mapList) {
            String alinkStr = alink
                    .replaceAll("#link#", map.get("link").toString())
                    .replaceAll("#a_title#", map.get("a_title").toString())
                    .replaceAll("#title#", map.get("title").toString())
            ;
            links.append(alinkStr);
        }

        structureHandler.setBody(title + links.toString(), false);
    }
}

注:以下為從數據庫中查詢出友情鏈接並拼接成一個字符串

springboot項目中實現thymeleaf自定義標簽 | 91博客

 

3.定義方言類ThSysDialect

 

package webapp.customlabel;

import org.thymeleaf.dialect.AbstractProcessorDialect;
import org.thymeleaf.processor.IProcessor;
import org.thymeleaf.standard.StandardDialect;
import org.thymeleaf.standard.processor.StandardXmlNsTagProcessor;
import org.thymeleaf.templatemode.TemplateMode;

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

public class ThSysDialect extends AbstractProcessorDialect {
    //定義方言名稱
    private static final String DIALECT_NAME = "Sys Dialect";

    public ThSysDialect() {
        //設置自定義方言與"方言處理器"優先級相同
        super(DIALECT_NAME, "amlink", StandardDialect.PROCESSOR_PRECEDENCE);
    }

    @Override
    public Set<IProcessor> getProcessors(String dialectPrefix) {
        Set<IProcessor> processors = new HashSet<>();
        processors.add(new ThSysTagProcessor(dialectPrefix));
        processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
        return processors;
    }
}

4.在SpringBoot中加載自定義方言

package webapp.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import webapp.customlabel.ThSysDialect;

/**
 * Thymeleaf配置
 */
@Configuration
public class ThymeleafDialectConfig {
    @Bean
    public ThSysDialect thSysDialect() {
        return new ThSysDialect();
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM