首先回顧了spring mvc中的表單驗證和業務邏輯校驗失敗后,回到表單頁面中顯示錯誤信息的整個內部運行流程。
表單校驗出錯后回到表單注冊頁面是由默認的SimpleFormController的processFormSubmission方法自動完成的,王濤忘記這一點,他們覆蓋了processFormSubmission方法,直接在processFormSubmission方法中執行業務邏輯校驗,結果導致表單校驗失敗后不能回到表單注冊頁面。
查看幫助文檔,可以了解到SimpleFormController的詳細工作流程,特別是看onSubmit(Object command,BindException errors)這個方法的幫助,就知道怎樣寫業務邏輯校驗失敗的代碼了。
protected ModelAndView onSubmit(Object command,
??????????????????????????????? BindException errors)
{
??errors.addError(new FieldError("name","用戶名重復"));
??return new ModelAndView(this.getFormView(),errors.getModel());
}
接著分析了onSubmit方法與doSubmitAction方法的應用區別。
講解了如何將Validator框架集成到spring中的設計思想:
class MyValidator implements Validator
{
?boolean supports(Class clazz)
?{
??為什么不能使用:UserCommand.class.equals(clazz);?
??這主要是因為Class沒有覆蓋equals方法。
?}
?void validate(Object obj,Errors errors)
?{
?}
}
編寫的校驗方法的定義應該如下:
public static boolean validateFloatRange(java.lang.Object bean,
???????????????????????????????????????? ValidatorAction va,
???????????????????????????????????????? Field field,
???????????????????????????????????????? Errors errors)
{
????????? ......
}
所以,MyValidator類的validate(Object obj,Errors errors)方法應編寫成如下形式“
?void validate(Object obj,Errors errors)
?{
??ValidateResources resources = new ValidateResources(Inputstream []);
??Validator validator = new Validator(resources,"/logon");
??valdiator.setParameter(Validator.PARAM_BEAN,obj);
??validator.setParameter("org.springframework.validation.Errors",errors);
??validator.validate();
??????? }
我問魏奕東,相比他以前不用validator框架而編寫的對表單信息進行校驗的代碼和這次使用validator框架編寫的代碼,哪個更復雜,他愿意采用哪個?顯然,使用validator框架編寫的代碼更復雜、他更愿意用以前的方式進行表單校驗,那我們為什么要使用validator框架呢?這是為了實現代碼重用和校驗邏輯的封裝和配置使用。如果他想在公司做到更高的開發職位,他想拿到更多的工資,他就應該使用validator框架,這樣,其他級別低的程序員可以不寫校驗代碼了,而直接在validator框架中插入魏奕東寫的校驗方法,老板就會將從其他人身上省下的一部分工錢裝入到魏奕東的口袋,呵呵!
魏奕東,別高興得太早!你想干的這份工作,早就有人干了,這就是spring module,它模仿struts實現的validator框架,實現了調用validator框架的sring mvc的Validator,現在,我們就來看看如何使用spring module提供的validtor吧!
接著我為大家講解了如何使用spring module提供的validtor來執行表單校驗,不過,由于spring不支持動態command對象,所以,我們還無法象struts那樣不寫一行代碼也玩個完整的view層。
楊松發現appfuse中帶的spring module 1.0沒有validateWhen這個校驗規則,不過,我們現在用的是spring module 6.0,不用擔心這個問題。
接著為大家講了struts中的文件上傳和spring mvc中的文件上傳,strtus的文件上傳很簡單,而spring mvc中的文件上傳稍微復雜一些,首先要在配置文件中配置CommonsMultipartResolver,spring mvc才會處理multipart的數據請求,接著就可以使用CommonsMultipartFile處理很大的上傳文件了,不用擔心數組越界的問題。王濤能夠接著我講解的思路說出ByteArrayMultipartFileEditor內部其實就是調用了CommonsMultipartFile的getByte方法來實現將上傳的文件轉換成字節數組的,真是不錯,看來他已經有了自己的編程感覺了,呵呵。
?