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