自定义方言 两个类
/** * 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 -->