自定義方言 兩個類
/**
* Thymeleaf 方言
*/
@Component // 被spring管理
public class NumberToLetterDialect extends AbstractProcessorDialect {
private static final String DIALECT_NAME = "dialectName";
private static final String PREFIX = "prefix";
public NumberToLetterDialect() {
// 設置自定義方言與方言處理器優先級相同
super(DIALECT_NAME, PREFIX, StandardDialect.PROCESSOR_PRECEDENCE);
}
@Override
/**
* 元素處理器
* @param dialectPrefix 方言前綴
* @return
*/
public Set<IProcessor> getProcessors(String dialectPrefix) {
Set<IProcessor> processors = new HashSet<>();
// 添加自定義標籤處理器
processors.add(new NumberToLetterDialectProcessor(dialectPrefix));
processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
return processors;
}
}
/**
* @author 李 磊
* 標籤處理器
*/
public class NumberToLetterDialectProcessor extends AbstractAttributeTagProcessor {
// 標籤名
private static final String TAG_NAME = "tagName";
// 屬性名
private static final String ATTRIBUTE_NAME = "attributeName";
protected NumberToLetterDialectProcessor(String dialectPrefix) {
super(
// 此處理器將僅應用於HTML模式
TemplateMode.HTML,
// 標籤前綴名 xxxx:text中的xxxx
dialectPrefix,
// 標籤名稱 匹配此名稱的特定標籤 null爲不限制
TAG_NAME,
// 將標籤前綴應用於標籤名稱
false, // true
// 標籤前綴屬性 如<xxxx:toLetter>
ATTRIBUTE_NAME,
// 開啓屬性名稱前綴
true,
// 優先級和原生標籤相同
StandardDialect.PROCESSOR_PRECEDENCE,
// 標籤處理後是否移除自定義屬性
true);
}
@Override
protected void doProcess(ITemplateContext context
, IProcessableElementTag tag
, AttributeName attributeName
, String attributeValue
, IElementTagStructureHandler structureHandler) {
// 使用shiro thymeleaf工具類獲取屬性值
// final String rawValue = ThymeleafFacade.getRawValue(tag, attributeName);
// 獲取屬性值
final IEngineConfiguration configuration = context.getConfiguration();
final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration);
final IStandardExpression expression = parser.parseExpression(context, attributeValue);
final Object rawValue = String.valueOf(expression.execute(context));
// 獲取標籤名
// final String elementCompleteName = tag.getElementCompleteName();
// 創建模型
final IModelFactory modelFactory = context.getModelFactory();
final IModel model = modelFactory.createModel();
// 添加模型 標籤
model.add(modelFactory.createOpenElementTag("h1"));
model.add(modelFactory.createText(NumberToLetterConverter(rawValue)));
model.add(modelFactory.createCloseElementTag("h1"));
// 替換頁面標籤
structureHandler.replaceWith(model, false);
// 只改變標籤內數據
// structureHandler.setBody(NumberToLetterConverter(rawValue), false);
}
private String NumberToLetterConverter(String str) {
int i = Integer.valueOf(str);
char c;
String s = "";
if (i <= 26) {
// 將ASCII碼轉換成字母 我這裏都是小寫
c = (char) (i + 96);
s = String.valueOf(c);
} else if (i > 26) {
List<Character> numlist = new ArrayList<>();
// 單循環數大於26時 就在前加個啊 效果 27 : aa
int num = i / 26;
for (int a = 0; a < num; a++) {
numlist.add('a');
}
numlist.add((char) (i % 26 + 97));
for (Character character : numlist) {
s = s + new StringBuilder().append(character).toString();
}
}
return s;
}
}
使用方式
<tagName prefix:attributeName="1"></tagName>
->
<h1>a</h1>
自定義工具類 兩個類
/**
* 參考文檔
* https://www.thymeleaf.org/doc/tutorials/3.0/extendingthymeleaf.html#expression-object-dialects-iexpressionobjectdialect
*/
@Component
public class UtilDialect implements IExpressionObjectDialect {
@Override
public IExpressionObjectFactory getExpressionObjectFactory() {
return new IExpressionObjectFactory() {
@Override
public Set<String> getAllExpressionObjectNames() {
// 可爲自定義工具類起多個名稱 一個名稱初始化一個對象
return new HashSet<String>() {{
add("util1");
add("util2");
}};
}
@Override
public Object buildObject(IExpressionContext context, String expressionObjectName) {
// System.out.println(expressionObjectName); // util名稱
return new Util();
}
@Override
public boolean isCacheable(String expressionObjectName) {
return true;
}
};
}
@Override
public String getName() {
return "util";
}
}
/**
* @author 李磊
* @datetime 2020/01/26 19:30
* @description 測試工具類
*/
public class Util {
public String util(String content) {
return content + "util";
}
}
使用方式
<p th:utext="${#util1.util(1)}"></p><!-- 1util -->
<p th:utext="${#util2.util(2)}"></p><!-- 2util -->