Posted on 2007-04-27 17:07
kook 閱讀(526)
評(píng)論(1) 編輯 收藏 所屬分類:
J2EE
1. 我們先詳細(xì)介紹一下Struts的控制器的工作流程。
首先,控制器(ActionServlet)進(jìn)行初始化工作,讀取配置文件struts-config.xml,為不同的Struts模塊初始化相應(yīng)的ModuleConfig對(duì)象。相應(yīng)地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。
AppFuse中設(shè)計(jì)了一個(gè)繼承ActionServlet 的子類:LoginServlet做為控制器,對(duì)ActionServlet的功能進(jìn)行了擴(kuò)展。主要的功能是對(duì)本系統(tǒng)使用到的一些組件進(jìn)行初始化工作,如用戶身份的安全校驗(yàn)url、密碼加密規(guī)則等。
控制器接收到HTTP請(qǐng)求,并從ActionConfig中找出對(duì)應(yīng)于該請(qǐng)求的Action子類,如果沒(méi)有對(duì)應(yīng)的Action,控制器直接將請(qǐng)求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁(yè)面。否則控制器將請(qǐng)求分發(fā)至具體Action類進(jìn)行處理。
在控制器調(diào)用具體Action的方法之前,相應(yīng)的ActionForm對(duì)象將利用HTTP請(qǐng)求中的參數(shù)來(lái)填充自己。此外,若所操作的ActionForm類配置了validate,系統(tǒng)會(huì)調(diào)用validate組件來(lái)檢查請(qǐng)求參數(shù)的合法性,并且返回一個(gè)包含所有錯(cuò)誤信息的ActionErrors對(duì)象。如果執(zhí)行成功,ActionForm自動(dòng)將這些參數(shù)信息以FormBean的方式保存在Servlet Context中,這樣它們就可以被其它Action對(duì)象或者JSP調(diào)用。
執(zhí)行完成Action中的方法之后,返回一個(gè)ActionForward對(duì)象,控制器通過(guò)該ActionForward對(duì)象來(lái)進(jìn)行轉(zhuǎn)發(fā)工作。
AppFuse實(shí)現(xiàn)的最主要的功能是對(duì)用戶的管理。下面就以對(duì)用戶的管理來(lái)說(shuō)明一下AppFuse控制器的實(shí)現(xiàn)。
與用戶信息表單數(shù)據(jù)相關(guān)的FormBean是UserForm。UserForm用來(lái)存放用戶的基本信息。
UserForm的控制器是org.appfuse.webapp.action.UserAction。UserAction繼承了BaseAction。BaseAction也是系統(tǒng)中幾乎所有Action類的父類,它繼承自Struts提供的DispatchAction,并提供了控制層通用的方法。
2. Action
Action是用戶請(qǐng)求和業(yè)務(wù)邏輯之間的橋梁,每個(gè)Action充當(dāng)客戶的一項(xiàng)業(yè)務(wù)代理。主要完成以下任務(wù):
1. 接收用戶請(qǐng)求。
2. 根據(jù)用戶請(qǐng)求,調(diào)用合適的模型組件來(lái)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。
3. 獲取業(yè)務(wù)邏輯執(zhí)行結(jié)果
4. 根據(jù)當(dāng)前狀態(tài)以及業(yè)務(wù)邏輯執(zhí)行結(jié)果,選擇合適的視圖組件返回給用戶。
3. DispatchAction
org.apache.struts.actions.DispatchAction是org.apache.struts.action.Action的子類。
Action的execute()方法是調(diào)用模型的業(yè)務(wù)方法,完成用戶請(qǐng)求的業(yè)務(wù)邏輯,然后根據(jù)執(zhí)行結(jié)果把請(qǐng)求轉(zhuǎn)發(fā)給其它合適的Web組件。通常,在一個(gè)Action類中只能完成一種業(yè)務(wù)操作(通過(guò)execute()方法)。
DispatchAction允許用戶將完成一個(gè)業(yè)務(wù)邏輯所需要的連續(xù)動(dòng)作和相關(guān)動(dòng)作集中于一個(gè)Action類中。無(wú)須覆蓋execute()方法,而是可以創(chuàng)建一些實(shí)現(xiàn)實(shí)際業(yè)務(wù)操作的方法,用戶通過(guò)method請(qǐng)求參數(shù)指定所需要使用的方法。
4. BaseAction
BaseAction中實(shí)現(xiàn)了系統(tǒng)中Action子類需要用到的通用方法,主要有:
1. public Object getBean(String name):通過(guò)讀取Spring的applicationContext-service.xml配置文件來(lái)創(chuàng)建實(shí)例從而實(shí)現(xiàn)“依賴注入”的方法。
2. public ActionMessages getMessages(HttpServletRequest request):初始化Struts的ActionMessages,并返回。
3. protected Object convert(Object o) :POJO與FormBean之間的轉(zhuǎn)換方法。
4. execute():置換了原始的execute()方法。作用是根據(jù)請(qǐng)求的url尋找相關(guān)的業(yè)務(wù)方法(沒(méi)有method請(qǐng)求參數(shù)時(shí))。例如請(qǐng)求的頁(yè)面是editUser.html,則執(zhí)行edit()方法。
5. protected ActionForm getActionForm(ActionMapping mapping, HttpServletRequest request):在mapping范圍內(nèi)得到一個(gè)Action FormBean。
6. protected User getUser(HttpSession session) :從Session中拿到當(dāng)前登錄用戶信息。
7. protected void updateFormBean(ActionMapping mapping, HttpServletRequest request, ActionForm form):在指定的范圍內(nèi)更新當(dāng)前Action 所對(duì)應(yīng)的Form Bean對(duì)象。
8. protected void removeFormBean(ActionMapping mapping, HttpServletRequest request):去除無(wú)用的Form Bean。
5. UserAction
UserAction是用戶數(shù)據(jù)管理的控制器,提供了對(duì)用戶數(shù)據(jù)的添加、修改、刪除、查詢等操作的控制,其包含的業(yè)務(wù)方法有:
1. add():進(jìn)入添加用戶頁(yè)面。
2. cancel():當(dāng)用戶在表單中點(diǎn)擊“取消”按鈕時(shí),執(zhí)行該方法。如果用戶是通過(guò)用戶列表進(jìn)入該表單,即當(dāng)前用于擁有管理其它用戶的權(quán)限,返回到用戶列表,否則返回到主頁(yè)面。
3. delete():根據(jù)請(qǐng)求的用戶ID調(diào)用業(yè)務(wù)層的removeUser ()方法刪除相應(yīng)的記錄,返回到用戶列表。
4. edit():首先校驗(yàn)用戶請(qǐng)求的URL是否為editProfile.html,若是,表示當(dāng)前登錄用戶要查看自己的信息,此時(shí)請(qǐng)求路徑中不應(yīng)該含有用戶ID(用戶ID從Session中取得)或用于標(biāo)識(shí)請(qǐng)求是通過(guò)用戶列表的from參數(shù),如果含有這兩個(gè)參數(shù),發(fā)出“無(wú)權(quán)限”的錯(cuò)誤信息。若不是,表示當(dāng)前用戶是通過(guò)用戶列表進(jìn)行請(qǐng)求。根據(jù)請(qǐng)求的用戶ID調(diào)用業(yè)務(wù)層的getUser ()方法取得相應(yīng)的記錄。更新相應(yīng)的FormBean。
5. save():當(dāng)需要要添加或修改用戶信息時(shí),執(zhí)行該方法。首先校驗(yàn)請(qǐng)求參數(shù)中是否有“encryptPass”并值為“true”,若是,表示密碼需要加密,隨即將密碼加密。然后調(diào)用業(yè)務(wù)層的getRole ()方法將提交的用戶權(quán)限持久化。調(diào)用業(yè)務(wù)層的saveUser ()方法,保存用戶信息。如果用戶編輯的是自己的信息,更新Session中的當(dāng)前登錄用戶信息。如果用戶在登錄時(shí)選擇了“記住我”,更新保存的Cookie。如果用戶編輯的是其它用戶的信息,根據(jù)version判斷是新添數(shù)據(jù)還是修改數(shù)據(jù),在ActionMessages中存儲(chǔ)不同的消息,返回到添加/修改用戶信息頁(yè)面。若是新添數(shù)據(jù),調(diào)用sendNewUserEmail()給新用戶發(fā)送一封Email。
6. search():具有管理權(quán)限的用戶進(jìn)入用戶列表時(shí)執(zhí)行該方法。調(diào)用業(yè)務(wù)層的getUsers ()方法,取得包含所有用戶信息的List。返回到用戶列表頁(yè)面。
7. unspecified():如果請(qǐng)求的url沒(méi)有包含method參數(shù),通過(guò)BaseAction的execute()方法也找不到指定的方法時(shí),執(zhí)行該方法。在該方法中轉(zhuǎn)到search()方法。
以上是很多Action需要用到的基本的方法。
8. sendNewUserEmail():根據(jù)FormBean中的內(nèi)容給用戶發(fā)送一封Email。
9. checkForCookieLogin():如果用戶是通過(guò)Cookie登錄(用戶在登錄時(shí)選擇了“記住我”),發(fā)出一個(gè)消息警告用戶不能修改密碼。