springboot+thymeleaf 实现 jsp 页面的自定义标签

本文介绍如何在 Spring Boot 中使用 Thymeleaf,并实现自定义方言以扩展其功能。通过创建和注册自定义方言,可以定义新的 HTML 标签,如 <phxl:matter>,并控制这些标签在页面上的呈现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘抄别人的代码  搞了一下  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"/>   这个   就是你 自定义的标签 在页面显示的是




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值