springboot+thymeleaf 实现thymeleaf自定义方言系统 自定义标签, cms系统搭建(二)

上节给大家介绍了thymeleaf自定义方言中 自定义标签的实现方式 但是如果存在下面这段代码的需求的话,自定义标签就无法满足了,因为代码中的 input是html的标签,我们无法对其自定义,但我们可以自定义它的属性,来完成业务需求。





Insert title here
	


首先我们需要继承AbstractAttributeTagProcessor类,重写doProcess(),具体代码如下:

package com.phxl.cms.TagProcessor;

import org.springframework.context.ApplicationContext;
import org.thymeleaf.IEngineConfiguration;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.engine.AttributeName;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractAttributeTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.spring4.context.SpringContextUtils;
import org.thymeleaf.standard.expression.IStandardExpression;
import org.thymeleaf.standard.expression.IStandardExpressionParser;
import org.thymeleaf.standard.expression.StandardExpressions;
import org.thymeleaf.templatemode.TemplateMode;

import com.phxl.cms.entity.Matter;
import com.phxl.cms.mapper.MatterMapper;

public class TagProcessor extends AbstractAttributeTagProcessor{
	private static final String ATTR_NAME = "m_id";//属性名称
    private static final int PRECEDENCE = 10000;//同一方言中的优先级


    public TagProcessor(final String dialectPrefix) {
        super(
            TemplateMode.HTML, // 此处理器将仅应用于HTML模式
            dialectPrefix,     // 要应用于名称的匹配前缀
            null,              // 无标签名称:匹配任何标签名称
            false,             // 没有要应用于标签名称的前缀
            ATTR_NAME,         // 将匹配的属性的名称
            true,              // 将方言前缀应用于属性名称
            PRECEDENCE,        // 优先(内部方言自己的优先)
            true);             // 之后删除匹配的属性
    }


    @Override
    protected void doProcess(
            final ITemplateContext context, final IProcessableElementTag tag,
            final AttributeName attributeName, final String attributeValue,
            final IElementTagStructureHandler structureHandler) {
    	ApplicationContext appCtx = SpringContextUtils.getApplicationContext(context);
        MatterMapper mapper=appCtx.getBean(MatterMapper.class);

        final IEngineConfiguration configuration = context.getConfiguration();

        /*
         * 获得Thymeleaf标准表达式解析器
         */
        final IStandardExpressionParser parser =
                StandardExpressions.getExpressionParser(configuration);

        /*
         * 将属性值解析为Thymeleaf标准表达式
         */
        final IStandardExpression expression = parser.parseExpression(context, attributeValue);

        /*
         * 执行刚刚解析的表达式
         */
        final Integer position = (Integer) expression.execute(context);

        /*
         * 将获取的值,进行业务处理。
         */
        Matter matter=mapper.tagSelectByMid(position);
        


        String matterName = null;
        if (null != matter) {
        	matterName = matter.getMatterTitle();
        } 

        /*
         * 将新值设置为“标签”属性
         */
        if (matterName != null) {
            if (attributeValue != null) {
                structureHandler.setAttribute("value",  matterName);
            } 
        }

    } 
} 
最后在CmsDialect方言处理器中 实例化该类

processors.add(new TagProcessor(dialectPrefix));//标签事件

不知道CmsDialect类的 可以看上节

http://blog.csdn.net/BecauseSy/article/details/78132538



你可能感兴趣的:(springboot+thymeleaf 实现thymeleaf自定义方言系统 自定义标签, cms系统搭建(二))