四、Struts2的多種Action類的寫法和訪問方式
Action類的三種寫法
1.簡單的Java類
沒有任何繼承和實現,例如:
package blog.csdn.net.mchenys;
public class HelloAction {
/**
* 方法許可權必須public
* 返回值必須String型別
* 方法引數必須是空引數
* @return 返回用於處理跳轉的name
*/
public String helloWorld() {
System.out.println("hello struts2");
return null;
}
}
對應的配置檔案設定
<?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>
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="blog.csdn.net.mchenys.HelloAction" method=" helloWorld"/>
</package>
</struts>
2.實現Action介面的Java類
Action介面中定義了5個常量,5個常量的值對應的是5個邏輯檢視跳轉頁面(跳轉的頁面還是需要自己來配置),還定義了一個方法,execute方法。常量值有以下5個:
- SUCCESS: 成功.
- INPUT:用於資料表單校驗.如果校驗失敗,跳轉INPUT檢視.
- LOGIN: 登入.
- ERROR:錯誤.
- NONE:頁面不轉向.
這5個常量你可以用也可以不用,他們的字串值就是對應的小寫單詞,如果要使用的話,那麼就要保持和struts.xml中的result標籤的name屬性值對應,這樣才能處理跳轉結果。
package blog.csdn.net.mchenys;
import com.opensymphony.xwork2.Action;
public class Demo1 implements Action{
//預設要實現的方法
@Override
public String execute() throws Exception {
return null;
}
//自定義的響應方法
public String helloWorld() {
System.out.println("hello Demo1");
return SUCCESS; //使用介面中預定義的字串常量
}
}
對應的配置檔案設定
<?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>
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="blog.csdn.net.mchenys.Demo1" method="helloWorld">
<!--
處理響應的跳轉,name屬性要和Demo1中的helloWorld方法的返回值一致,
例子中的返回值是才用Action介面預定義的常量值
-->
<result name="success">/demo/suc.jsp</result>
</action>
</package>
</struts>
這樣配置後,在瀏覽器上輸入地址http://localhost:8080/web專案名/hello 就可以成功跳轉到WebContent\demo\suc.jsp頁面了,同時控制檯會輸出hello Demo1
3.繼承ActionSupport類
這種方式是用的比較多的,ActionSupport其實是Action介面的實現類.因此Action介面中預定義的常量也是可以使用的,例如:
package blog.csdn.net.mchenys;
import com.opensymphony.xwork2.ActionSupport;
public class Demo2 extends ActionSupport{
/**
* 方法許可權必須public
* 返回值必須String型別
* 方法引數必須是空引數
* @return 返回用於處理跳轉的name
*/
public String helloWorld() {
System.out.println("hello struts2");
return SUCCESS;
}
}
然後在配置檔案中新增一條Action就可以了,這裡就不貼出程式碼了,跟方式2差不多。
Action的3種訪問方式
1.傳統配置
通過<action>
標籤中的method屬性,訪問到Action類中的具體的方法。
例如配置檔案中的Action是這樣的
<package name="book" extends="struts-default" namespace="/">
<action name="addBook" class="blog.csdn.net.mchenys.BookAction" method="add"></action>
<action name="deleteBook" class="blog.csdn.net.mchenys.BookAction" method="delete"></action>
</package>
對應的Action類的java程式碼如下:
package blog.csdn.net.mchenys;
import com.opensymphony.xwork2.ActionSupport;
/**
* 圖書管理
* @author mChenys
*
*/
public class BookAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String add() {
System.out.println("新增圖書");
return NONE; //none表示不跳轉
}
public String delete() {
System.out.println("刪除圖書");
return NONE;
}
}
2.萬用字元的訪問方式
訪問的路徑和方法的名稱必須要有某種聯絡,使用萬用字元的方式可以簡化配置檔案的程式碼編寫,而且擴充套件和維護比較容易。
假設我的頁面有以下2個請求:
<a href="${pageContext.request.contextPath}/order_add.action">新增訂單</a>
<a href="${pageContext.request.contextPath}/order_delete.action">刪除訂單</a>
按照方式1的話,就必須要在配置檔案中新增2條Action與之對應,但是有了萬用字元,我就可以只新增一條Action記錄,例如:
<?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>
<package name="default" namespace="/" extends="struts-default">
<!--
name屬性可以使用萬用字元*,跟名稱空間組合起來的匹配路徑就是/order_*
method屬性如果要引用萬用字元*代表的字串,可以使用{}來取值,下標從1開始
-->
<action name="order_*" class="blog.csdn.net.mchenys.OrderAction" method="{1}"/>
</package>
</struts>
對應的Action類的java程式碼如下:
package blog.csdn.net.mchenys;
import com.opensymphony.xwork2.ActionSupport;
/**
* 訂單管理
* @author mChenys
*
*/
public class OrderAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String add() {
System.out.println("新增訂單");
return NONE;
}
public String delete() {
System.out.println("刪除訂單");
return NONE;
}
}
具體理解:在JSP頁面傳送請求http://localhost/web專案名/order_add.action,配置檔案中的order_*可以匹配該請求,就相當於變成了add,method屬性的值使用{1}來代替,{1}就表示的是第一個號的位置!!所以method的值就等於了add,那麼就找到Action類中的add方法,那麼add方法就執行了!
3.動態方法訪問的方式
有的開發中也會使用這種方式,如果想完成動態方法訪問的方式,需要開啟一個常量,在struts.xml中開啟該常量
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
如何動態訪問呢?
訪問連線也需要做修改,用歎號(!)來分割請求的方法名,例如:
<a href="${pageContext.request.contextPath}/product!add.action">新增商品</a>
<a href="${pageContext.request.contextPath}/product!delete.action">刪除商品</a>
其中歎號(!)後的add和delete就是Action類需要處理的方法;而歎號(!)前的product就是對應Action標籤的name屬性
具體的配置檔案配置如下:
<?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>
<!-- 需要開啟動態訪問屬性 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="default" namespace="/" extends="struts-default">
<!-- 動態配置訪問方式的method屬性無需配置 -->
<action name="product" class="blog.csdn.net.mchenys.ProductAction"></action>
</package>
</struts>
對應的Action類的java程式碼如下:
package blog.csdn.net.mchenys;
import com.opensymphony.xwork2.ActionSupport;
/**
* 產品管理
*
* @author mChenys
*
*/
public class ProductAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String add() {
System.out.println("新增產品");
return NONE;
}
public String delete() {
System.out.println("刪除產品");
return NONE;
}
}