Thymeleaf 自定義標籤

本文介紹自定義標籤,使用的環境爲,

spring-boot-starter-parent 版本爲  1.5.10.RELEASE   使用的 Thymeleaf 的版本是 3.0.9.RELEASE

如果使用的  spring-boot-starter-parent 爲 2.0 以上 則使用 Thymeleaf 的版本則是4以上

按照上面版本的說明,首先先把Thymeleaf 的版本進行升級

注意一定需要升級,不然會報錯,下面是依賴

            <dependency>
                <groupId>net.sourceforge.nekohtml</groupId>
                <artifactId>nekohtml</artifactId>
                <version>${nekohtml.version}</version>
            </dependency>
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring4</artifactId>
                <version>${thymeleaf.version}</version>
            </dependency>
            <dependency>
                <groupId>nz.net.ultraq.thymeleaf</groupId>
                <artifactId>thymeleaf-layout-dialect</artifactId>
                <version>${thymeleaf-layout-dialect.version}</version>
            </dependency>

            <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
            <thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
            <nekohtml.version>1.9.22</nekohtml.version>

首先進行配置,配置在頁面導入的 名稱空間的 標籤前綴

創建一個類並且繼承  AbstractProcessorDialect 該類 ,該類是一個默認的方言處理器,重寫下面的 構造函數和方法

/**
 * 系統方言
 */
public class SysDialect  extends AbstractProcessorDialect {
    // 定義方言名稱
    private static final String DIALECT_NAME = "Sys Dialect";
    /**
     * 構造函數
     */
    public SysDialect() {
        // 設置自定義方言與“方言處理器”優先級相同
        /*
        * DIALECT_NAME : 表示 設置的方言的名稱
        * sys : 表示在頁面使用的標籤的名稱  是在名稱空間中聲明的 部分
        * */
        super(DIALECT_NAME, "thSys", StandardDialect.PROCESSOR_PRECEDENCE);
    }

    @Override
    public Set<IProcessor> getProcessors(String dialectPrefix) {
        Set<IProcessor> processors = new HashSet<IProcessor>();

        // 添加自定義標籤
        processors.add(new SysDictTagProcessor(dialectPrefix));
        processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
        return processors;
    }
}

設置完成之後,下面開始創建,名稱空間前綴 調用的 具體的標籤名稱和功能

創建一個類,繼承  AbstractElementTagProcessor ,標籤元素處理器 ,該類也需要重寫構造函數和具體的方法

/**
 * 創建標籤  具體的 標籤
 */
public class SysDictTagProcessor extends AbstractElementTagProcessor {
    // 標籤名
    private static final String TAG_NAME = "dict";

    // 優先級
    private static final int PRECEDENCE = 10000;

    public SysDictTagProcessor(String dialectPrefix) {
        super(
                // 此處理器將僅應用於HTML模式
                TemplateMode.HTML,

                // 要應用於名稱的匹配前綴
                dialectPrefix,

                // 標籤名稱:匹配此名稱的特定標籤 該內容就是在使用名稱空間調用的 標籤
                TAG_NAME,

                // 將標籤前綴應用於標籤名稱
                true,

                // 無屬性名稱:將通過標籤名稱匹配
                null,

                // 沒有要應用於屬性名稱的前綴
                false,

                // 優先(內部方言自己的優先)
                PRECEDENCE
        );

    }

    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag
            iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
       // 首先 引入 server 進行數據的查詢,但是在引入bena 的時候,會報錯,因爲當前類不是server類,所以需要
//        創建類,然後使用上下文,獲取相應的bena
        ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(iTemplateContext);
        DictService dictService = applicationContext.getBean(DubboUtils.class).getDictService();

        //  獲取前端頁面傳遞的屬性
        String type = iProcessableElementTag.getAttributeValue("type");
        String name = iProcessableElementTag.getAttributeValue("name");
        String classStyle = iProcessableElementTag.getAttributeValue("class");
        // 進行數據的查詢 根據 type 查詢
        List<Dict> dictByType = dictService.getDictByType(type);
        if(dictByType != null && dictByType.size() >0){
            // 創建標籤
            IModelFactory modelFactory = iTemplateContext.getModelFactory();
            IModel model = modelFactory.createModel();
            model.add(modelFactory.createOpenElementTag(String.format("select name='%s' class='%s'",name,classStyle)));
            for (Dict dict : dictByType) {
                model.add(modelFactory.createOpenElementTag(String.format("option value='%s'",dict.getValue())));
                model.add(modelFactory.createText(dict.getLabel()));
                model.add(modelFactory.createCloseElementTag("option"));
            }
            model.add(modelFactory.createCloseElementTag("select"));

            iElementTagStructureHandler.replaceWith(model,false);
        }
    }
}

可以將具體的功能,在  doProcess 方法中寫,並最後將標籤進行替換

在頁面中使用,本案例是在html頁面中使用

 首先導入名稱空間

導入之後,在需要使用的位置調用該標籤即可

具體的屬性可以在後端直接獲取到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章