struts.xml的常用配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts./dtds/struts-2.3.dtd"> <struts> <!-- 所有匹配*.action的請求都由struts2處理 --> <constant name="struts.action.extension" value="action" /> <!-- 是否啟用開發(fā)模式 --> <constant name="struts.devMode" value="true" /> <!-- struts配置文件改動后,是否重新加載 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 設置瀏覽器是否緩存靜態(tài)內(nèi)容 --> <constant name="struts.serve.static.browserCache" value="false" /> <!-- 請求參數(shù)的編碼方式 --> <constant name="struts.i18n.encoding" value="utf-8" /> <!-- 每次HTTP請求系統(tǒng)都重新加載資源文件,有助于開發(fā) --> <constant name="struts.i18n.reload" value="true" /> <!-- 文件上傳最大值 --> <constant name="struts.multipart.maxSize" value="104857600" /> <!-- 讓struts2支持動態(tài)方法調用 --> <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./dtds/struts-2.0.dtd" > <struts> <!-- include節(jié)點是struts2中組件化的方式 可以將每個功能模塊獨立到一個xml配置文件中 然后用include節(jié)點引用 --> <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> <!-- 節(jié)點配置 name : result名稱 和Action中返回的值相同 type : result類型 不寫則選用superpackage的type struts-default.xml中的默認為dispatcher --> <result name="success" type="dispatcher">/talk.jsp</result> <!-- 參數(shù)設置 name:對應Action中的get/set方法 --> <param name="url">http://www.sina.com</param> </action> </package> </struts>
一個Action內(nèi)包含多個請求處理方法的處理 Struts1提供了DispatchAction,從而允許一個Action內(nèi)包含多個請求處理方法。Struts2也提供了類似的功能。 處理方式主要有以下三種方式:
1. 1 動態(tài)方法調用: DMI:Dynamic Method Invocation 動態(tài)方法調用。
動態(tài)方法調用是指:表單元素的action不直接等于某個Action的名字,而是以感嘆號后加方法名來指定對應的動作名:
<!-- 動態(tài)方法調用HTML標簽與Struts2標簽 --> <form action="computeAction!add.action" name="from" > <s:form action="computeAction!add.action" name="form" theme="simple" > 則用戶的請求將提交到名為”computeAction”的Action實例,Action實例將調用名為”add”方法來處理請求。 注意:要使用動態(tài)方法調用,必須設置Struts2允許動態(tài)方法調用,通過設置struts.enable.DynamicMethodInvocation常量來完成,該常量屬性的默認值是true。 <struts> <!-- //禁用動態(tài)方法調用,默認為true啟用,false禁用 constant:name="struts.enable.DynamicMethodInvocation" --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> </struts>
示列:簡單的一個加法和減法例子。 1. index.jsp用戶在頁面輸入兩個數(shù)字,選擇相加,或者相減 <body> <!-- 動態(tài)方法調用 使用: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;//動態(tài)選擇處理請求的方法 document.form.submit();//提交 } </script> </body>
2. struts.xml配置信息,啟用動態(tài)方法調用(可選) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <!-- //禁用動態(tài)方法調用,默認為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;//結果 /** 若請求為指定操作方法默認執(zhí)行execute()方法 */ public String execute(){ System.out.println("當調用其它方法就不會走這個方法!"); return ""; } /** 執(zhí)行處理加法 */ public String add(){ this.fruit=num1+num2;//加 return "fruitPage"; } /** 執(zhí)行處理減法 */ 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;//動態(tài)選擇處理請求的方法 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執(zhí)行時調用的方法。 優(yōu)點:使得以更加安全的方式來實現(xiàn)動態(tài)方法的調用,不讓別人看到你的實現(xiàn)方法。 Struts2根據(jù)method屬性查找方法有兩種途徑: 1.查找與method屬性值完全一致的方法
2.查找doMethod形式的方法
使用動態(tài)方法調用和method屬性的區(qū)別: 1.通過以上三個struts.xml中的配置信息例子來說,他們的共同點是都在操作同一個Action。 2.<form action="">中請求地址不同。 3.動態(tài)方法的返回值相同,則會通過result進入一個頁面。而method屬性就算兩個方法的返回值相同但進去不同的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屬性來實現(xiàn)同一個Action的不同方法處理不同的請求時,會發(fā)現(xiàn),隨著方法的增多,從而導致大量的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>
2.默認Action:
在瀏覽器輸入一個不存在的Action,頁面將呈現(xiàn)404錯誤,為了網(wǎng)站更友好,我們可以設置一個默認的Action。
注意:有一部份的朋友在某個自定義的action中定義default-action-ref這個配置的時候,認為在地址欄中輸入地址如http://localhost:8080/project的時候(project為項目名),如果該項目后面不輸入任何名字或者輸錯地址,則會自動進入default-action-ref定義的action并進入對應的類方法中進行操作并根據(jù)result返回頁面,但是很多人發(fā)現(xiàn)結果并不是這樣,而不管怎樣都返回進入到index.jsp頁面。
實際上這一點從原理上來講可以理解,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')" /><!-- 把動態(tài)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 創(chuàng)建此頁面查看效果 <body> 錯誤頁面。! 未找到,Action實例時會默認走此頁面! </body>
3.處理結果 Struts2的Action處理完用戶請求后,將返回一個普通字符串,整個普通字符串就是一個邏輯視圖名。Struts2通過配置邏輯視圖名和物理視圖資源之間的映射關系,一旦系統(tǒng)收到Action返回的某個邏輯視圖名,系統(tǒng)就會把對應的物理視圖資源呈現(xiàn)給瀏覽者。 3.1 配置處理結果:
Struts2的Action處理用戶請求結束后,返回一個普通字符串-邏輯視圖名,必須在struts.xml文件中完成邏輯視圖和物理視圖資源的映射,才可讓系統(tǒng)轉到實際的視圖資源。
Struts2通過在struts.xml文件中使用<result …/>元素來配置結果。Struts2提供了兩種結果。
局部結果:將<result …/>作為<action …>元素的子元素配置。
全局結果:將<result …/>作為<global-results …>元素的子元素配置。
在package元素中配置<global-results>子元素:
全局結果可滿足一個包中多個Action共享一個結果:
<!-- 全局結果可滿足一個包中多個Action共享一個結果,也就是說,當多個Action中都有一個重復的result時就可以使用全局結果,也就是說公共的result --> <global-results> <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> </global-results> 3.2. 處理結果類型:
Struts2提供了對不同種類返回結果的支持,常見的有JSP,F(xiàn)reeMarker,Velocity等。
Struts2支持的不同類型的返回結果為:(加粗為常用)
另外第三方的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轉發(fā)跳轉 <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實例中帶參數(shù) <result name="fruitPage" type="redirectAction" >skipAction!add</result> --> <!--4.2 跳轉Action帶參數(shù)的方式: actionName:跳轉Action的名稱 method:跳轉Action實例中的哪個方法 num:帶的參數(shù),可寫固定,可使用${屬性名}取上一個Action實例中的屬性,實現(xiàn)動態(tài)傳值。 --> <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.再創(chuàng)建一個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; } }
|
|