元件化系統框架-元件JAR包化
實現元件功能(含頁面)的JAR包化是一直是我的一個想法,在我原先做的一些系統中我們做到的API組別的元件化,但是當我們要將一個新的元件功能加入到系統中我們會發現很大問題,那就是對頁面的COPY,特別是當程式設計師對頁面的劃分不太規範的時候我們實在是無法找到對應的頁面檔案,或者在COPY的時候很容易搞錯。 針對上面的問題,我認為元件應該是包含兩個部分的,一個是API部分的JAR包,一個是頁面檔案的JAR包,那麼我要解決兩個問題:
一、靜態檔案的讀取
這裡所說的靜態檔案指的是不需要編譯的檔案,如:圖片檔案,JS檔案,其它不需要編譯的檔案。
將靜態檔案放在JAR包中並要顯示出來,採用到的方法是通過過濾器通過讀取JAR包裡的檔案並通過Response寫入到檔案中。
由於這個過濾器是對整個資源的過濾,要考慮到相容性,所以要對頁面檔案進行轉發。
類名:com.youyoulong.framework.util.filter.ResourceContextFilter
二、頁面檔案的讀取
通過freemarker的springmvc外掛配置讀取頁面檔案。所以整個頁面的編譯器我拋棄了JSP,採用freemarker的編譯器。配置程式碼如下:
<!-- freemarker的配置 -->
<bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPaths">
<list>
<value>classpath:/web/view</value>
</list >
</property>
<!--將檔案的內容全部放入JAR包中-->
<property name="defaultEncoding" value="UTF8" />
<property name="preferFileSystemAccess" value="false" /><!--解決html在多個包中的問題-->
<property name="freemarkerSettings">
<props>
<prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop>
<prop key="template_update_delay">10</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">#.##</prop>
<prop key="boolean_format">True,False</prop>
<prop key="auto_import">/base/include/spring.html as spring</prop>
</props>
</property>
<property name="freemarkerVariables"><!--設定一些常用的全域性變數-->
<map>
<entry key="aa" value="/static/view"></entry>
</map>
</property>
</bean>
系統訪問路徑入口:http://localhost:20040/framework-webapp/static/view/auth/login/login.html admin/123456
所有要訪問jar包中的靜態檔案都以staic/view為起始路徑,後auth/login/login.html 為JAR包中的檔案路徑。所有的頁面和靜態檔案都要在jar包中的web/view目錄下。(可參考程式碼中的目錄)
結合com.youyoulong.framework.controller.ViewController類的goView方法,可以在路徑中直接訪問.html檔案的方式,跳轉到正確的頁面檔案,僅僅只是製造一個直接訪問靜態檔案的假象。
總結:從上所述,任何事情都是從提出問題,到解決問題的過程,正是因為我需要達到的目標決定了我應該採用什麼樣的框架,什麼樣的模式去解決問題,這就是站在巨人的肩膀上。
QQ:93334958 微信:18028750128