Web.xml 文件對于配置任何 Java Web 應用都是必須的 . 當配置 Struts 應用時 , 還應該在 web.xml 文件中配置和 Struts 相關的配置選項 . 一下講述配置 Struts 應用的必要步驟 .
?
1 ·配置 Struts 的 ActionServlet
第一步用 <servlet> 元素來聲明 ActionServlet 。
在 <servlet> 的子元素中,經常用到的有:
?? · <servlet-name> 元素用來定義 Servlet 的名稱。
?? · <servlet-class> 元素用來置頂 Servlet 的完整類名。
?? · <init-param> 元素用于配置 Servlet 初始化參數。
第二步為配置 <servlet-mapping> 元素,用來指定 ActionServlet 可以處理哪些 URL 。
有子元素 <servlet-name> 和 <url-pattern> ,注意,這里的 <servlet-name> 必須和 <servlet> 元素中的 <servlet-name> 匹配。
?
** 提示 **
? 不管應用中包含多少子應用,都只需要配置一個 ActionServlet 。有些開發者希望設置多個 ActionServlet 類來處理應用中不同的功能,其實這是不必要的,因為 Serlvet 本身支持多線程。而且,目前的 Struts 框架只允許在應用中配置一個 ActionSerlvet 。
?
2
·配置歡迎文件清單
<welcome-file-list>
元素中可以包含多個
<welcome-file>
子元素,當
Web
容器調用
Web
應用的歡迎文件時,首先尋找第一個
<welcome-file>
指定的文件。如果這個文件存在,將把這一個文件返回給客戶;如果這個文件不存在,
Web
容器將依次尋找下一個歡迎文件,直到找到為止;如果都不存在,服務器將向客戶返回“
HTTP
?
3
·配置錯誤處理
<error-page>
? <error-code></error-code>
? <location></location>
</error-page>
如果在 web.xml 文件中做了以上配置,當 Web 容器捕獲到錯誤時(如: HTTP 404 、 HTTP 500 ),將根據錯誤代碼減縮 <error-page> 的子元素 <error-code> ,如果有匹配項就返回 <location> 子元素指定的文件。
? 也可以為 Web 容器捕獲的 Java 異常配置 <error-page> 元素,這是需要設置 <exception-type> 子元素,它用于指定 Java 異常類。 Web 容器可能捕獲如下異常:
? · RuntimeException 或 Error 。
? · ServletException 或它的子類。
? · IOException 或它的子類。
這里的配置信息如下:
<error-page>
? <exception-type></exception-type>
? <location></location>
</error-page>
?
4
·配置
Struts
標簽庫
<taglib> 元素有兩個子元素: <taglib-uri> 和 <taglib-location> 。 <taglib-uri> 元素指定標簽庫的相對或者絕對 URI 地址, Web 應用將根據這一 URI 來訪問標簽庫; <taglib-location> 元素指定標簽庫描述文件在文件資源系統中的物理位置。
如果 Web 應用中沒有使用 Struts 標簽庫,就沒有必要在 web.xml 文件中配置它。此外,也可以按以上方式在 web.xml 文件中配置用戶自定義的客戶化標簽庫
?
?
Struts配置文件簡介
Struts?framework根據配置文件使得ServletAction,ActionMapping,Action , ActionForm這幾個不同層次的組件相互交互,協調的工作。這些配置文件是在系統啟動的時候,讀入導內存中,供控制器使用的。
Struts?framework主要包括三部分的配置描述,一個是指定有關Struts?Controller及其相關的的配置描述(Initialization?Parameters),一個對struts?tag?lib的描述,一個是struts組件(ActionMapping,Action,ActionForm)之間相互映射協調的關系
有關Struts?Controller及其相關的的配置描述
????因為Struts?Controller的主要類ActionServlet是繼承自HttpServlet,所以必須像配置一個Servlet那樣在部署描述符(Web.xml)中配置ActionServlet類及其訪問映射。
????當您第一次創建基于Struts的Web應用程序時,將為您創建一個部署描述符,這通常就足夠了。該文件包括下列條目:
?????<servlet>條目定義用于Web應用程序的servlet(在本例中,這是唯一的servlet):
—??<servlet-name>?和<servlet-class>指示ActionServlet?(標識為“操作”)接收HTTP請求并確定如何響應。
—??<init-param>表示servlet初始化參數.
-????“config”指示ActionServlet的行為由指定的配置文件來指導,該配置文件通常具有以下名稱:
\WEB-INF\struts-config.xml
-????“debug”具有整數值,它指示將有關處理的詳細信息寫至控制臺的程度。
-????”detail”具有整數值,它指示將“映射”詳細信息(如后面所述)寫至控制臺的程度。
—??<load-on-startup>導致在啟動應用程序時裝入servlet。
?????<servlet-mapping>元素標識這樣的命名模式:當命名模式由URL進行匹配時,Web服務器就將控制權移交給ActionServlet。考慮下面各種情況:
—??訪問了ActionServlet,原因是“操作”(<servlet-mapping>中的<servlet-name>元素的內容)與“操作”(<servlet>中的<servlet-name>元素的內容)相匹配。
????—??<servlet-mapping>元素指定URL的結尾的命名模式。每個URL的開頭都是應用程序上下文路徑。按照慣例,ActionServlet調用對象以響應與命名模式“*do”(其中“*”是通配符)一致的URL。
?????<welcome-file-list>元素指示獲得初始控制權的特定于應用程序的代碼;在本例中,Web服務器直接從Web?Content目錄中調用index.jsp。
?????<error-page>元素指示顯示哪個JSP來響應錯誤;在本例中,錯誤為如下所示:
—??404??(找不到資源)
—??500??(Web服務器內部發生錯誤)
?????每個<taglib>元素都使相對URL(相對于Web.xml)與標記庫描述符(相對于Web應用程序根目錄)相關聯。每個JSP都可以使用同一個URL來表示給定的標記庫,而Web.xml確定引用了哪個文件。
有關struts?tag?lib的配置描述
????如果你的web?application打算使用Struts的taglib,那么你有必要在web.xml中對struts?taglib進行配置描述。
有關Struts?Action?Mapping的配置描述
???? 作為先前描述的web.xml設置的結果,Web應用程序服務器將請求的一個子集按路徑發送至ActionServlet,它通常調用一系列操作和JSP。ActionServlet的響應是基于配置文件struts-config.xml的內容的。有關其DTD文檔的描述,請參考http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd
????一般struts-config(version1.1)包含了如下幾個部分:
(1)form-bean
????(2)global-forwards
????(3)action-mappings
????(4)data-sources
????我們知道,對于這樣的一個請求(例如,表示為“/login.do”),執行下列步驟:
1、????尋找操作類對象(繼承org.?apache.struts.action.Action的類)
2、????ActionServlet調用操作類對象的執行方法
操作類中的執行方法的特征符為如下所示:
public?ActionForward??execute(
??????ActionMapping?mapping,
??????ActionForm?form,
??????HttpServletRequest?request,
??????HttpServletResponse?response)
?????映射對象(ActionMapping),它包含指示如何響應方法的每個可能結果的規則(“映射”)
?????Struts表單bean(ActionForm),它保存發送至HTML表單或接收自HTML表單的數據
?????請求和響應對象(HttpServletReques/?HttpServletResponse)
3、????從執行方法返回ActionForward對象,用于指導ActionServlet接著訪問哪個操作類或JSP
返回的ActionForward對象中的信息取決于兩個值:
?????方法的結果(如在“成功”或“故障”等字符串中所述)
?????映射對象,它包含從Struts配置文件中讀取的信息
要弄明白某些運行時關系,要明白struts-config.xml該文件包括下面的一組條目:
?????<form-beans>標記標識每個表單bean
?????<action-mappings>標記包括用于指導應用程序流的信息,每個<action>子標記都使相對URL與操作類和潛在的后續操作相關。
Form-bean元素
Struts配置文件中的一個示例<form-bean>子元素為如下所示:
<form-bean?name=“registerForm”??type=“strutscommon.RegisterForm”/>
每個<form-bean>子元素都包括下列屬性:
name
表單bean的名稱,稍后在配置文件中會用到。ActionServlet舉例說明了該bean(如果需要的話)并在將對bean的引用存儲在請求或會話對象中時將該名稱用作鍵。
type
類的全限定名稱,它繼承org.apache.struts.action.ActionForm該類必須在類路徑中。接受“Struts貿易樣本”中的注冊的表單bean包括HTML注冊表單中每個字段的getter?和setter方法。該bean還包括驗證方法,如下節“驗證”中所述。
Action元素
???Struts配置文件中的一個示例<action>元素為如下所示:
<action?path=“/register”
????????type=“strutsEGL.RegisterAction”
???????name=“registerForm”
???????input=“/register.jsp”
???????scope=“request”
???????<forward?name=“success”path=“/home.do”/>
???????<?forward?name=“failure”path=“/register.jsp”/>
?????</action>
每個<action>元素都包括下列屬性中的某些屬性或所有屬性:
?path
?????將請求指定為非限定URL,不帶文件擴展名(例如,“/register”)請求是根據<action>元素中的其它屬性來處理的,并且是用戶輸入的結果或者是在different<action>元素中標識的轉發的結果。
type
?????指定在發出請求時調用其執行方法的操作類的全限定名。該類必須在類路徑中。
注:不指定要實例化的類,可以通過使用forward屬性來轉發請求,該屬性在“Struts貿易樣本”中未使用,并且與后面描述的<forward>子元素不相同。
name
?????用于保存發送至HTML表單或接收自HTML表單的數據表單bean的名稱。
?input
?????指定相對URL(例如,“/register.do”或“/index.jsp”)必須包括后綴,
如果表單bean的驗證方法指示發生了輸入錯誤,則會調用URL;有關詳細信息,參見下節的“驗證”。
?scope
?????????指定將對表單?bean的引用存儲在哪個作用域中。其值為“會話”(缺省值)或“請求”。
?Struts配置文件中的每個<action>元素還包括子元素<forward>,它指定從方法結果至后續調用的映射。每個<forward>子元素都包括下列屬性
name?
指定導致在運行時使用當前映射的字符串(例如,“success”),但是
只限于以下情況:在?type?中引用的操作類的執行方法使用完全相同
的字符串來配置返回至ActionServlet的?ActionForward對象。下面
的執行方法不是很重要,但是會導致使用“success”映射:
??
?public?ActionForward?exectue(
???ActionMapping?mapping,
???ActoinForm?form,
???HttpServletRequest?request,
???HttpServletResponse?response)
???Throws?IOException,ServletException
{
???ActionForward?forward=new?ActionForward();
???Forward=mapping,findForward(“success”);
???return(forward);
}
?????path
??????????指定非限定URL(例如,“/home.do”?或“/index.jsp”)必須包括文件擴展名,僅當使用當前映射時才會調用該URL,轉發操作類是根據different<action>元素中的屬性來處理的,尤其是,在其path屬性標識相同URL的<action>元素中。
????有必要提一下的是,在struts1.1中,提出了對Multiple?Application?Support。在struts的早先版本中,只有一個struts配置文件,一般叫struts-config.xml。但是,對于越來越復雜的應用系統的發展,只有一個地方存放這個一個文件,對大型項目來說,使用和修改這個配置文件,使其成為了一個應用的瓶頸問題。在struts1.1中,你可以定義多了配置文件協同工作。
Struts 框架在啟動時會讀入其配置文件,根據它來創建和配置各種 Struts 組件。 Struts 配置文件使得開發者可以靈活地組裝和配置各個組件,提高了應用軟件的可擴展性和靈活性,可以避免硬編碼。 Struts 配置文件是基于 XML 的。
?
·
1
。
org.apache.struts.config
包
? 在 Struts1.1 中加入了 org.apache.struts.config 包。在 Struts 應用啟動時,會把 Struts 配置文件中的配置信息讀入到內存中,并把他們存放在 cofnig 包中相關 JavaBean 類的實例中。
org.apache.struts.config 包中的每一個類都和 Struts 配置文件中特定的配置元素對應。
在 Struts 框架完成了對配置文件的驗證和解析后,就把配置文件中的信息存放在這些類的實例中。這些類的實例可以充當配置信息的運行時容器, Struts 組件可以方便地通過他們來獲取配置信息。
org.apache.struts.config.ModuleConfig 在 Struts 框架中扮演了十分重要的角色。它是整個 org.apache.struts.config 包的核心,在 Struts 應用運行時用來存放整個 Struts 應用的配置信息。如果有多個子應用,每個子應用都會有一個 ModuleConfig 對象。 ModuleConfig 和 Struts 配置文件的根元素 <struts-config> 對應。 <struts-config> 根元素中包含 <form-bean> 、 <action> 和 <forward> 等一系列子元素,因此 ModuleConfig 中包含了和每個子元素對應的配置類實例。
org.apache.struts.config.ConfigRuleSet 類的功能不同于其他類,它包含了解析 Struts 配置文件所需要的一組規則。在應用啟動時,該類負責構造 org.apache.struts.config 包中其他用于保存配置信息的 JavaBean 類的實例。
下面分別介紹 Struts 配置文件中每個元素的用法。
?
·
2
。
<struts-config>
元素
<struts-cofnig> 元素是 Struts 配置文件的根元素,和它對應的配置類為 org.apache.struts.config.ModuleConfig 類。 <struts-config> 元素有 8 個子元素。
在 Struts 配置文件中,必須按照它的 DTD 指定的先后順序來配置 <struts-config> 元素的各個子元素,如果顛倒了這些子元素在配置文件中的順序,在 Struts 應用啟動時就會生成 XML 解析錯誤。
?
·
3
。
<data-sources>
元素
<data-sources> 元素用來配置應用所需要的數據源。數據源負責建立和特定數據庫的連接,許多數據源采用連接池機制實現,以便提高數據庫訪問性能。 Java 語言提供了 javax.sql.DataSource 接口,所有的數據源必須實現該接口。許多應用服務器和 Web 容器提供了內在的數據源組件,很多數據庫廠商也提供了數據源的實現。
<data-sources> 元素包含零個,一個或多個 <data-source> 子元素。 <data-source> 元素用于配置特定的數據源,它可以包含多個 <set-property> 子元素。 <set-property> 元素用于設置數據源的各種屬性。
<data-source> 元素的 type 屬性用來指定數據源的實現類。開發者應該根據實際應用的需要來選用合適的數據源實現。
配置了數據源后,就可以在 Action 類中訪問數據源。在 org.apache.struts.action.Action 類中定義了 getDataSource(HttpRequest) 方法,它用于獲取數據源對象的引用。
也可以在配置文件中聲明多個數據源,此時需要為每一個數據源分配唯一的 key 值,通過該值來標識特定的數據源。
?
·
4
。
<form-beans>
元素
<form-beans> 元素用來配置多個 ActionForm Bean 。 <form-beans> 元素包含零個或多個 <form-bean> 子元素。每個 <form-bean> 元素又包含多個屬性。
<form-bean> 元素的屬性
屬性 |
描述 |
className |
指定和 <form-bean> 元素對應的配置類,默認值為 org.apache.struts.config.FormBeanConfig 。如果在這里設置自定義的類,該類必須擴展 FormBeanConfig 類 |
name |
指定該 ActionForm Bean 的唯一標識符,整個 Struts 框架用該標識符來引用這個 bean 。該屬性是必需的。 |
type |
指定 ActionForm 類的完整類名(類的報名也包含在內),該屬性是必需的 |
?
? 如果配置動態 ActionForm Bean ,還必須配置 <form-bean> 元素的 <form-property> 子元素。 <form-property> 元素用來指定表單字段,它有四個屬性。
<form-property> 元素的屬性
屬性 |
描述 |
className |
指定和 <form-property> 元素對應的配置類,默認值為 org.apache.struts.config.FormPropertyConfig |
initial |
以字符串的形式設置表單字段的初始值。如果沒有設置該屬性,則基本類型的表單字段的默認值為 0 ,對象類型的表單字段的默認值為 null |
name |
指定表單字段的名字。該屬性是必需的 |
type |
指定表單字段的類型。如果表單資源為 Java 類,必須給出完整的類名。該屬性是必需的。 |
?
·
5
。
<global-exceptions>
元素
<global-exceptions> 元素用于配置異常處理。 <global-exceptions> 元素可以包含零個或者多個 <exception> 元素。
<exception> 元素用來設置 Java 異常和異常處理類 org.apache.struts.action.ExceptionHandler 之間的映射。
<exception> 元素的屬性
屬性 |
描述 |
className |
指定和 <exception> 元素對應的配置類。默認值為 org.apache.struts.config.ExceptionConfig |
handler |
指定異常處理類。默認值為 org.apache.struts.action.ExceptionHandler |
key |
指定在 Resource Bundle 中描述該異常的消息 key |
path |
指定當異常發生時的轉發路徑 |
scope |
指定 ActionMessages 實例的存放范圍,可選值包括 request 和 session ,此項的默認值為 request |
type |
指定所需處理的異常類的名字。此項是必需的 |
bundle |
指定 Resource Bundle |
?
·
6
。
<global-forwards>
元素
<global-forwards> 元素用來聲明全局的轉發關系。 <global-forwards> 元素由零個或者多個 <forward> 元素組成。 <forward> 元素用于把一個邏輯名映射到特定的 URL 。通過這種方式, Action 類或者 JSP 文件無需要指定實際的 URL ,只要指定邏輯名就能實現請求轉發或者重定向,這可是減弱控制組件和視圖組件之間的耦合,并且有助于維護 JSP 文件。
<forward> 元素的屬性
屬性 |
描述 |
className |
和 <forward> 元素對應的配置類,默認值為 org.apache.struts.action.ActionForard |
contextRelative |
如果此項為 true ,表示當 path 屬性以“ / ”開頭時,給出的是相對于當前上下文的 URL 。此項的默認值為 false |
name |
轉發路徑的邏輯名。此項是必需的 |
path |
指定轉發或重定向的 URL 。此項是必需的,必需以“ / ”開頭。當 contextRelative 屬性為 false 時,表示 URL 路徑相對于當前應用 (application-relative) ;當 contextRelative 屬性為 true 時,表示 URL 路徑相對于當前上下文 (context-relative) |
redirect |
當此項為 true 時,表示執行重定向操作;當此項為 false 時,表示執行請求轉發操作。此項默認值為 false |
?
·
7
。
<action-mappings>
元素
<action-mappings> 元素包含零個或者多個 <action> 元素。 <action> 元素描述了從特定的請求路徑到相應的 Action 類的映射。
在 <action> 元素中可以包含多個 <exception> 和 <forward> 子元素,他們分別配置局部的異常處理及請求轉發僅被當前的 Action 所訪問。
在 <global-exceptions> 元素中定義的 <exception> 子元素代表全局的異常配置。在 <global-forwards> 元素中定義的 <forward> 子元素代表全局的請求轉發。在不同位置配置 <exception> 和 <forward> 元素的語法和屬性是一樣的。
<action> 元素的屬性
屬性 |
描述 |
attribute |
設置和 Action 關聯的 ActionForm Bean 在 request 或 session 范圍內的屬性 key 。例如,假定 Form Bean 存在于 request 范圍內,并且此項為“ myBean ”,那么 request.getAttribute(“MyBean”) 就可以返回該 Bean 的實例。此項為可選項。 |
className |
和 <action> 元素對應的配置元素。默認值為 org.apache.struts.action.ActionMapping |
forward |
指定轉發的 URL 路徑 |
include |
指定包含的 URL 路徑 |
input |
指定包含輸入表單的 URL 路徑。當表單驗證失敗時,將把請求轉發到該 URL |
name |
指定和該 Action 關聯的 ActionForm Bean 的名字。該名字必需在 <form-bean> 元素中定義過。此項是可選項 |
path |
指定訪問 Action 的路徑,它以“ / ”開頭,沒有擴展名 |
parameter |
指定 Action 的配置參數。在 Action 類的 execute() 方法中,可以調用 ActionMapping 對象的 getParameter() 方法來讀取該配置參數 |
roles |
指定允許調用該 Action 的安全角色。多個角色之間以逗號隔開。在處理請求時, RequestProcessor 會根據該配置項來決定用戶是否有調用 Action 的權限 |
scope |
指定 ActionForm Bean 的存在范圍,可選值為 request 和 session 。默認值為 session |
type |
指定 Action 類的完整類名 |
unknown |
如果此項為 true ,表示可以處理用戶發出的所有無效的 Action URL 。默認值為 false |
validate |
指定是否要先調用 ActionForm Bean 的 validate() 方法。默認值為 true |
?
提示: <action> 元素的 forward 、 include 和 type 屬性相互排斥,也就是說只能設置其中的一項。 forward 屬性的作用和 org.apache.struts.actions.ForwardAction 類相同。 Include 屬性的作用和 org.apache.struts.actions.IncludeAction 類相同。
? 如果在 <action> 元素中定義了局部的 <forward> 元素,它的優先級別高于全局的 <forward> 元素。
<Action> 的 forward 屬性和 <forward> 子元素是兩個不同的概念。 Forward 屬性指定和 path 屬性匹配的請求轉發路徑。
?
·
8
。
<controller>
元素
<controller> 元素用于配置 ActionServlet 。
<controller> 元素的屬性
屬性 |
描述 |
bufferSize |
指定上載文件的輸入緩沖的大小。該屬性為可選項,默認值為 4096 。 |
className |
指定和 <controller> 元素對應的配置類。默認值為 org.apache.struts.config.ControllerConfig 。 |
contentType |
指定響應結果的內容類型和字符編碼。該屬性為可選項,默認值為 text/html 。如果在 Action 和 JSP 網頁中也設置了內容類型和字符編碼,將會覆蓋該設置 |
locale |
指定是否把 Locale 對象保存到當前用戶的 Session 中。默認值為 false |
processorClass |
指定負責處理請求的 Java 類的完整類名。默認值為 org.apache.struts.action.RequestProcessor 。如果把此項設置為自定義的類,那么應該保持該類擴展了 org.apache.struts.action.RequestProcessor 類 |
tempDir |
指定處理文件上傳的臨時目錄。如果此項沒有設置,將采用 Servlet 容器為 Web 應用分配的臨時工作目錄 |
nochache |
如果為 true ,在響應結果中將加入特定的頭參數: Pragma , Cache-Control 和 Expires ,防止頁面被存儲在客戶瀏覽器的緩存中。默認值為 false |
?
如果應用包含多個子應用,可以在每個子應用的 Struts 配置文件中配置 <controller> 元素。這樣,盡管這些子應用共享同一個 ActionServlet 對象,但是它們可以使用不同的 RequestProcessor 類。
?
·
9
。
<message-resources>
元素
<message-resources> 元素用來配置 Resource Bundle , Resource Bundle 用于存放本地化消息文本。
<message-resources> 元素的屬性
屬性 |
描述 |
className |
和 <message-resources> 元素對應的配置類。默認值為 org.apache.struts.config.MessageResourcesConfig |
factory |
指定消息資源的工廠類。默認值為 org.apache.struts.util.PropertyMessageResourcesFactory 類 |
key |
指定 Resource Bundle 存放在 ServletContext 對象中時采用的屬性 key 。默認值為由 Globals.MESSAGES_KEY 定義的字符串常量。只允許有一個 Resource Bundle 采用默認的屬性 key |
null |
指定 MessageResources 類如何處理未知的消息 key 。如果此項為 true ,將返回空字符串。如果此項為 false ,將返回類似“ ???global.label.missing??? ”的字符串。該屬性為可選項,默認值為 true |
parameter |
指定 Resource Bundle 的消息資源文件名。 |
?
許多 Struts 客戶化標簽都通過 bundle 屬性來指定 Resource Bundle ,標簽的 bundle 屬性和 <message-resources> 元素的 key 屬性匹配。
?
·
10
。
<plug-in>
元素
<plug-in> 元素用于配置 Struts 插件。
<plug-in> 元素的屬性
屬性 |
描述 |
className |
指定 Struts 插件類。插件類必需實現 org.apache.struts.action.PlugIn 接口 |
?
·
11
。配置多應用模塊
Struts 1.1 支持多應用模塊,即同一個應用包含多個子應用,每個子應用可以處理相關的一組功能。
所有的子應用都共享同一個 ActionServlet 實例,但每個子應用都有單獨的配置文件。把應用劃分成多個子應用模塊包含一下步驟:
(1) ?????? 為每個子應用傳見單獨的 Struts 配置文件。
(2) ?????? 在 web.xml 的 ActionServlet 的配置代碼中添加每個子應用信息。
(3) ?????? 采用 <forward> 元素或 SwitchAction 類來實現子應用之間的切換