struts和jsf/tapestry都屬于表現層框架,這兩種分屬不同性質的框架,后者是一種事件驅動型的組件模型,而struts只是單純的mvc模式框架,我們下面進行詳細分析比較。
首先事件是指從客戶端頁面(瀏覽器)由用戶操作觸發的事件,struts使用action來接受瀏覽器表單提交的事件,這里使用了command模式,每個繼承action的子類都必須實現一個方法execute。
在struts中,實際是一個表單form對應一個action類(或dispatchaction),換一句話說:在struts中實際是一個表單只能對應一個事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件。
struts重要的表單對象actionform是一種對象,它代表了一種應用,這個對象中至少包含幾個字段,這些字段是jsp頁面表單中的input字段,因為一個表單對應一個事件,所以,當我們需要將事件粒度細化到表單中這些字段時,也就是說,一個字段對應一個事件時,單純使用struts就不太可能,當然通過結合javascript也是可以轉彎實現的。
而這種情況使用jsf就可以方便實現,
|
#{login.userid}表示從名為login的javabean的getuserid獲得的結果,這個功能使用struts也可以實現,name="login" property="userid"
關鍵是第二行,這里表示如果userid的值改變并且確定提交后,將觸發調用類userloginchanged的processvaluechanged(...)方法。
jsf可以為組件提供兩種事件:value changed和 action. 前者我們已經在上節見識過用處,后者就相當于struts中表單提交action機制,它的jsf寫法如下:
|
從代碼可以看出,這兩種事件是通過listerner這樣觀察者模式貼在具體組件字段上的,而struts此類事件是原始的一種表單提交submit觸發機制。如果說前者比較語言化(編程語言習慣做法類似swing編程);后者是屬于web化,因為它是來自html表單,如果你起步是從perl/php開始,反而容易接受struts這種風格。
基本配置
struts和jsf都是一種框架,jsf必須需要兩種包jsf核心包、jstl包(標簽庫),此外,jsf還將使用到apache項目的一些commons包,這些apache包只要部署在你的服務器中既可。
jsf包下載地址:http://java.sun.com/j2ee/javaserverfaces/download.html選擇其中reference implementation。
jstl包下載在http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
所以,從jsf的驅動包組成看,其開源基因也占據很大的比重,jsf是一個sun伙伴們工業標準和開源之間的一個混血兒。
上述兩個地址下載的jar合并在一起就是jsf所需要的全部驅動包了。與struts的驅動包一樣,這些驅動包必須位于web項目的web-inf/lib,和struts一樣的是也必須在web.xml中有如下配置:
|
這里和struts的web.xml配置何其相似,簡直一模一樣。
正如struts的struts-config.xml一樣,jsf也有類似的faces-config.xml配置文件:
|
在struts-config.xml中有actionform action以及jsp之間的流程關系,在faces-config.xml中,也有這樣的流程,我們具體解釋一下navigation:
在index.jsp中有一個事件:
<h:commandbutton label="login" action="login" />
action的值必須匹配form-outcome值,上述navigation配置表示:如果在index.jsp中有一個login事件,那么事件觸發后下一個頁面將是welcome.jsp
jsf有一個獨立的事件發生和頁面導航的流程安排,這個思路比struts要非常清晰。
managed-bean類似struts的actionform,正如可以在struts-config.xml中定義actionform的scope一樣,這里也定義了managed-bean的scope為session。
但是如果你只以為jsf的managed-bean就這點功能就錯了,jsf融入了新的ioc模式/依賴性注射等技術。
ioc模式
對于userbean這樣一個managed-bean,其代碼如下:
|
faces-config.xml這段配置其實是將"me"賦值給name,將secret賦值給password,這是采取ioc模式中的setter注射方式。
backing beans
對于一個web form,我們可以使用一個bean包含其涉及的所有組件,這個bean就稱為backing bean, backing bean的優點是:一個單個類可以封裝相關一系列功能的數據和邏輯。
說白了,就是一個javabean里包含其他javabean,互相調用,屬于facade模式或adapter模式。
對于一個backing beans來說,其中包含了幾個managed-bean,managed-bean一定是有scope的,那么這其中的幾個managed-beans如何配置它們的scope呢?
|
這里配置了一個backing beans中有一個setvisit方法,將這個visit賦值為session中的visit,這樣以后在程序中我們只管訪問visit對象,從中獲取我們希望的數據(如用戶登陸注冊信息),而visit是保存在session還是application或request只需要配置既可。
ui界面
jsf和struts一樣,除了javabeans類之外,還有頁面表現元素,都是是使用標簽完成的,struts也提供了struts-faces.tld標簽庫向jsf過渡。
使用struts標簽庫編程復雜頁面時,一個最大問題是會大量使用logic標簽,這個logic如同if語句,一旦寫起來,搞的jsp頁面象俄羅斯方塊一樣,但是使用jsf標簽就簡潔優美:
|
如果authenticationbean中inboxauthorized返回是假,那么這一行標簽就不用顯示,多干凈利索!
新聞熱點
疑難解答