Struts vs. JSF






















 


Struts


JSF


MVC


支持


支持


POJO


 


支持


頁面流(Page Flow


支持


支持


UI組件(UI Component


 


支持


    MVC是模型(Model)、視圖(View)、控制(Controller)分層的結(jié)構(gòu),通過分層來實現(xiàn)關(guān)注分離,減少傳統(tǒng)開發(fā)中常見并重復(fù)的工作。Struts和JSF均支持MVC。Struts對MVC支持的核心是Controller,通過Controller(一個共同的入口Servlet)獲得HTTP請求,將HTTP參數(shù)傳入ActionForm,然后將ActionForm傳給Action類。Struts對HTTP請求只有一個事件處理handler,當(dāng)請求過來時,由相應(yīng)Action返回結(jié)果給前端Controller,并據(jù)此選擇如何進(jìn)行導(dǎo)航。JSF一般也采用一個前端Controller(有些商用JSF能夠智能識別JSF請求,無需額外的controller),不過在Controller中做的工作跟Struts Controller截然不同,它負(fù)責(zé)觸發(fā)JSF頁面組件中的事件,用Render工具生成組件的展現(xiàn),綁定來自Model的數(shù)據(jù)到組件等??梢钥吹剑琂SF在在控制層更靈活,在視圖層支持Render工具的變換而生成靈活的展現(xiàn),在模型層實現(xiàn)與框架的徹底分離,因而具有更高的靈活性。
  
    POJO是無格式Java對象(Plain Old Java Object)。POJO與AOP結(jié)合被廣泛用于快速業(yè)務(wù)模型。Struts設(shè)計的初衷主要是解決視圖和控制問題,并無過多關(guān)注模型的靈活性問題。Struts中的ActionForm模型必須繼承自框架類,雖然可以通過定制類庫提供一些幫助類實現(xiàn)模型與框架無關(guān),但本質(zhì)上還是緊耦合于JSP- and HTTP-centric方法。JSF提供了對POJO天然的良好支持,并支持通過RAD工具實現(xiàn)快速的業(yè)務(wù)模型生成,從而具有更高的生產(chǎn)力。
  
    頁面導(dǎo)航的最大意義是幫助實現(xiàn)頁面的可視化開發(fā),在UI界面上快速定義頁面流向。頁面導(dǎo)航分靜態(tài)導(dǎo)航和動態(tài)導(dǎo)航兩種,靜態(tài)導(dǎo)航是頁面直接流向另一頁面,動態(tài)導(dǎo)航是由特定動作或邏輯決定頁面的流向。Struts和JSF均支持靜態(tài)和動態(tài)頁面導(dǎo)航。不過Struts中的導(dǎo)航規(guī)則是綁定到Action中的,那意味著可能需要對同一頁面中不同的Action做重復(fù)性的導(dǎo)航規(guī)則制定,而JSF導(dǎo)航可以跟Action無關(guān),可以在頁面中不同組件的不同Action間共享相同的導(dǎo)航規(guī)則。
  
    Struts本身并不提供UI組件機(jī)制,而JSF則提供了完整的UI組件機(jī)制。通過UI組件的定制和重用,能夠極大地簡化開發(fā),提升用戶體驗。商業(yè)化的產(chǎn)品則往往更進(jìn)一步,提供強(qiáng)大易用的開發(fā)工具,實現(xiàn)drag-and-drop方式所見即所得的Web UI開發(fā)。  

Spring vs. EJB 3.0


























 


Spring


EJB3


標(biāo)準(zhǔn)(Standard


 


是,Java EE 5標(biāo)準(zhǔn)組成部分


持久(Persistence


JDBC, Hibernate, JDO, iBatis and JPA(ongoing spring 2.0)


JPA


聲明式服務(wù)(Declarative Services


支持


支持


依賴注入(Dependency Injection


支持


支持


集群(Cluster


 


支持


    Spring框架是一個開源項目,并不是一個標(biāo)準(zhǔn)的東西。Spring自己定義了一套XML配置文件大綱以及程序接口,從長遠(yuǎn)考慮,有很大的不確定性。Spring的主要開發(fā)者來自Interface21公司(這是幫我非常敬重的人),Interface21靠相關(guān)咨詢和服務(wù)維持,作為一個商業(yè)團(tuán)體其利益取向?qū)⒖梢酝耆笥襍pring未來的方向。相比EJB 3出身名門正派的標(biāo)準(zhǔn)血統(tǒng)并有眾多主流商業(yè)廠商支持,Spring的非標(biāo)準(zhǔn)性將可能帶來極大的風(fēng)險。
  
    Spring框架本身不帶持久實現(xiàn),但它支持JDBC, Hibernate, JDO和 iBatis等持久化框架。Spring通過使用不同的DAO和Helper類以利用JDBC、Hibernate、iBatis或JDO,所以并沒有實現(xiàn)和最終服務(wù)提供者的隔離。簡單來說,就是需要重構(gòu)代碼才能實現(xiàn)持久化框架的更換。EJB 3.0的持久集成在應(yīng)用服務(wù)中,通過JPA,可以在底層更換持久實現(xiàn),如將Hibernate更換為Toplink。EJB 3.0的持久具有更大的靈活性,并有利于廠商進(jìn)行性能優(yōu)化和擴(kuò)展。
  
    Spring和EJB3.0都為企業(yè)應(yīng)用提供運行時服務(wù),(如:事務(wù)、安全、日志消息、配置服務(wù))。由于這些服務(wù)都不是直接與應(yīng)用的業(yè)務(wù)邏輯相關(guān)聯(lián),所以都不是由應(yīng)用來自行管理。EJB3.0使用Java注釋來配置聲明式服務(wù),Spring使用XML配置文件。在大多數(shù)情況下,EJB3.0的注釋聲明顯得更為簡單和優(yōu)雅。Spring使用XML來定義屬性并配置聲明式服務(wù)的結(jié)果將是一個冗長而不穩(wěn)定的配置文件。 
  
    依賴注入模式(DI)是在應(yīng)用中實現(xiàn)松散耦合的最佳實踐。Spring和EJB3.0都支持DI模式,但他們有著深刻的不同。Spring支持通用的(但復(fù)雜的)基于XML配置文件的依賴注入API。EJB3.0支持注入大多數(shù)服務(wù)對象(如EJB和上下文對象)和通過簡單注釋聲明的JNDI對象。
  
    EJB 3.0完全支持集群。部署在服務(wù)集群中的EJB3.0應(yīng)用將自動獲得負(fù)載均衡、分布緩存、狀態(tài)復(fù)制等功能。底層的集群服務(wù)隱藏在EJB3.0編程接口后面,屏蔽了所有的復(fù)雜性。Spring沒有簡單的利用集群的方法。
  
    Hibernate vs. EJB 3.0
  
    Hibernate與EJB 3.0其實并沒有很好的可比性,因Hibernate僅關(guān)注ORM,而EJB 3.0更多則更多表現(xiàn)為一種組件框架,其中包含ORM部分而已。EJB 3.0在設(shè)計過程中,曾經(jīng)得益于Hibernate的作者Gavin King,據(jù)說EJB 3.0 EntityBean的設(shè)計理念完全來自于Hibernate。只需用將EJB 3.0 EntityBean API調(diào)用轉(zhuǎn)換為Hibernate API,Hibernate就可以成為EJB 3.0中EntityBean的Implementation。
  
    當(dāng)開源framework已經(jīng)成為習(xí)慣性勢力,并給人們帶來眾多樂趣或疲憊感的時候,Java EE 5的出現(xiàn)會是適逢其時嗎?無論如何,是繼續(xù)選擇開源還是擁抱Java EE 5?相信今天這并不是個容易的選擇,或許,隨著更多的廠商發(fā)布支持Java EE 5的產(chǎn)品,提供更好的工具支持,這個答案才會明朗起來。

分享到

多易

相關(guān)推薦