邱吉爾曾經說過他喜歡學習新東西
但他覺得沒有必要讓別人教他
不管你是否喜歡學習新知識
也不管有人教你還是你自學
學習Java通常意味著仔細研究許多特殊的類
學習Struts也是如此
這就是我寫本系列第四部分的初衷
在本文中
我將詳述org
apache
struts
action
ActionMapping類
它是從onfig
ActionConfig派生的
ActionMapping將一個請求路徑映射到一個action類
它是Struts應用程序中最常用的類之一
在你深入學習這個類時
你會重新用到在該系列第
和
部分創建的兩個login應用程序
從而了解如何運用ActionMapping來重寫應用程序
當然
你可能不記得以前用過任何ActionMapping實例了
這是因為控制器servlet實際上為你創建了它們
你只需要配置在Struts配置文件(struts
config
xml)中創建的每個ActionMapping實例就行了(通過給它的屬性賦值)
了解這些屬性對正確運用ActionMapping類很重要
因此我將講述這些屬性以及如何定義它們
首先
讓我們回想一下
Struts配置文件的根元素是<struts
config>
<struts
config>元素可以包含一個可選的<action
mappings>元素
同樣<action
mappings>元素可以包含<action>元素
例如
下面就是本系列第三部分的login應用程序配置文件中的<struts
config>元素及其子元素
<struts
config>
<action
mappings>
<action path=
/login
type=
com
javapro
struts
LoginAction
/>
<action path=
/logout
type=
com
javapro
struts
LogoutAction
/>
<action path=
/viewSecret
type=
com
javapro
struts
ViewSecretAction
/>
</action
mappings>
</struts
config>
<action
mapping>中的每個<action>都代表控制器servlet創建的一個ActionMapping實例
一個<action>元素可以包含多個特性
每個特性都和ActionMapping實例中的一個屬性相應
作為例子
我們來看前面的Struts配置文件中的這個<action>元素
<action path=
/login
type=
com
javapro
struts
LoginAction
/>
這個<action>將路徑
/login
映射到action類com
javapro
struts
LoginAction
換句話說
一個以
/login
do
結尾的用戶請求將被傳遞到LoginAction類
然而
ActionMapping也有其它的用途
你(Struts程序員)可以通過給它的屬性賦值來給ActionMapping實例下達action指令
(有些屬性與action forms相關
我將在本系列的第五部分講述
)
ActionMapping類的屬性 ActionMapping有許多屬性
首先
它從ActionConfig類繼承了一些屬性——如type
forward
include和unknown
它們與action forms是無關的
前三個屬性是ActionMapping類最重要的屬性
你只能指定其中的一個
所以
如果一個<action>元素已經定義了一個type屬性
它就不能有forward屬性或include屬性了
type屬性的值是路徑所映射的Action類的完全限定的Java類的名稱
(你曾在前面的login應用程序中的Struts配置文件中用過這個屬性
)如果運用了type屬性
那麼控制器servlet就可以調用action實現類的execute方法
傳遞恰當的ActionMapping實例
注意
org
apache
struts
action
Actionclass類的execute方法有如下的定義(第一個參數是一個ActionMapping實例)
public ActionForward execute(ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException
ServletException
forward屬性代表的是滿足該請求的context
relative資源(通過調用RequestDispatcher
forward())
而不是實例化type屬性指定的Action類
(更多關於如何運用這個屬性的信息
參見後面的
修改login應用程序
部分
)
我們給include屬性賦的值是滿足該請求的context
relative資源路徑(通過調用RequestDispatcher
include())
而不是實例化type屬性指定的Action類
注意
<action>元素包含的forward屬性與可能出現在<action>元素下的<forward>元素是不同的
這就是說
一個<action>元素可以有一個type屬性
以及一個或多個<forward>子元素
如下面這個<action>元素所示(我馬上會講述<forward>元素)
<action path=
/login
type=
com
javapro
struts
LoginAction
>
<forward name=
success
path=
/mainMenu
jsp
/>
<forward name=
failure
path=
/login
jsp
/>
</action>
我們用<path>屬性來指定這個ActionMapping將處理的請求路徑
最後
用unknown屬性來處理未知的路徑
在一個action元素中
將這個屬性設置為true
使這個action成為該應用程序缺省的action
換句話說
它處理所有其它的action不能處理的請求
在一個單獨的應用程序中
只有一個action可以被定義成是缺省的
例如
下面這個<action>元素將unknown屬性設置為true
使該action成為缺省的
<action path=
/login
type=
com
javapro
struts
LoginAction
unknown=
true
/>
<forward>元素 <forward>元素描述了一個邏輯名稱與一個context
relative URI路徑識別的資源之間的映射
它有以下這些屬性
· className 這是你想運用的ActionForward實現類的完全限定的Java類的名稱
缺省情況下
它的值是作為
forward
初始化參數給Struts控制器servlet配置的
· contextRelative 在一個模塊化應用程序中
如果路徑屬性是以一個斜線(
/
)開頭的
並且是相對於整個Web應用程序的
而不是相對於該模塊的
我們就將這個屬性設置為true
缺省情況下是false
· name 這是forward的唯一標識符
用來在應用程序的action類中引用它
· path 被映射資源的context
relative路徑
· redirect 設置成true
運用sendRedirect()引導到該資源
或者設置成false
運用RequestDispatcher
forward()作為替代
運用<action>下的<forward>元素意味著你不必在你的ActionForward對象中寫死路徑名
例如
我們來看前面的login應用程序中LoginAction類的execute方法中的代碼
public ActionForward execute(ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException
ServletException {
String userName =
request
getParameter(
userName
);
String password =
request
getParameter(
password
);
if (userName!=null && password!=null &&
userName
equals(
john
) &&
password
equals(
)) {
HttpSession session = request
getSession();
session
setAttribute(
loggedIn
);
return (new ActionForward(
/mainMenu
jsp
));
}
else {
return (new ActionForward(
/login
jsp
));
}
}
注意
最後的兩個return語句寫死了mainMenu
jsp和login
jsp頁面
如果任意一個文件名發生改變
你都必須重新編譯LoginAction類
但是如果你用<forward>元素
你可以用一個名稱映射mainMenu
jsp頁面
用另一個名稱映射login
jsp頁面
現在
如果你需要改變文件名
你就可以在配置文件中進行改變
而不需要重新編譯了
要這麼做
你需要在struts
config
xml文件中聲明這個<action>元素
<action path=
/login
type=
com
javapro
struts
LoginAction
>
<forward name=
success
path=
/mainMenu
jsp
/>
<forward name=
failure
path=
/login
jsp
/>
</action>
現在
mainMenu
jsp就與
success
這個名稱聯系在一起了
login
jsp與
failure
聯系在一起了
你可以通過調用ActionMapping類的findForward方法
傳入相關的名稱從一個action實現類的內部得到ActionForward實例
mapping
findForward(name);
例如
要得到包含路徑
/mainMenu
jsp
的ActionForward對象
我們可以用下面的方法
mapping
findForward(
success
);
同樣
要得到包含路徑
/login
jsp
的ActionForward對象
可以用
writemapping
findForward(
failure
);
接下來
我們該用<forward>方法重寫login應用程序了
修改Login應用程序 注意
你在第三部分創建的login應用程序發生了怎樣的變化
首先
我們來看原應用程序中ViewSecretAction類的execute方法
public ActionForward execute(ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException
ServletException {
return (new ActionForward(
/viewSecret
jsp
));
}
除了返回一個路徑是
/viewSecret
jsp
的ActionForward對象外
該execute方法沒有做任何的處理
通過運用struts
config
xml文件中<action>元素的forward屬性
我們就不需要ViewSecretAction類了
要實現這一點
我們可以將下面的<action>代碼
<action path=
/viewSecret
type=
com
javapro
str
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27894.html