一、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取消,建議升級。