摘抄别人的代码 搞了一下 springboot 版本 (v2.0.2.RELEASE)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
// 这个 东西 要不要 也没啥用。 我也没搞明白 我把这段代码注销了
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf --><!-- <dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.3.0</version>
</dependency> -->
先上代码,
第一个 类 实现 AbstractProcessorDialect 接口 官方文档有写这是干什么的
https://www.thymeleaf.org/doc/tutorials/3.0/extendingthymeleaf.html#an-element-processor-for-our-headlines
也就是一个 自定义方言的一个注册类。 spring 加载 实例化 自定义的注册类
package com.framework.thyelaf;
import java.util.HashSet;
import java.util.Set;
import org.thymeleaf.dialect.AbstractProcessorDialect;
import org.thymeleaf.processor.IProcessor;
import org.thymeleaf.standard.StandardDialect;
import org.thymeleaf.standard.processor.StandardXmlNsTagProcessor;
import org.thymeleaf.templatemode.TemplateMode;
public class CmsDialect extends AbstractProcessorDialect{
private static final String DIALECT_NAME = "Phxl Dialect";//定义方言名称
public CmsDialect() {
// 我们将设置此方言与“方言处理器”优先级相同
// 标准方言, 以便处理器执行交错。 phxl 自定义标签的名称 在html 是这样写的 <phxl:matter matterid="7"/>
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;
}
}
第二个类
package com.framework.thyelaf;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.templatemode.TemplateMode;
public class MatterTagProcessor extends AbstractElementTagProcessor{
// <phxl:matter matterid="7"/>
private static final String TAG_NAME = "matter";//标签名 matter 这个玩意就是 自定义标签的 : 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);
/*
* 从标签读取“matterid”属性。标签中的这个可选属性将告诉我们需要什么样的数据
*
*/
final String matterid= tag.getAttributeValue("matterid");
String logoimgText="在实体类中获取的对象???"; // 这里是 重点 , 在这里写 显示的内容
可以 通过模板输出一段html 代码 返回到 页面
/** 创建将替换自定义标签的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);
}
}
第三段代码 就是 要在springboot 配置类 中 去 加载 第一个类
@Configuration // 这玩意 可以写n个, 例如 springboot 加载 servlet filter Listener , 就和在springmvc 配置<bean id ="abb" class="com.xxx.xxx.Abb"/> 同理 , 只不过这个是在springboot 配置类 中去注册bean 。 不过也可以不用注册,自己研究一下。
public class WebConfig {
@Bean
public CmsDialect testDialect(){
return new CmsDialect();
}
}
最后一步 在html 页面 去 写 一个
<phxl:matter matterid="7"/> 这个 就是你 自定义的标签 在页面显示的是