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