11月21日spring mvc的表单校验培训日记
2006-11-24 22:32 java ee spring 阅读(214) 评论(0) 编辑 收藏 举报看到HtmlFilter中的一段代码:
StringBuffer result = new StringBuffer(content.length + 50);
顺便问问学员们其中的一些思想和原因,结果回答者甚少,这是我以前就讲解过的一个知识,结果很多人都忘了。这次再给大家讲述一遍,希望大家能够记住。
今天主要讲解如何使用Spring MVC中的Validator对表单数据进行校验,分析了BindException类,ObjectError类,FieldError类的应用。MessageSourceResolvable.getCodes()方法的说明,了解了FieldError构造方法中的String[] codes参数的作用,将逐一尝试其中的元素去从MessageResource中提取信息。
可以向BindException中加入同一字段的多个FieldError和多个ObjectError。可以调用BindException的addError方法,也可以调用Errors接口中定义的系列reject方法,还可以调用ValidationUtils提供的若干工具方法。研究BindException的源文件,了解了与doSetNestedPath方法相关的一些内容,就是最终导致在调用reject方法时,在传入的field名称前加上适当前缀。
对于rejectValue(String field, String errorCode)方法,如果field是email,errorCode是required或invalid,最后产生的消息key是一个数组:..、required.email、..、required,拿着这个数组在消息资源中逐一尝试,详情参看BindException的String[] resolveMessageCodes(String errorCode)方法(注意其中的参数是errorCode)和DefaultMessageCodesResolver类(帮助文档中看所有类,可以迅速检索这个类)。
需要调用setValidator和setValidateOnBinding方法。
通过读BindException的源文件,明白了更多的细节知识,例如,command对象和错误对象是如何绑定到request域中的:BindException.getModel方法返回的Map中包含了command对象和错误对象,OnSubmit方法中使用如下代码:
return new ModelAndView(getSuccessView(), errors.getModel());
showForm方法中使用如下代码:
Map model = errors.getModel();
return new ModelAndView(viewName, model);
在InternalResourceView.exposeModelAsRequestAttributes方法中,它把model这个map对象中的每个元素都存储进了request域中。
通过对Validator的使用,大家更应该明白了框架的作用:“把你的想法,把你的心愿嵌入到框架中,框架提供了插入你的心愿的接口”。
在程序中直接写setValidator(new MyValidator()),eclipse提示错误后,我们可以让eclipse自动帮我们生成MyValidator类,并且自动实现Validator接口。
在中午休息时,为新班客串了一下,讲解了摸版方法设计模式,以了解大家的基础情况和让大家感受我的讲课风格。
什么是设计模式?
为什么Set与HashSet/TreeSet之间要有一个AbstractSet?
AbstractSet类中的几个方法是怎么编写的?这是什么设计模式?
这几个方法的代码会因底层的具体类不同(例如,HashSet/TreeSet)而有变化吗?
摸板方法设计模式:经理定义出咨询员的服务方法的工作流程,服务方法中的每个工作步骤则以抽象方法的形式定义,以后只要找来一个人做咨询员,就要继承咨询员这个类,并实现咨询员中定义的抽象方法。外面只与咨询员的服务方法进行交互,而不知道服务方法内部调用的其他方法的存在,子类中实现的方法是专供服务方法调用的,不被外面的其他类调用。每个子类采用各不相同的方式来实现这些方法,这就好比每个具体的咨询员在完成每个步骤时采用的具体方式可以各不相同。
接着请王泽佑为大家讲解了他研究的validator框架的一些成果,写了一个最简单的使用validator框架的demo程序。