Struts
控制器組件負責接受用戶請求、更新模型,以及選擇合適的視圖組件返回給用戶??刂破鹘M件有助于將模型層和視圖層分離,有了這種分離,就可以在同一個模型的基礎上得心應手地開發多種類型的視圖。
Struts
控制器組建主要包括:
?
·
ActionServlet
組件:充當
Struts
框架的中央控制器。
·
RequestProcessor
組件:充當每個子應用模塊的請求處理器。
·
Action
組件:負責處理一項具體的業務。
?
Struts
框架采用控制器組件來預處理所有的客戶請求,這種集中控制方式可以滿足
MVC
設計模式的兩大需求:
?
·首先,控制器在用戶輸入數據和模型之間充當媒介
/
翻譯者的角色,提供一些通用功能,如安全、登入和其他針對具體用戶請求的重要服務,當系統的這些通用功能出現需求變更時,部需要修改整個應用,只需要修改局部的控制器組件即可。
·其次,由于所有的請求都經過控制器過濾,因此可以降低視圖組件之間,以及視圖組件和模型組件之間的相互依賴關系,提高每個組件的相對獨立性。由控制器組件來決定把合適的視圖組件返回給用用戶,這可以減少視圖組件之間直接的,錯綜復雜的連接關系,使應用更加靈活,便于維護。
?
Struts
框架采用
ActionServlet
和
RequestProcessor
組件進行集中控制,并采用
Action
組件來處理單項業務。
?
?
一
控制器組件的控制機制
?
Struts
的控制器組件主要完成以下任務:
·接受用戶請求
·根據用戶請求,調用合適的模型組件來執行相應的業務邏輯。
·獲取業務邏輯執行結果。
·根據當前狀態以及業務邏輯執行結果,選擇合適的視圖組件返回給用戶。
?
1 Action
類
?
?org.apache.struts.action.ActionServlet
類是
Struts
框架的核心控制器組件,所有的用戶請求都先有
ActionServlet
來處理,然后再由
ActionServlet
把請求轉發給其他組件。
Struts
框架只允許在一個應用中配置一個
ActionServlet
類,在應用的生命周期中,僅創建
ActionServlet
類的一個實例,這個
ActionServlet
實例可以同時響應多個用戶請求。
?
<!--[if !supportLists]-->(a)???<!--[endif]-->Struts框架初始化過程
<!--[if !supportLists]-->(1)???<!--[endif]-->調用initInternal()方法,初始化Struts框架內在的消息資源,如與系統日志相關的同志、警告和錯誤消息。
<!--[if !supportLists]-->(2)???<!--[endif]-->調用initOther()方法,從web.xml文件中加載ActionServlet的初始化參數,如config參數。
<!--[if !supportLists]-->(3)???<!--[endif]-->調用initServlet()方法,從web.xml文件中加載ActionServlet的URL映射信息。此外還會注冊web.xml和Struts配置文件所使用的DTD文件,這些DTD文件用來驗證web.xml和Struts配置文件的語法。
<!--[if !supportLists]-->(4)???<!--[endif]-->調用initModuleConfig()方法,加載并解析子應用模塊的Struts配置文件;創建ModuleConfig對象,把它存儲在ServletContext中。
<!--[if !supportLists]-->(5)???<!--[endif]-->調用initModuleMessageResources()方法,加載并初始化默認子應用模塊的消息資源:創建MessageResources對象,把它存儲在ServletContext中。
<!--[if !supportLists]-->(6)???<!--[endif]-->調用initModuleDataSources()方法,加載并初始化默認子應用模塊的數據源。如果在Struts配置文件中沒有定義<data-sources>元素,就忽略這一流程。
<!--[if !supportLists]-->(7)???<!--[endif]-->調用InitModulePlugins()方法,加載并初始化默認子應用模塊的所有插件。
<!--[if !supportLists]-->(8)???<!--[endif]-->當默認子應用模塊被成功地初始化后,如果還包括其他子應用模塊,將重復流程(4)~(7),分別對其他子應用模塊進行初始化。
?
<!--[if !supportLists]-->(b)???<!--[endif]-->ActionServlet的process()方法
當
ActionServlet
實例接受到
HTTP
請求之后,在
doGet()
或
doPost()
方法都會調用
process()
方法來處理請求。一下是
ActionServlet
的
process()
方法的源代碼:
?
protected voidprocess (HttpServletRequest request, HttpServletResponse response)
throwIOException, ServletException {
?
ModuleUtils.getInstance().selectModule(request,getServletContext());
getRequestProcessor(getModuleConfig(request)).process(request,response);
}
?
在
process()
方法中,首先調用
org.apache.struts.util.ModuleUtils
類的
selectModule()
方法,這個方法選擇負責處理當前請求的子應用模塊,然后把與子應用模塊相關的
ModuleConfig
和
MessageResources
對象存儲倒
request
范圍中,這使得框架的其余組件可以方便地從
request
范圍中讀取這些對象,從而獲取應用配置信息和消息資源。
process()
方法的第二步操作為獲得
RequestProcessor
類的實例,然后調用
RequestProcessor
類的
process()
方法,來完成十幾的預處理請求操作。
?
?
<!--[if !supportLists]-->(c)???<!--[endif]-->擴展ActionServlet類
在
Sturts 1.1
之前的版本中,
ActionServlet
類本身包含了很多處理請求的代碼。從
Struts 1.1
開始,多數功能被移到
org.apache.struts.action.RequestProcessor
類中,以便減輕
ActionServlet
類的控制負擔。
?
盡管新版本的
Struts
框架允許在應用中創建礦展
ActionServlet
類的子類,但是這在多數情況下沒有必要,因為控制器的多數控制功能位于
RequestProcessor
類中。
?
如果實際應用確實需要創建自己的
ActionServlet
類,則可以創建一個
ActionServlet
的子類,然后在
web.xml
文件中配置這個客戶化
ActionServlet
類。
?
如果覆蓋了
init()
方法,應該確保首先調用
super.init()
,它保證
ActionServlet
的默認初始化操作被執行。除了覆蓋
init()
方法外,事實上,還可以根據十幾需要覆蓋
ActionServlet
的任何其他方法。
?
?
2 RequestProcessor
類
?
?
對于多應用模塊的
Struts
應用,每個子應用模塊都有各自的
RequestProcessor
實例。在
ActionServlet
的
process()
方法中,一旦選擇了正確的子應用模塊,就會調用子應用模塊的
RequestProcessor
實例的
process()
方法來處理請求。在
ActionServlet
調用這個方法時,會把當前的
request
和
response
對象傳給它。
Struts
框架只允許應用中存在一個
ActionServlet
類,但是可以存在多個客戶化的
RequestProcessor
類,每個子應用模塊都可以擁有單獨的
RequestProcessor
類。如果想修改
RequestProcessor
類的一些默認功能,可以覆蓋
RequestProcessor
基類中的相關方法。
?
<!--[if !supportLists]-->(a)???<!--[endif]-->RequestProcessor類的process()方法
RequestProcessor
類的
process()
方法負責實際的預處理請求操作。
RequestProcessor
類的
process()
方法一次執行一下流程:
(1)
調用
processMultipart()
方法。如果
HTTP
請求方式為
POST
,并且請求的
contentType
屬性以“
multipart/form-data
”開頭,標準的
HttpServletRequest
對象將被重新包裝,以方便處理“
multipart
”類型的
HTTP
請求。如果請求方式為
GET
,或者
contentType
屬性不是“
multipart
”,就直接返回原始的
HttpServletRequest
對象。
(2)
調用
processPath()
方法,獲得請求
URI
的路徑,這一信息可用于選擇合適的
Struts Action
組件。
(3)
調用
processLocale()
方法,當
ControllerConfig
對象的
locale
屬性為
true
,將讀取用戶請求中包含的
Locale
信息,然后把
Locale
實例保存在
session
范圍內。
(4)
調用
processContent()
方法,讀取
ControllerConfig
對象的
contentType
屬性,然后調用
response.setContentType(contentType)
方法,設置響應結果的文檔類型和字符編碼。
(5)
調用
processNoCache()
方法,讀取
ControllerConfig
對象的
nocache
屬性,如果
nocache
屬性為
true
,在響應結果中將加入特定的頭參數:
Pragma
、
Cache-Control
和
Expires
,防止頁面被存儲在客戶瀏覽器的緩存中。
(6)
調用
processPreprocess()
方法。該方法不執行任何操作,直接返回
true
。子類可以覆蓋這個方法,執行客戶化的預處理請求操作。
(7)
調用
processMapping()
方法,尋找和用戶請求的
URI
匹配的
ActionMapping
。如果不存在這樣的
ActionMapping
,則向用戶返回恰當的錯誤消息。
(8)
調用
processRoles()
方法,先判斷是否為
Action
配置了安全角色,如果配置了安全角色,就調用
isUserRole()
方法判斷當前用戶是否具備必需的角色;如果不具備,就結束請求處理流程,向用戶返回恰當的錯誤消息。
(9)
調用
processActionForm()
方法,先判斷是否為
ActionMapping
配置了
ActionForm
,如果配置了
ActionForm
,就先從
ActionForm
的存在范圍內尋找該
ActionForm
實例;如果不存在,就創建一個實例。接下來把它保存在合適的范圍中,保存時使用的屬性
key
為
ActionMapping
的
name
屬性。
(10)
調用
processActionForm()
方法。如果為
ActionMapping
配置了
ActionForm
,就先調用
ActionForm
的
reset()
方法,再把請求中的表單數據組裝到
ActionForm
中。
(11)
調用
processValidate()
方法,如果為
ActionMapping
配置了
ActionForm
,并且
ActionMapping
的
validate
屬性為
true
,就調用
ActionForm
的
validate()
方法。如果
validate()
方法返回的
ActionErrors
對象中包含
ActionMessage
對象,說明表單驗證失敗,就把
ActionErrors
對象存儲在
request
范圍內,再把請求轉發到
ActionMapping
的
input
屬性指定的
Web
組件。如果
ActionForm
的
validate()
方法執行表單驗證成功,就繼續執行下一步請求處理流程。
(12)
調用
processForward()
方法,判斷是否在
ActionMapping
中配置了
forward
屬性。如果配置了這個屬性,就調用
RequestDispatcher
的
forward()
方法,請求處理流程結束,否則繼續下一步。
(13)
調用
processInclude()
方法,判斷是否在
ActionMapping
中配置了
include
屬性。如果配置了這個屬性,就調用
RequestDispatcher
的
include()
方法,請求處理流程結束,否則繼續下一步。
(14)
調用
processActionCreate()
方法,先判斷是否在
Action
緩存中存在這個
Action
實例,如果不存在,就創建一個
Action
實例,把它保存在
Action
緩存中。
(15)
調用
processActionPerform()
方法,該方法再調用
Action
實例的
execute()
方法。
execute()
方法位于
try/catch
代碼中,以便捕獲異常。
(16)
調用
processActionForward()
方法,把
Action
的
execute()
方法返回的
ActionForward
對象作為參數傳給它。
processActionForward()
根據
ActionForward
對象包含的請求轉發信息來執行請求轉發或重定向。
?
<!--[if !supportLists]-->(b)???<!--[endif]-->擴展RequestProcessor類
開發人員可以很方便地創建客戶化的
RequestProcessor
類。
在
Struts
配置文件中,
<controller>
元素的
processorClass
屬性
RequestProcessor
類。
?
?
3 Action
類
Action
類是用戶請求和業務邏輯之間的橋梁。每個
Action
充當客戶的一項業務代理。在
RequestProcessor
類預處理請求時,在創建了
Action
的實例后,就調用自身的
processActionPerform()
方法,該方法再調用
Action
類的
execute()
方法。
Action
的
execute()
方法調用模型的業務方法,完成用戶請求的業務邏輯,然后根據執行結果把請求轉發給其他合適的
Web
組件。
?
<!--[if !supportLists]-->(a)???<!--[endif]-->Action類緩存
為了確保線程安全
(thread-safe)
,在一個應用的生命周期中,
Struts
框架只會為每個
Action
類創建一個
Action
實例。所有的客戶請求共享一個
Action
實例,并且所有請求線程可以同時執行它的
execute()
方法。
RequestProcessor
類包含一個
HashMap
,作為存放所有
Action
實例的緩存,每個
Action
實例在緩存中存放的屬性
key
為
Action
類名。在
RequestProcessor
類的
processActionCreate()
方法中,首先檢查在
HashMap
中是否存在
Action
實例,如果存在,就返回這個實例;否則,就創建一個新的
Action
實例。創建
Action
實例的代碼位于同步代碼塊中,以保證只有一個線程創建
Action
實例。一旦線程創建了
Action
實例并把它存放到
HashMap
中,以后所有的線程就會直接使用這個緩存中的實例。
?
<!--[if !supportLists]-->(b)???<!--[endif]-->ActionForward類
Action
類的
execute()
方法返回一個
ActionForward
對象。
ActionForward
對象代表了
Web
資源的邏輯抽象,這里的
Web
資源可以是
JSP
頁、
Java Servlet
或
Action
。從
execute()
方法中返回
ActionForward
對象有兩種方法:
·
在
execute()
方法中動態創建一個
ActionForward
實例
·
在
Struts
配置文件中配置
<forward>
元素。
???
???
配置了
<forward>
元素后,在
Struts
框架初始化時就會創建存放
<forward>
元素;
??
在
execute()
方法中只需調用
ActionMapping
實例的
findForward()
方法,來獲取特定的
ActionForward
實例。
findForward()
方法先調用
findForwardConfig()
方法,在
Action
級別(即
<action>
元素內的
<forward>
子元素)尋找匹配的
ActionForward
對象。如果沒有,再在全局級別(即
<global-forwards>
元素內的
<forward>
子元素)中尋找匹配的
ActionForward
對象。如果找到,就返回該
ActionForward
對象。如果
findForward()
方法沒有找到匹配的
ActionForward
對象,它不會拋出異常,而是返回
null
。在瀏覽器端,用戶將收到一個空白頁。
采用第二種方式,無需在程序中硬編碼來指定轉發資源的無力路徑,而是在配置文件中配置轉發資源,程序中秩序引用轉發資源的邏輯名即可,這提高了應用的靈活性和可維護性。
?
<!--[if !supportLists]-->(c)???<!--[endif]-->創建支持多線程的Action類
在
Struts
應用的生命周期中,只會為每個
Action
類創建一個實例,所有的客戶請求共享這個實例。因此,必需保證在多線程環境中,
Action
也能正常工作。保證線程安全的重要元素是在
Action
類中僅僅使用局部變量,謹慎地使用實例變量。
如果在
Action
的
execute()
方法中定義了局部變量,對于每個調用
execute()
方法的線程,
Java
虛擬機會在每個線程的堆棧中創建局部變量,因此每個線程擁有獨立的局部變量,不會被其他線程共享。當線程執行完
execute()
方法時,它的局部變量就會被銷毀。
如果在
Action
類中定義了實例變量,那么在
Action
實例的整個生命周期中,這個實例變量被所有的請求線程共享。因此不能在
Action
類中定義代表特定客戶狀態的實例變量。
在
Action
類中定義的實例變量代表了可以被所有請求線程訪問的共享資源。為了避免共享資源的競爭,在必要的情況下,需要采用
Java
同步機制對訪問共享資源的代碼塊進行同步。
?
(d)Action
類的安全
在某些情況下,如果
Action
類執行的功能非常重要,則只允許具有特定權限的用戶才能訪問該
Action
。為了防止未授權的用戶來訪問
Action
,可以在配置
Action
時指定安全角色。
<action>
元素的
roles
屬性指定訪問這個
Action
的用戶必須具備的安全角色,多個角色之間以逗號隔開。
RequestProcessor
類在預處理請求時會調用自身的
processRoles()
方法,該方法先檢查在配置文件中是否未
Action
配置了安全角色,如果配置了安全角色,就調用
HttpServletRequest
的
isUserInRole()
方法,來判斷用戶是否具備了必要的安全角色。如果不具備,就直接向客戶端返回錯誤。
?
?
?
二
使用內置的
StrutsAction
類
?
Struts
提供了一些現成的
Action
類,在
Struts
應用中直接使用這些
Action
類可以大大節省開發時間。
?
1 org.apache.struts.actions.ForwardAction
類
?
在
JSP
網頁中,盡管可以直接通過
<jsp:forward>
標簽把請求轉發給其他
Web
組件,但是
Struts
框架提倡先把請求轉發給控制器,再由控制器來負責請求轉發。
?
?
有控制器來負責請求轉發有以下一些優點:
·控制器具有預處理請求功能,它能夠選擇正確的子應用模塊來處理請求,并且把子應用模塊的
ModuleConfig
和
MessageResources
對象存放在
request
范圍內。這樣,請求轉發的目標
Web
組件就可以正常地訪問
ModuleConfig
和
MessageResources
對象。
·如果
JSP
頁面中包含
HTML
表單,那么控制器能夠創建和這個表單對應的
ActionForm
對象,把用戶輸入表單數據組裝到
ActionForm
中。如果
<action>
元素的
validate
屬性為
true
,那么還會調用
ActionForm
的表單驗證方法??刂破靼?/span>
ActionForm
對象存放在
request
或
session
范圍內,這樣請求轉發的目標
Web
組件也可以訪問
ActionForm
。
·
JSP
網頁之間直接相互轉發違背了
MVC
的分層原則,按照
MVC
設計思想,控制器負責處理所有請求,然后選擇適當的視圖組件返回給用戶,如果直接讓
JSP
相互調用,控制器就失去了流程控制作用。
?
?
對于用戶自定義的
Action
類,既可以負責請求轉發,還可以充當客戶端的業務代理,如果僅僅需要
Action
類提供請求轉發功能,則可以使用
org.apache.struts.actions.ForwardAction
類。
ForwardAction
類專門用于轉發請求,不執行任何其他業務操作。
? ActionServlet
把請求轉發給
ForwardAction
,
ForwardAction
再把請求轉發給
<action>
元素中
parameter
屬性指定的
Web
組件??傊?,在
Web
組件之間通過
ForwardAction
類來進行請求轉發,可以充分利用
Struts
控制器的預處理請求功能。此外,也可以通過
<action>
元素的
forward
屬性來實現請求轉發。
?
2 org.apache.struts.actions.IncludeAction
類
?
在
JSP
網頁中,盡管可以直接通過
<include>
指令包含另一個
Web
組件,但是
Struts
框架提倡先把請求轉發給控制器,再由控制器來負責包含其他
Web
組件。
IncludeAction
類提供了包含其他
Web
組件的功能。與
ForwardAction
一樣,
Web
組件通過
IncludeAction
類來包含另一個
Web
組件,可以充分利用
Struts
控制器的預處理功能。
<action>
的
paramter
屬性指定需要包含的
Web
組件。此外,也可以通過
<action>
元素的
include
屬性來包含
Web
組件。
?
3 org.apache.struts.actions.DispatchAction
類
?
通常,在一個
Action
類中,只能完成一種業務操作,如果希望在同一個
Action
類中完成一組相關的業務操作,可以使用
DispatchAction
類。
?
創建一個擴展
DispatchAction
類的子類,不必覆蓋
execute()
方法,而是創建一些實現實際業務操作的方法,這些業務方法都應該和
execute()
方法具有同樣的方法簽名,即他們的參數和返回類型都應該相同,此外也應該聲明拋出
Exception
。
?
在配置
DispatchAction
類時,需要把
parameter
屬性設置為“
method
”。設置之后,當用戶請求訪問
DispatchAction
時,應該提供
method
請求參數。
?
4 org.apache.struts.actions.LookupDispatchAction
類
LookupDispatchAction
類是
DispatchAction
的子類,在
LookupDispatchAction
類中也可以定義多個業務方法。通常
LookupDispatchAction
主要應用于在一個表單中有多個提交按鈕,而這些按鈕又有一個共同的名字的場合,這些按鈕的名字和具體的
ActionMapping
的
parameter
屬性值相對應。
在
Struts
配置文件中配置
LookUpDispatchAction
:
在
<action>
元素中,設置
parameter
屬性時,需要使它和
<html:submit>
標簽的
property
屬性保持一致。
?
5 org.apache.struts.actions.SwitchAction
類
SwitchAction
類用于子應用模塊之間的切換。對于請求訪問
SwitchAction
的
URL
,需要提供兩個參數:
·
prefix
:指定子應用模塊的前綴,以“
/
”開頭,默認子應用模塊的前綴為空字符串“”。
·
page
:指定被請求
Web
組件的
URI
,只需指定相對于被切換后的子應用模塊的相對路徑。
?
?
三
利用
Token
解決重復提交
?
?
在某些情況下,如果用戶對同一個
HTML
表單多次提交,
Web
應用必需能夠判斷用戶的重復提交行為,以作出相應的處理。
?
可以利用同步令牌(
Token
)機制來解決
Web
應用中重復提交的問題,
Struts
也給出了一個參考實現。
org.apache.struuts.action.Action
類中提供了一系列和
Token
相關的方法:
?
·
protected boolean isTokenValid(javax.servlet.http.HttpServletRequestrequest)
判斷存儲在當前用戶會話中的令牌值和請求參數中的令牌值是否匹配。如果匹配,就返回
true
,否則返回
false
。只要符合一下情況之一,就返回
false
:
·不能存在
HttpSession
對象。
·在
session
范圍內沒有保存令牌值。
·在請求參數中沒有令牌值
·存儲在當前用戶
session
范圍內的令牌值和請求參數中的令牌值不匹配。
?
·
protected voidresetToken(javax.servlet.http.HttpServletRequest request)
從當前
session
范圍內刪除令牌屬性。
?
·
protected voidsaveToken(javax.servlet.http.HttpServletRequest request)
創建一個新的令牌,并把它保存在當前
session
范圍內。如果
HttpSession
對象不存在,就首先創建一個
HttpSession
對象。
?
?
具體的
Token
處理邏輯由
org.apache.struts.util.TokenProcessor
類來完成,它的
generateToken(request)
方法根據用戶會話
ID
和當前系統時間來生成一個唯一的令牌。
?
?
四
實用類
?
?
在創建
Web
應用時,有許多檢索和處理
HTTP
請求的操作時重復的。為了提高應用代碼的可重用性,減少冗余,
Struts
框架提供了一組提供這些通用功能的實用類,它們可以被所有的
Struts
應用共享。
?
1 RequestUtils
類
org.apache.struts.util.RequestUtils
為
Struts
控制框架提供了一些處理請求的通用方法。
RequestUtils
類中的所有方法都是線程安全的,在這個類中沒有定義任何實例變量,所有的方法都被聲明為
static
類型。因此,不必創建
RequestUtils
類的實例,可以直接通過類名來訪問這些方法。
RequestUtils
類的常用方法
方法
|
描述
|
absoluteURL(HttpServletRequest request,String utl)
|
創建并返回絕對
URL
路徑,參數
path
指定相對于上下文(
context-relative
)的相對路徑
|
createActionForm(HttpServletRequest request, ActionMapping mapping, ModuleConfig moduleConfig, ActionServlet servlet)
|
先從
request
或
session
范圍內查找該
ActionForm
,如果存在,就直接將它返回,否則先創建它的實例,把它保存在
request
或
session
范圍內,再把它返回。
mapping
參數包含了
<action>
元素的配置信息,例如它的
scope
屬性指定
ActionForm
的范圍
|
populate(Object bean, HttpServletRequest request)
|
把
HTTP
請求中的參數值組裝到指定的
JavaBean
中,請求的參數名和
JavaBean
的屬性名匹配。當
ActionServlet
把用戶輸入的表單數據組裝到
ActionForm
中時,就調用此方法
|
?
2 TagUtils
類
org.apache.struts.taglib.TagUtil
類為
JSP
標簽處理類提供了許多實例方法,如果要使用
TagUtils
類,首先應調用
TagUtils.getInstance()
方法,獲得
TagUtils
類的實例,
getInstance()
方法為靜態方法。
TagUtils
類的常用方法
方法
|
描述
|
getInstance()
|
返回一個
TagUtils
的實例。該方法為靜態的,如果要在程序中獲得
TagUtils
的實例,可以調用
TagUtils.getInstance()
方法
|
getActionMessages(PageContext pageContext, String paramName)
|
調用
pageContext.findAttribute(paramName)
方法,從
page, request, session
和
application
范圍內減縮并返回
ActionMessages
對象,參數
paramName
指定檢索
ActionMessages
對象的屬性
key
|
getModuleConfig(PageContext pageContext)
|
返回
ModuleConfig
對象,如果不存在,就返回
null
|
lookup(PageContext pageContext, String name, String scope)
|
返回特定范圍內的
JavaBean
。參數
scope
指定
JavaBean
的所在范圍,
name
參數指定
JavaBean
在特定范圍內的名字
|
message(PageContext pageContext, String bundle, String locale, String key)
|
從指定的
Resource Bundle
中返回一條消息文本,參數
locale
指定
Locale
,參數
key
指定消息
key
|
write(PageContext pageContext, String text)
|
向網頁上輸入特定的文本,參數
text
用于指定文本內容
|
?
3 ModuleUtils
類
org.apache.struts.taglib.ModuleUtils
類提供了處理子應用模塊的實用方法,如果要使用
ModuleUtils
類,首先應該調用
ModuleUtils.getInstance()
方法,獲得
ModuleUtils
類的實例,
getInstance()
方法為靜態方法。
ModuleUtils
類的常用方法
方法
|
描述
|
getInstance()
|
返回一個
ModuleUtils
的實例。該方法為靜態的,如果要在程序中獲得
ModuleUtils
的實例,可以調用
ModuleUtils.getInstance()
方法。
|
getModuleConfig(javax.servlet.http.HttpervletRequest request)
|
從
request
范圍內檢索并返回
ModuleConfig
對象
|
getModuleConfig(java.lang.String prefix, javax.servlet.ServletContext context)
|
從
application
范圍內檢索并返回
ModuleConfig
對象,參數
prefix
指定子應用模塊名的前綴
|
getModuleName(javax.servlet.http.HttpServletRequest request, javax.servlet.ServletContext context)
|
返回請求訪問的子應用模塊的名字
|
selectModule(javax.servlet.http.HttpServletRequest request, javax.servlet.ServletContext context)
|
選擇請求訪問的子應用模塊,把和子應用模塊相關的
ModuleConfig
和
MessageResources
對象存儲到
request
范圍中
|
?
4 Globals
類
org.apache.struts.Globals
類提供一組公共類型的靜態常量,被用作在特定范圍內存放
JavaBean
的屬性
key
。
Globals
類中定義的常量
方法
|
描述
|
ACTION_SERVLET_KEY
|
代表在
application
范圍內存放
ActionServlet
實例的屬性
key
|
DATA_SOURCE_KEY
|
代表在
application
范圍內存放默認的
DataSource
實例的屬性
key
|
ERROR_KEY
|
代表在
request
范圍內存放
ActionErrors
實例的屬性
key
|
LOCALE_KEY
|
代表在
session
范圍內存放
Locale
實例的屬性
key
|
MAPPING_KEY
|
代表在
request
范圍內存放
ActionMapping
實例的屬性
key
|
MESSAGE_KEY
|
代表在
request
范圍內存放
ActionMessages
實例的屬性
key
|
MESSAGES_KEY
|
代表在
application
范圍內存放各個子應用模塊的
MessageResources
實例的屬性
key
的前綴
|
MODULE_KEY
|
代表在
application
范圍內存放各個子應用模塊的
ModuleConfig
實例的屬性
key
的前綴
|
REQUEST_PROCESSOR_KEY
|
代表在
application
范圍內存放各個子應用模塊的
RequestProcessor
實例的屬性
key
的前綴
|
閱讀材料:《精通Struts:基于MVC的Java Web設計與開發》
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=372708