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) {

        // 獲取屬性值
        final String rawValue = ThymeleafFacade.getRawValue(tag, attributeName);

        // 獲取標籤名
        // 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>

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