- Java EE程序設計與開發實踐教程
- 馮志林編著
- 2025字
- 2021-10-27 17:05:36
6.3.3 struts.xml配置文件
struts.xml文件是Struts2框架的核心配置文件,主要負責管理Web應用中的action映射,以及該action包含的result定義和攔截器的配置、bean的配置、package的配置等。Struts2框架允許使用<include>在struts.xml中包含其他配置文件。代碼如下:

1.package元素
通過包(package)的配置,可以實現對某包中的所有action統一管理,如權限的限制等。package元素的主要屬性如下。
● name:該屬性必須指定,表示包的名稱,由于struts.xml中可以定義不同的<package>,而且它們之間還可以互相引用,所以必須指定名稱。
● extends:該屬性是可選的,表示當前定義的包繼承其他的包。如果繼承了其他包,就可以繼承其他包中的action、攔截器等。
由于包信息的獲取是按照配置文件中的先后順序進行的,所以父包必須在子包之前被定義。
通常應用程序會繼承一個名為“struts-default”的內置包,它配置了Struts2所有的內置結果類型,該文件包含在struts2-core-2.1.8.jar中。struts-default這個單詞不能拼寫錯誤,否則運行時將會報錯。
● namespace:該屬性是可選的,用來指定一個命名空間,定義命名空間非常簡單,只要指定namespace="/*"即可,其中"*"是我們自定義的。如果直接指定"/",表示設置命名空間為根命名空間。如果不指定任何namespace,則使用默認的命名空間,默認的命名空間為""。
當指定了命名空間后,相應的請求也要改變,例如:

表單form的action請求就不能是“login”,而必須改為“user/login”。當Struts2接收到請求后,會將請求信息解析為namespace名和action名兩部分,然后根據namespace名在struts.xml中查找指定命名空間的包,并且在該包中尋找與action名相同的配置,如果沒有找到,就到默認的命名空間中尋找與action名稱相同的配置,如果依然沒找到,就給出錯誤信息。
表單<form action="user/login">中的action="user/login"是不能有斜杠/的,<action namespace="/user">中的namespace="/user"是要有斜杠/的。
● abstract:該屬性是可選的,如果定義該包是一個抽象包,則該包不能包含<action>配置信息,但可以被繼承。
在Struts 2核心包struts2-core-2.1.8.jar中可找到struts-default.xml文件。
struts-default.xml中定義的struts-default就是abstract抽象的,代碼如下:

struts-default中定義許多常用的結果類型result-type,如dispatcher、chain、redirect等。
由于自定義package的extends屬性基本都設置為struts-default,因此不能拼寫錯誤,否則就無法繼承struts-default,也就不能正確地解析struts-default中已定義好的result-type。
2.action元素
在struts.xml文件中,通過<action>元素對Action進行配置。Action是業務邏輯控制器,負責接收客戶端請求,處理客戶端請求,并把處理結果返回給客戶端。
action元素的主要屬性如下。
● name:該屬性是必選屬性,用于指定客戶端發送請求的地址映射名稱。用戶可以通過這個name的值發送請求,然后交給對應的class類來處理。
● class:該屬性是可選屬性,用于指定Action實現類的完整類名。具體處理請求的類,是一個包含包名+類名的action類。
客戶端每次請求action時,Struts2框架都會創建新的action對象,因此action對象是一個多實例對象。如果需要客戶端每次請求的action對象是同一個對象,即action對象強制成為單例對象,則必須將action對象的class屬性值設為Spring中指定的bean對象名。
● method:該屬性是可選屬性,用于指定調用action中的方法名,如果不指定method屬性,則默認提交給exceute()方法處理請求。通常,需要為每個action指定一個方法,并通過method元素來進行配置,這樣就可以調用Action類中的該方法。
3.result元素
result元素的作用是調度視圖以決定采用哪種形式呈現給客戶端,也就是用來設定Action處理結束后,系統下一步將要做什么。
result元素的主要屬性如下。
● name:用于指定action的返回名稱。
● type:用于指定返回的視圖技術,如jsp、freemaker等。
result的常用type類型共有4種。
(1)dispatcher:轉發
默認的結果類型,即內部請求轉發,類似于forward。Struts2在后臺使用RequestDispatcher()轉發請求。
(2)chain:鏈式
用于把幾個相關的action連接起來,共同完成一個功能。注意:只能轉發到一個action,而不能是頁面。例如:

(3)redirect:用來重定向到其他頁面
在后臺使用的sendRedirect()將請求重定向至指定的URL。如果要傳值的話,可以采用GET方式傳參,例如:

${account}是一個EL表達式。
(4)redirectAction:用來重定向到其他Action
主要用于重定向到Action。即請求處理完成后,如果需要重定向到一個Action,那么使用redirectAction類型。redirecAction有兩個參數:actionName(指定需要重定向的Action)和namespace(指定Action所在的命名空間,如果沒有指定該參數,框架會從默認的namespace中去尋找)。
例如,package包含了3個Action。action1為login,action2為work,action3為rest,代碼如下:

第6章任務4

在login這個action1中,當客戶端執行login.action時,將執行org.action.UserAction類的login方法,并且可以有4個返回result處理:
1)result1:success返回,重定向到work這個action2。
2)result2:success返回,重定向到/user包下的rest這個action3。
3)result3:error返回,重定向到error.jsp。
4)result4:input返回,即輸入框中輸入非法類型,強制跳轉到login.jsp。
在work這個action2中,當客戶端執行work.action時,將執行org.action.UserAction類的work方法。
在rest這個action3中,當客戶端執行rest.action時,將執行org.action.UserAction類的rest方法,但是該Action有namespace屬性,因此必須在result2中設置<param name="namespace">/user</param>。
最后分析result元素的4種type類型的不同點。
chain是鏈式的,是從一個Action跳轉到另外一個Action,但是chain的下一個Action可以獲得前一個Action的請求參數的值。redirectAction是請求一個新的Action,不會獲取上一個Action的參數值。
redirectAction和redirect兩者請求路徑不同,redirect帶后綴,redirectAction不帶后綴。
例如:

4.bean元素
在struts.xml中配置bean元素,把核心組件的一個實例注入給框架。常用屬性包括如下幾個。
● class:必需的,用來指定此配置的bean對應的實現類。
● name:可選的,用來指定bean實例的名字。
● type:可選的,用來指定bean實例實現的Struts2的規范,若配置的bean作為框架的一個核心組件來使用,則應該指定該屬性的值。
例如,struts-default.xml中定義如下一些bean,代碼如下:

- 程序設計與實踐(VB.NET)
- Computer Vision for the Web
- Delphi程序設計基礎:教程、實驗、習題
- Dynamics 365 Application Development
- JSP開發案例教程
- INSTANT Adobe Edge Inspect Starter
- AutoCAD 2009實訓指導
- QPanda量子計算編程
- Apache Solr PHP Integration
- WebStorm Essentials
- Spring Boot從入門到實戰
- Visual FoxPro程序設計習題及實驗指導
- Eclipse開發(學習筆記)
- Python網絡爬蟲從入門到實踐
- Java語言GUI程序設計