1. 程式人生 > >SpringBoot中Beetl自定義標籤的完美整合

SpringBoot中Beetl自定義標籤的完美整合

今天接手一個專案,專案中使用SpringBoot,發現之前實現Beetl自定義標籤註冊的方式有些傻大粗,做了些修改,整理之後釋出,作為回顧。

Beetl自定義標籤

下面說一下在SpringBoot中關於Beetl自定義標籤的定義以及注入:

  1. 自定義標籤需要繼承 org.beetl.core.Tag 類,在 render() 方法中進行標籤功能實現;
  2. 標籤註冊

    /**
     * Beetl配置類
     */
    @Configuration
    public class BeetlConfiguration {
        @Bean(initMethod = "init", name = "beetlConfig"
    ) public BeetlGroupUtilConfiguration getBeetlConfig() { BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration(); // 1.單個標籤註冊 beetlGroupUtilConfiguration.getGroupTemplate().registerTag("myTag", FindListTag.class); // 2.通過Spring Bean方式註冊
    SpringBeanTagFactory tagFactory = new SpringBeanTagFactory(); // 此處使用的name為Spring中註冊的Bean的name tagFactory.setName("myTag"); beetlGroupUtilConfiguration.getGroupTemplate().registerTagFactory("myTag", tagFactory); // 3.多標籤註冊 SpringBeanTagFactory tag1 = new
    SpringBeanTagFactory(); tag1.setName("myTag1"); SpringBeanTagFactory tag2 = new SpringBeanTagFactory(); tag2.setName("myTag2"); Map<String, TagFactory> tags = new HashMap<>(); tags.put("myTag1", tag1); tags.put("myTag2", tag2); beetlGroupUtilConfiguration.setTagFactorys(tags); return beetlGroupUtilConfiguration; } }

多個自定義標籤整合優化

由上節可以看出,當專案中需要自定義多個標籤時,Beetl配置類中需要反覆的新增標籤進行註冊。

  1. 方便管理多個標籤,並且避免汙染Beetl配置類,於是將 Map<String, TagFactory> 使用Spring IoC進行管理注入

    /**
     * Beetl配置類
     */
    @Configuration
    public class BeetlConfiguration {
        @Bean(initMethod = "init", name = "beetlConfig")
        public BeetlGroupUtilConfiguration getBeetlConfig(@Qualifier("tagFactorys") Map<String, TagFactory> tagFactorys) {
            BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
            beetlGroupUtilConfiguration.setTagFactorys(tagFactorys);
            return beetlGroupUtilConfiguration;
        }
    }
  2. 配置TagFactory管理類

    @Component
    public class BeetlTagFactoryManager {
        @Bean(name = "tagFactorys")
        public Map<String, TagFactory> tagFactorys() {
            Map<String, TagFactory> tags = new HashMap<>();
            return tags;
        }
    }

    此時,如果專案中的多個自定義標籤並未加入到標籤工廠中

  3. 獲取Spring中所有自定義標籤,並且注入到標籤工廠中

    @Component
    public class BeetlTagFactoryManager implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        @Bean(name = "tagFactorys")
        public Map<String, TagFactory> tagFactorys() {
            Map<String, TagFactory> tags = new HashMap<>();
            Map<String, Tag> beans = applicationContext.getBeansOfType(Tag.class);
            for (String beanName : beans.keySet()) {
                tags.put(beanName, toSpringBeanTagFactory(beanName));
            }
            return tags;
        }
    
        private SpringBeanTagFactory toSpringBeanTagFactory(String beanName) {
            SpringBeanTagFactory springBeanTagFactory = new SpringBeanTagFactory();
            springBeanTagFactory.setName(beanName);
            return springBeanTagFactory;
        }
    }
  4. 至此,自定義標籤注入已經完成。不過,又如何完成標籤的自定義呢?請看下節~~

使用註解進行自定義Beetl標籤名

  1. Beetl本身並沒有提供自定義標籤名的註解,所以需要我們自己進行定義

    /**
     * Annotation - Beetl自定義標籤命名
     */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface BeetlTagName {
        /**
         * 標籤名稱
         */
        String value() default "";
    }
  2. 在自定義標籤上加上剛剛建立的註解

    import org.beetl.core.GeneralVarTagBinding;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Service;
    
    @Service
    @Scope("prototype")
    @BeetlTagName("my_tag")
    public class MyTag extends GeneralVarTagBinding {
        @Override
        public void render() {
            // TODO 標籤處理
        }
    }

    注: org.beetl.core.GeneralVarTagBindingorg.beetl.core.Tag 的一個更友好的抽象實現類。在Beetl模板中使用時,標籤名為 @BeetlTagName 中的所寫,此處為 my_tag。使用方法如下:

    <#my_tag>
        <!--標籤處理-->
    </#my_tag>
  3. 修改 BeetlTagFactoryManager ,讀取自定義標籤名

    @Component
    public class BeetlTagFactoryManager implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        @Bean(name = "tagFactorys")
        public Map<String, TagFactory> tagFactorys() {
            Map<String, TagFactory> tags = new HashMap<>();
            Map<String, Tag> beans = applicationContext.getBeansOfType(Tag.class);
            for (String beanName : beans.keySet()) {
                // 讀取自定義標籤名
                BeetlTagName tagAnno = beans.get(beanName).getClass().getAnnotation(BeetlTagName.class);
                String tagName = tagAnno != null ? tagAnno.value() : beanName;
                tags.put(tagName, toSpringBeanTagFactory(beanName));
            }
            return tags;
        }
    
        private SpringBeanTagFactory toSpringBeanTagFactory(String beanName) {
            SpringBeanTagFactory springBeanTagFactory = new SpringBeanTagFactory();
            springBeanTagFactory.setName(beanName);
            return springBeanTagFactory;
        }
    }
  4. 建立新的自定義標籤時,只需要在標籤上加入 @BeetlTagName 並且寫上你喜歡的標籤名即可使用。至此,大功告成啦~快去體驗吧!

相關推薦

SpringBootBeetl定義標籤完美整合

今天接手一個專案,專案中使用SpringBoot,發現之前實現Beetl自定義標籤註冊的方式有些傻大粗,做了些修改,整理之後釋出,作為回顧。 Beetl自定義標籤 下面說一下在SpringBoot中關於Beetl自定義標籤的定義以及注入: 自定義標籤

springboot讀取定義properties文件

actor lec his @property web not ack urn 版本 一、在高版本的springboot中,@ConfigurationProperties(prefix = "wisely2",locations = "classpath:wisely.p

SpringBoot讀取定義properties配置文件

bsp clas manage trace etl sstream factory 地址 app 配置文件放在src/main/resources目錄下 java代碼: /** * 系統配置文件 */ public class GlobalProperties {

beetl定義標籤 select 上傳檔案

select @var res = res!dict.allDict(); //結果集 @var valueKey = valueKey; //結果物件中作為select > option > value 值的屬性名 @var textKey = textKey;

SpringBoot使用定義攔截器

一、新建一個SpringBoot工程,目錄結構如下: 二、在核心配置檔案application.properties中配置檢視解析器格式 #配置檢視解析器解析檔案的格式 spring.mvc.view.prefix=/ spring.mvc.view.suffix=.html 三、新建一個

SpringBoot如何定義自己的Valid註解

在專案的開發中,在後臺介面中,我們經常需要對前端傳來的資料進行校驗,一般都是使用@Valid註解,但是有的時候我們的校驗工作比較複雜,@Valid提供的註解無法滿足我們的需求,這個時候我們就需要自己來定義我們自己所需的Valid註解。有同學不清楚@Valid註解的可以看一下我的另一篇文章Spring

Springboot使用定義註解設定請求攔截器

Springboot中想要使用自定義註解需先新增基礎依賴 <parent>           <groupId>org.springframework.boot</groupId>           <artifactId&

springfreemarker定義標籤詳解

最近因工作需要,從網上搜了一個jeecms網站,準備進行借鑑使用,發現裡面對模板用的不錯,前面雖說也對freemarker有用,但是還沒有這麼深入,所以就查了一些資料,下面進行總結下。 一、jar包準備 首先是Spring、SpringMVC的依賴jar包…… 然後是Fr

Androidattr定義標籤介紹

第二行是自定義標籤。 格式如上,其中“xmlns:wen”冒號後面是標籤名,在下面使用時(只對當前檔案可用) <TextView  wen:屬性名/> “com.iteye.googlers”是你的工程包名。 1. reference:參考某一資源ID。     (1)屬性

springboot使用定義線程池ThreadPoolTaskExecutor

return red 例子 exec rgs exception wire 異常 ans java5以後,線程有了很大的變化,在使用上更加方便功能更佳強大,Springboot裏面進行了進一步的封裝。 我們來看一個例子 package com.execut

javaweb標籤體的定義標籤

1.完整的示例程式碼: 標籤體的處理器類,JspFragmentTest.java package com.javaweb.tag; import java.io.IOException; import java.io.StringWriter; import javax.servlet.jsp

Django 框架定義模板標籤(template.Library())

某一些標籤(例如:選單欄、css、JS、以及一些複雜計算後的資料等)需要我們自定義。 然後再在指定的html中引用並顯示。 之所以要用到標籤,主要作用就是想讓一些內容在多個模板(HTML)中都要有,比如選單欄。 我們絕對不想在每個檢視函式(views中)都寫一次這些變數內容。 即每個頁面

如何在Spring定義標籤

標籤定義檔案 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!--matrix.xsd--> <xsd:schema xmlns="http://zhangyuy

django定義標籤和過濾器

準備(必需)工作: 1  在某個app下建立一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下建立了一個templatetags的包,並在該包下建立了一個名為mytags的檔案。那麼目錄結構看起來應該就像這樣: polls/

django使用定義過濾器和定義標籤

自定義過濾器 首先在app底下新建一個templatetags目錄,裡面新增兩個檔案,目錄結構如下: 然後在settings.py中把templatetags目錄作為app註冊 INSTALLED_APPS = [ 'django.cont

Springboot freemark定義標籤

spring-boot開發網站使用freemarker裡的自定義標籤方法 建立類實現 TemplateDirectiveModel 類 @Component public class UserTopicDirective implements TemplateDirectiveModel {

Struts定義標籤獲取值棧valuestack

    首先,要糾正下在《自定義-擴充套件struts2的標籤》一文中筆者的分析。在該文中筆者說,     最近在做j2ee的專案,需要封裝很多標籤,發現直接從BodyTagSupport繼承的話,無法獲取valuestack,也無法借用struts的國際化解決方案。所以需

Taglib標籤之六Taglib常用的屬性值與tld常用標籤簡介與web.xml設定定義標籤的uri

tld標籤的描述檔案   標籤的描述檔案是一個描述整個標籤庫標記資訊和標籤庫中每個標籤處理器以及其屬性的XML文件。可以包含如下的一些元素。   1. tlibversion:標籤庫版本號,是一個點式十進位制數(例如1.0),最多為4組小數點分隔的數字組成。   2. jspversion:標籤庫所需

struts定義標籤引入到jsp中報錯問題,不能引入問題

Can not find the tag library descriptor for "/Idefine-tags",前幾天專案就出現這個問題,我沒放在心上,不管它就去看文件和其他程式碼去了。因為平時匯入專案都是滑鼠右鍵專案——》找到build-path------》Co

在Struts2實現定義分頁標籤全攻略(一)

我們先看看這個分頁標籤的效果: 使用標籤的最大好處就是下次再用到的話直接引用就行,而不必重寫。 本人對Struts2自定義標籤沒有太深究,在網上找了一些資料可以參考參考: 其實,開發自定義標籤並不需要Struts2的支援,一般情況下,只需要繼承javax.servle