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)中進行處理。