相比於Tomcat,GlassFish的用戶群還沒有那麼廣泛,但是因為其同樣免費、開源,而且擁有如延遲加載、 Grizzly等技術,正取得越來越多人的認可。而JSF作為一個Web開發的標准,雖然自誕生之日起就一直飽受爭議,不過在爭議中,它也在贏得更多開發者的眼光。Anissa是GlassFish的一個主要提交者,領導其管理控制台項目,在Sun的應用服務器團隊工作了7年之久。InfoQ中文站的編輯霍泰穩有幸就JSF在GlassFish管理控制台中的應用,如為何在GlassFish管理控制台中應用JSF模板,如何對JSF做單元測試,JSF的組件庫以及如何提高JSF的性能等問題采訪了Anissa。
InfoQ中文站:請介紹一下您自己以及目前所主要研究的技術領域。
Anissa:我是GlassFish的主要提交者,目前領導其管理控制台項目。大約七年前,我加入了應用服務器團隊,那時GlassFish還沒有開源。我參與過許多GUI工具,包括J2EE 1.4參考實現中的deploytool以及我們深受歡迎的IDE_NetBeans的插件,而現在是負責管理控制台。在這些年裡,我見證了Web應用開發技術的發展過程,並從中受益很多。我目前專注於Web 2.0,致力於將最新的技術應用到GlassFish管理控制台。
InfoQ中文站:GlassFish的管理控制台用到了JSF模板,請介紹一下選用這個技術的緣由。
Anissa:JSF是一個面向組件的框架。因此,它易於組織各種具有復雜功能的“組件”成為一個網頁,這些組件包括文件選擇、文件上傳、表格、BreadCrumb、屬性表以及其它很多組件。但是,JSF 1.2 沒有提供一種簡潔的方式重用GUI顯示邏輯或者通過模板組織頁面。 JSFTemplating通過協調模板讓定義頁面變得更有效率。它也添加了許多旨在鼓勵代碼復用的特性和其他有用的功能。這些功能包括:一個細粒度的事件模型、能夠參數化的可重用“處理函數”、支持注釋、頁面作用域、可以將任何內容來源轉化為資源流、可定制的組件工廠。這些功能和JSF豐富的組件模型結合,為創建GlassFish管理控制台提供了豐富的開發環境。
InfoQ中文站:JSF的一個初衷就是快速開發,但單元測試對快速開發同樣重要。您如何做JSF的單元測試?
Anissa:我不得不承認管理控制台的單元測試是最具缺陷的地方之一,亟需提高。對於GlassFish V2,我們已經研究並使用Selenium做了一些測試,雖然Selenium更適合功能測試。我們也依靠質量保證部門對控制台進行自動化測試。對於 GlassFish V3,我們正在研究不同的框架,例如JSFUnit,它可以作為Maven構建過程和Hudson的一部分。
InfoQ中文站:目前關於JSF的錯誤提示似乎還不那麼直觀,過於底層,對於如何定位錯誤您有什麼技巧?
Anissa:JSF錯誤信息從1.0開始一直在持續改進。不幸的是,很多時候人們面對錯誤信息,仍然需要具備足夠的JSF是如何工作的知識才能完全理解。找出錯誤的根源常常需要經驗。但是,這裡有一些技巧可以幫助你:
查看JSF源代碼。JSF是開源的,不要害怕去獲取源代碼,看一看錯誤發生位置處的代碼。
報告糟糕的錯誤信息。當你無法理解錯誤信息的意思時,請去https://javaserverfaces.dev.java.net,提交一個“問題”,這會有助於改進錯誤信息而且你也很有可能得到你所遇到的問題的答案。
使用google,在論壇上提問。有很多人在使用JSF,可能有人已經遇到並提出了這個問題。如果沒有,你會發現許多人樂於幫助你、解答你的問題。
確認你使用了JSF “h:messages”組件(或者另外一個顯示這些內容的組件)。JSF經常使用“Faces消息”機制報告錯誤,如果你沒有在頁面上包含“h:messages” 組件,你就無法看到這些錯誤。
使用這些技巧,你能夠解決遇到的任何問題。
InfoQ中文站:JSF用來做重業務,輕頁面的企業開發還比較合適,但現在客戶也都比較重視頁面,對界面設計也提出了很高的要求。通過IDE,JSF可以實現可視化編輯Web界面,但如何高效的實現開發人員和網頁開發人員的合作?您在開發JSF時是如何跟美工配合的?
Anissa:我們的產品對界面設計感觀有一個非常明確的標准。我們使用的組件(Woodstock)默認情況下就反映了這種設計要求。因此,JSF面向組件的本質提供給我們很多外觀和感覺方面的選擇,而不需要太多開發工作。也就是說,我們的產品中有一些地方需要定制圖片、決定如何顯示信息,也存在一些地方沒有被JSF Woodstock組件覆蓋。針對這些情況,我們與美工合作創建圖片,或者他們幫助我們決定哪些組件最合適,或者對新組件制定標准。如果需要新組件,我們經常讓Woodstock團隊負責這項工作--當我們不能等待時,我們才會自己實現。美工通常提供圖片和HTML,我們將其轉化成JSF頁面或者組件。
InfoQ中文站:管理控制台是如何使用AJAX技術的?
Anissa:在GlassFish V2中,我們在大多數頁面上使用Ajax計算BreadCrumb。浏覽器中的JavaScript計算當前哪一個樹節點被選中,然後從樹節點中獲取 URL,將這些信息通過XMLHttpRequest發送給服務器。服務器將這些信息轉化成由多個Woodstock超鏈接組成的BreadCrumb組件。顯示該組件的代碼返回到浏覽器後,JavaScript將BreadCrumb信息更新到當前頁面上。
當新對象創建時,我們也使用Ajax更新樹節點。整棵樹從不會被完全刷新,它只會通過Ajax進行部分更新。我們使用Dynamic Faces實現Ajax技術,它是Ed Burns(JSF標准負責人)領導的JSF擴展項目的一部分。
InfoQ中文站:JSF一個重要的優勢是基於組件,管理控制台有沒有開發自己的組件庫,關於組件庫的選擇使用有何建議?管理控制台中的表單是如何進行擴展的?
Anissa:正如在回答第4個問題時所提到的,我們使用Woodstock組件開發控制台。Woodstock 提供了一整套JSF組件,讓開發人員基於統一的規范創建方便的本地化的應用。我們還沒有遇到需要自己開發組件的情況。如果你有這個想法,你可以看一看 Ken Paulsen寫的有關ServerSide的文章,他是JSFTemplating的技術負責人和創建者。他在文中展示了如何使用 JSFTemplating簡化和加快顯示(Render)開發。
我們的許多頁面使用表單顯示數據,這也是Woodstock的組件之一。
InfoQ中文站:在使用JSF的過程中,你們主要遇到了哪些棘手的難題,又是如何克服的?
Anissa:Bug。當組件正常工作的時候它們很出色,但是當你處理一個無法工作的新組件時,很難找到原因。幸運的是,這種情況不會經常發生,因為組件被很多人、很多程序重用,因此bug會及時發現。但是,如果這發生了,我們會與組件作者交流、在論壇或者irc頻道提問、搜索google中其他人遇到的類似問題,問題最終得到解決。
InfoQ中文站:JSF通過和Session綁定實現數據顯示,雖然簡單了,但是控制數據同時也困難了。對於這種情況,您是如何理解的?
Anissa:管理控制台盡量避免使用session作用域。頻繁使用session可能會導致內存的大量占用,或者之前的動作遺留下來的一些信息會導致產生bug。管理控制台盡可能多的使用request,還有pageSession,它允許伴隨著頁面存儲值,只要你處於同一個頁面,其值就一直存在,但不會超過頁面的生存時間。我們的確遇到過一些情況,數據必須跨頁面存在,我們要麼在頁面之間傳遞數據,要麼在極少的個案中使用session。
InfoQ中文站:在提升JSF應用的性能方面,您有什麼建議?
Anissa:JSF提供了大量功能。但是,功能只有在需要時才是有價值的。是否應該使用JSF的更多功能取決於你應用程序的需求。如果你想對功能進一步了解以確定它們是否對你的應用有幫助,我推薦你閱讀一本好書以及在JSF論壇上提問。你可能也會考慮加入 irc.freenode.net上的jsf IRC頻道。這是一個聆聽其他人提問和從專家獲取答案的好地方。如果正在使用JSFTemplating或者只是想多了解一下,#jsftemplating也是一個不錯的去處。
注:感謝Sun中國研究院蔣健,InfoQ中文站Java社區編輯沙曉蘭提供智慧支持!本文采訪文稿為英文,由崔康翻譯,張凱峰審校。