推薦淘寶秋冬男裝熱賣網店

          追求無止境

          我的程序人生
          隨筆 - 31, 文章 - 2, 評論 - 20, 引用 - 0
          數(shù)據(jù)加載中……

          Spring MVC 框架學習筆記之BaseCommandController和AbstractCommandController

           

          Spring的BaseCommandController繼承自AbstractController。在看BaseCommandController之前先看他的繼承類AbstractCommandController是如何實現(xiàn)

          AbstractController的handleInternalRequest方法的:

          protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
          throws Exception {
          Object command = getCommand(request);
          ServletRequestDataBinder binder = bindAndValidate(request, command);
          BindException errors = new BindException(binder.getBindingResult());
          return handle(request, response, command, errors);
          }
          

          getCommand就是BaseCommandController中的方法。

          protected Object getCommand(HttpServletRequest request) throws Exception {
          return createCommand();
          }
          protected final Object createCommand() throws Exception {
          if (this.commandClass == null) {
          throw new IllegalStateException("Cannot create command without commandClass being set - " +
          "either set commandClass or (in a form controller) override formBackingObject");
          }
          if (logger.isDebugEnabled()) {
          logger.debug("Creating new command of class [" + this.commandClass.getName() + "]");
          }
          return BeanUtils.instantiateClass(this.commandClass);
          }
          

          createCommand創(chuàng)建了一個CommandClass的對象。

          然后再看bindAndValidate方法:

          protected final ServletRequestDataBinder bindAndValidate(HttpServletRequest request, Object command)
          throws Exception {
          ServletRequestDataBinder binder = createBinder(request, command);
          BindException errors = new BindException(binder.getBindingResult());
          if (!suppressBinding(request)) {
          binder.bind(request);
          onBind(request, command, errors);
          if (this.validators != null && isValidateOnBinding() && !suppressValidation(request, command, errors)) {
          for (int i = 0; i < this.validators.length; i++) {
          ValidationUtils.invokeValidator(this.validators[i], command, errors);
          }
          }
          onBindAndValidate(request, command, errors);
          }
          return binder;
          }
          

          這個方法首先創(chuàng)建了 DataBinder對象,然后,獲取創(chuàng)建綁定對象時發(fā)生的錯誤。報錯在errors。接下來綁定對象,調用onBind處理綁定事件;接下來應用Validator。然后調用onBindAndValidate來處理綁定和驗證事件。最后返回binder。

          處理完之后調用handle方法進行處理。

          綜上所述,AbstractCommandController具有兩個功能:

          1、將請求參數(shù)轉換為Command對象。在該Controller中,我們設置一個object對象。然后BaseCommandController將請求的參數(shù)進行轉換。如果請求參數(shù)有value值,就會調用object的的setValue對象來設置對象里的值。如果請求參數(shù)中有address.city.就會調用object中getAddress().setCity()方法來賦值。這個object可以是任意的object,唯一的要求就是這個object類沒有參數(shù)。

          2、對數(shù)據(jù)進行驗證。在轉換和驗證時發(fā)生錯誤時,需要在handle(request, response, command, errors)中進行處理。

          posted on 2009-11-25 16:25 追求無止境 閱讀(5384) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 台东市| 霍邱县| 石景山区| 咸宁市| 海伦市| 雅江县| 平乡县| 定陶县| 自治县| 延川县| 临潭县| 和田市| 丰原市| 吉木乃县| 秦安县| 沙湾县| 梓潼县| 浦县| 曲阜市| 哈尔滨市| 安新县| 乐昌市| 翼城县| 安化县| 大新县| 民和| 高安市| 鹤庆县| 宝坻区| 沙坪坝区| 桓仁| 平定县| 三门县| 梅州市| 万山特区| 深水埗区| 桓仁| 天峻县| 松潘县| 神农架林区| 游戏|