springboot+thymeleaf自定義select標籤

 

效果

<sys:dict type="DISEASES_OPTION" name="option_code" class="" />

創建方言

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;
/**
 * Thymeleaf 方言:系統用
 */
public class SysDialect extends AbstractProcessorDialect {
    // 定義方言名稱
    private static final String DIALECT_NAME = "Sys Dialect";
    public SysDialect() {
        // 設置自定義方言與“方言處理器”優先級相同
        super(DIALECT_NAME, "sys", StandardDialect.PROCESSOR_PRECEDENCE);
    }
    /**
     * 元素處理器
     * @param dialectPrefix 方言前綴
     * @return
     */
    @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;
    }
}

創建並設置標籤

這個類我這裏從數據庫中查的數據,可替換加數據看效果

import com.dnkj.childAppBackstage.model.Dictionary;
import com.dnkj.childAppBackstage.service.DictionaryService;
import org.springframework.context.ApplicationContext;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.spring5.context.SpringContextUtils;
import org.thymeleaf.templatemode.TemplateMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 自定義字典標籤
 */
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
        );
    }
    /**
     * 處理自定義標籤 DOM 結構
     *
     * @param iTemplateContext            模板頁上下文
     * @param iProcessableElementTag      待處理標籤
     * @param iElementTagStructureHandler 元素標籤結構處理器
     */
    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
     // 獲取 Spring上下文
        ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(iTemplateContext);
        //獲取字典service的bean
        DictionaryService dictService = applicationContext.getBean(DictionaryService.class);
        //獲取標籤的屬性值
        String dictType = iProcessableElementTag.getAttributeValue("type");
        String dictName = iProcessableElementTag.getAttributeValue("name");
        String dictClass = iProcessableElementTag.getAttributeValue("class");
       
        //查詢數據庫
        //設置參數
        Map<String,Object> paraMap = new HashMap<String,Object>();
        paraMap.put("dict_type", dictType);
        // 根據類型查詢出字典列表
        List<Dictionary> dictList = dictService.getList(paraMap);
       
        // 創建將替換自定義標籤的 DOM 結構
        IModelFactory modelFactory = iTemplateContext.getModelFactory();
        IModel model = modelFactory.createModel();
        // 這裏是將字典的內容拼裝成一個下拉框
        model.add(modelFactory.createOpenElementTag(String.format("select name='%s' class='%s'", dictName, dictClass)));
        for (Dictionary dict : dictList) {
            model.add(modelFactory.createOpenElementTag(String.format("option value='%s'", dict.getDict_code())));
            model.add(modelFactory.createText(dict.getDict_name()));
            model.add(modelFactory.createCloseElementTag("option"));
        }
        model.add(modelFactory.createCloseElementTag("select"));
        // 利用引擎替換整合標籤
        iElementTagStructureHandler.replaceWith(model, false);
    }
}

配置注入

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.dnkj.childAppBackstage.schedule.SysDialect;
/**
 * Thymeleaf配置
*/
@Configuration
public class ThymeleafDialectConfig {
    /**
     * 自定義方言注入
     * 字典下拉框下拉框
     * @return
     */
    @Bean
    public SysDialect sysDialect() {
        return new SysDialect();
    }
}

使用

增加命名空間配置:xmlns:sys=""

 <html xmlns:th="http://www.thymeleaf.org" xmlns:sys="">

<sys:dict type="DISEASES_OPTION" name="option_code" class="" />

 

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