张孝祥专栏

以平常心工作,远离忧虑,除了让自己快乐,也要让别人快乐!

用户操作
[即时聊天] [发私信] [加为好友]
张孝祥ID:zhangxiaoxiang
555136次访问,排名74好友4人,关注者134
zhangxiaoxiang的文章
原创 129 篇
翻译 0 篇
转载 2 篇
评论 339 篇
张孝祥的公告
《深入体验Java Web开发内幕——高级特性》已经出版。 传智播客开展:先培训,就业后再还款活。详细信息查询:http://www.itcast.cn/goodnews.htm
最近评论
kwlong2008:

来看看朋友,最近过的怎么样?俺的空间是介绍
网站制作网站建设的,有时间也常去一下我的空间谢谢,
kwlong2008:

来看看朋友,最近过的怎么样?俺的空间是介绍
网站制作网站建设的,有时间也常去一下我的空间谢谢,
kwlong2008:

来看看朋友,最近过的怎么样?俺的空间是介绍
网站制作网站建设的,有时间也常去一下我的空间谢谢,
kwlong2008:

来看看朋友,最近过的怎么样?俺的空间是介绍
网站制作网站建设的,有时间也常去一下我的空间谢谢,
programmer_duncan:谢谢张老师分享!!!
文章分类
收藏
    相册
    传智播客原创教材展示
    培训
    《深入体验javaweb开发内幕——高级特性》出版啦!
    培训就业后还款计划正式启航
    良少的blog
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 11月28日Validator框架培训日记收藏

    新一篇: 11月30在spring mvc中使用Validator框架和文件上传 | 旧一篇: struts表单校验失败后的整数重显问题

    validation.xml文件中的<form>代表一组校验规则,我们可以使用它的name属性值来选择这组规则去对某个JavaBean进行校验,也就是给JavaBean安上一组怎样的校验规则。
    <Valdiator>元素的msg属性相当于该Validator的一个标记,如果该validator校验失败,我们可以取出它的msg,至于msg代表什么信息,validator框架不管。我们自己拿着msg去我们的资源文件中查。

    Validator,ValidatorResources,ValidatorAction,Field是Validator框架中的几个重要的API类。Validator是调用Validator框架的入口类,ValidatorResources对应validator的xml配置文件,ValidatorAction对应xml文件中的<validator>元素、Field对应<field>元素、Form类对应<form>元素。查看Validator的源代码,了解了Validator是怎样去调用校验方法的,是怎样将参数信息传递给这些校验方法的。validator.validate()方法的源代码,对于1.3.0版本,validate方法中的如下代码应该是一个Bug。
    if (form != null) {
                this.setParameter(FORM_PARAM, this);
    应改为:this.setParameter(FORM_PARAM, form);

    调用validator.setParameter方法将一个个参数对象存入到一个Map中,关键字就是类的名称,Validator.BEAN_PARAM等常量也是一些类的完全限定名称,在ValidatorAction内部通过反射获得验证方法对应的Method对象,然后根据其参数的类型名作为关键字从Map中检索相应的值作为参数,所以,Map中存储的条目可以多于验证方法所接收的参数个数的。
    valiator.validate-->form.validate-->field.validate-->ValidateAction.executeValidationMethod
    这一串的方法调用过程向存储参数的Map对象中存入了Validator、Form、Field、ValidateAction等对象。在validator的源代码中,有使用validator的example。Validator框架调用校验方法时,根据参数的类型来选择参数对象,如果要给校验方法传递多个参数类型完全一样的参数,那该怎么做呢?个人的一个想法:可以把这些参数打包成一个组装对象后再传递。

    要使用Validator的JavaScript校验功能,要在jsp页面中使用struts的<html:javascript formName="xxx">标签,其中的xxx是某个校验域的名称,并在需要验证的表单的onsubmit属性中调用"return validateXxx()"方法。validateXxx方法可以通过<html:javascript>的method属性来改变。在struts-rules.xml文件中看到:
       Note: Starting in Struts 1.2.0 the default javascript definitions have
             been consolidated to commons-validator. The default can be overridden
             by supplying a <javascript> element with a CDATA section, just as
             in struts 1.1.
    以后有时间还应该看看<html:javascript>的源代码,看看JavaScript代码是如何生成的,以及看看生成的JavaScript代码的实现细节,这个已经安排张艳清去熟悉了,有机会让他给大家讲讲。在二进制发行包中,有各个javascript源代码,看谁能够读懂这些源代码。


    struts的Validator插件中的有关代码:
     public static Validator initValidator(
            String key,
            Object bean,
            ServletContext application,
            HttpServletRequest request,
            ActionMessages errors,
            int page) {

            ValidatorResources resources =
                Resources.getValidatorResources(application, request);

            Locale locale = RequestUtils.getUserLocale(request, null);

            Validator validator = new Validator(resources, key);
            validator.setUseContextClassLoader(true);

            validator.setPage(page);

            validator.setParameter(SERVLET_CONTEXT_PARAM, application);
            validator.setParameter(HTTP_SERVLET_REQUEST_PARAM, request);
            validator.setParameter(Validator.LOCALE_PARAM, locale);
            validator.setParameter(ACTION_MESSAGES_PARAM, errors);
            validator.setParameter(Validator.BEAN_PARAM, bean);

            return validator;
        }

    Struts中的ValidatorForm与ValidatorActionForm的设计思想,可以作为面向对象的一个很好案例。为什么getValidationKey方法中只有一句代码,那还要把这句代码抽取到一个单独的函数中来实现,而不在主函数中直接编写这句代码?不是说有多行代码才要抽取到一个函数中吗?
    如果要为ValidatorActionForm对应的表单生成前台的javascript校验代码,可以使用类似如下的代码:
    <html:javascript formName="/logon" />,其中的formName与校验域的名字完全一样,生成的javascript方法则是按formBean的名称来的。

    如何校验两个密码字段的内容是否相等:讲解了validateif的设计思路,与当前字段进行比较的另外一个字段名必须作为当前校验器的变量进行配置。通过在struts帮助文挡的Validator帮助页面中搜索validateWhen,迅速掌握了ValidateWhen的使用:this两边都有*,整个表达式必须套在()中。
    两个典型的<field>元素的配置:
               <field property="password2"
                        depends="validwhen">
                    <arg   key="prompt.password"/>
                    <var>
                        <var-name>test</var-name>
                        <var-value>(*this* == password)</var-value>
                    </var>
                </field>
                <field property="age"
                        depends="intRange">
                    <arg   key="prompt.age"/>
                    <arg   key="${var:min}" resource="false" position="1"/>
                    <arg   key="${var:max}" name="intRange" position="2"
                       resource="false"/>
                    <var>
                        <var-name>max</var-name>
                        <var-value>60</var-value>
                    </var>
                    <var>
                        <var-name>min</var-name>
                        <var-value>18</var-value>
                    </var>
                </field>

     

    实验中的一个小插曲:即使没有配置DispatchAction的parameter属性,如果表单校验出错,也不会出现该Action的问题,因为只有通过表单校验后,ActionServlet才去调用Action。

    学员们的发现:struts 1.2.4中的mailreader例子的validator-rules.xml文件中的required validator的方法的参数列表中少了一个参数,validateRequired方法本来接受6个参数,但该文件中只声明了5个参数,所以,在使用到该validator时总是报告错误。

    最后讲解了DynaActionForm和DynaValidatorForm,完全不写一行代码,也玩了个登录用例的view层处理,Action使用的是ForwardAction,这可以作为以后免费讲座的一个很吸引人的主题。

    杂记:struts的mail-reader例子程序中的一段<validator>配置。
         <!--
           This simply allows struts to include the validateUtilities into a page, it should
           not be used as a validation rule.
         -->
         <validator name="includeJavaScriptUtilities"
                classname=""
                   method=""
             methodParams=""
                  depends=""
                      msg=""
               jsFunction="org.apache.commons.validator.javascript.validateUtilities"/> 

    发表于 @ 2006年12月04日 22:48:00|评论(loading...)|编辑

    新一篇: 11月30在spring mvc中使用Validator框架和文件上传 | 旧一篇: struts表单校验失败后的整数重显问题

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 张孝祥