摘要:最终还是决定用的自定义标签来解决这个问题。自定义标签处理器需要实现接口,标签的处理逻辑在方法中编写。作者宋浩志创建时间年月日上午模板模式,这里使用模板。标签名是否要求前缀。自定义标签属性名。标签处理的优先级,此处使用和标准方言相同的优先级。
前言
最近一直在忙着写自己的博客系统,好久没有发布新的文章,最近在查Thymeleaf的自定义标签发现文章极少,非常苦恼,简书的这篇解决了我的问题,于是引用一下他的文章(抄一下)
心路历程我的博客的标题我需要显示出当前在哪个页面,如"后台首页-XX的博客","文章管理-XX的博客",如果说我把对象每个页面都传递过去那肯定是没有问题的,但是我并不想,于是就开始找解决办法,最开始用拦截器解决,实现倒是可以实现,就是ajax方法会报错,虽然可以用,但是不够优雅;由于开始一直在写博客后台,没考虑首页的问题,当我放弃使用拦截器以后,我把我的map放到了session中,这样登录以后肯定也是所有页面共享。再后来博客后台写的差不多了,准备开始写前台首页的时候发现这个方法也不对,总之这次自己写项目觉得不考虑清楚就写最后就会各种不对劲,就一直在改。最终还是决定用Thymeleaf的自定义标签来解决这个问题。
代码 html标签实现自定义标签处理器</>复制代码
新建一个java类 com.songhaozhi.mayday.config.thymeleaf.tag.ThSysTagProcessor.java
对于Thymeleaf方言,自定义标签的处理逻辑是在标签处理器定义的。
自定义标签处理器需要实现AbstractAttributeTagProcessor 接口,标签的处理逻辑在doProcess 方法中编写。
</>复制代码
package com.songhaozhi.mayday.config.thymeleaf.tag;
import org.thymeleaf.IEngineConfiguration;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.engine.AttributeName;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractAttributeTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.standard.expression.IStandardExpression;
import org.thymeleaf.standard.expression.IStandardExpressionParser;
import org.thymeleaf.standard.expression.StandardExpressions;
import org.thymeleaf.templatemode.TemplateMode;
import com.songhaozhi.mayday.model.dto.MaydayConst;
/**
* @author 作者:宋浩志
* @createDate 创建时间:2018年12月17日 上午10:44:54
*/
public class ThSysTagProcessor extends AbstractAttributeTagProcessor{
private static final String TEXT_ATTRIBUTE = "text";
private static final int PRECEDENCE = 10000;
/*templateMode: 模板模式,这里使用HTML模板。
dialectPrefix: 标签前缀。即xxx:text中的xxx。在此例子中prefix为thSys。
elementName:匹配标签元素名。举例来说如果是div,则我们的自定义标签只能用在div标签中。为null能够匹配所有的标签。
prefixElementName: 标签名是否要求前缀。
attributeName: 自定义标签属性名。这里为text。
prefixAttributeName:属性名是否要求前缀,如果为true,Thymeeleaf会要求使用text属性时必须加上前缀,即thSys:text。
precedence:标签处理的优先级,此处使用和Thymeleaf标准方言相同的优先级。
removeAttribute:标签处理后是否移除自定义属性。*/
public ThSysTagProcessor(String dialectPrefix) {
super(
TemplateMode.HTML,
dialectPrefix,
null,
false,
TEXT_ATTRIBUTE,
true,
PRECEDENCE,
true);
}
@Override
protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName,
String attributeValue, IElementTagStructureHandler structureHandler) {
final IEngineConfiguration configuration = context.getConfiguration();
final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration);
final IStandardExpression expression = parser.parseExpression(context, attributeValue);
final String title = (String) expression.execute(context);
structureHandler.setBody(title+MaydayConst.options.get("blog_name"),false);
}
}
其中的MaydayConst.options.get("blog_name")是我数据库查出来缓存的map
定义方言类</>复制代码
package com.songhaozhi.mayday.config.thymeleaf.dialect;
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;
import com.songhaozhi.mayday.config.thymeleaf.tag.ThSysTagProcessor;
/**
* 系统方言
* @author 宋浩志
* @createDate 创建时间:2018年12月4日 下午9:12:14
*
*/
public class ThSysDialect extends AbstractProcessorDialect{
//定义方言名称
private static final String DIALECT_NAME="Sys Dialect";
public ThSysDialect() {
//设置自定义方言与"方言处理器"优先级相同
super(DIALECT_NAME, "thSys", StandardDialect.PROCESSOR_PRECEDENCE);
}
@Override
public Set getProcessors(String dialectPrefix) {
Set processors=new HashSet();
processors.add(new ThSysTagProcessor(dialectPrefix));
processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
return processors;
}
}
在SpringBoot中加载自定义方言
com.songhaozhi.mayday.config.ThymeleafDialectConfig.java
</>复制代码
package com.songhaozhi.mayday.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.songhaozhi.mayday.config.thymeleaf.dialect.ThSysDialect;
/**
* Thymeleaf配置
* @author 宋浩志
* @createDate 创建时间:2018年12月4日 下午9:29:53
*
*/
@Configuration
public class ThymeleafDialectConfig {
@Bean
public ThSysDialect thSysDialect() {
return new ThSysDialect();
}
}
效果
其中"后台登录 - "是标签传递到后台的,"张三的博客"是数据库保存的值。
这就大功告成了!
代码在我的博客项目里面 Mayday博客系统 (还没有写完) 如果对你有帮助你给我一个star,非常感谢!!!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72777.html
摘要:在使用上述模板,默认从下加载。介绍是现代化服务器端的模板引擎,不同与其它几种模板的是的语法更加接近,并且具有很高的扩展性。特点支持无网络环境下运行,由于它支持原型,然后在标签里增加额外的属性来达到模板数据的展示方式。 SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,...
摘要:简介是个模板引擎,可以用于与非应用的主要目标在于提供一种可被浏览器正确显示的格式良好的模板创建方式,因此也可以用作静态建模的可扩展性也非常棒。 1.Thymeleaf简介 Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用 Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模,Thym...
摘要:本次学习如何使用以及相关语法在上一章写的那样引入包到工程同理配置配置模板设置在需要引用添加引用头下面记录一下的模板语法和稍微有些出入不过好在不需要修改文件类型直接将进行头部引用就可以使用标签引入路径或地址绝对路径进行访问相对路径进 本次学习如何使用thymeleaf以及相关语法1、在上一章写的那样 引入jar包到maven工程 org.springframewor...
摘要:本次学习如何使用以及相关语法在上一章写的那样引入包到工程同理配置配置模板设置在需要引用添加引用头下面记录一下的模板语法和稍微有些出入不过好在不需要修改文件类型直接将进行头部引用就可以使用标签引入路径或地址绝对路径进行访问相对路径进 本次学习如何使用thymeleaf以及相关语法1、在上一章写的那样 引入jar包到maven工程 org.springframewor...
摘要:对应的请求信息如下如果是其他客户端请求,如测试,会默认返回数据在之前的文章中介绍过了的自动配置机制,默认错误处理机制也是自动配置其中的一部分。在这个包中加载了所有的自动配置类,其中就是处理异常的机制。 在我们开发的过程中经常会看到下图这个界面,这是SpringBoot默认出现异常之后给用户抛出的异常处理界面。showImg(https://segmentfault.com/img/...
阅读 2168·2021-09-29 09:35
阅读 2069·2019-08-30 14:15
阅读 3045·2019-08-30 10:56
阅读 1031·2019-08-29 16:59
阅读 651·2019-08-29 14:04
阅读 1403·2019-08-29 12:30
阅读 1106·2019-08-28 18:19
阅读 575·2019-08-26 11:51