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號稱是一個全新的框架,但這僅僅是相對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優雅的請求參數封裝靈活的視圖技術豐富的表達式語言機動,靈活,簡單的配置線程安全的控制器(Action)霸氣的插件
基於Struts2創建一個簡單登錄項目。導入struts核心支持包在web.xml中配置FilterDispatcher開發DAO開發action編寫前臺顯示頁面創建struts.xmlStruts 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是一個普通的類, 不需要實現任何接口或繼承任何類.
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=actionStruts版本比較在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創建不同的生命週期。