Jhonney的專欄

             ----人見人愛
          隨筆 - 49, 文章 - 1, 評(píng)論 - 23, 引用 - 0
          數(shù)據(jù)加載中……

          SimpleFormController workflow

                很久前,對(duì)SimpleFormController 和AbstractWizardFormController做過一段深入的分析,并對(duì)向?qū)偷淖隽藗€(gè)實(shí)例,但是估計(jì)是很少動(dòng)手了,現(xiàn)在對(duì)這些東西又模糊了,我快瘋了。
                需要注意的是這兩個(gè)控制器都是橫跨兩個(gè)頁(yè)面的控制器,一個(gè)是get進(jìn)入修改或新增頁(yè)面,另一個(gè)就是頁(yè)面提交即保存或增加

                由于SimpleFormController是繼承AbstractFormController,在該AbstractFormController中的handleRequestInternal方法需要判斷當(dāng)前提交的方法是Get還是Post,如果是Get則是New一個(gè)View,如果是Post則是運(yùn)行客戶端業(yè)務(wù)邏輯,然后跳轉(zhuǎn)到成功頁(yè)面。

          •  通過Get 方式請(qǐng)求一個(gè)View

          1、Controller受到一個(gè)Get請(qǐng)求;

          2、formBackingObject()方法,如果需要讀取數(shù)據(jù)庫(kù),這里是一個(gè)比較好的地方去做這件事情。然后將Object通過request.setAttribute來傳遞到頁(yè)面;如果頁(yè)面表單需要綁定多個(gè)Object,可以在這里讀取數(shù)據(jù)庫(kù)取得,然后設(shè)置到頁(yè)面上。

          3、initBinder() 這里是用來進(jìn)行數(shù)據(jù)格式化轉(zhuǎn)換的;如果在頁(yè)面上顯示某些類型需要進(jìn)行格式化顯示,那么需要在XXXXFormController中重載該方法,指定特定的轉(zhuǎn)換器完成對(duì)特定Object的設(shè)置。如對(duì)于日期格式需要在本方法中增加如下代碼:

          binder.registerCustomEditor(Date.class, null, new CustomDateEditor(

          new SimpleDateFormat("MM/dd/yyyy"),true));

          4、調(diào)用AbstractFormController.handleRequestInternal方法,在該方法中判斷,如果是新建一個(gè)Form View,則調(diào)用ShowNewForm方法,在ShowNewForm方法中調(diào)用了ShowForm方法,SimpleFormController實(shí)現(xiàn)了此方法,指向的url是Controller中注冊(cè)的formView參數(shù)。

          6、View 模塊完成,顯示給用戶。

           

          • 通過Post方式提交一個(gè)Form

          1、  提交后根據(jù)Action指向的URL在urlMapping配置中找到指定的Controller;

          2、  如果配置了Validator則使用該Validator(見applicationContext-validation.xml)進(jìn)行相關(guān)的驗(yàn)證;缺省是beanValidator。錯(cuò)誤信息寫入到errors參數(shù)里。

          3、  調(diào)用AbstractFormController.handleRequestInternal方法,在該方法中判斷是通過Post來調(diào)用此方法,則調(diào)用processFormSubmission方法,該方法會(huì)先判斷errors中是否有驗(yàn)證錯(cuò)誤,如果有則返回到原表單頁(yè)面,顯示錯(cuò)誤信息。

          4、  驗(yàn)證通過后進(jìn)入onSubmit方法,該方法的command參數(shù)對(duì)應(yīng)綁定到頁(yè)面的對(duì)象,

          如果在表單中有多個(gè)對(duì)象需要進(jìn)行綁定,那么其它對(duì)象可以通過this.bindAndValidate(HttpServletRequest request, Object command);方法來進(jìn)行綁定。

          5、  做相關(guān)的業(yè)務(wù)操作。

          6、  往返回界面上輸出結(jié)果提示信息,通過getText和saveMessage()方法完成。getText()第一個(gè)參數(shù)是在資源文件中的信息代碼,第二個(gè)參數(shù)是發(fā)給該信息的參數(shù),在該信息中通過{0}來讀取,第三個(gè)參數(shù)是當(dāng)前使用的Locale。saveMessage()的信息顯示是通過common\messages.jsp來進(jìn)行。

          7、  返回一個(gè)ModelAndView(new RedirectView(success)),success對(duì)應(yīng)action-servlet.xml文件該Controller所配置successView,跳轉(zhuǎn)路徑是相對(duì)路徑。

          而對(duì)于MultiActionController來說,要么繼承這個(gè)類,要么給它設(shè)個(gè)delegate,注意不能類中出現(xiàn)方法多態(tài)。相對(duì)簡(jiǎn)單一些

          posted on 2007-06-22 22:01 Jhonney 閱讀(538) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 云霄县| 湖南省| 台江县| 甘孜县| 中西区| 桂林市| 东丰县| 南部县| 迁西县| 霍林郭勒市| 洛南县| 天峻县| 延庆县| 饶阳县| 新闻| 库车县| 辉南县| 肥乡县| 依安县| 佛学| 贡嘎县| 沾化县| 大安市| 山东| 广东省| 阿拉善左旗| 乌兰浩特市| 定日县| 泗阳县| 香河县| 双牌县| 怀来县| 原阳县| 额敏县| 镇雄县| 东光县| 海林市| 大悟县| 肇庆市| 安陆市| 博白县|