如果圖片看不到,請移步:http://sdrv.ms/1dGzTCh
一、Web產品的客戶化定製開發概述
很多產品在爲具體客戶進行部署後,每個客戶都有可能提出一些個性化的需求,這就需要對產品進行一定的定製開發,此現象在中小IT公司尤其常見。在產品的定製開發過程中不可避免的需要在原產品中增加或修改功能,由於JavaWeb技術本身對模塊化的支持嚴重不足,在進行定製開發時通常會導致版本控制混亂、開發調試不便和部署複雜等問題。
目前客戶化定製開發常見模式主要有:
1.直接修改方式
通常通過SVN創建產品的分支,然後直接修改源碼,添加或變更產品的部分功能。
此方式修改方便,但會導致產品版本控制混亂。
2.覆蓋方式
類似直接修改方式,但不直接在產品源碼中修改,在部署時先部署產品然後將修改後的類和資源文件向產品部署目錄進行覆蓋。
此方式部署較複雜,通常還需要修改已部署產品的配置文件,另外也會導致版本控制問題。
3.產品架構設計支持方式
產品在設計之初就考慮到各種客戶化定製的需求,採用OSGI插件或其它技術支持客戶化功能變更。
此方式的主要問題是設計複雜增加開發難度,另外調試不便。
Servlet3.0 WebFragment簡介
2010年發佈的Servlet3.0規範(從屬於JavaEE6的一部分)中增加了Web片段技術,大大加強了Web項目的模塊化開發支持。Servlet3.0中同時增加了異步Servlet、WebSocket、原生文件上傳、註解等多種現代化特性。
目前幾乎各種主流Web服務器都已經支持Servlet3.0/JavaEE6,例如:Tomcat7.x、Jetty8.x、GlassFish3.x等。
同樣各種開發工具也已經提供支持,例如:Eclipse3.6、MyEclipse9.1、Netbeans7.x、IntelliJ IDEA 10.x等。
二、WebFragment實踐
開發環境:MyEclipse9.1/Tomcat7.0
1.創建一個標準Web Project做爲主項目
此項目除了JavaEE版本從JavaEE5變化爲JavaEE6,項目整體結構上沒有特別之處,主要區別是web.xml中的版本號定義爲3.0。
1.1項目結構視圖
屏幕剪輯的捕獲時間: 2012/8/1 16:27
1.2 web.xml截圖
屏幕剪輯的捕獲時間: 2012/8/1 16:27
2.創建一個Web Fragment Project做爲項目模塊
2.1選擇Web Fragment Project項目嚮導
屏幕剪輯的捕獲時間: 2012/8/1 16:32
注意:如果找不到Web Fragment Project,請勾選“Show All Wizards”選項。
2.2 創建Web Fragment Project項目
屏幕剪輯的捕獲時間: 2012/8/1 16:32
注意:“Dynamic Web Project name”項務必選中主項目。
2.3 Web Fragment項目結構視圖
屏幕剪輯的捕獲時間: 2012/8/1 17:07
可以看到此項目結構類似於普通的“Java Project",項目結構中沒有常見Web項目的WebRoot目錄,而是在src下多了一個META-INF目錄。
目錄下的resources目錄相當於主Web項目中的WebRoot目錄,resources目錄需要自行創建。
目錄下的web-fragment.xml就是此Web項目片段的配置文件,相當於主Web項目中的web.xml。
2.4 web-fragment.xml截圖
屏幕剪輯的捕獲時間: 2012/8/1 16:43
可以看到web-fragment.xml文件中的根標籤與web.xml文件中的根標籤不同,但實際上它們的內容元素(子標籤)都是相同的。
3.在主項目和模塊項目中各自Servlet和JSP嘗試模塊化開發模式
3.1在主項目“Product”中創建ServletA
創建Serlvet的過程與Serlvet2.5/JavaEE5中基本沒有區別,使用默認生成的代碼即可。
3.2在模塊項目“ProductPlugin”中創建ServletB
3.2.1使用Servlet嚮導創建ServletB
屏幕剪輯的捕獲時間: 2012/8/1 16:43
注意:可以不用勾選“Generate/Map web.xml file”選項,因爲在Fragment項目中根本不存在web.xml文件,所以也不需要理會嚮導中的錯誤提示信息。
3.2.2 在模塊項目中引入JavaEE6庫
ServletB創建之後會發現,代碼中出現錯誤提示
屏幕剪輯的捕獲時間: 2012/8/1 17:10
此錯誤很明顯是由於項目中未引入JavaEE相關類庫,導致無法識別HttpServlet類。
在項目上右擊,選擇“Build Path -> Add Library”,打開添加庫窗口,選擇“MyEclipse Libraries -> JavaEE 6 Libraries”點擊確定,錯誤自動消除。
屏幕剪輯的捕獲時間: 2012/8/1 17:15
3.2.3 配置ServletB
可以按照JavaEE5中配置Servlet的標準方式在web-fragment.xml中配置ServletB,在此示例中將嘗試註解的方式進行配置。
打開ServletB代碼,在類聲明前增加“@WebServlet("/ServletB")”,註解括號中是指ServletB的UrlMapping,可以按需設置。
3.3 在模塊項目中創建一個JSP
只要把JSP文件創建到src/META-INF/resources/目錄下即可,可以在文件內容中添加一些關於模塊項目的說明文字。
4.運行項目,驗證模塊化開發結果
4.1運行效果截圖
4.1.1 主項目默認歡迎頁
4.1.2 主項目ServletA
4.1.3 模塊項目ServetB
4.1.4 模塊項目JSP
通過每個功能的URL地址來看,使用WebFragment模塊化開發的運行結果,與普通的WebProject開發的運行結果是一致的。
4.3 打包項目部署,分析打包結果
將主項目按照傳統過程導出爲標準WAR文件,然後按照生產環境部署到Tomcat7中。
進入Tomcat7/webapps/Product目錄,可以看到目錄中並不存在模塊項目“ProductPlugin”中的jsp/servlet文件,而是在“WEB-INF/lib”目錄下多出了一個“ProductPlugin.jar”文件。
模塊項目“ProductPlugin”以jar的方式存在,所有模塊項目的代碼和資源文件都已經打包在“ProductPlugin.jar”文件中,主項目的web.xml文件中沒有額外的配置,因此模塊項目的加入沒有污染主項目,部署也非常簡單。
5 結論
因此Servlet3.0 WebFragment提供的模塊化開發模式,完全克服了傳統產品客戶化項目的問題,其效果達到了引用第三方jar包的便捷性。