二、Struts2中的actionhtml
Struts2中的Action是一個純Java對象,默認的Action會執行execute()方法。java
2.一、訪問不一樣的方法瀏覽器
一、能夠爲Action設置多個method,以後在struts.xml文件中配置這些Action所對應的方法。jsp
<!-- 能夠爲一個action寫多個方法進行對應,這樣能夠減小action類的數量, 可是沒法減小配置的數量 --> <action name="user_addInput" class="org.struts.action.UserAction" method="addInput"> <result name="success">/WEB-INF/user/addInput.jsp</result> </action> <action name="user_add" class="org.struts.action.UserAction" method="add"> <result name="success">/WEB-INF/user/add.jsp</result> </action> <action name="user_list" class="org.struts.action.UserAction" method="list"> <result name="success">/WEB-INF/user/list.jsp</result> </action> <!-- 建立了多個action,而且爲action中的每個方法都設置一個對應 致使的問題就是:action要配置的數量太多,不方便操做 -->
二、只是寫一個action,經過一些特殊的方法來進行訪問。this
<!-- 如下方式能夠僅僅寫一個action,以後經過在調用的時候肯定方法, 經過在調用時user!addInput.action來完成某個特定方法的調用。 這個方法雖然減小了action的配置,可是依然得增長大量的結果集進行配置 --> <action name="user" class="org.struts.action.UserAction"> <!-- 默認的result的name就是success, 下面每個方法都有不一樣的返回字符串 --> <result name="add">/WEB-INF/User/add.jsp</result> <result name="addInput">/WEB-INF/User/addInput.jsp</result> <result name="list">/WEB-INF/User/list.jsp</result> </action> <!-- 若是但願調用不一樣的方法,須要按照以下寫法書寫: user!add.action:表示會調用user這個action中的add方法 user.action?method:list:表示會調用user這個action中的list方法 -->
以上操做的問題是:須要爲不一樣的方法設定不一樣的返回值,這個名稱很差統一。spa
特別注意:使用以上配置方法,必須設置如下值:code
<struts> <!-- 動態調用方法必須設置下面的值 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" />
三、使用通配符的方式xml
<!-- 基於通配符的方式:這樣只要約定好規則能夠大大減小action的編寫 --> <!-- name="*_*":當在瀏覽器中輸入User_addInput.action時,User就會去對應第一個*, addInput會去對應第二個*。 {1}:表示第一個*所對應的名稱,若是是User_add表示訪問的action是UserAction。 {2}:表示第二個*所對應的名稱,若是是User_add表示會訪問UserAction中的add方法 --> <action name="*_*" class="org.struts.action.{1}Action" method="{2}"> <!-- 只要方法返回的是success就會去/WEB-INF/下找相應的jsp文件,若是是 User_add.action表示會去找/WEB-INF/User/add.jsp文件 --> <result>/WEB-INF/{1}/{2}.jsp</result> <!-- 設置客戶端跳轉,方法返回的名稱爲name="r_list" --> <result type="redirect" name="r_list">/{1}_list</result> </action>
在開發中通常都使用通配符的方式(這樣能夠大大減小action的配置)。htm
2.二、一些常量的配置對象
能夠經過<constant>標籤來設置一些常量的配置,這些常量能夠經過struts的jar包來查詢。
<!-- 動態調用方法必須設置 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 設置擴展名 --> <constant name="struts.action.extension" value="action,do,html"/> <!-- 設置修改了配置文件後不用從新啓動直接生效 --> <constant name="struts.configuration.xml.reload" value="true"/>
2.三、全局結果集
<package name="default" namespace="/" extends="struts-default"> <!-- 全部的action只要返回了error,若是在action內部沒有設置的話就會找到這個 全局結果集所對應的頁面 --> <global-results> <result name="error">/WEB-INF/inc/error.jsp</result> </global-results>
2.四、參數的傳遞
一、對於servlet而言傳遞參數是經過request或Session等servlet做用域進行傳遞的。
二、對於Struts2而言,傳遞參數很是簡單。
方式一:
public class UserAction { /** * 直接在action中設定兩個屬性,以後爲屬性提供get和set方法(struts是經過get和set來取值的)。 * 以後直接在頁面經過EL表達式(${})或者<s:property value="xxx"/>標籤便可以獲得值 */ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
方式二:能夠經過ActionContext來設置值。取值時:若是使用EL表達式直接取值便可,若是使用
<s:property value="#aaa"/>建議在值前增長#。
public String list() { //傳值的第一種方式,直接經過在action中設置相應的get和set方法 this.setUsername("張三"); this.setPassword("123"); //第二種方式經過ActionContext完成值的傳遞 ActionContext.getContext().put("aaa", 12345); ActionContext.getContext().put("bbb", 67890); ActionContext.getContext().put("ccc", "abc"); //第三種傳值方式,能夠直接經過Servlet的API傳值 ServletActionContext.getRequest().setAttribute("hello", "world"); return "success"; }
方式三:使用Servlet API(通常不推薦使用)
//第三種傳值方式,能夠直接經過Servlet的API傳值 //使用Servlet API來設置值,取值:EL表達式,<s:property value="#request.hello"/> ServletActionContext.getRequest().setAttribute("hello", "world"); return "success";
三、在action中接收參數:只要定義相應的屬性而且設置相應的get和set方法,會自動完成傳值。
http://localhost:8080/struts01/User_addInput.action?username=abc&password=123