struts1工作流程

Struts在Tomcat中的安裝配置及工作流程

1.準備工作
      安裝JDK及Tomcat,並分別設置環境變量:JAVA_HOME、CLASSPATH、COMCAT_HOME,並確保Tomcat已正常工作。本文以jdk1.5和Tomcat5.5.12爲環境介紹Struts在Tomcat中的安裝及工作流程。
2.安裝Struts(通過二進制發佈包安裝)
 2.1下載Struts二進制發佈包(
http://struts.apache.org/downloads.html
 2.2解壓下載的二進制發佈包,並將解壓目錄下lib目錄中的所有.jar文檔複製到TOMCAT_HOME\web應用\WEB_INF\lib目錄下,即只有些Web應用使用Struts構架。
另:如果多個應該要同時使用Struts構架,則應該將解壓目錄下lib目錄中的所有.jar文檔複製到TOMCAT_HOME\common\lib目錄下。
 2.3將對應lib目錄下的struts.jar文件路徑添加到CLASSPATH環境變量中。
通過以上配置Web應用就可以使用Struts構架進行項目開發了。
另外還可以通過Struts源碼進行安裝。
3.Struts構架的構成
 整個Struts應用是一個分工明確的有機整體,在控制器的統一指揮下,各個組件各負其責,協調工作,是MVC設計模式的具體實現。MVC模式分爲:模型(Model)、視圖(View)、控制器(Controller)三部分。
3.1模型(Model):業務邏輯層,用於實現具體的業務邏輯。此部分一般由JavaBean或EJB(企業級JavaBean)組成。Struts中的模型主要分爲兩個部分:
1.系統的內部狀態
2.可以改變狀態的操作(事務邏輯)
內部狀態通常由一組ActinForm JavaBean表示。根據設計或應用程序複雜度的不同,這些Bean可以是自包含的並具有持續的狀態,或只在需要時才獲得數據(從某個數據庫)。
大型應用程序通常在方法內部封裝事務邏輯(操作),這些方法可以被擁有狀態信息的bean調用。比如購物車bean,它擁有用戶購買商品的信息,可能還有checkOut()方法用來檢查用戶的信用卡,並向倉庫發定貨信息。
小型程序中,操作可能會被內嵌在Action類,它是struts框架中控制器角色的一部分。當邏輯簡單時這個方法很適合。
注:建議用戶將事務邏輯(要做什麼)與Action類所扮演的角色(決定做什麼)分開。
3.2視圖(View):表示層,與用戶直接交互的視圖。此部分一般通過JSP頁面來實現,另外Struts還提供了豐富的自定義標識庫,它與模型部分有效交互。
3.3控制器(Controller):控制層,是整個應用的控制中心,用於控制整個業務流程(Flow Control),使用Model與View協同工作。控制器通過專門的Servlet來實現的,該Servlet是一個Struts API中提供的ActionServlet類型的實例。
3.4 Struts框架的組成部分
Struts-config.xml    Struts配置文件
ActionServlet      控制器
Action Class      包含事務邏輯
ActionForm      顯示模塊數據
ActionMapping     幫助控制器將請求映射到操作
ActionForward     用來指示操作轉移的對象
ActionError         用來存儲和回收錯誤
Struts標記庫    可以減輕開發顯示層的工作
3.5主要的配置文件
 web.xml(TOMCAT_HOME/Web應用/WEB_INF),Web.xml是web應用的通過配置文件,主要完成ActionServlet的配置、配置首頁的設置等。
Struts-config.xml(TOMCAT_HOME/Web應用/WEB_INF),struts-config.xml是整個Struts構架的核心,用來組裝各個組件,是一個控制中心。
4.Struts構架的工作流程(如圖所示)
初學Struts時,可能難以理解其工作流程,最簡單的理解可以把Struts看作是一個「頁面導航」構架,在struts_config.xml來規化應該程序的各個部分,Struts通過讀取該配置文件來組織應用程序。

 

 

 

 

 

 

 

 

 

 

5.流程說明
首先,服務器接收到客戶瀏覽器請求後,對請求進行過濾,若屬於Struts的處理範圍則自動提交給Struts控制器進行處理,否則按傳統方式作出響應。
注:過濾標準依據web.xml中Servlet的配置信息:
<servlet>
<servlet-name>actionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
以上信息配置了名爲actionServlet的控制器Servlet,並說明凡是以.do(也可約定爲其它)結尾的頁面請求都由此Servlet來處理,實現此Servlet的類是org.apache.struts.action.ActionServlet.(Struts API中定義的組件類)
其次,控制器servlet開始工作,讀取struts_config.xml中的配置信息
注:Struts_config.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<struts-config>
<form-beans>
<form-bean name="formBeanName" type=" package.ClassNameForm "/>
</form-beans>
<global-forwards>
<forward name="failed" path="/error.jsp"/>
<forward name="successed" path="/right.jsp"/>
</global-forwards>
<action-mappings>
<action path="/login" type ="classmate.LoginAction" name ="formBeanName" scope="request" input ="/login.jsp"/>
<action path="/regist" forward="/regist.jsp"/>
</action-mappings>
</struts-config>
1. 使用指定的JavaBean來自動接收來自客戶提交的表單數據,聲明該JavaBean的代碼對應於struts_config.xml中的:
<form-beans>
<form-bean name="formBeanName" type="package.ClassNameForm"/>
</form-beans>
 Name:該bean的名字
 Type:實現該bean的類
爲實現自動填充功能,該Bean(package.ClassNameForm類)必須是org.apache.struts.action.ActionForm類(即其子類)的對象。
2. Servlet控制器讀取Http分發規則(即Http請求與處理此請求的類的對應關係)
<action-mappings>
<action path="/login" type ="package.LoginAction" name =" formBeanName " scope="request" input ="/login.jsp"/>
<action path="/regist" forward="/regist.jsp"/>
</action-mappings>
說明:
path:和本Action對應的請求頁面的相對路徑(不包括後.do)。
type:處理請求的Action Bean類(完整路徑)。
name:用到的ActionForm Bean的名字(<form-bean>元素中聲明的)
scope:ActionForm Bean的作用域(默認爲session)。
input:表單驗證出錯時的處理頁面。
forward:指定目標響應頁面(與<forward>元素不同,只有當沒有指定type屬性時本屬性才生效)。
另:還可以在<action>中配置<forward>元素,即此Action處理後反回的目標頁面
以上代碼使用<action-mapping>元素的子元素<action>來約定控制器(ActionSevlet對象)分發HTTP請求的規則:
1. 若頁面URI是login.do,則使用formBeanName來自動接收來自客戶請求表單中的數據(該formBeanName中屬性要與用戶提交表單中的屬性名稱對應該,否則將無法接收),並將該請求分給一個package.LoginAction類型的實例來處理。該實例起到事件監聽器的作用,類型必須是org.apache.struts.action.Action的子類。
注:控制器(ActionServlet)對象與JavaBean的情形類似,第一次運行時會自動實例化一個對象。
2. 若頁面URI是regist.do,則直接轉向/regist.jsp頁面作出響應。
3. Action對象的功能
Action對象接收到發送來的Http請求和由ActionServlet對象已填充過的表單對象,然後調用其execute()方法進行處理,此方法有四個參數:
ActionMapping mapping:映射到struts_config.xml中的相關配置信息。
ActionForm form:ActionServlet對象填充過的表單(ActionForm Bean)的一個引用,可以從對象中獲取表單數據。
HttpServletRequest request:來自客戶端的Http請求信息。
HttpServletResponse response:響應客戶端的Http信息。
執行完成後,返回給控制器ActionServlet對象一個封裝了目標頁面的ActionForward對象,此時,mapping對象調用findForward()方法 到struts_config.xml中的查找<forward>元素中映射信息,<forward>元素的定義如下:
<global-forwards>
<forward name="name1" path="/page1.jsp"/>
<forward name="name2" path="/page2.jsp"/>
</global-forwards>
Execute方法中的findForward()方法中的參數對應forward元素中的name屬性,找到後將導航到相應的頁面。
注:<forward>可以在struts_config.xml中兩個地方定義:一個是<global-forwards>元素中,此時在整個應用中都有關效,可理解爲編程語言中的全局變量;另一個是<action>元素中,此時作用域爲本Action。 findForward()方法查找順序爲<action>?<global_forwards>
6.Struts構架工作流程總結ActionSerlvet接收客戶Http請求,使用ActionForm Bean自動填充客戶送來的表單數據到ActionForm Bean對象中?根據配置信息(struts_config.xml)將請求分發給相應的Action對象?Action對象調用execute()方法處理請求(根據JavaBean和ActionForm取得業務邏輯和表單數據),並反回ActionForward對象給ActionSerlvet對象?根據ActionForward對象的信息(目標頁面),ActionServlet再次將Http請求導航到目標頁面,併發送到客戶端。以上是struts在Tomcat中的安裝與基本配置,在以後的系列文章中將詳細介紹其核心組件及運行機制。