1.準備工作
安裝JDK及Tomcat,并分別設置環(huán)境變量:JAVA_HOME、CLASSPATH、COMCAT_HOME,并確保Tomcat已正常工作。本文以jdk1.5和Tomcat5.5.12為環(huán)境介紹Struts在Tomcat中的安裝及工作流程。
2.安裝Struts(通過二進制發(fā)布包安裝)
2.1下載Struts二進制發(fā)布包(http://struts.apache.org/downloads.html)
2.2解壓下載的二進制發(fā)布包,并將解壓目錄下lib目錄中的所有.jar文檔復制到TOMCAT_HOME\web應用\WEB_INF\lib目錄下,即只有些Web應用使用Struts構(gòu)架。
另:如果多個應該要同時使用Struts構(gòu)架,則應該將解壓目錄下lib目錄中的所有.jar文檔復制到TOMCAT_HOME\common\lib目錄下。
2.3將對應lib目錄下的struts.jar文件路徑添加到CLASSPATH環(huán)境變量中。
通過以上配置Web應用就可以使用Struts構(gòu)架進行項目開發(fā)了。
另外還可以通過Struts源碼進行安裝。
3.Struts構(gòu)架的構(gòu)成
整個Struts應用是一個分工明確的有機整體,在控制器的統(tǒng)一指揮下,各個組件各負其責,協(xié)調(diào)工作,是MVC設計模式的具體實現(xiàn)。MVC模式分為:模型(Model)、視圖(View)、控制器(Controller)三部分。
3.1模型(Model):業(yè)務邏輯層,用于實現(xiàn)具體的業(yè)務邏輯。此部分一般由JavaBean或EJB(企業(yè)級JavaBean)組成。Struts中的模型主要分為兩個部分:
1.系統(tǒng)的內(nèi)部狀態(tài)
2.可以改變狀態(tài)的操作(事務邏輯)
內(nèi)部狀態(tài)通常由一組ActinForm JavaBean表示。根據(jù)設計或應用程序復雜度的不同,這些Bean可以是自包含的并具有持續(xù)的狀態(tài),或只在需要時才獲得數(shù)據(jù)(從某個數(shù)據(jù)庫)。
大型應用程序通常在方法內(nèi)部封裝事務邏輯(操作),這些方法可以被擁有狀態(tài)信息的bean調(diào)用。比如購物車bean,它擁有用戶購買商品的信息,可能還有checkOut()方法用來檢查用戶的信用卡,并向倉庫發(fā)定貨信息。
小型程序中,操作可能會被內(nèi)嵌在Action類,它是struts框架中控制器角色的一部分。當邏輯簡單時這個方法很適合。
注:建議用戶將事務邏輯(要做什么)與Action類所扮演的角色(決定做什么)分開。
3.2視圖(View):表示層,與用戶直接交互的視圖。此部分一般通過JSP頁面來實現(xiàn),另外Struts還提供了豐富的自定義標識庫,它與模型部分有效交互。
3.3控制器(Controller):控制層,是整個應用的控制中心,用于控制整個業(yè)務流程(Flow Control),使用Model與View協(xié)同工作??刂破魍ㄟ^專門的Servlet來實現(xiàn)的,該Servlet是一個Struts API中提供的ActionServlet類型的實例。
3.4 Struts框架的組成部分
Struts-config.xml Struts配置文件
ActionServlet 控制器
Action Class 包含事務邏輯
ActionForm 顯示模塊數(shù)據(jù)
ActionMapping 幫助控制器將請求映射到操作
ActionForward 用來指示操作轉(zhuǎn)移的對象
ActionError 用來存儲和回收錯誤
Struts標記庫 可以減輕開發(fā)顯示層的工作
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構(gòu)架的核心,用來組裝各個組件,是一個控制中心。
4.Struts構(gòu)架的工作流程(如圖所示)
初學Struts時,可能難以理解其工作流程,最簡單的理解可以把Struts看作是一個“頁面導航”構(gòu)架,在struts_config.xml來規(guī)化應該程序的各個部分,Struts通過讀取該配置文件來組織應用程序。
5.流程說明
首先,服務器接收到客戶瀏覽器請求后,對請求進行過濾,若屬于Struts的處理范圍則自動提交給Struts控制器進行處理,否則按傳統(tǒng)方式作出響應。
注:過濾標準依據(jù)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(也可約定為其它)結(jié)尾的頁面請求都由此Servlet來處理,實現(xiàn)此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來自動接收來自客戶提交的表單數(shù)據(jù),聲明該JavaBean的代碼對應于struts_config.xml中的:
<form-beans>
<form-bean name="formBeanName" type="package.ClassNameForm"/>
</form-beans>
Name:該bean的名字
Type:實現(xiàn)該bean的類
為實現(xiàn)自動填充功能,該Bean(package.ClassNameForm類)必須是org.apache.struts.action.ActionForm類(即其子類)的對象。
2. Servlet控制器讀取Http分發(fā)規(guī)則(即Http請求與處理此請求的類的對應關(guān)系)
<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對象)分發(fā)HTTP請求的規(guī)則:
1. 若頁面URI是login.do,則使用formBeanName來自動接收來自客戶請求表單中的數(shù)據(jù)(該formBeanName中屬性要與用戶提交表單中的屬性名稱對應該,否則將無法接收),并將該請求分給一個package.LoginAction類型的實例來處理。該實例起到事件監(jiān)聽器的作用,類型必須是org.apache.struts.action.Action的子類。
注:控制器(ActionServlet)對象與JavaBean的情形類似,第一次運行時會自動實例化一個對象。
2. 若頁面URI是regist.do,則直接轉(zhuǎn)向/regist.jsp頁面作出響應。
3. Action對象的功能
Action對象接收到發(fā)送來的Http請求和由ActionServlet對象已填充過的表單對象,然后調(diào)用其execute()方法進行處理,此方法有四個參數(shù):
ActionMapping mapping:映射到struts_config.xml中的相關(guān)配置信息。
ActionForm form:ActionServlet對象填充過的表單(ActionForm Bean)的一個引用,可以從對象中獲取表單數(shù)據(jù)。
HttpServletRequest request:來自客戶端的Http請求信息。
HttpServletResponse response:響應客戶端的Http信息。
執(zhí)行完成后,返回給控制器ActionServlet對象一個封裝了目標頁面的ActionForward對象,此時,mapping對象調(diào)用findForward()方法 到struts_config.xml中的查找<forward>元素中映射信息,<forward>元素的定義如下:
<global-forwards>
<forward name="name1" path="/page1.jsp"/>
<forward name="name2" path="/page2.jsp"/>
</global-forwards>
Execute方法中的findForward()方法中的參數(shù)對應forward元素中的name屬性,找到后將導航到相應的頁面。
注:<forward>可以在struts_config.xml中兩個地方定義:一個是<global-forwards>元素中,此時在整個應用中都有關(guān)效,可理解為編程語言中的全局變量;另一個是<action>元素中,此時作用域為本Action。 findForward()方法查找順序為<action>?<global_forwards>
6.Struts構(gòu)架工作流程總結(jié)
ActionSerlvet接收客戶Http請求,使用ActionForm Bean自動填充客戶送來的表單數(shù)據(jù)到ActionForm Bean對象中?根據(jù)配置信息(struts_config.xml)將請求分發(fā)給相應的Action對象?Action對象調(diào)用execute()方法處理請求(根據(jù)JavaBean和ActionForm取得業(yè)務邏輯和表單數(shù)據(jù)),并反回ActionForward對象給ActionSerlvet對象?根據(jù)ActionForward對象的信息(目標頁面),ActionServlet再次將Http請求導航到目標頁面,并發(fā)送到客戶端。
以上是struts在Tomcat中的安裝與基本配置,在以后的系列文章中將詳細介紹其核心組件及運行機制。
7.相關(guān)資源
1.Struts的官方網(wǎng)站:http://jakarta.apache.org/struts/
2.Struts用戶手冊(User Guide)http://jakarta.apache.org/struts/userGuide
3.ARTICLE --- Framework save the day
http://www.javaworld.com/jw-09-2000/jw-0929-ejbframe.html
4.ARTICLE --- Building a Java servlet framework using reflection
http://www.javaworld.com/javaworld/jw-11-1999/jw-11-servlet.html
聲明:轉(zhuǎn)載請加入:http://blog.csdn.net/CloneIQ/archive/2006/07/18/936801.aspx
謝謝合作!