struts.xml的經常使用配置 javascript
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 全部匹配*.action的請求都由struts2處理 --> <constant name="struts.action.extension" value="action" /> <!-- 是否啓用開發模式 --> <constant name="struts.devMode" value="true" /> <!-- struts配置文件改動後,是否從新加載 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 設置瀏覽器是否緩存靜態內容 --> <constant name="struts.serve.static.browserCache" value="false" /> <!-- 請求參數的編碼方式 --> <constant name="struts.i18n.encoding" value="utf-8" /> <!-- 每次HTTP請求系統都從新加載資源文件,有助於開發 --> <constant name="struts.i18n.reload" value="true" /> <!-- 文件上傳最大值 --> <constant name="struts.multipart.maxSize" value="104857600" /> <!-- 讓struts2支持動態方法調用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- Action名稱中是否仍是用斜線 --> <constant name="struts.enable.SlashesInActionNames" value="false" /> <!-- 容許標籤中使用表達式語法 --> <constant name="struts.tag.altSyntax" value="true" /> <!-- 對於WebLogic,Orion,OC4J此屬性應該設置成true --> <constant name="struts.dispatcher.parametersWorkaround" value="false" /> <package name="basePackage" extends="struts-default"> </package> </struts>
<?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> <!-- include節點是struts2中組件化的方式 能夠將每一個功能模塊獨立到一個xml配置文件中 而後用include節點引用 --> <include file="struts-default.xml"></include> <!-- package提供了將多個Action組織爲一個模塊的方式 package的名字必須是惟一的 package能夠擴展 當一個package擴展自 另外一個package時該package會在自己配置的基礎上加入擴展的package 的配置 父package必須在子package前配置 name:package名稱 extends:繼承的父package名稱 abstract:設置package的屬性爲抽象的 抽象的package不能定義action 值true:false namespace:定義package命名空間 該命名空間影響到url的地址,例如此命名空間爲/test那麼訪問是的地址爲http://localhost:8080/struts2/test/XX.action --> <package name="com.kay.struts2" extends="struts-default" namespace="/test"> <interceptors> <!-- 定義攔截器 name:攔截器名稱 class:攔截器類路徑 --> <interceptor name="timer" class="com.kay.timer"></interceptor> <interceptor name="logger" class="com.kay.logger"></interceptor> <!-- 定義攔截器棧 --> <interceptor-stack name="mystack"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="logger"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 定義默認的攔截器 每一個Action都會自動引用 若是Action中引用了其它的攔截器 默認的攔截器將無效 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 全局results配置 --> <global-results> <result name="input">/error.jsp</result> </global-results> <!-- Action配置 一個Action能夠被屢次映射(只要action配置中的name不一樣) name:action名稱 class: 對應的類的路徑 method: 調用Action中的方法名 --> <action name="hello" class="com.kay.struts2.Action.LoginAction"> <!-- 引用攔截器 name:攔截器名稱或攔截器棧名稱 --> <interceptor-ref name="timer"></interceptor-ref> <!-- 節點配置 name : result名稱 和Action中返回的值相同 type : result類型 不寫則選用superpackage的type struts-default.xml中的默認爲dispatcher --> <result name="success" type="dispatcher">/talk.jsp</result> <!-- 參數設置 name:對應Action中的get/set方法 --> <param name="url">http://www.sina.com</param> </action> </package> </struts>
一個Action內包含多個請求處理方法的處理java
Struts1提供了DispatchAction,從而容許一個Action內包含多個請求處理方法。Struts2也提供了相似的功能。ios
處理方式主要有如下三種方式:apache
1. 1 動態方法調用:瀏覽器
<!-- 動態方法調用HTML標籤與Struts2標籤 --> <form action="computeAction!add.action" name="from" > <s:form action="computeAction!add.action" name="form" theme="simple" >
則用戶的請求將提交到名爲」computeAction」的Action實例,Action實例將調用名爲」add」方法來處理請求。
當指定調用某一方法來處理請求時,就不會走默認執行處理請求的execute()方法。緩存
注意:要使用動態方法調用,必須設置Struts2容許動態方法調用,經過設置struts.enable.DynamicMethodInvocation常量來完成,該常量屬性的默認值是true。安全
<struts> <!-- //禁用動態方法調用,默認爲true啓用,false禁用 constant:name="struts.enable.DynamicMethodInvocation" --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> </struts>
示列:簡單的一個加法和減法例子。app
1. index.jsp用戶在頁面輸入兩個數字,選擇相加,或者相減
當用戶點擊加或減須要走同一個Action但處理請求方法不一樣,這裏使用了js動態選擇。jsp
<body> <!-- 動態方法調用 使用:Struts2標籤也可使用HTML標籤 --> <s: name="form" theme="simple" > num1:<s:textfield name="num1" /> num2:<s:textfield name="num2" /> <s:submit type="button" value="加" onclick="computeMethod('add')" /> <s:submit type="button" value="減" onclick="computeMethod('subtract')" /> </s:form> <!-- js --> <script type="text/javascript"> function computeMethod(op){ document.form.action="computeAction!"+op;//動態選擇處理請求的方法 document.form.submit();//提交 } </script> </body>
2. struts.xml配置信息,啓用動態方法調用(可選)組件化
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <!-- //禁用動態方法調用,默認爲true啓用,false禁用 constant:name="struts.enable.DynamicMethodInvocation" --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="struts2" extends="struts-default"> <action name="computeAction" class="com.struts.ComputeAction" > <result name="fruitPage" >/fruit.jsp</result> </action> </package> </struts>
3. ComputeAction控制器的類處理請求
package com.struts; /** * Struts2控制器的類 * @author asus * */ public class ComputeAction { /** 屬性 */ private int num1; private int num2; private int fruit;//結果 /** 若請求爲指定操做方法默認執行execute()方法 */ public String execute(){ System.out.println("當調用其它方法就不會走這個方法!"); return ""; } /** 執行處理加法 */ public String add(){ this.fruit=num1+num2;//加 return "fruitPage"; } /** 執行處理減法 */ public String subtract(){ this.fruit=num1-num2;//減 return "fruitPage"; } /** JavaBean */ public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } public int getFruit() { return fruit; } public void setFruit(int fruit) { this.fruit = fruit; } }
4. fruit.jsp響應結果的頁面
<body> <!-- 結果頁面 --> 計算結果:<s:property value="fruit" /> </body>
1.2Action配置method屬性(示列與以上代碼大多一致,只修改有變動的):
將Action類中的每個處理方法都定義成一個邏輯Action方法。
1. index.jsp頁面
<body> <!-- Action配置method屬性 使用:Struts2標籤也可使用HTML標籤 --> <s:form name="form" theme="simple" > num1:<s:textfield name="num1" /> num2:<s:textfield name="num2" /> <s:submit type="button" value="加" onclick="computeMethod('addAction')" /> <s:submit type="button" value="減" onclick="computeMethod('subtractAction')" /> </s:form> <!-- js --> <script type="text/javascript"> function computeMethod(op){ document.form.action=op;//動態選擇處理請求的方法 document.form.submit();//提交 } </script> </body>
2. struts.xml配置信息
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="struts2" extends="struts-default"> <action name="addAction" class="com.struts.ComputeAction" method="add" > <result name="fruitPage" >/fruit.jsp</result> </action> <action name="subtractAction" class="com.struts.ComputeAction" method="subtract" > <result name="fruitPage" >/fruit.jsp</result> </action> </package> </struts>
經過action元素的method屬性來指定Action執行時調用的方法。
優勢:使得以更加安全的方式來實現動態方法的調用,不讓別人看到你的實現方法。
缺點:繁瑣,一個處理請求的方法要跟一個action。
Struts2根據method屬性查找方法有兩種途徑:
使用動態方法調用和method屬性的區別:
1.經過以上三個struts.xml中的配置信息例子來講,他們的共同點是都在操做同一個Action。
2.<form action="">中請求地址不一樣。
3.動態方法的返回值相同,則會經過result進入一個頁面。而method屬性就算兩個方法的返回值相同但進去不一樣的result,可能會進入兩個不一樣的頁面。
由上能夠分析出:
(1)若是使用同一個Action,不一樣的處理請求的方法,響應使用相同的配置(result等)則使用動態方法調用。
(2)若是使用同一個Action,不一樣的處理請求的方法,響應分別使用不一樣的配置,則使用action元素的method屬性,爲同一個Action配置多個名稱。
1.3使用通配符映射(wildcard mappings)方式(示列與以上代碼大多一致,只修改有變動的):
1. index.jsp頁面只改動了js部分。
<body> <!-- 使用通配符映射(wildcard mappings)方式 使用:Struts2標籤也可使用HTML標籤 --> <s:form name="form" theme="simple" > num1:<s:textfield name="num1" /> num2:<s:textfield name="num2" /> <s:submit type="button" value="加" onclick="computeMethod('addAction')" /> <s:submit type="button" value="減" onclick="computeMethod('subtractAction')" /> </s:form> <!-- js --> <script type="text/javascript"> function computeMethod(op){ document.form.action=op;//相比mothod屬性改動只有這裏 document.form.submit();//提交 } </script> </body>
2.struts.xml的配置信息
在使用method屬性來實現同一個Action的不一樣方法處理不一樣的請求時,會發現,隨着方法的增多,從而致使大量的Action配置,這時咱們就須要經過使用通配符來解決Action配置過多的方法。
在配置<action.../>元素時,須要指定name、class、method屬性。其中name屬性可支持通配符,而後能夠在class、method屬性中使用表達式。通配符用星號 * 表示。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="struts2" extends="struts-default"> <action name="*Action" class="com.struts.ComputeAction" method="{1}" > <result name="fruitPage" >/fruit.jsp</result> <!-- <result name="fruitPage" >/{1}.jsp</result>表達式也能夠寫在這裏 --> </action> </package> </struts>
實際上這一點從原理上來說能夠理解,default-action-ref這個配置的意思是當用戶在點擊了沒有定義的action時,若是struts沒有找到用戶定義的action名稱,則會自動跳轉到該默認定義的action中。
我的以爲地址欄中項目後不寫名稱和名稱不存在是兩個概念。
示列:
1. struts.xml 就在通配符例子中配置上默認Action
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="struts2" extends="struts-default"> <!-- 配置默認Action --> <default-action-ref name="defaultAction"></default-action-ref> <action name="defaultAction"> <result>/error.jsp</result> </action> <!-- 通配符映射(wildcard mappings) --> <action name="*Action" class="com.struts.ComputeAction" method="{1}" > <result name="fruitPage" >/fruit.jsp</result> <!-- <result name="fruitPage" >/{1}.jsp</result>表達式也能夠寫在這裏 --> </action> </package> </struts>
2. index.jsp頁面 這裏咱們把提交的url :Action地址連接,寫錯打斷,當提交時找不到對應的Action,則會進入默認Action,進入error.jsp頁面
<body> <!-- 使用通配符映射(wildcard mappings)方式 使用:Struts2標籤也可使用HTML標籤 --> <s:form name="form" theme="simple" > num1:<s:textfield name="num1" /> num2:<s:textfield name="num2" /> <!-- 測試默認Action,當提交的Action地址錯誤。則會走默認Action --> <s:submit type="button" value="加" onclick="computeMethod('ssss')" /><!-- 把動態url地址亂寫 --> <s:submit type="button" value="減" onclick="computeMethod('subtractActios')" /><!-- 或在url地址中多加字符 --> </s:form> <!-- js --> <script type="text/javascript"> function computeMethod(op){ document.form.action=op;//改動只有這裏 document.form.submit();//提交 } </script> </body>
3. error.jsp 建立此頁面查看效果
<body> 錯誤頁面。! 未找到,Action實例時會默認走此頁面! </body>
3.處理結果
Struts2的Action處理完用戶請求後,將返回一個普通字符串,整個普通字符串就是一個邏輯視圖名。Struts2經過配置邏輯視圖名和物理視圖資源之間的映射關係,一旦系統收到Action返回的某個邏輯視圖名,系統就會把對應的物理視圖資源呈現給瀏覽者。
<!-- 全局結果可知足一個包中多個Action共享一個結果,也就是說,當多個Action中都有一個重複的result時就可使用全局結果,也就是說公共的result --> <global-results> <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> </global-results>
名字 | 說明 |
chain | 用來處理Action鏈 |
dispatcher | 用來轉向頁面,一般處理JSP,這是默認的結果類型 |
freeMarker | 處理FreeMarker模板 |
httpHeader | 用來控制特殊的Http行爲 |
redirect | 重定向到一個URL |
redirect-action | 重定向到一個Action |
stream | 向瀏覽器發送InputSream對象,一般用來處理文件下載 |
velocity | 處理Velocity模板 |
xslt | 處理XML/XLST模板 |
plaintext | 顯示原始文件內容,例如文件源代碼 |
tiles | 結合Tile使用 |
另外第三方的Result類型還包括JasperReports Plugin,專門用來處理JasperReport類型的報表輸出;Jfreechart Plugin;JSF Plugin。
經常使用示列:
1.struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="struts2" extends="struts-default"> <!-- 默認Action --> <default-action-ref name="defaultAction"></default-action-ref> <!-- 全局結果可知足一個包中多個Action共享一個結果,也就是說,當多個Action中都有一個重複的result時就可使用全局結果,也就是說公共的result <global-results> <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> </global-results> --> <action name="defaultAction"> <result>/error.jsp</result> </action> <!-- 通配符映射(wildcard mappings) --> <action name="*Action" class="com.struts.ComputeAction" method="{1}" > <!--1 表達式{1}也能夠寫在url鏈接中,class,name中均可以寫,也能夠寫多少,索引從1開始 <result name="fruitPage" >/{1}.jsp</result> --> <!--2 默認dispatcher轉發跳轉 <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> --> <!--3 重定向跳轉 <result name="fruitPage" type="redirect" >/fruit.jsp</result> --> <!--4 redirectAction: Action實例 與另外一個Action實例互相跳轉 <result name="fruitPage" type="redirectAction" >skipAction</result> --> <!--4.1 使用感嘆號指定跳轉方法,xml會顯示報錯,但能夠用。 使用?&不能在Action實例中帶參數 <result name="fruitPage" type="redirectAction" >skipAction!add</result> --> <!--4.2 跳轉Action帶參數的方式: actionName:跳轉Action的名稱 method:跳轉Action實例中的哪一個方法 num:帶的參數,可寫固定,可以使用${屬性名}取上一個Action實例中的屬性,實現動態傳值。 --> <result name="fruitPage" type="redirectAction" > <param name="actionName">skipAction</param> <param name="method">add</param> <param name="num1">${num1}</param> <param name="num2">${num2}</param> </result> </action> <action name="skipAction" class="com.struts.SkipAction" > <result name="success" type="dispatcher" >/fruit.jsp</result> </action> </package> </struts>
2.再建立一個SkipAction 控制器的類
package com.struts; /** * 測試與dispatcherAction之間的傳值 * @author asus * */ public class SkipAction { /** 接收computeAction實例傳過來屬性 */ private int num1; private int num2; private int result;//結果返回給頁面 public String execute(){ System.out.println("當指定要走的方法時不會走此方法"); return "success"; } /**添加的方法 */ public String add(){ result=num1+num2; System.out.println("走add方法!"); return "success"; } /** Get,Set方法 */ public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } public int getResult() { return result; } public void setResult(int result) { this.result = result; } }