Thymeleaf 自定义标签

本文介绍自定义标签,使用的环境为,

spring-boot-starter-parent 版本为  1.5.10.RELEASE   使用的 Thymeleaf 的版本是 3.0.9.RELEASE

如果使用的  spring-boot-starter-parent 为 2.0 以上 则使用 Thymeleaf 的版本则是4以上

按照上面版本的说明,首先先把Thymeleaf 的版本进行升级

注意一定需要升级,不然会报错,下面是依赖

            <dependency>
                <groupId>net.sourceforge.nekohtml</groupId>
                <artifactId>nekohtml</artifactId>
                <version>${nekohtml.version}</version>
            </dependency>
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring4</artifactId>
                <version>${thymeleaf.version}</version>
            </dependency>
            <dependency>
                <groupId>nz.net.ultraq.thymeleaf</groupId>
                <artifactId>thymeleaf-layout-dialect</artifactId>
                <version>${thymeleaf-layout-dialect.version}</version>
            </dependency>

            <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
            <thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
            <nekohtml.version>1.9.22</nekohtml.version>

首先进行配置,配置在页面导入的 名称空间的 标签前缀

创建一个类并且继承  AbstractProcessorDialect 该类 ,该类是一个默认的方言处理器,重写下面的 构造函数和方法

/**
 * 系统方言
 */
public class SysDialect  extends AbstractProcessorDialect {
    // 定义方言名称
    private static final String DIALECT_NAME = "Sys Dialect";
    /**
     * 构造函数
     */
    public SysDialect() {
        // 设置自定义方言与“方言处理器”优先级相同
        /*
        * DIALECT_NAME : 表示 设置的方言的名称
        * sys : 表示在页面使用的标签的名称  是在名称空间中声明的 部分
        * */
        super(DIALECT_NAME, "thSys", StandardDialect.PROCESSOR_PRECEDENCE);
    }

    @Override
    public Set<IProcessor> getProcessors(String dialectPrefix) {
        Set<IProcessor> processors = new HashSet<IProcessor>();

        // 添加自定义标签
        processors.add(new SysDictTagProcessor(dialectPrefix));
        processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
        return processors;
    }
}

设置完成之后,下面开始创建,名称空间前缀 调用的 具体的标签名称和功能

创建一个类,继承  AbstractElementTagProcessor ,标签元素处理器 ,该类也需要重写构造函数和具体的方法

/**
 * 创建标签  具体的 标签
 */
public class SysDictTagProcessor extends AbstractElementTagProcessor {
    // 标签名
    private static final String TAG_NAME = "dict";

    // 优先级
    private static final int PRECEDENCE = 10000;

    public SysDictTagProcessor(String dialectPrefix) {
        super(
                // 此处理器将仅应用于HTML模式
                TemplateMode.HTML,

                // 要应用于名称的匹配前缀
                dialectPrefix,

                // 标签名称:匹配此名称的特定标签 该内容就是在使用名称空间调用的 标签
                TAG_NAME,

                // 将标签前缀应用于标签名称
                true,

                // 无属性名称:将通过标签名称匹配
                null,

                // 没有要应用于属性名称的前缀
                false,

                // 优先(内部方言自己的优先)
                PRECEDENCE
        );

    }

    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag
            iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
       // 首先 引入 server 进行数据的查询,但是在引入bena 的时候,会报错,因为当前类不是server类,所以需要
//        创建类,然后使用上下文,获取相应的bena
        ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(iTemplateContext);
        DictService dictService = applicationContext.getBean(DubboUtils.class).getDictService();

        //  获取前端页面传递的属性
        String type = iProcessableElementTag.getAttributeValue("type");
        String name = iProcessableElementTag.getAttributeValue("name");
        String classStyle = iProcessableElementTag.getAttributeValue("class");
        // 进行数据的查询 根据 type 查询
        List<Dict> dictByType = dictService.getDictByType(type);
        if(dictByType != null && dictByType.size() >0){
            // 创建标签
            IModelFactory modelFactory = iTemplateContext.getModelFactory();
            IModel model = modelFactory.createModel();
            model.add(modelFactory.createOpenElementTag(String.format("select name='%s' class='%s'",name,classStyle)));
            for (Dict dict : dictByType) {
                model.add(modelFactory.createOpenElementTag(String.format("option value='%s'",dict.getValue())));
                model.add(modelFactory.createText(dict.getLabel()));
                model.add(modelFactory.createCloseElementTag("option"));
            }
            model.add(modelFactory.createCloseElementTag("select"));

            iElementTagStructureHandler.replaceWith(model,false);
        }
    }
}

可以将具体的功能,在  doProcess 方法中写,并最后将标签进行替换

在页面中使用,本案例是在html页面中使用

 首先导入名称空间

导入之后,在需要使用的位置调用该标签即可

具体的属性可以在后端直接获取到

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在使用 Thymeleaf 时遇到了页面报错,可以查看控制台输出的错误信息,找到具体的问题所在。常见的错误包括语法错误、模板引用错误、标签使用错误等等。 如果你想利用 Thymeleaf定义错误页面,可以按照以下步骤进行: 1. 首先在 `src/main/resources/templates` 目录下创建一个 `error` 目录。在该目录下创建一个名为 `error.html` 的 Thymeleaf 模板文件。 2. 在 `application.properties` 文件中配置错误处理的地址: ``` server.error.path=/error ``` 3. 创建一个名为 `ErrorController` 的控制器类,用于处理错误请求: ```java @Controller public class ErrorController implements org.springframework.boot.web.servlet.error.ErrorController { @RequestMapping("/error") public String handleError(HttpServletRequest request, HttpServletResponse response) { // 获取错误状态码 Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); // 根据状态码返回不同的错误页面 if (statusCode == 404) { return "error/404"; } else { return "error/500"; } } @Override public String getErrorPath() { return "/error"; } } ``` 4. 在 `error` 目录下创建 `404.html` 和 `500.html` 两个 Thymeleaf 模板文件,用于显示不同类型的错误页面。 例如,`404.html` 可以这样编写: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>404 Not Found</title> </head> <body> <h1>404 Not Found</h1> <p>您请求的页面不存在,请检查您输入的地址是否正确。</p> </body> </html> ``` 5. 访问不存在的页面,尝试触发 404 错误,可以看到自定义的错误页面。 如果你想测试 500 错误,可以在控制器中抛出一个异常,例如: ```java @RequestMapping("/test") public String test() { throw new RuntimeException("测试错误"); } ``` 然后访问 `/test` 地址即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值