簡單之中也蘊涵著復雜性
我們在本系列第一部分和第二部分創建
研究一個簡單的Struts login應用程序時
回避了許多這種復雜性
因為那兩篇文章是給初學者的Struts入門讀物
所以我們在應用程序中沒有充分運用Struts類庫
但現在
你已經做好准備學習更多的東西了
讓我們先來看看真正的Struts程序員是如何運用ActionForward類的吧
它代表的是控制指令所導向的一個目的資源
從一個servlet內部
通過運用javax
servlet
RequestDispatcher類的forward方法你就可以將控制流程引導到一個目的資源
在login應用程序的action類中
該代碼形式如下
RequestDispatcher rd =
request
getRequestDispatcher(destination);
rd
forward(request
response);
其中destination就是到一個目的資源的路徑
但是在一個典型的Struts應用程序中
你可以用ActionForward類作為替代
運用這個類的好處就是你不再需要創建一個RequestDispatcher對象並調用它的forward方法了
你可以將ActionForward類用於一個Action類的execute方法中
注意
其中一個重載的execute方法有如下的定義
它返回一個ActionForward對象
public ActionForward execute(
ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws Exception
因為當時我們還沒有講到ActionForward類
所以在本系列的第一部分和第二部分中所有Action類的execute方法都只返回了空值
現在
在一個Action類的execute方法中
你就可以用ActionForward類來代替下面這個RequestDispatcher對象實例了
RequestDispatcher rd =
request
getRequestDispatcher(destination);
rd
forward(request
response);
新的代碼變成
return (new ActionForward(destination));
構建ActionForward對象 ActionForward類提供了下面五種構造器
public ActionForward()
public ActionForward(String path)
public ActionForward(String path
boolean
redirect)
public ActionForward(String name
String path
boolean redirect)
public ActionForward(String name
String path
boolean redirect
boolean contextRelative)
雖然這些構造器是不需要說明的
但我們應該注意下面幾點
在這些構造器中
第二種可能是最常用的
後四種構造器中的path參數表示的是到目的資源的路徑
後三種構造器中的redirect布爾值表示的是是否執行了一個重定向(redirect)
(缺省情況下
這個值設置為false
因為redirect比forward慢
)最後
第五個構造器中的contextRelative布爾值表示該路徑是否應該是context
relative的
而不是module
relative的
同樣
一個ActionForward實例也可以有一個邏輯名稱
你可以用這個名稱來查找與一個特殊的ActionMapping對象相關的實例
(參見本系列第四部分關於ActionMapping的講述
)
學習ActionForward類的方法 ActionForward類定義了三個保護字段——name
path和redirect——它們構成了ActionForward的三個屬性
ActionForward類提供getter和setter方法來從這些字段讀值
給這些字段賦值
這些方法是不需要說明的
定義如下
public boolean getContextRelative()
public void setContextRelative(boolean
contextRelative)
public String getName()
public void setName(String name)
public String getPath()
public void setPath(String path)
public boolean getRedirect()
public void setRedirect(boolean redirect)
除此之外
ActionForward類還重載了toString方法並返回
ActionForward[
+ name +
]
其中name是名稱字段
最後
還有一個freeze方法
它固定了一個組件的配置
再次運用Login應用程序 要完全了解ActionForward類
我們需要再次運用在本系列第一部分和第二部分構建的login應用程序
你可以下載完整的應用程序
把它重命名為myStrutsApp
它的web
xml和struts
config
xml文件同myStrutsApp
中的文件是一樣的
JSP頁面也沒有改變
只有action類同以前不同(見列表
)
注意下面這行代碼是新的
return (new ActionForward(
/mainMenu
jsp
));
它替代了下面這些代碼
現在它們都被注釋出來了
RequestDispatcher rd =
request
getRequestDispatcher(
/mainMenu
jsp
);
rd
forward(request
response);
同樣
下面這些代碼也都被重寫了
// RequestDispatcher rd =
request
getRequestDispatcher(
/login
jsp
);
// rd
forward(request
response);
新的代碼變成
return (new ActionForward(
/login
jsp
));
ViewSecretAction類
ViewSecretAction也變得更好了(見列表
)
execute方法最後的這三行代碼現在由一行來處理了
返回(new ActionForward (
/viewSecret
jsp
)): // RequestDispatcher rd =
request
getRequestDispatcher(
/viewSecret
jsp
);
// rd
forward(request
response);
// return null;
接下來
我們來重新查看LogoutAction類(見列表
)
注意execute方法中下面這些代碼已經被替代了
// RequestDispatcher rd =
request
getRequestDispatcher(
/login
jsp
);
// rd
forward(request
response);
// return null;
你只需要用下面這一行代碼來取代它就行了
return (new ActionForward(
/login
jsp
));
ActionForward是個很有用
功能很多的類
它可以讓你更簡單
更快
更直接地完成許多事情
這可能就是它很受歡迎的原因
在本系列的第四部分
你可以了解另一個重要的類org
apache
struts
action
ActionMapping
它可以使你的代碼更有效
更漂亮
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27970.html