本文介紹自定義標籤,使用的環境爲,
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頁面中使用
首先導入名稱空間
導入之後,在需要使用的位置調用該標籤即可
具體的屬性可以在後端直接獲取到