上节给大家介绍了thymeleaf自定义方言中 自定义标签的实现方式 但是如果存在下面这段代码的需求的话,自定义标签就无法满足了,因为代码中的 input是html的标签,我们无法对其自定义,但我们可以自定义它的属性,来完成业务需求。
Insert title here[html] view plain copy
[html] view plain copy
首先我们需要继承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类的 可以看上节 https://my.oschina.net/u/3700119/blog/1545367