struts2:struts.xml配置文件详解
1. 幾個重要的元素
1.1 package元素
package元素用來配置包。在Struts2框架中,包是一個獨立的單位,通過name屬性來唯一標識包。還可以通過extends屬性讓一個包繼承另一個包,extends屬性值就是被繼承包的name屬性值,繼承包可以從被繼承包那里繼承到攔截器、Action等。
在Struts2框架中是通過包來管理action、result、interceptor、interceptor-stack等配置信息的。包屬性如下:
| 屬性 | 說明 |
| name | 包名,作為其它包應用本包的標記 |
| extends | 可選屬性,設置本包繼承其它包 |
| namespace | 可選屬性,設置包的命名空間 |
| abstact | 可選屬性,設置為抽象包 |
-extends
- 當一個包通過配置extends屬性繼承了另一個包的時候,該包將會繼承父包中所有的配置,包括action、result、interceptor等。
- 由于包信息的獲取是按照配置文件的先后順序進行的,所以父包必須在子包之前被定義。
- 通常我們配置struts.xml的時候,都繼承一個名為“struts-default.xml”的包,這是struts2中內置的包。
-namespace
- 該屬性可以指定包對應的命名空間。由于在一個Web應用中可能出現同名的Action并存的情況,為了避免命名沖突,只要使同名Action位于不同的namespace下就可以了。
- Struts2中如果沒有為某個包指定命名空間,該包使用默認的命名空間,默認的命名空間總是""。
- 當設置了命名空間為“/”,即指定了包的命名空間為根命名空間時,此時所有根路徑下的Action請求都會去這個包中查找對應的資源信息。
- 根命名空間和普通命名空間中的Action的查找是一樣的,即如果有請求“/stu_info.action“(或者是”/C/stu_info.action“),則先查找根命名空間下的Action(或者是/C命名空間下的Action),如果不存在對應的Action,則查找默認命名空間里的Action。此規則對于多級別的命名空間也是如此,即如果請求查找/A/A_Login/login.action時,Struts2框架先到/A/A_Login的命名空間里查找名為login的action,如果找不到,則到默認的命名空間里查詢,而不會到它的上一級“/A“里面查找。
示范:
<package name="caiwu" extends="struts-default" namespace="/caiwu"></package>1.2 action元素
Struts2框架通過Action對象來處理HTTP請求,該請求的URL地址對應的Action即配置在action元素中。
action元素屬性
| 屬性名稱 | 功能描述 |
| name | 請求的Action名稱 |
| class | 可選屬性,Action處理類對應具體路徑 |
| method | 可選屬性,指定Action中的方法名 |
| converter | 可選屬性,指定Action使用的類型轉換器 |
- 如果沒有指定method則默認執行Action類中的execute方法;否則調用method屬性中指定的方法。
- 如果沒有指定class則默認值為:com.opensymphony.xwork2.ActionSupport,該默認類使用默認的處理方法(啥也沒做),直接返回success值。
示范:
<action name="list" class="com.clzhang.struts2.demo3.ListAction"></action><action name="listSalarySum" class="com.clzhang.struts2.demo3.ListAction" method="listSalarySum"></action>1.3 result元素
當調用Action方法處理結束返回后,下一步就是使用result元素來設置返回給瀏覽器的視圖。配置result元素時常需要指定name和type兩個屬性。
result屬性
| 屬性名稱 | 功能描述 |
| name | 對應Action返回邏輯視圖名稱,默認為success |
| type | 返回結果類型,默認為dispatcher |
- name屬性對應于Action方法返回的值,success為其默認值。
- type屬性指定結果類型,默認的類型是dispatcher。
Struts2支持的結果類型
| 結果類型 | 說明 |
| dispatcher | 將請求轉發(forward)到指定的JSP頁面 |
| redirect | 將請求重定向到指定的視圖資源 |
| chain | 處理Action鏈 |
| freemarker | 指定Freemarker模板作為視圖 |
| httpheader | 控制特殊的HTTP行為 |
| redirect-action | 直接跳轉到其它Action |
| stream | 向游覽器返回一個InputStream(一般用于文件下載)???????????????????? |
| velocity | 指定使用velocity模板作為視圖 |
| xslt | 用于XM/XSLT整合 |
| plainText???????????????????????????????? | 顯示某個頁面的原始代碼 |
示范:
<action name="login" class="com.clzhang.struts2.demo1.LoginAction"><result name="input">/struts2/demo1/login.jsp</result><result name="error">/struts2/demo1/wrong.jsp</result><result name="list" type="redirectAction"><param name="idInList">${id}</param><param name="actionName">listBook</param></result></action>需要注意dispatcher和redirect的區別,也就是轉發和重定向的區別,重定向會丟失所有的請求參數,而且會丟失Action處理結果。
1.4 include元素
在Struts2中提供了一個默認的struts.xml文件,但如果package、action、interceptors等配置比較多時,都放到一個struts.xml文件不太容易維護。因此,就需要將struts.xml文件分成多個配置文件,然后在struts.xml文件中使用<include>標簽引用這些配置文件。
示范:
<include file="caiwu.xml"></include><include file="cangku.xml"></include>1.5 global-results元素
有很多時候一個<result>初很多<action>使用,這時可以使用<global-results>標簽來定義全局的<result>。
示范:
<global-results><result name="user">/struts2/demo3/user.jsp</result><result name="sum">/struts2/demo3/sum.jsp</result><result name="default">/struts2/demo3/default.jsp</result></global-results>1.6 default-action-ref元素
如果在請求一個沒有定義過的Action資源時,系統就會拋出404錯誤。這種錯誤不可避免,但這樣的頁面并不友好。我們可以使用<default-action-ref>來指定一個默認的Action,如果系統沒有找到指定的Action,就會指定來調用這個默認的Action。
示范:
<default-action-ref name="acctionError"></default-action-ref><action name="acctionError"><result>/jsp/actionError.jsp</result></action>2. Action的動態調用(DMI)
Struts2提供了包含多個處理邏輯的Action處理方式,即DMI(Dynamic Method Invocation,動態方法調用)。它是通過請求對象中的一個具體的方法來實現動態的操作。具體說,在請求Action的URL地址后加上請求方法字符串,與Action對象中的方法進行匹配。其中,Action對象名稱和方法之間用“!“隔開。
更多內容參考:struts2:多業務方法的處理(動態調用,DMI)
示范:
<A href="list!listUser.action" target="_blank">3.2 通過URL嘆號參數</A>3. 通配符
在實際的項目開發中,會出現多個Action定義的絕大部分都是相同的情況,這時就會產生大量冗余。對于這種情況,Struts2也給出了相應的解決方法,即使用通配符。
| 通配符 | 說明 |
| * | 匹配0個或多個字符除了“/” |
| ** | 匹配0個或多個字符包含“/” |
| \character???????????????????????????????????????? ? | 轉義字符,“\\”匹配“\”;“\*”匹配“*”????????????????????????????????????????????????????????? |
通配符“*“通常用在<action>標簽的name屬性中,而在class、name屬性及result元素中使用{n}的形式來代表前面第n個*所匹配的字符串,{0}來代表URL請求的整個Action字符串。
示范一:
<!-- 使用*通配符,第一個*表示調用方法,第二個*表示Action --> <action name="*_*" class="com.clzhang.struts2.action.{2}Action"method="{1}"><result name="success">/{0}Suc.jsp</result> </action>在上面代碼中,當URL請求是/update_Login.action時,會調用LoginAction類中的update()方法,處理結束返回到update_LoginSuc.jsp。
示范二:
<!-- 不管調用哪個Action,默認返回名為Action名的JSP --> <action name="*_*"><result>/{0}.jsp</result> </action>上面代碼中沒有指定class屬性,也沒指定result元素的name,這樣不管訪問哪個Action都會返回與該Action名字相同的JSP頁面。?
4.?常量配置
在之前提到struts.properties配置文件的介紹中,我們曾經提到所有在struts.properties文件中定義的屬性,都可以配置在struts.xml文件中。而在struts.xml中,是通過<constant>標簽來進行配置的。
示范:
<constant name="struts.action.extension" value="action"></constant><constant name="struts.ognl.allowStaticMethodAccess" value="true" /><constant name="struts.ui.theme" value="simple"></constant><constant name="struts.custom.i18n.resources" value="message"></constant><constant name="struts.i18n.encoding" value="UTF-8"></constant>?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的struts2:struts.xml配置文件详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电商:流量不再重要,渠道终将为王
- 下一篇: oschina android版源码中的