1. 程式人生 > >四、Struts2的多種Action類的寫法和訪問方式

四、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;
	}
}