struts2重新梳理---入門

 MVC模式

 

 

MVC是Model-View-Controller的簡稱,即模型-視圖-控制器。
MVC是一種設計模式,它把應用程序分成三個核心模塊:模型、視圖、控制器,它們各自處理自己的任務。
 
  工作流程
 
 

Struts1實現MVC

        Struts的體系結構包括模型,視圖和控制器三部分。下面我們就從MVC角度來分析Struts的體系結構。

1.模型(Model)

        在Struts體系結構中,模型主要由JavaBean或EJB構成。模型分爲兩個部分:系統的內部狀態和可以改變狀態的操作(事務邏輯)。

2.視圖(View)

        視圖主要由一組JSP文件構成,在視圖中不存在業務邏輯與模型信息,只包含有標籤。

3.控制器(Controller)

         在Struts中,基本的控制器組件是ActionServlet類中的實例Servlet,實際使用的Servlet在配置文件中由一組映射(由ActionMapping類進行描述)進行定義。

Struts 1以ActionServlet作爲核心控制器,由ActionServlet負責攔截用戶的所有請求。Struts 1框架有3個重要組成部分:Action、ActionForm和ActionForward對象。
ActionForm必須實現ActionForm的基類,設計上並不是真正的POJO
ActionForward就是一個邏輯視圖,通過在配置文件中定義ActionFoward的映射,完成邏輯視圖名和實際視圖資源之間的映射
struts1的缺陷:
(1).只支持JSP作爲表現層技術,不能與Velocity,FreeMarker等技術整合
(2).與Servlet API嚴重耦合,難於測試
一個exute有四個參數ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化困難.
(3).侵入式設計,嚴重依賴於Struts1API,如如ActionMapping、ActionForm和ActionForward類.一旦系統需要重構時,這些類完全沒有利用價值,導致較低的代碼複用.
Struts2

   雖然Struts2號稱是一個全新的框架,但這僅僅是相對Struts 1而言。Struts 2 與Struts 1相比,確實有很多革命性的改進,但它並不是新發布的新框架,而是在另一個赫赫有名的框架:WebWork基礎上發展起來的。從某種程度上來講,Struts2沒有繼承Struts 1的血統,而是繼承WebWork的血統。或者說,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。

  Struts2是WebWork的升級,而不是一個全新的框架,因此穩定性、性能等各方面都有很好的保證:而且吸收了Struts 1和WebWork兩者的優勢。在經歷了幾年的各自發展後,WebWork和Struts社區決定合二爲一,也即是Struts 2
無需與Servlet API整合,更容易測試
優雅的請求參數封裝
靈活的視圖技術
豐富的表達式語言
機動,靈活,簡單的配置
線程安全的控制器(Action)
霸氣的插件
 
struts2框架結構
             Struts2內建了多個攔截器和攔截棧,將用戶的web請求進行處理,從而提供了更加豐富的功能,如數據類型轉換、國際化、文件上傳等
 
struts2流程
 
一個請求在Struts2框架中的處理大概分爲以下幾個步驟:
客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;
如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類;
ActionProxy創建一個ActionInvocation的實例。
ActionInvocation實例使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。
一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。在這個過程中需要涉及到ActionMapper。
 
基於Struts2創建一個簡單登錄項目。
導入struts核心支持包
在web.xml中配置FilterDispatcher
開發DAO
開發action
編寫前臺顯示頁面
創建struts.xml

Struts 2的核心Filter配置的web.xml配置文件的代碼:

<filter>

 <!-- 定義核心Filter的名字 -->

<filter-name>struts2</filter-name>

<!-- 定義核心Filter的實現類 -->

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

    <welcome-file-list>

        <welcome-file>index.html</welcome-file>

    </welcome-file-list>

</web-app>

控制器

Struts2有兩個重要的控制器:
StrutsPrepareAndExecuteFilter: 核心控制器,負責接收所有請求
Action: 負責處理單個特定請求
Action是一個普通的類, 不需要實現任何接口或繼承任何類.

 

Action的基本結構

public class SimpleAction {

public String execute() throws Exception{

return "to-index";

}

}

說明:

無需實現任何接口或繼承任何類,但有時爲了簡化某些功能必須繼承ActionSupport類
execute()方法會被自動調用,該方法用於處理用戶請求,返回類型爲String,是跳轉路徑的邏輯名稱.向上拋出Exception表示能夠處理所有異常.
“to-index”是跳轉路徑的邏輯名稱.
 

Action必須配置在struts.xml文件中,該文件默認放在classpath下.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

  <package name="MyStruts2" extends="struts-default">

  <action name="hello" class="com.fit.struts2.HelloWorld">

  <result name="error">/error.jsp</result>

  <result name="success">/success.jsp</result>

  </action>

  </package>

</struts>

struts.xml配置說明
package:用於組織Action的一個邏輯概念,必須通過extends繼承自struts-default包, struts-default包在struts-default.xml文件中定義,該文件配置了很多有用的功能.
action: 所有的Action都必須通過action標籤配置
name: 訪問action 邏輯名稱
class: Action類的全限定名
result子標籤: 定義跳轉路徑, execute()方法的返回值在此定義.默認情況下爲轉發,如果是重定向,必須按下面的格式:
<result type="redirect" name="xx">/xx.jsp</result>
 
simple.action是訪問Action的實際路徑.
格式:action的邏輯名稱+後綴
後綴的默認名稱爲:action
在struts.properties文件中可以配置後綴,如下:
struts.action.extension=action 
 
Struts版本比較
 
在Action實現類方面的對比:Struts 1要求Action類繼承一個抽象基類;Struts 2 Action類可以實現一個Action接口,也可以實現其他接口,使可選和定製的服務成爲可能。
— 線程模式方面的對比:Struts 1 Action是單例模式並且必須是線程安全,Struts 2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。
—  Servlet依賴方面的對比:Struts 1 Action依賴於Servlet API,。Struts 2 Action不再依賴於Servlet API。
— 表達式語言方面的對比:Struts 1整合了JSTL,因此可以使用JSTL表達式語言。Struts 2可以使用JSTL,但它整合了一種更強大和靈活的表達式語言:OGNL(Object Graph Notation Language)
— 綁定值到視圖的對比:Struts 1使用標準JSP機制把對象綁定到視圖頁面;Struts 2使用“ValueStack”技術,使標籤庫能夠訪問值,而不需要把對象和視圖頁面綁定在一起。
— 類型轉換的對比:Struts 1 ActionForm 屬性通常都是String類型。Struts 2使用OGNL進行類型轉換,支持基本數據類型和常用對象之間的轉換。
數據校驗的對比:Struts 1支持在ActionForm重寫validate方法中手動校驗,或者通過整合Commons alidator框架來完成數據校驗。Struts 2支持通過重寫validate方法進行校驗,也支持整合XWork校驗框架進行校驗。
—  Action執行控制的對比:Struts 1支持每一個模塊對應一個請求處理。Struts 2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章