最近在写一个cms系统项目,因为使用过thymeleaf模板引擎,所以技术选择打算用springboot+thymeleaf来完成。但thymeleaf的相关资料太少,因此打算写一篇关于thymeleaf自定义方言系统的教程,帮助大家学习thymeleaf。
给大家简单介绍些thymeleaf的方言系统的组成,直接上图简单明了

首先,要自定义标签,需要继承AbstractProcessorDialect类 并实现其方法
public class CmsDialect extends AbstractProcessorDialect{
private static final String DIALECT_NAME = "Phxl Dialect";//定义方言名称
public CmsDialect() {
// 我们将设置此方言与“方言处理器”优先级相同
// 标准方言, 以便处理器执行交错。
super(DIALECT_NAME, "phxl", StandardDialect.PROCESSOR_PRECEDENCE);
}
/*
*
* 元素处理器:“matter”标签。
*/
public Set<IProcessor> getProcessors(final String dialectPrefix) {
Set<IProcessor> processors = new HashSet<IProcessor>();
processors.add(new MatterTagProcessor(dialectPrefix));//添加我们定义的标签
processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
return processors;
}
}然后创建一个新的标签处理器并继承AbstractElementTagProcessor类
public class MatterTagProcessor extends AbstractElementTagProcessor{
private static final String TAG_NAME = "matter";//标签名
private static final int PRECEDENCE = 10000;//优先级
public MatterTagProcessor( String dialectPrefix) {
super(
TemplateMode.HTML, // 此处理器将仅应用于HTML模式
dialectPrefix, // 要应用于名称的匹配前缀
TAG_NAME, // 标签名称:匹配此名称的特定标签
true, // 将标签前缀应用于标签名称
null, // 无属性名称:将通过标签名称匹配
false, // 没有要应用于属性名称的前缀
PRECEDENCE); // 优先(内部方言自己的优先)
}
/**
* context 页面上下文
* tag 标签
*
*/
@Override
protected void doProcess(
final ITemplateContext context,
final IProcessableElementTag tag,
final IElementTagStructureHandler structureHandler) {
/**
* 获取应用程序上下文。
*/
ApplicationContext appCtx = SpringContextUtils.getApplicationContext(context);
MatterMapper mapper=appCtx.getBean(MatterMapper.class);
/*
* 从标签读取“matterid”属性。标签中的这个可选属性将告诉我们需要什么样的数据
*
*/
final String matterid= tag.getAttributeValue("matterid");
Matter matter=mapper.tagSelectByMid(Integer.parseInt(matterid));
String logoimgText=null;
if(null!=matter){
logoimgText= matter.getMatterDetails();
}else{
logoimgText="无素材信息" ;
}
/*
* 创建将替换自定义标签的DOM结构。
* logo将显示在“<div>”标签内, 因此必须首先创建,
* 然后必须向其中添加一个节点。
*/
final IModelFactory modelFactory = context.getModelFactory();
final IModel model = modelFactory.createModel();
model.add(modelFactory.createOpenElementTag("div"));
model.add(modelFactory.createText(logoimgText));
model.add(modelFactory.createCloseElementTag("div"));
/*
* 指示引擎用指定的模型替换整个元素。
*/
structureHandler.replaceWith(model, false);
}
}以上我们完成了thymeleaf自定义标签部分的代码,然后我们就需要在springboot注入我们的自定义方言!

最后,我们在前台页面上使用自己的方言系统就可以了
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:phxl="" >
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<phxl:matter matterid="7"/>
</body>
</html>
补充:在springboot中,要定义thymeleaf的版本只需要在pom中加
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
就可以了
版权声明:本文为BecauseSy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。