struts.xml的常用配置
<?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內包含多個請求處理方法的處理Struts1提供了DispatchAction,從而允許一個Action內包含多個請求處理方法。
Struts2也提供了類似的功能。處理方式主要有以下三種方式:
- 1 動態方法調用:
DMI:Dynamic Method Invocation 動態方法調用。 動態方法調用是指:表單元素的action不直接等于某個Action的名字,而是以感嘆號后加方法名來指定對應的動作名:
<!-- 動態方法調用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>
示列:簡單的一個加法和減法例子。
1. index.jsp用戶在頁面輸入兩個數字,選擇相加,或者相減當用戶點擊加或減需要走同一個Action但處理請求方法不同,這里使用了js動態選擇。
<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控制器的類處理請求
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";
}
/
}