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