Thymeleaf自定义方言&自定义工具类

自定义方言 两个类

/**
 * 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 -->
原创文章 157 获赞 113 访问量 7万+

猜你喜欢

转载自blog.csdn.net/setlilei/article/details/102866162