在src目錄下創建一個struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- struts基本配置內容 -->
<!--
package:包,struts2使用package來組織模塊。
package-name:必須,用於區別不同的package;必須是唯一的、可用的變量名;用於其它package來繼承;
package-namespace:可選,如果它沒有給出,則以/爲默認值
若namespace有一個非默認值,則要想調用這個包裏的Action,
就必選把這個屬性所定義的命名空間添加到有關的URL字符串裏
例:http:/localhost:8080/contextPath/namespace/actionName.action
package-extends:當前包繼承哪個包,即可以繼承其中的所有的配置。
通常情況下繼承struts-default
struts-default這個包在struts-default.xml文件中定義
-->
<package name="struts" namespace="" extends="struts-default">
<!--
配置一個action:一個struts2的請求就是一個action
action-name:用於在一個package裏區別不同的action;必須是唯一的、可用的變量名;
是調用action時輸入路徑的組成部分;
對應一個struts2的請求的名字(或對一個servletPath,但去除/和擴展名)不包含擴展名
action-class:action所在的路徑(包名+類名);默認值爲:com.opensymphony.xwork2.ActionSupport,可不寫
action-method:action所調用的方法名; 默認執行execute,所以execute可以不寫
result:結果
-->
<action name="product-input" class="com.opensymphony.xwork2.ActionSupport" method="execute">
<!--
result:結果。表示action方法執行後可能返回的一個結果,所以一個action結點可能會有多個result子節點,
多個result子節點使用name來區分
name:標識一個result和action方法的返回值對應,默認值爲success(可不寫)
type:表示結果的類型。默認值爲dispatcher(轉發到結果)
-->
<result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result>
</action>
<action name="product-save" class="actionbao.Product" method="save">
<result name="details">/WEB-INF/pages/details.jsp</result>
</action>
</package>
</struts>
詳解:
- namespace屬性
默認namespace=”“,所以在訪問該Action時,直接http://localhost:8080/應用名稱/login.action就可以請求到該Action。
當namespace=”/abc”時,再訪問該Action時,其URL應爲:http://localhost:8080/應用名稱/abc/login.action。
這樣在大型項目中有很多個Action時容易分類區分。
問題:如果namespace=”“,此時用http://localhost:8080/應用名稱/abc/login.action訪問該Action,會不會成功?
答案是:會。因爲當程序找不到相應的namespace時,它會自動去默認的namespace中去找Action。 - ActionSupport 是默認的 Action 類
若某個 action 節點沒有配置 class 屬性, 則 ActionSupport 即爲待執行的 Action 類. 而 execute 方法即爲要默認執行的 action 方法,Action動作處理後返回值爲success也是默認執行的路徑,還有如下值
例:<action name="testActionSupport" class="com.opensymphony.xwork2.ActionSupport" method="execute"> <result name="success">/testActionSupport.jsp</result> </action> 等同於 <action name="testActionSupport"> <result>/testActionSupport.jsp</result> </action>
- struts2請求的擴展名問題
1.默認的請求擴展名爲 action 或 爲空。
即上面兩種寫法都會被struts.xml中對應的action所處理
Struts2請求的擴展名默認設置在:
2.如果是如下方式就會報錯
解決方式:如果要修改Struts2請求的擴展名可以在struts.xml中配置,如下:
此時,struts2請求的擴展名就只能是action 或者 do 了,修改其他常量值,於此類似。 - 通配符映射
一個 Web 應用可能有成百上千個 action 聲明. 可以利用 struts 提供的通配符映射機制把多個彼此相似的映射關係簡化爲一個映射關係- 實例
如:<action name="czy_save" class="com.test.struts2Test" method="save"> <result name="save">/WEB-INF/page/save.jsp</result> </action> <action name="czy_update" class="com.test.struts2Test" method="update"> <result name="update">/WEB-INF/page/update.jsp</result> </action> <action name="czy_delete" class="com.test.struts2Test" method="delete"> <result name="delete">/WEB-INF/page/delete.jsp</result> </action> <action name="czy_get" class="com.test.struts2Test" method="get"> <result name="get">/WEB-INF/page/get.jsp</result> </action>
下面和上面配置的效果相同
<action name="czy_*" class="com.test.struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action>
- 通配符映射規則
- 若找到多個匹配, 沒有通配符的那個將勝出
<action name="czy_*" class="com.test.struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action> <!-- 如果請求 /czy_get.action 將會執行沒有通配符的 name="czy_get" 的action --> <action name="czy_get" class="com.test.struts2Test" method="get"> <result name="get">/WEB-INF/page/get.jsp</result> </action>
- 若指定的動作不存在, Struts 將會嘗試把這個 URI 與任何一個包含着通配符 * 的動作名及進行匹配
可見,uri匹配時是先精確匹配的,精確匹配不上時,再來對包含有通配符*的action進行匹配。 - 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 來引用. {1} 匹配第一個子串, {2} 匹配第二個子串....
<!-- 當請求是 /czy_save_show.action 時,就會調用struts2Ttest.java 中的save方法,當返回值爲"save"時,會轉發到 /WEB-INF/page/show.jsp--> <action name="czy_*_*" class="com.test.struts2Ttest" method="{1}"> <result name="{1}">/WEB-INF/page/{2}.jsp</result> </action>
- {0} 匹配整個 URI
<!-- 若請求是 /czy_save 時,將會調用 Struts2Test.java 的czy_save方法 --> <action name="czy_*" class="com.test.Struts2Test" method="{0}"> <result name="ok">/WEB-INF/page/Show.jsp</result> </action>
- 若 Struts 找到的帶有通配符的匹配不止一個, 則按先後順序進行匹配
<!-- 若請求是 /czy_save_show 將會調用 name="czy_*" 的action --> <action name="czy_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action> <action name="czy_*_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{2}.jsp</result> </action>
<!-- 若請求是 /czy_save_show 將會調用 name="czy_*_*" 的action --> <action name="czy_*_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{2}.jsp</result> </action> <action name="czy_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action>
- 可以匹配零個或多個字符, 但不包括 / 字符. 如果想把 / 字符包括在內, 需要使用 **. 如果需要對某個字符進行轉義, 需要使用\.**
- 若找到多個匹配, 沒有通配符的那個將勝出
- 實例
- result
- result 是 action 節點的子節點
- result 代表 action 方法執行後, 可能去的一個目的地
- 一個 action 節點可以配置多個 result 子節點.
- result 的 name 屬性值對應着 action 方法可能有的一個返回值.
- result 一共有 2 個屬性, 還有一個是 type: 表示結果的響應類型
- type常用的有值有:
- dispatcher(默認的): 轉發. 同 Servlet 中的轉發
注意:注意: 不能通過 type=dispatcher 的方式轉發到一個 Action<!-- 會報 404 異常 --> <result name="test">/user/testAction.do</result>
- redirect: 重定向
<result name="index" type="redirect">/atguigu/testAction.action</result>
注意:通過 redirect 的響應類型也可以便捷的實現 redirectAction 的功能!
- redirectAction: 重定向到一個 Action
<!-- 結果返回"index"之後,將會重定向到 package中 namespace="/user" 且其中的 action的 name="testAction" --> <result name="index" type="redirectAction"> <param name="namespace">/user</param> <param name="actionName">testAction</param> </result>
- chain: 轉發到一個 Action
<result name="test" type="chain"> <param name="namespace">/user</param> <param name="actionName">testAction</param> </result>
- dispatcher(默認的): 轉發. 同 Servlet 中的轉發
- type常用的有值有:
- result 的 type 屬性值在 struts-default 包的 result-types 節點的 name 屬性中定義.