Struts, Spring 簡介

  • 對於Struts和Spring兩種MVC框架的比較

    基於Web的MVC framework在J2EE的世界內已是空前繁榮。TTS網站上幾乎每隔一兩個星期就會有新的MVC框架發佈。目前比較好的MVC,老牌的有Struts、Webwork。新興的MVC框架有Spring MVC、Tapestry、JSF等。這些大多是著名團隊的作品,另外還有一些邊緣團隊的作品,也相當出色,如Dinamica、VRaptor等。這些框架都提供了較好的層次分隔能力。在實現良好的MVC 分隔的基礎上,通過提供一些現成的輔助類庫,同時也促進了生產效率的提高。

    如何選擇一個好的框架應用在你的項目中,將會對你的項目的效率和可重用是至關重要的。本文將對目前最流行、最常用的兩種framework進行介紹。

    一、Struts

    Struts是Apache軟件基金下Jakarta項目的一部分。Struts框架的主要架構設計和開發者是Craig R.McClanahan。Struts是目前Java Web MVC框架中不爭的王者。經過長達五年的發展,Struts已經逐漸成長爲一個穩定、成熟的框架,並且佔有了MVC框架中最大的市場份額。但是Struts某些技術特性上已經落後於新興的MVC框架。面對Spring MVC、Webwork2 這些設計更精密,擴展性更強的框架,Struts受到了前所未有的挑戰。但站在產品開發的角度而言,Struts仍然是最穩妥的選擇。

    Struts有一組相互協作的類(組件)、Serlvet以及jsp tag lib組成。基於struts構架的web應用程序基本上符合JSP Model2的設計標準,可以說是MVC設計模式的一種變化類型。根據上面對framework的描述,我們很容易理解爲什麼說Struts是一個web framwork,而不僅僅是一些標記庫的組合。但 Struts 也包含了豐富的標記庫和獨立於該框架工作的實用程序類。Struts有其自己的控制器(Controller),同時整合了其他的一些技術去實現模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與數據訪問技術相結合,包括EJB,JDBC和Object Relation Bridge。在視圖層,Struts能夠與JSP, Velocity Templates,XSL等等這些表示層組件想結合。

    Struts的體系結構

    struts framework是MVC 模式的體現,下面我們就從分別從模型、視圖、控制來看看struts的體系結構(Architecture)。

    從視圖角度(View)

    主要由JSP建立,struts自身包含了一組可擴展的自定義標籤庫(TagLib),可以簡化創建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags這幾個Taglib。有關它們的詳細資料請參考struts用戶手冊。
    從模型角度(Model)

    模型主要是表示一個系統的狀態(有時候,改變系統狀態的業務邏輯操作也劃分到模型中)。在Struts中,系統的狀態主要有ActiomForm Bean體現,一般情況下,這些狀態是非持久性的。如果需要將這些狀態轉化爲持久性數據存儲,Struts本身也提供了Utitle包,可以方便的與數據庫操作。
從控制器角度(Controller)

    在Struts framework中,Controller主要是ActionServlet,但是對於業務邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協調完成(也許這幾個組件,應該劃分到模型中的業務邏輯一塊)。其中,Action扮演了真正的業務邏輯的實現者,而ActionMapping和ActionForward則指定了不同業務邏輯或流程的運行方向。

    對於Struts 如何控制、處理客戶請求,讓我們通過對struts的四個核心組件介紹來具體說明。這幾個組件就是:ActionServlet。Action Classes,Action Mapping(此處包括ActionForward),ActionFrom Bean。

    二、Spring

    Spring實際上是《Expert One-on-One J2EE Design and Development》一書中所闡述的設計思想的具體實現。在One-on-One一書中,Rod Johnson 倡導J2EE 實用主義的設計思想,並隨書提供了一個初步的開發框架實現(interface21 開發包)。而Spring 正是這一思想的更全面和具體的體現。Rod Johnson在interface21 開發包的基礎之上,進行了進一步的改造和擴充,使其發展爲一個更加開放、清晰、全面、高效的開發框架。

    Spring是一個開源框架,由Rod Johnson創建並且在他的著作《J2EE設計開發編程指南》裏進行了描述。它是爲了解決企業應用開發的複雜性而創建的。Spring使使用基本的JavaBeans來完成以前只可能由EJB完成的事情變得可能了。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。

    簡單來說,Spring是一個輕量的控制反轉和麪向切面的容器框架。當然,這個描述有點過於簡單。但它的確概括出了Spring是做什麼的。爲了更好地理解Spring,讓我們分析一下這個描述:

    1、輕量

    從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR文件裏發佈。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於輕量,從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR文件裏發佈。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。

    2、控制反轉

    Spring通過一種稱作控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,對象被動地傳遞它們的依賴而不是自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反??不是對象從容器中查找依賴,而是容器在對象初始化時不等被請求就將依賴傳遞給它。

    3、面向切面

    Spring包含對面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統服務(例如審計與事物管理)進行內聚性的開發。應用對象只做它們應該做的,完成業務邏輯,僅此而已。它們並不負責(甚至是意識)其它的系統關注點,例如日誌或事物支持。

    4、容器

    Spring包含和管理應用對象的配置和生命週期,在這個意義上它是一種容器。你可以配置你的每個bean如何被創建?基於一個配置原形爲你的bean創建一個單獨的實例或者每次需要時都生成一個新的實例以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量的EJB容器,它們經常是龐大與笨重的,難以使用。

    框架:Spring是由簡單的組件配置和組合複雜的應用成爲可能。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了很多基礎功能(事務管理、持久性框架集成等等),將應用邏輯的開發留給了你。

    所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也爲Spring中的各種子框架提供了基礎。

  • 說說Spring和Struts的區別

    Struts只是一個MVC框架(Framework),用於快速開發Java Web應用。Struts實現的重點在C(Controller),包括ActionServlet/RequestProcessor和我們定製的Action,也爲V(View)提供了一系列定製標籤(Custom Tag)。但Struts幾乎沒有涉及M(Model),所以Struts可以採用JAVA實現的任何形式的商業邏輯。
    Spring是一個輕型容器(light-weight container),其核心是Bean工廠(Bean Factory),用以構造我們所需要的M(Model)。在此基礎之上,Spring提供了AOP(Aspect-Oriented Programming, 面向層面的編程)的實現,用它來提供非管理環境下申明方式的事務、安全等服務;對Bean工廠的擴展ApplicationContext更加方便我們實現J2EE的應用;DAO/ORM的實現方便我們進行數據庫的開發;Web MVC和Spring Web提供了Java Web應用的框架或與其他流行的Web框架進行集成。
    就是說可將兩者一起使用,達到將兩者自身的特點進行互補。

 

  • Spring和Struts整合的三種方式

1,使用Spring 的 ActionSupport

2,使用Spring 的 DelegatingRequestProcessor 類。

3,全權委託。

無論用那種方法來整合第一步就是要爲struts來裝載spring的應用環境。 就是在 struts 中加入一個插件。

struts-config.xml中

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
 </plug-in>

spring 的配置文件被作爲參數配置進來。這樣可以省略對web.xml 文件中的配置。確保你的applicationContext.xml 在WEB-INF目錄下面

1、使用Spring的ActionSupport .

Spring 的ActionSupport 繼承至org.apache.struts.action.Action

ActionSupport的子類可以或得 WebApplicationContext類型的全局變量。通過getWebApplicationContext()可以獲得這個變量。

這是一個 servlet 的代碼:

 

這中配置方式同直接在web.xml文件配置差別不大。注意:Action繼承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。

但實現了表示層和業務邏輯層的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。

2、使用Spring 的 DelegatingRequestProcessor 類

DelegatingRequestProcessor  繼承自 org.apache.struts.action.RequestProcessor 並覆蓋了裏面的方法。

sturts-config.xml  中 

processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通過 來替代

org.apache.struts.action.RequestProcessor 的請求處理。

 

 

這裏 name="/login" 與struts 中的path匹配

class="com.cao.struts.action.LoginAction" 與struts 中的type匹配

還要爲 LoginAction 提供必要的setXXX方法。 獲得ApplicationCotext和依賴注入的工作都在DelegatingRequestProcessor中完成。

3,全權委託:

Action 的創建和對象的依賴注入全部由IOC容器來完成。使用Spring的DelegatingAcionProxy來幫助實現代理的工作

org.springframework.web.struts.DelegatingActiongProxy繼承於org.apache.struts.action.Action .

全權委託的配置方式同 方式 2 類似 (applcationContext.xml文件的配置和 Action類的實現方式相同)。

<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="loginForm" 
  type="com.cao.struts.form.LoginForm" /> 
  </form-beans>

  <global-exceptions />
  <global-forwards />
 <action-mappings >
    <!-- type指向的是spring 的代理類 -->
    <action
      attribute="loginForm"
      input="login.jsp"
      name="loginForm"
      path="/login"
      scope="request"

   type="org.springframework.web.struts.DelegatingActionProxy" >
      
      <forward name="success" path="/ok.jsp" />
      <forward name="error" path="/error.jsp" />
    </action>
 
 </action-mappings>
 
  
  <message-resources parameter="com.cao.struts.ApplicationResources" />

 <plug-in className=
 "org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" 
  value="/WEB-INF/applicationContext.xml"/>
 </plug-in>

</struts-config>
不同之處
1, <action>中 type指向的是spring 的代理類

2, 去掉struts-config.xml中 <controller >


三種整和方式中我們優先選用 全權委託的方式。

理由:

1,第一種使得過多的耦合了Spring和Action .

2,RequestProcessor類已經被代理 如果要再實現自己的實現方式(如:編碼處理)怕有點麻煩。

總結一下:

整合工作中的步驟:

1,修改struts-config.xml

2, 配置applicationContext.xml

3, 爲Action添加get/set方法 來獲得依賴注入的功能。

 

參見:http://developer.51cto.com/art/200810/94799_1.htm

 

 

發佈了42 篇原創文章 · 獲贊 4 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章