摘要:最終還是決定用的自定義標簽來解決這個問題。自定義標簽處理器需要實現接口,標簽的處理邏輯在方法中編寫。作者宋浩志創建時間年月日上午模板模式,這里使用模板。標簽名是否要求前綴。自定義標簽屬性名。標簽處理的優先級,此處使用和標準方言相同的優先級。
前言
最近一直在忙著寫自己的博客系統,好久沒有發布新的文章,最近在查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在SpringBoot中加載自定義方言getProcessors(String dialectPrefix) { Set processors=new HashSet (); processors.add(new ThSysTagProcessor(dialectPrefix)); processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix)); return processors; } }
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,非常感謝!!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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/...
閱讀 2013·2021-09-29 09:35
閱讀 1949·2019-08-30 14:15
閱讀 2973·2019-08-30 10:56
閱讀 955·2019-08-29 16:59
閱讀 571·2019-08-29 14:04
閱讀 1301·2019-08-29 12:30
閱讀 1020·2019-08-28 18:19
閱讀 509·2019-08-26 11:51