Struts2與Struts1的對比學習(一)

寫在前面:

  1. Struts1官方已經停止更新,現在用的也比較少,但是瞭解Struts1可以幫助我們更好的理解Struts2.
  2. 我們不能簡單的把Struts2理解爲Struts1的升級,甚至可以說這樣理解是錯誤的。Struts2與Struts1有巨大的差別,Struts2以WebWork爲核心,吸收了Struts1的優點,儘量解決Struts1存在的問題。正是這種差距,將兩者放到一起對比,可以更好的理解一些技術點的優缺點。

MVC簡介

Struts2是一個兼容Struts1和WebWork的MVC框架,既然,提到了MVC框架,就不得不對MVC框架做一個簡單介紹,僅限於簡單介紹,如果,想了解更多的MVC的知識可以查看相關的文檔。言歸正傳,其實,Java目前出現的這些框架而言,其最終目的都是爲了接觸耦合,不論是Spring、Hibernate或MVC框架,目的都是爲了接觸耦合增加複用。MVC接觸的是View和Model間的耦合。
MVC包含三個基礎部分:Model、View和Controller,這三個部分以最小的耦合協同工作,以增加程序的可擴展性和可維護性。各個部分的實現技術可以總結如下:
1)Model:JavaBean、EJB的EntityBean
2)View:JSP、Struts的TagLib
3)Controller:Struts的ActionServlet、Action
概括起來MVC的優點主要有一下方面:
1) 多個視圖可以對應一個模型。按MVC設計模式,一個模型對應多個視圖,可以減少代碼的複製及代碼的維護量,一旦模型發生改變,也易於維護 。
2) 模型返回的數據與顯示邏輯分離。模型數據可以應用任何的顯示技術,例如,使用JSP頁面、Velocity模板或直接產生Excel文檔等。
3) 應用被分隔爲三層,降低了各層之間的耦合,提供了應用的可擴展性 。
4) 控制層的概念也很有效,由於它把不同的模型和不同的視圖組合在一起,完成不同的請求。因此,控制層可以說是包含了用戶請求權限的概念 。
5) MVC更符合軟件工程化管理的精神。不同的層各司其職,每一層的組件具有相同的特徵,有利於通過工程化和工具化產生管理程序代碼 。

MVC更多的時候是一種思想,這個階段我們可以更多的去關注各個模塊的實現技術是什麼。

Struts1

特點

Struts 1以ActionServlet作爲核心控制器,由ActionServlet負責攔截用戶的所有請求。Struts 1框架有3個重要組成部分:
Action、ActionForm和ActionForward對象。
ActionForm必須實現ActionForm的基類,設計上並不是真正的POJO。ActionForward就是一個邏輯視圖,通過在配置文件中定義ActionFoward的映射,完成邏輯視圖名和實際視圖資源之間的映射。
Struts 1的Action類與Struts 2的Action類有一定的類似性,都通過調用execute方法來處理用戶請求。但最大的區別在於Struts 1 Action的execute方法與Servlet API耦合(ActionServlet繼承自HttpServlet),但Struts 2 Action類的execute方法無需與Servlet API耦合。

缺點:

1). 只支持JSP作爲表現層技術,不能與Velocity,FreeMarker等技術整合。
(2). 與Servlet API嚴重耦合,難於測試。一個exute有四個參數ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化困難。
(3). 侵入式設計,嚴重依賴於Struts1API,如如ActionMapping、ActionForm和ActionForward類。一旦系統需要重構時,這些類完全沒有利用價值,導致較低的代碼複用。
這裏寫圖片描述

Struts2

特點

Struts2之所以以WebWork的設計思想爲其核心,就是WebWork沒有Struts1上面的那些缺點,更符合MVC的設計思想,也更利於代碼的複用。
基於以上介紹可以看的出,Struts2體系結構與Struts1的體系結構有很大的差別,Struts1是使用ActionServlet做爲其中心處理器,Struts2則使用一個攔截器(FilterDispatcher)做爲其中心處理器,這樣做的一個好處就是將Action類和Servlet API進行了分離。
Struts2的簡單處理流程如下:
1. 瀏覽器發送請求 。
2. 中心處理器根據struts.xml文件查找對應的處理請求的Action類。
3. WebWork的攔截器鏈自動對請求應用通用功能,例如:WorkFlow、Validation等功能 。
4. 如果Struts.xml文件中配置Method參數,則調用Method參數對應的Action類中的Method方法,否則調用通用的Execute方法來處理用戶請求 。
5. 將Action類中的對應方法返回的結果響應給瀏覽器。

這裏寫圖片描述

核心控制器:FilterDispatcher

Struts 2用於處理用戶請求的Action實例,並不是用戶實現的業務控制器,而是Action代理——因爲用戶實現的業務控制器並沒有與Servlet API耦合,顯然無法處理用戶請求。而Struts 2框架提供了系列攔截器,該系列攔截器負責將HttpServletRequest請求中的請求參數解析出來,傳入到Action中,並回調Action 的execute方法來處理用戶請求。顯然,上面的處理過程是典型的AOP(面向切面編程)處理方式。

Action

  1. Action類完全是一個POJO,因此具有很好的代碼複用性。
  2. Action類無需與Servlet API耦合,因此進行單元測試非常簡單。
  3. Action類的execute方法僅返回一個字符串作爲處理結果,該處理結果可映射到任何的視圖,甚至是另一個Action。

配置文件

  1. 配置Action的struts.xml文件。
  2. 配置Struts 2全局屬性的struts.properties文件。

下面是struts.xml配置文件的示例:

Xml代碼

<struts>  
            <!-- Struts 2的Action都必須配置在package裏 -->  
      <package name="default" extends="struts-default">  
             <!-- 定義一個Logon的Action,實現類爲lee.Logon -->  
        <action name="Logon" class="lee.Logon">  
            <!-- 配置Action返回input時轉入/pages/Logon.jsp頁面 -->  
          <result name="input">/pages/Logon.jsp</result>  
            <!-- 配置Action返回cancel時重定向到Welcome的Action-->  
          <result name="cancel" type="redirect-action">Welcome</result>  
            <!-- 配置Action返回success時重定向到MainMenu的Action -->  
          <result type="redirect-action">MainMenu</result>  
            <!-- 配置Action返回expired時進入ChangePassword的Action鏈 -->  
          <result name="expired" type="chain">ChangePassword</result>  
        </action>  
            <!-- 定義Logoff的Action,實現類爲lee.Logoff -->  
        <action name="Logoff" class=" lee.Logoff">  
            <!-- 配置Action返回success時重定向到MainMenu的Action -->  
          <result type="redirect-action">Welcome</result>  
        </action>  
      </package>  
    </struts>  

總結:

瞭解學習Struts1與Struts2的基礎知識和工作流程,可以讓我們更好的理解兩者的區別和爲什麼要這樣改進。通過對兩者的基礎學習,我們發現,兩者雖然是完全不同的框架,但是Struts2完全是爲了解決Struts1存在的問題而產生的。下篇文章我們將討論兩者的區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章