###前言
spring boot、thymeleaf环境下,通常有一些页面转义时,可以通过自定义标签将code转成描述。
1、申明自定义标签
import org.springframework.stereotype.Component;
import org.thymeleaf.dialect.AbstractDialect;
import org.thymeleaf.processor.IProcessor;
import java.util.HashSet;
import java.util.Set;
@Component
public class CrmDialect extends AbstractDialect {
@Override
public String getPrefix() {
return "crm";
}
@Override
public Set<IProcessor> getProcessors() {
final Set<IProcessor> processors = new HashSet<>();
processors.add(new FragmentElementProcessor());
return processors;
}
}
import com.google.common.base.Strings;
import org.springframework.stereotype.Component;
import org.thymeleaf.Arguments;
import org.thymeleaf.dom.Element;
import org.thymeleaf.dom.Node;
import org.thymeleaf.dom.Text;
import org.thymeleaf.processor.element.AbstractMarkupSubstitutionElementProcessor;
import java.util.ArrayList;
import java.util.List;
@Component
public class FragmentElementProcessor extends AbstractMarkupSubstitutionElementProcessor {
public FragmentElementProcessor() {
super("subject");
}
@Override
protected List<Node> getMarkupSubstitutes(Arguments arguments, Element element) {
//获取标签name属性的值
String value = element.getAttributeValue("value");
List<Node> nodes = null;
if(!Strings.isNullOrEmpty(value)){
//如果name属性的值为none,则在自定义标签下的内容前插入标签:<span style="color:red">无信息</span>
Element h2 = new Element("span");
h2.setAttribute("style", "color:red");
h2.addChild(new Text("转义"));
element.insertChild(0, h2);
nodes = element.getChildren();
} else {
//如果name属性不为none,则移除自定义标签下的内容,插入<div>hello name</div>
nodes = new ArrayList<>();
}
return nodes;
}
@Override
public int getPrecedence() {
return 1000;
}
}
springboot默认使用thymeleaf引擎,所以不需要在配置文件中注册自定义标签,仅需要将自定义标签类添加入spring容器即可。例如添加@Component注解。
###2、用法
<crm:subject value="test"></crm:subject>
3、效果
<span style="color:red">转义</span>