JSF和Struts的區(qū)別概述
據(jù)說(shuō)JSF的主要負(fù)責(zé)人就是struts的主要作者,所以JSF和Struts的相似點(diǎn)還是有很多的。
◆都采用taglib來(lái)處理表示層
◆都是采用一套標(biāo)記庫(kù)來(lái)處理頁(yè)面的表示和model層的交互。
◆都采用了bean來(lái)作為和jsp頁(yè)面對(duì)應(yīng)的model層。該model層保存了jsp頁(yè)面上的數(shù)據(jù),同時(shí)可以作一些驗(yàn)證工作,在struts中就是FormBean,在JSF中就是back bean.
◆都采用bean作為控制層,Struts中采用ActionBean來(lái)處理業(yè)務(wù)邏輯,對(duì)于簡(jiǎn)單的應(yīng)用可以直接在ActionBean中編寫(xiě)業(yè)務(wù)邏輯代碼,也可以調(diào)用另外的bean或者EJB來(lái)處理業(yè)務(wù)邏輯;對(duì)于JSF則采用backing bean來(lái)處理業(yè)務(wù)邏輯,同樣,backing bean也可以直接編寫(xiě)業(yè)務(wù)邏輯或者調(diào)用其他的bean來(lái)處理業(yè)務(wù)邏輯。
◆都采用xml配置文件來(lái)處理bean的配置,頁(yè)面導(dǎo)航等問(wèn)題,增加了系統(tǒng)的靈活性。
◆都采用資源文件來(lái)處理國(guó)際化和本地化的問(wèn)題。
然而,JSF和Struts的不同點(diǎn)也很多,下面分別說(shuō)明:
1、首先JSF和Struts的側(cè)重點(diǎn)不同,Struts側(cè)重于控制層,側(cè)重于如何分派和處理用戶(hù)的請(qǐng)求,所以表示層的taglib功能不夠強(qiáng)大。而JSF則側(cè)重于表示層,實(shí)現(xiàn)了大量的標(biāo)準(zhǔn)組件,允許開(kāi)發(fā)人員對(duì)表示層有更多的控制權(quán),同時(shí)JSF實(shí)現(xiàn)了一個(gè)開(kāi)放的架構(gòu),允許開(kāi)發(fā)人員創(chuàng)建自己的組件,或者在現(xiàn)有的組件上繼承,開(kāi)發(fā)功能更強(qiáng)大的組件。本人認(rèn)為這是JSF***的一個(gè)特色。(有點(diǎn)類(lèi)似于vcl和。net組件)
2、和jsp 對(duì)應(yīng)的model層,在Struts中采用FormBean來(lái)保存用戶(hù)輸入的數(shù)據(jù),基本上一般字段的類(lèi)型都是String.而且可以進(jìn)行簡(jiǎn)單的驗(yàn)證,當(dāng)然如果采用動(dòng)態(tài)的FormBean就不能在FormBean中進(jìn)行驗(yàn)證了。在Struts中,jsp和FormBean是緊密結(jié)合在一起的,只要寫(xiě)一個(gè) jsp就必須對(duì)應(yīng)一個(gè)FormBean,同時(shí)jsp上的每個(gè)組件都對(duì)應(yīng)FormBean中相同名字的字段。本人認(rèn)為這里不太靈活,比如,開(kāi)發(fā)頁(yè)面的時(shí)候就必須考慮后臺(tái)的FormBean的實(shí)現(xiàn),但此時(shí)如果該頁(yè)面沒(méi)有FormBean的化則程序運(yùn)行時(shí)會(huì)出錯(cuò)。在JSF中,JSP頁(yè)面中的組件通過(guò)value屬性和backing bean的字段關(guān)聯(lián),這樣就有比較大的靈活性,頁(yè)面上的每個(gè)組件可以對(duì)應(yīng)相同的backing bean,也可以對(duì)應(yīng)不同的backing bean(當(dāng)然本人認(rèn)為在一般的應(yīng)用中,一個(gè)頁(yè)面上的組件還是都對(duì)應(yīng)到一個(gè)backing bean較好),而且在設(shè)計(jì)頁(yè)面的時(shí)候可以不考慮backing bean如何設(shè)計(jì),可以在設(shè)計(jì)完頁(yè)面之后再考慮backing bean的實(shí)現(xiàn)問(wèn)題。
3、關(guān)于數(shù)據(jù)驗(yàn)證,Struts可以采用在FormBean中的驗(yàn)證函數(shù)中進(jìn) 行驗(yàn)證,也可以使用validator進(jìn)行驗(yàn)證(關(guān)于這種驗(yàn)證方法,本人沒(méi)有測(cè)試過(guò),不知效果如何,希望有經(jīng)驗(yàn)的朋友指教?。?。在JSF中,提供了一些標(biāo)準(zhǔn)的validator.可以對(duì)輸入的數(shù)據(jù)做一些簡(jiǎn)單的驗(yàn)證,例如驗(yàn)證數(shù)值數(shù)據(jù)的范圍,字段是否必填等。但其驗(yàn)證的反饋信息為英文。如果該信息不能自定義的化,那么針對(duì)國(guó)內(nèi)的應(yīng)用就不太適合了,目前本人還沒(méi)有找到該反饋信息是否能夠自定義的辦法。另外對(duì)于input類(lèi)型的組件可以通過(guò)validator屬性關(guān)聯(lián)到backing bean的一個(gè)驗(yàn)證方法上。在事件處理方法中進(jìn)行驗(yàn)證也是一個(gè)辦法。
在JSF中還有一個(gè)問(wèn)題就是在JSF生成的頁(yè)面中,組件的Id命名比較怪異,所有的組件的id都類(lèi)似于“form:compnentid”即form的名稱(chēng)+“:” +組件的id.這樣通過(guò)javascript訪(fǎng)問(wèn)組件就不是很方便,通過(guò)form.id形式好像不能訪(fǎng)問(wèn)到組件。不知道各位有沒(méi)有好的解決方案。
4、控制層:Struts 中通過(guò)form的action來(lái)提交請(qǐng)求,通過(guò)ActionServlet來(lái)分發(fā)請(qǐng)求,***由ActionBean來(lái)處理請(qǐng)求,在Action中實(shí)現(xiàn)業(yè)務(wù)邏輯或者調(diào)用其他的業(yè)務(wù)邏輯bean來(lái)完成用戶(hù)的請(qǐng)求并返回客戶(hù)端。在這里,一個(gè)form只有一個(gè)action,即一個(gè)頁(yè)面只能提交到一個(gè)action Bean.對(duì)于頁(yè)面上有多個(gè)按鈕都需要提交的情況就需要使用一些變通的方法了。和傳統(tǒng)的web開(kāi)發(fā)的模式比較接近。
對(duì)于JSF,采用了事件模式來(lái)處理用戶(hù)提交的請(qǐng)求。JSF實(shí)現(xiàn)了事件監(jiān)聽(tīng)器來(lái)監(jiān)測(cè)事件,例如當(dāng)用戶(hù)單擊了一個(gè)按鈕就會(huì)觸發(fā)一個(gè)按鈕單擊事件,還有valuechange事件監(jiān)聽(tīng)器來(lái)監(jiān)測(cè)數(shù)值改變的事件等。例如在頁(yè)面中通過(guò)通過(guò)CommandButton按鈕的action屬性來(lái)關(guān)聯(lián)到backing bean的方法來(lái)執(zhí)行相應(yīng)的操作。 每個(gè)不同的按鈕都可以關(guān)聯(lián)不同的方法,當(dāng)然也可以關(guān)聯(lián)相同的方法(這樣就和Action Bean非常類(lèi)似了)。這中開(kāi)發(fā)模式比較接近于傳統(tǒng)的c/s模式或者Asp.net的開(kāi)發(fā)模式。對(duì)于那些從c/s架構(gòu)程序或者Asp.net架構(gòu)轉(zhuǎn)過(guò)來(lái)的開(kāi)發(fā)者來(lái)說(shuō),這種方式可能更自然一些。
在JSF的一些簡(jiǎn)單的示例程序中,通常把和jsp對(duì)應(yīng)的model層和jsp所提交的action放在 同一個(gè)backing bean中,即業(yè)務(wù)邏輯和業(yè)務(wù)邏輯所處理的數(shù)據(jù)在同一個(gè)bean中。本人認(rèn)為,這樣的結(jié)構(gòu)只能用在簡(jiǎn)單的應(yīng)用中,對(duì)于企業(yè)級(jí)的開(kāi)發(fā)并不適合。應(yīng)該將頁(yè)面所關(guān)聯(lián)的數(shù)據(jù)和頁(yè)面所做的action分開(kāi),這樣的結(jié)構(gòu)更好一些,比較類(lèi)似于struts的結(jié)構(gòu)。
JSF的backing bean中的方法訪(fǎng)問(wèn)session,request等沒(méi)有struts中的直觀。筆者找了很多例子才知道如何訪(fǎng)問(wèn)session中的數(shù)據(jù)。
5、頁(yè)面的導(dǎo)航:關(guān)于頁(yè)面的導(dǎo)航,struts和JSF比較類(lèi)似。都是在xml的配置文件中配置導(dǎo)航規(guī)則。每個(gè)要跳轉(zhuǎn)的頁(yè)面都有一個(gè)別名,在程序中通過(guò)別名進(jìn)行跳轉(zhuǎn)。另外Struts中的跳轉(zhuǎn)是在ActionBean中發(fā)生,execute方法***返回一個(gè)actionForward來(lái)進(jìn)行跳轉(zhuǎn)。而JSF則在事件處理方法中***返回一個(gè)字符串,由系統(tǒng)在xml文件中匹配自動(dòng)進(jìn)行跳轉(zhuǎn)。在JSF中也可以通過(guò)在JSP頁(yè)面的CommandButton的action 屬性中直接填寫(xiě)跳轉(zhuǎn)的別名直接跳轉(zhuǎn),而不必經(jīng)過(guò)事件處理方法的處理。
6、資源文件的管理:Struts和JSF對(duì)于資源文件的管理比較類(lèi)似,Struts中在struts-config.xml中對(duì)資源文件進(jìn)行配置,實(shí)現(xiàn)整個(gè)程序的統(tǒng)一管理。而對(duì)于JSF則可以在每個(gè)JSP頁(yè)面中分別定義資源文件,然后通過(guò)資源文件的別名來(lái)訪(fǎng)問(wèn)資源文件中的內(nèi)容。兩者的格式也不相同,在 Struts中,格式為: grade1.grade2.grade3 = your information,通過(guò)“?!眮?lái)表示級(jí)別。而在JSF中則必須通過(guò)下劃線(xiàn)來(lái)表示級(jí)別,例如grade1_grade2_grade3= your information.本人認(rèn)為還是struts的方案更直觀一些。另外在Struts的資源文件中可以定義信息的顯示格式,例如: error.header,error.footer.而JSF中如何定義還不太清楚,或者可以通過(guò)定義Messages標(biāo)記的屬性來(lái)定義。
【編輯推薦】















 
 
 
 
 
 
 