beetl-spring Beetl的Spring整合擴展(1):GroupTemplateFactroyBean與Beetl Spring擴展類


一、GroupTemplateFactroyBean與Beetl Spring擴展類

  本章主要介紹GroupTemplateFactroyBean及其相關的Beetl Spring擴展類,這些類的設計目的均為盡可能將Beetl所使用的各種組件對象(Function,ResourceLoader,TagFactory,甚至核心對象GroupTemplate等都交由Spring容器管理,以充分利用Spring的特性增強組件功能,這一思想是后面Beetl對Spring MVC及Spring Security整合的基礎),除非有特殊需要,這些擴展並不要求Web環境,即使為普通的Spring應用程序的也能使用。

  文中涉及的Beetl的相關概念請閱讀Beetl文檔:http://ibeetl.com/guide/

1.1 GroupTemplateFactroyBean

  GroupTemplate是Beetl的核心配置和操作類,對模板的渲染以及模板配置都是以此類為中心實現的。GroupTemplateFactoryBean是一個Spring FactoryBean<GroupTemplate>,用以在指定配置后構造GroupTemplate實例。將他配置為一個Spring Bean,如下:

<bean name="groupTemplate" class="org.fox.beetl.ext.spring.GroupTemplateFactoryBean"/>

  GroupTemplateFactoryBean的所有配置參數都是可選的,他們可以對GroupTemplate細節提供細化的配置,具體參數格式見下表:

參數名 參數類型
說明
 configFileResource  Resource

指定Beetl配置文件,這使用Spring IO包的Resource的語法來指定資源

默認情況下加載Beetl包自帶的默認配置文件:

classpath:org/beetl/core/beetl-default.properties

 configProperties  Properties 用於覆蓋上述配置文件中配置項的Properties
 resourceLoader  ResourceLoader

Beetl組件:資源加載器,負責按照給定path加載模板數據

默認Beetl會按照配置文件指定自己實例化資源加載器

(Beetl默認使用ClassPathResourceLoader從classpath中獲取模板)

 errorHandler  ErrorHandler

Beetl組件:錯誤處理器,負責對Beetl模板渲染過程中出現的錯誤進行處理

默認Beetl會按照配置文件指定自己實例化錯誤處理器

(Beetl默認將錯誤輸出到Stdout中)

 sharedVars  Map<String, Object> Beetl模板的共享變量,所有該GroupTemplate實例處理的模板都能使用該實例
 extGroupTemplateConfigs  List<ExtGroupTemplateConfig>

GroupTemplate擴展配置類,他能對本屬性以下的所有屬性進行額外設置,他主要為更多配置擴展進行簡化的統一配置支持

默認不設置時,GroupTemplateFactoryBean會自動檢測上下文中所有已經部署的ExtGroupTemplateConfig實現Bean進行配置。

注意1:本屬性及本屬性以上的配置不能被ExtGroupTemplateConfig設置,即configFileResource、configProperties、resourceLoader、errorHandler、sharedVars、extGroupTemplateConfigs這幾個屬性必須在GroupTemplateFactoryBean中設置;

注意2:配置順序按照列表給定的順序執行,最后是當前GroupTemplateFactoryBean的自身設置,如果配置沖突以最后配置為准。

例如Beetl Spring Security整合擴展提供預設的整合配置文件,security-ext.3.2.xml,將擴展的tag和function都配置為一個ExtGroupTemplateFactory實例,這樣使用時只需要在當前配置文件中import入預設文件,將對應的ExtGroupTemplateFactory實例就

用法參考beetl-spring-web-security-example示例

 functions  Map<String, Function>

Beetl組件:自定義函數

其中key為函數名

 typeFormats  Map<Class<?>, Format>

Beetl組件:自定義類型默認格式化器

其中key為類型Class

 formats  Map<String, Format>

Beetl組件:自定義格式化器

其中key為格式化器名

 tagFactorys  Map<String, TagFactory>

Beetl組件:自定義標簽(工廠)

其中key為標簽名

 functionPackages  Map<String, Object>

Beetl組件:自定義函數包

其中key為函數包名

 virtualClassAttributes  Map<Class<?>, VirtualClassAttribute>

Beetl組件:為類型添加自定義虛擬屬性

其中key為類型Class

 virtualAttributeEvals  List<VirtualAttributeEval>

Beetl組件:虛擬屬性執行器

與virtualClassAttributes不同,他們不特定於某個類型

 1.2 SpElFunction

  SpELFunction函數類是Beetl的一個Function擴展,執行一個SpEL表達式返回其結果,調用格式為:

Object spel(String expression)

  SpEL表達式的相關內容請參見Spring文檔,它在一般EL語法上進行擴展,允許直接調用對象函數,提供對集合類的投影,篩選操作等。特殊的可以在SpEL表達式中使用@beanName的的方式直接引用到Spring上下文中的Bean,也允許使用T(className).method()調用指定類型的靜態函數。例如:

1 spel("@urlEncoder.encode(name)");
2 spel("T(java.util.UUID).randomUUID().toString()");

  注意1:由於Beetl的限制,當前版本的SpELFunction只支持操作Beetl上下文中的共享變量和全局變量,並不支持;

  注意2:SpELFunction必須作為Spring上下文中的受管Bean通過GroupTemplateFactoryBean提供給Beetl使用。

1.3 SpringServletContextResourceLoader

  SpringServletContextResourceLoader使用Spring的機制獲取Web環境中的ServletContext,以servletContext.getRealPath("/")獲取到的文件路徑為資源的根目錄。這個ResourceLoader用以在Spring Web環境下替換Beetl自帶的WebAppResourceLoader,以解決Beetl的jar包不在WEB-INF/lib下造成錯誤判定WebRoot目錄的問題(例如main方法啟動的Jetty服務)。

  注意1:與一般基於File的FileResourceLoader相同,他支持設置charset和autoCheck屬性,但它不支持設置root屬性(只能通過beetl配置文件REOURCE.root設置)。

  注意2:SpringServletContextResourceLoader必須作為Spring上下文中的受管Bean通過GroupTemplateFactoryBean提供給Beetl使用。

1.4 SpringBeanTagFactory

  SpringBeanTagFactory作為一個TagFactory實現,他按照name參數的設置,從Spring上下文中獲取指定name的Tag實現Bean實例返回。SpringBeanTagFactory必須作為Spring上下文中的受管Bean通過GroupTemplateFactoryBean提供給Beetl使用。並且應該保證他所引用的Tag實現Bean必須是prototype的,不能單例,否則在使用時會出現不一致的情況。

 1 <bean name="groupTemplate" ....>
 2   <property name="tagFactorys">
 3     <map>
 4       <entry key="sec.accessIf" value-ref="accessIfTagFactory"/>
 5     </map> 
 6   </property>
 7 </bean>
 8 <bean name="accessIfTagFactory" class="org.fox.beetl.ext.spring.tag.SpringBeanTagFactory">
 9     <property name="name" value="accessIfTag"/>
10 </bean>
11 <bean name="accessIfTag" class="...." scope="prototype"/>

  截至Beetl2.0.10,SpringBeanTagFactory的使用有一些特殊問題,需要一些特殊處理技巧,詳細問題描述和處理技巧參見這里:http://www.cnblogs.com/shishuifox/p/3852398.html  使用方法建議參考示例beetl-spring-web-security-example

  簡單的說,要正常使用SpringBeanTagFactory,需要保證1. 將他定義為一個公開的有確認名字的bean,不能使用匿名bean或內部bean定義。2.在應用程序上下文中注冊一個ApplicationContext生命周期監聽器:

<bean class="org.fox.beetl.ext.spring.utils.ApplicationContextLifecycleEventListener"/>

  Beetl2.0.11已經修正該問題,該限制也於beetl-spring.1.0.4取消,建議升級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM