1. 程式人生 > >SSH入門Struts2篇(2)——Action的四種自定義方法

SSH入門Struts2篇(2)——Action的四種自定義方法

1.Action類的生命週期

框架先例項化 Action 物件,再呼叫 Action 的 set*** 函式,封裝表單資料,然後呼叫 execute 函式,進行處理。
在第二次提交時,Action 會重新例項化,每一個 Action 物件都服務一個請求,這和 Servlet 的原理是不一樣的——servlet是隻在伺服器啟動時載入一次,所有使用者共享。

2.Action的自定義方法

其實一個action中是可以提供多個方法用來處理不同的請求,也即不一定要是execute()
當Action中使用了自定義方法,則該Action就需要特定的配置,一般有四種呼叫方式:
① 在struts.xml檔案中通過method屬性指定方法名
② 使用動態方法呼叫方式(DMI)
③ 使用提交按鈕的method屬性
④ 使用萬用字元配置Action

注:我們在這裡討論的都是在同一Action下有兩種或以上方法分別處理不同請求的情況

假設我們這裡有這樣一個Action:

package cn.edu.zjut.action;

import cn.edu.zjut.bean.*;
import cn.edu.zjut.service.*;

public class UserAction {
	
	private UserBean loginUser;
	private UserBean regUser;
	
	public UserBean getLoginUser() {
		return loginUser;
	}

	public
void setLoginUser(UserBean loginUser) { this.loginUser = loginUser; } public UserBean getRegUser() { return regUser; } public void setRegUser(UserBean regUser) { this.regUser = regUser; } public String login() { UserService userServ = new UserService(); if(userServ.login(loginUser)
) { return "loginsuccess"; } return "loginfail"; } public String reg() { UserService userServ = new UserService(); if(userServ.register(regUser)) { return "regsuccess"; } return "regfail"; } }

2.1 在struts.xml檔案中通過method屬性指定方法名

form action="login" 以及在另一個表單 form action="register"
在Action下有幾種方法在xml檔案裡就需要寫幾個<action ...>,class都是指定同一action,但是通過method後面的內容來指定使用該action下的什麼方法。

<action name="login" class="...UserAction" method="login"> …… </action>
<action name="register" class="...UserAction" method="reg"> …… </action>

訪問方式:以actionName.action形式訪問,如 http://localhost:8080/struts2/login.action
缺點就是要寫太多個<action ...>了啦…(其實我覺得還好)

2.2 使用動態方法呼叫方式(DMI)

先要在struts.xml檔案中:(否則會404

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

struts.xml:

<action name="UserAction" class="...UserAction">....</action>

訪問方式:

//url方式
http://localhost:8080/struts2/UserAction!login.action
http://localhost:8080/struts2/UserAction!reg.action
//表單
<s:form action="UserAction!login" method="post">
<s:form action="UserAction!reg" method="post">

注:在這種方法時一定要注意UserAction下的login和reg方法不能有相同的result返回值,因為它們的result標籤都是寫在一個<action></action>裡的

<action name="UserAction" class="...UserAction">
	<result name="success">/loginSuccess.jsp</result>
	<result name="fail">/loginFail.jsp</result>
	<result name="registersuccess">
                 /regSuccess.jsp</result>
	<result name="registerfail">/regFail.jsp</result>
</action>

2.3使用提交按鈕的method屬性——注意這種方法只能用於表單中

struts.xml和上文中沒有差別,也需要

<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<action name="UserAction"  class="...UserAction">
</action>

表單:

<s:form action="UserAction" method="post">
……
<s:submit value="登入" method="login"/>
<s:submit value="註冊" method="reg"/>

注意這裡的result和動態呼叫一樣,兩個方法都需要互不相同

2.4使用萬用字元配置Action——這也是相對更為普遍的方式

struts.xml檔案中這麼寫:

<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
			<result name="{1}success">/{1}Success.jsp</result>
			<result name="{1}fail">/{1}Fail.jsp</result>
</action>

在這裡*就代表了佔位符,而method="{1}"中的1、2、3則代表了佔位符的位置(當然這裡只有一個佔位符,所以只有1)
例如表單中寫:form action="regAction" ,則在Action類中對應的方法就應該要叫做"reg",而方法的返回值則為regsuccess和regfail,相對跳轉到的頁面則為regSuccess.jspregFail.jsp.

3.Action處理後的結果result的型別-type屬性

使用result的type屬性來設定結果型別
1.dispatcher: 預設值,伺服器內部跳轉(跳轉到web元件),相當於javaWeb中的forward
2.redirect: 作客戶端重定向(重定向到web元件);
3.chain: 作伺服器內部跳轉(跳轉到其他Action);
4.redirectAction: 作客戶端重定向(重定向到其他Action)
5.plainText:跳轉到介面的原始碼
例如在以下程式碼中預設的是dispatcher,因此在xxSuccess.jsp頁面中是可以獲得對應Action中的屬性值的

<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
			<result name="{1}success">/{1}Success.jsp</result>
			<result name="{1}fail">/{1}Fail.jsp</result>
</action>

例如Action中有一個屬性叫做count
那麼在跳轉到的頁面就可以使用<s:property value="count">來把屬性值顯示出來。(此時導航欄顯示的是xxx/loginAction)
但是在使用了redirect之後這個屬性值就抓不到了.(此時導航欄顯示的是loginSuccess.jsp(以*代表login為例)