新聞中心
據(jù)說JSF的主要負(fù)責(zé)人就是struts的主要作者,所以JSF和Struts的相似點(diǎn)還是有很多的。

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


咨詢
建站咨詢
