1. 程式人生 > >【SSH三大框架】Struts2基礎第三篇:配置Action以及呼叫Action的三種方式

【SSH三大框架】Struts2基礎第三篇:配置Action以及呼叫Action的三種方式

一、struts.xml中的包和名稱空間

1、Struts2不支援為單獨的Action設定名稱空間,而是通過為包指定namespace屬性來為包下面的所有Action指定共同的名稱空間。

如果在配置<package>的時候沒有指定namespace屬性,則該包下的所有Action處於預設的包空間下

2、例如:

<package name="lee" extends="struts-default">
		<action name="login" class="org.crazyit.app.action.LoginAction">
			<!-- 定義三個邏輯檢視和物理資源之間的對映 -->		
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
對於這裡的package,定義了name屬性,未定義名稱空間,則該Action處理的URL為:localhost:8080/專案名/login.action
<package name="lee" extends="struts-default" namespace="/book">
		<action name="login" class="org.crazyit.app.action.LoginAction">
			<!-- 定義三個邏輯檢視和物理資源之間的對映 -->		
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
對於這裡的package,定義了namespace名稱空間,則該Action處理的URL為:localhost:8080/專案名稱/book/login.action

注意順序:①如果請求為/book/login.action,系統首先會查詢/book名稱空間下的login.action,如果找不到,則會在預設的名稱空間查詢login.action

如果請求為/login.action,系統會在跟名稱空間(”/“)查詢名為login.action,如果找不到,就會轉入預設的名稱空間

二、使用動態方法呼叫Action

在一個登陸頁面,包含有”登陸“和”註冊“兩個按鈕,如果我們點選了”註冊“,我們可以利用javascript來改變form表單的action

function regist()
{
   targetForm = document.forms[0];
   targetForm.action = "login!regist";
}
在點選註冊之後,我們表單的action屬性變為了”login!regist“,意思是交給login這個Action的regist方法處理

三、指定method屬性呼叫Action

在配置<action>元素的時候,我們可以為它定義method屬性讓Action呼叫指定的方法:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="lee" extends="struts-default">
		<!-- 配置login Action,處理類為LoginRegistAction
			預設使用execute方法處理請求-->
		<action name="login" class="org.crazyit.app.action.LoginRegistAction">
			<!-- 定義邏輯檢視和物理檢視之間的對映關係 -->
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 配置regist Action,處理類為LoginRegistAction
			指定使用regist方法處理請求-->
		<action name="regist" class="org.crazyit.app.action.LoginRegistAction"
			method="regist">
			<!-- 定義邏輯檢視和物理檢視之間的對映關係 -->
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>
在這個struts.xml中,我們定義了兩個Action,同時指向了同一個類:LoginRegistAction.java。但是,我們為這兩個action分別配置了method屬性。

這樣子雖然看起來簡單明瞭,但是程式碼量太多,不好看。

四、使用萬用字元呼叫Action

在配置<action>元素的時候,允許在指定name屬性時使用模式字串(即用”*“代表一個或多個任意字元),接下來就可以在class、method屬性以及<result>子元素中使用{N}的形式來代表前面第N個星號(*)所匹配的子串,因此我們就可以用一個<action>代替多個“指定method屬性的action(就是上邊的第三種)”。

1、使用萬用字元配置method屬性

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="lee" extends="struts-default">
		<!-- 使用模式字串定義Action的name,指定所有以Action結尾的請求,
		都可用LoginRegistAction來處理,method屬性使用{1},
		這個{1}代表進行模式匹配時第一個*所代替的字串 -->
		<action name="*Action" class="org.crazyit.app.action.LoginRegistAction"
			method="{1}">
			<!-- 定義邏輯檢視和物理檢視之間的對映關係 -->
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>
當用戶請求/loginAction的時候,會自動呼叫類“org.crazyit.app.action.LoginRegistAction”中的login方法

2、使用萬用字元配置class屬性

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="lee" extends="struts-default">
		<!-- 使用模式字串定義Action的name,指定所有以Action結尾的請求,
		都可用{1}Action來處理,
		這個{1}代表進行模式匹配時第一個*所代替的字串 -->
		<action name="*Action" class="org.crazyit.app.action.{1}Action">
			<!-- 定義邏輯檢視和物理檢視之間的對映關係 -->
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>
當用戶請求/loginAction的時候,會自動呼叫類org.crazyit.app.action.loginAction中預設的execute方法

3、使用多個萬用字元,同時配置class和method屬性

<action name="*_*" method="{2}" class="actions.{1}" >
在上邊的程式碼中,我們為name屬性設定為"*_*",當我們請求/book_save的時候,系統會呼叫actions.book處理類的save方法來處理使用者請求。


在使用萬用字元的時候,要特別注意一下呼叫順序:

對於下邊的程式碼:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="lee" extends="struts-default">

		<!-- 配置name="*"的第二個Action -->
		<action name="*Action" class="org.crazyit.app.action.TwoAction">
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 配置name="*Action"的第一個Action -->
		<action name="*" class="org.crazyit.app.action.FirstAction">
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 配置name為LoginAction的第三個Action -->
		<action name="LoginAction" class="org.crazyit.app.action.LoginAction">
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>
我們定義了三個action,分別為"*","*Action","LoginAction"

如果我們請求/RegistAction,該請求會由第一個action進行處理

把上邊程式碼修改順序:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="lee" extends="struts-default">

		<!-- 配置name="*Action"的第二個Action -->
		<action name="*Action" class="org.crazyit.app.action.TwoAction">
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 配置name="*"的第一個Action -->
		<action name="*" class="org.crazyit.app.action.FirstAction">
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 配置name為LoginAction的第三個Action -->
		<action name="LoginAction" class="org.crazyit.app.action.LoginAction">
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>
如果我們請求/RegistAction,這時候會由第一個請求處理

由此我們可以得到下邊的規律

如果系統發來一條請求:abcAction.action

步驟:

第一、首先查詢有沒有名為abcAction.action的Action,沒有的話進行下一步

第二、搜尋name屬性值能夠匹配abcAction的Action,例如name為 * 或為*Action,但是*Action並不會比*更有限匹配abcAction的請求,而是先找到哪個Action就會由哪個Action來處理