說到Struts2執行過程就少不了一張圖:
1 客戶端初始化一個指向Servlet容器的請求;
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)。
3 接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action。(注:在Struts2的被StrutsPrepareAndExecuteFilter替換)
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy。
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類。
6 ActionProxy創建一個ActionInvocation的實例。
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。
推薦博客:http://blog.sina.com.cn/s/blog_6ef516d0010188hm.html
Then:
在之前說過的使用Struts2框架實現用戶登錄的功能,使用Struts2標簽和OGNL表達式簡化了視圖的開發,並且利用Struts2提供的特性對輸入的數據進行驗證,以及訪問Servlet API時實現用戶會話跟蹤,其簡單的程序運行流程圖
login.jsp>>StrutsPrepareAndExecuteFilter>>Action>>Result>>success.jsp
下面通過分析登錄程序,帶領大家深入了解Struts2.
分析登錄程序
為了實現用戶登錄的功能,需要經過以下幾個步驟:
(1)獲取Struts2資源
(2)在應用程序中導入Struts2的類庫
(3)在web.xml文件中配置其核心控制器StrutsPerpareAndExecuteFilter,用於對框架進行初始化,以及處理所有的請求。
(4)編寫Action類並進行配置。
(5)配置返回結果與物理視圖資源的關系。
(6)編寫返回視圖
眾所周知,Struts2框架是基於MVC模式的。基於MVC模式框架的核心就是控制器對所有請求進行統一處理。Struts2的控制器StrutsPrepareAndExecuteFilter由Servlet API中的Filter充當,當Web容器接收到登錄的請求后,將請求交給在web.xml中的配置的過濾器StrutsPrepareAndExecuteFilter。
我們首先來看看StrutsPrepareAndExecuteFilter的配置。
1.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name></display-name> <!-- --> <filter> <filter-name>struts2</filter-name> <!-- 使用Struts2的核心類庫 --> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <!-- 攔截所有的action --> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
StrutsPrepareAndExecuteFilter可以包含一些初始化參數,經常使用的如config--要加載的xml形式的配置文件列表(多個配置文件以逗號分隔),如果沒有設置這個參數,Struts2框架將默認加載struts.default.xml,struts-plugin.xml和struts.xml,這些文件將在后面進行講解。
StrutsPrepareAndExecuteFilter作為一個Filter在web應用中運行,它負責攔截所有的用戶請求,當用戶請求達到時,該Filter會過濾用戶請求。如果用戶請求以action結尾,該請求將被輸入Struts
2框架進行處理。
2.Action
實際上,在MVC框架中,控制器是由兩個部分組成,分別如下
--核心控制器(Filter):用於攔截用戶請求,對請求進行處理。
--業務控制器(Action):調用相應的Model類實現業務處理,返回結果。
對於開發人員來說,使用Struts2框架,主要的編碼工作就是編寫Action類。在之前學習的過程中,我們介紹了com.opensymphony.xwork2.Action接口和com.opensymphony.xwork2.ActionSupport類,Struts2並不要求編寫的Action類一定要實現Action接口,可以編寫一個普通的java類作為Action類,只要該類含有一個返回字符串的無參的public方法即可。
問:Action是如何獲取用戶請求並進行業務處理的?
答:回想一下,我們在學習Servlet時,Servlet是如何實現業務控制的。用戶提交請求后,各種業務並沒有在Servlet中直接完成,而是通過調用不同的javaBean組件來實現的。在Struts2中也是如此,Filter用來接收用戶的請求,在對數據進行簡單處理后通過反射創建Action實例,然后調用Action的方法。而Action實例的創建就由struts.xml中的配置來決定。
3.Result
result元素的作用是實現結果視圖的調用,並決定視圖以哪種形式展示給客戶端。簡單地說,就是用來設定在Action處理結束后,系統下一步將要做什么。
Action類在處理完用戶請求后,會返回一個處理結果。這個結果是一個簡單的字符串,框架根據這個字符串選擇對應的Result,所以我們又將稱為邏輯視圖名稱。這個邏輯視圖名稱由result元素的name屬性來表示。result元素的值用來指定這個邏輯視圖對應的物理視圖資源的位置。需要特別指出的是,邏輯視圖名稱只有與物理視圖資源聯系在一起,才能發揮作用,所以必須要在配置文件中設置二者之間的對應關系。