<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 5, comments - 24, trackbacks - 0, articles - 20
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    AppFuse學(xué)習(xí)筆記-控制層 4

    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è)消息警告用戶不能修改密碼。


    評(píng)論

    # re: AppFuse學(xué)習(xí)筆記-控制層 4  回復(fù)  更多評(píng)論   

    2008-08-19 12:12 by ThomasYe
    AppFuse 2.0.2發(fā)布了。能不能結(jié)合AppFuse 2.0.2進(jìn)行描述。謝謝了!
    主站蜘蛛池模板: 最近2019中文字幕免费大全5| 久草视频在线免费| 亚洲福利视频一区| 亚洲欧洲精品视频在线观看| 免费做爰猛烈吃奶摸视频在线观看| 狠狠入ady亚洲精品| 亚洲国产精彩中文乱码AV| 日韩精品福利片午夜免费观着| 亚洲成a∨人片在无码2023| 亚洲精品无码乱码成人| 我要看免费的毛片| 中国黄色免费网站| 中中文字幕亚洲无线码| 中文字幕亚洲无线码| 久久一区二区三区免费| 中文文字幕文字幕亚洲色| 亚洲综合国产一区二区三区| 免费国产黄线在线观看| 三级毛片在线免费观看| 亚洲性色AV日韩在线观看| 女人18毛片a级毛片免费 | 亚洲日韩AV一区二区三区中文| 亚洲成a人片在线观看日本麻豆| 久久精品无码专区免费东京热 | 亚洲精品无码av中文字幕| 国产AV无码专区亚洲AV毛网站| 永久免费AV无码网站在线观看| 久久A级毛片免费观看| 一二三四在线观看免费中文在线观看 | 国产一级淫片免费播放| 牛牛在线精品免费视频观看| 亚洲视频免费一区| 国语成本人片免费av无码| 永久免费AV无码网站国产| 亚洲精品中文字幕乱码影院| 亚洲日韩国产成网在线观看| 成年美女黄网站色大免费视频| 一级毛片在线免费观看| 日本亚洲免费无线码| 亚洲精品中文字幕乱码影院| 亚洲高清在线播放|