Struts核心技術簡介
1、Struts內部機制
Struts是一種基於MVC經典設計模式的開發源代碼的應用框架,它通過把Servlet、JSP、JavaBean、自定義標簽和信息資源整合到一個統一的框架中,為Web開發提供具有高可配置性的MVC開發模式。
Struts體系結構實現了MVC設計模式的概念,它將Model、View、和Controller分別映射到Web應用組件中。Controller負責控制流程,由ActionServlet負責讀取struts-config.xml,並使用ActionMapping來查找對應的Action;Model由系統狀態Bean ActionForm和商業邏輯的JavaBean來構建;View是由JSP和Struts提供的自定義標簽來實現的,具體如下圖一所示:
圖一:Struts的MVC結構圖
2、Struts工作流程
Struts的工作流程主要涉及到以下七個類:ActionServlet、ActionMapping、RequestProcessor、Action、ActionForm、ActionForward、ActionErrors。以下簡要說明以下各自的作用:
(1)ActionServlet是Struts的核心控制器,一個系統中只需要一個。我們可以通過繼承該類來擴展一個新的Servlet,但通常我們直接使用默認的ActionServlet,只需要在web.xml文件中配置ActionServlet的相關屬性即可;
(2)ActionMapping是struts-config.xml文件中配置元素的實例對象,該類與struts-config.xml文件中的元素和屬性相匹配。由於struts-config.xml文件中的元素類型已經由Struts設計者定義完成了,因此類ActionMapping也是僅有的一個通用類,不再需要開發人員開發;
(3)RequestProcessor是ActionServlet的代處理類,與ActionServlet相似,通常我們只需要使用默認的類即可,如果要擴展新的功能,只需要實現一個繼承該類的新的處理類即可;
(4)Action是struts-config.xml文件中<action>元素對應的處理類,該配置文件中可以配置指向多個Action處理類,不同的業務需要不同的Action類。因此Action是我們自己開發,新開發的類需要繼承Action基類;
(5)ActionForm Bean是struts-config.xml文件中配置的<from-bean>元素對應的類,表示不同的出來表單。由於不同的HTML處理表單包含的表單元素不同,因此也需要開發多個ActionForm類;
(6)ActionForward用於根據struts-config.xml文件中action的配置進行頁面轉換,與ActionMapping類似,它是一個通用的類,也不需要開發;
(7)ActionErrors是對錯誤信息的包裝,一旦在執行action或者form.validate中出現異常,即可產生一個ActionErrors並最終加入到ActionErrors。在Form驗證的過程中,如果有Error發生,則會將頁面重新導向至輸入頁,並提升錯誤。
下面請看Struts的工作流程圖,如圖二所示:
圖二:Struts工作流程圖
3、Struts配置文件詳解
Struts配置文件——struts-config.xml文件是一個簡單的框架,<struts-config>是struts的根元素,其主要有8個子元素:
(1)配置數據源:<data-sources>元素
(2)配置ActionForm:<form-beans>元素
(3)配置全局異常處理:<global-exceptions>元素
(4)配置全局跳轉:<global-fowards>元素
(5)配置映射關系:<action-mappings>元素
(6)配置RequestProcessor插件:<controller>元素
(7)配置國際化資源文件:<message-resources>元素
(8)配置Plug-in插件:<plug-in>元素
下面請看一個struts-config.xml文件示例代碼:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <!-- 配置數據源 --> <data-sources> <data-source type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="driverClassName" value="com.mysql.jdbc.Driver" /> <set-property property="url" value="jdbc:mysql://localhost:3306/demo" /> <set-property property="username" value="root" /> <set-property property="password" value="" /> <set-property property="maxActive" value="10" /> <set-property property="maxWait" value="5000" /> <set-property property="defaultAutoCommit" value="false" /> <set-property property="defaultReadOnly" value="false" /> <set-property property="validationQuery" value="SELECT COUNT(*) FROM user" /> </data-source> </data-sources> <!-- 配置ActionForm --> <form-beans> <form-bean name="loginForm" type="com.demo.struts.forms.LoginForm"> </form-bean> <form-bean name="registerForm" type="com.demo.struts.forms.RegisterForm"> </form-bean> </form-beans> <!-- 配置全局異常處理 --> <global-exceptions /> <global-forwards> <forward name="welcome" path="/welcome.do" /> <forward name="login" path="/login.do" /> </global-forwards> <!-- 配置映射關系 --> <action-mappings> <action path="/index" forward="/login.jsp" /> <action path="/welcome" forward="/welcome.jsp" /> <action path="/menu1" forward="/menu1.jsp" /> <action path="/menu2" forward="/menu2.jsp" /> <action path="/menu3" forward="/menu3.jsp" /> <action path="/menu4" forward="/menu4.jsp" /> <action path="/menu5" forward="/menu5.jsp" /> <action path="/menu6" forward="/menu6.jsp" /> <action path="/menu7" forward="/menu7.jsp" /> <action path="/menu8" forward="/menu8.jsp" /> <action path="/login" name="loginForm" scope="request" type="com.demo.struts.actions.LoginAction" input="/login.jsp"> <forward name="success" path="/welcome.jsp" /> <forward name="failure" path="/login.jsp" /> </action> <action path="/logout" type="com.demo.struts.actions.LogoutAction"> <forward name="logout" path="/login.jsp" /> </action> <action path="/register" parameter="method" name="registerForm" scope="request" type="com.demo.struts.actions.RegisterAction" input="/register.jsp"> <!-- 配置局部跳轉 --> <forward name="success" path="/login.jsp" /> <forward name="failure" path="/register.jsp" /> </action> </action-mappings> <!-- 配置國際化資源文件 --> <message-resources parameter="com.demo.struts.resources.ApplicationResources" /> </struts-config>
4、ActionForm Bean的開發技術
ActionForm可以繼承三個類:org.apache.struts.action.ActionForm類、org.apache.struts.action.DynaActionForm類、org.apache.struts.action.DynaValidatorForm類。下面分別簡要說明一下這三種類似ActionForm的開發:
(1)使用默認表單ActionForm
ActionForm表示HTTP窗體中的數據,可以將其看做是模型和視圖的中介,它負責保存視圖中的數據,供模型或者視圖使用。Struts文檔中把它比作HTTP和Action之間的防火牆,這體現了ActionForm所具有的過濾與保護的作用,只有通過ActionForm驗證的數據才能夠發送到Action處理。
(2) 使用動態表單DynaActionForm
當多個模塊共用一個ActionForm時,這樣重復使用會造成復用性很差,而且難以維護。針對這個問題,在Struts中提出了DynaActionForm的概念。
DynaActionForm的目的就是減少ActionForm的數目,利用它可以不用創建一個個具體的ActionForm類,而是在配置文件中配置出所需的虛擬ActionForm。
(3)使用自動校檢表單DynaValidatorForm
DynaValidatorForm能夠提供動態的ActionForm和自動表單輸入驗證的功能。但是,使用DynaValidatorForm需要在配置文件中進行配置,也需要在struts-config.xml文件中定義驗證的插件,在改插件中定義具體功能的驗證代碼。
5、Action組件開發技術
開發Action組件,需要繼承默認的Action類。Struts提供了6個內置的Action類,這些類繼承自普通Action類,並有各自的功能實現,具體如下:
org.apache.struts.actions.Action;
org.apache.struts.actions.ForwardAction;
org.apache.struts.actions.IncludeAction;
org.apache.struts.actions.DispatchAction;
org.apache.struts.actions.LookupDispatchAction;
org.apache.struts.actions.SwitchAction。
(1)使用默認的Action
通過繼承Action類來實現具體的執行類,具體Action類的功能一般都在execute()方法中完成。
(2)可直接轉發的ForwardAction
有時我們想要從一個頁面或資源轉換到另一個資源,通常我們會使用JSP頁面的直接轉換來進行處理,但這樣處理會使得控制器沒有機會處理該轉換請求。因此,我們可以通過使用ForwardAction來完成轉換這個任務。
(3)可包含文件的IncludeAction
有時我們會需要引入一個頁面或者資源,在這樣的情況下就可以使用IncludeAction。
(4)可自動分發的DispatchAction
通常,如果繼承默認的Action類,只能完成一種業務操作。如果要完成一組業務操作,例如對用戶進行更新、刪除、插入操作,則需要建立多個操作類,分別來接受相應。通過使用DispatchAction可以將這些類合並,並把相同的部分提出來,然后在該類中每一個實現的功能對應不同的方法,即可完成目的。
(5)可進行多個提交的LookupDispatchAction
LookupDispatchAction最大的特點是可以在一個表單中輕松實現多個Submit按鈕,通常LookupDispatchAction主要應用在一個表單中有多個“提交”按鈕,而這些按鈕又有一個共同的名字的場合,這些按鈕的名字和具體的ActionMapping的parameter屬性相對應。這樣情況下,可以根據JSP文件中設置的標簽名,在Action類中設置與相應標簽名對應的函數來編寫相應的功能代碼。
(6)可實現交換的SwitchAction
SwitchAction用於從一個模塊轉換至另一個模塊。