关于validator 验证框架的见解 
一般情况下,validator 验证框架分为两种:客户端验证和服务器端验证。
    对于服务器端验证,本人不提倡。因为现在进行的是简单的数据验证,完全没有必要去服务器
进行验证,那样浏览器与服务器要因为进行不必要的信息交流而浪费大量的时间。
    如果在客户端进行验证,那么其实还是把validator 验证框架的JScript写到了页面。而且
把所有的验证方法的JScript都写了过去,不管有用的还是没有用的。但是这种方法还是可行的,但是如果只写有用的,那会更好。    结合上边的论述,本人觉得还不如直接在页面中用JScript写一些简单的验证规则。
    以上是我自己的一些见解,如果那位有其他的意见,请赐教。大家互相学习!
-------------------------

解决方案 »

  1.   

    我觉得validator的应用可能在表单内容较为复杂是比较有利,因为完全用js的话即使不考虑工作量,程序也比较难看。
    而且应用struts架构本来的目的就是使三层分离,直接拷贝js可能违背了这一初衷。不过,我觉得zeq258(近朱者赤)的有关客户端资源利用的观点还是很有道理的。
      

  2.   

    to  zeq258(近朱者赤) ,
    如果只做客户端验证,我可以很容易拼出 url 来攻击你的程序,你写的这种程序根本不能用!
      

  3.   

    问题转移了
    我是想问一下,在用validator的情况下,要验证注册时设置的密码和密码确认该怎么设置才是?或者如果不用validator的话,在ActionForm里要怎么写,
    public class UserRegisterForm extends ValidatorForm
      

  4.   

    是呀~~~
    他们回答得都不是楼主体的问题,看来,不仅要ask a smart question,还要smart answer啊。我继续关注高人的解答!
      

  5.   

    先解决基本问题先。
    2 个  String 对象不是这么比较的。String a ="abc";
    String b ="abc";
    String c = new String("abc");你打印出 a==b ? , a == c ?    a.equals(b), a.equals(c);看看有什么差别。如果  a.intern() == b .intern() == c.intern() 那就相等了。
      

  6.   

    humanity(很健忘了) : 谢谢
    低级错误,真是惭愧不过似乎还是这个问题,即使我改成了equals之后,
    事实上,经过我断点调试,发现程序根本不处理这个form的validate函数,我怀疑是不是因为继承ValidatorForm的关系,请指教。
      

  7.   

    先说说楼主的问题,楼主到http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse
    下载appfuse1.8.2,它有好几个版本,默认的版本是struts+spring+hibernate的,其他版本使用ww+spring+hibernate或其他框架结构。
    appfuse的struts部分使用了validate框架进行验证,而且作者对struts提供的validate框架进行了修改和扩展,增加了对两个输入框进行是否相等的验证,也就用于你所说的两个密码是否相同的验证。使用方法和validate基本用法类似,你可能需要使用appfuse中提供的struts修改版以及作者扩展的验证文件。
    这足以解决你的问题了。另外,我不同意zeq258(近朱者赤) 的看法。我觉得服务器端验证是非常必要的。以前有人觉得服务器端验证需要占用服务器的处理时间,降低服务器的运行效率,所以反对使用服务器端验证。但是对于目前的硬件条件,这个问题完全可以忽略。
    使用JavaScript进行客户端验证的好处是能够快速的回馈给用户验证信息,省去了用户等待服务器反馈验证信息的时间,可以在本地立即检查并反馈给用户提示信息,提高系统的友好性。现在看来,没有人会否认JS客户端校验的必要性了。而是否进行服务器端验证看起来是可有可无的。
    但是在实际项目中,客户提交的数据的有效性和完整性是必须保证的。有人认为JS已经做了有效性和完整性的检查了啊,可是大家没有注意到吗,现在很多新的浏览器(如FireFox),都提供了禁用JS的设置。只要JS一禁用,而服务器又没有进行校验,格式不正确的数据、过长过短的数据、空数据就会源源不断的添加到数据库中,这也就等于没有进行任何校验。有人说可以在数据库设置不能为空和长度限制啊,但这完全不能满足复杂的校验需求,而且谁愿意看着控制台不停的抛出数据库异常信息?!另外一些人也可能会说,对于那些关键字段,就在程序里写校验代码就可以了。但这明显增加了工作量。
    Struts提供的validation框架就很好的解决了这个问题,它提供了各种常用的校验规则,而且编写校验文件也不是很复杂,更好的是它可以同时提供服务器端和客户端的校验,这正是valiate优秀的地方。像zeq258(近朱者赤) 同志说的,客户端做的都是简单的校验,没有必要放到服务器去。他还举了电子邮件的例子。那好,如果客户端禁用js后,我输入一个abcd作为邮件地址,你的服务器是不检查的,保存到了数据库,请问这是有效数据吗?是否有效暂且不说,另一个邮件发送模块需要按用户的邮件地址发送邮件给用户,这个abcd的邮件发送时就等着抛异常吧,当然你可以多些一些代码捕获这个异常,然后再确定是什么原因引起的...如果是一个结构良好的系统,系统的健壮性是必须考虑了,如果没有服务器校验,那健壮性也就无从谈起,不知还有什么客户愿意使用这样的产品呢?
      

  8.   

    至于zeq258(近朱者赤) 前边所说的,validate框架会把很多验证用的js写到html中,这个问题以前是存在的。
    不过兄台你一定没有了解过新版的struts和validate,不妨找些资料学习一下。至少我开发的项目不存在这个问题,html中嵌入的只有少量的校验代码。建议看看appfuse中的实现。
      

  9.   

    IceCraft(心淡情浓) :谢谢按照你所说的确实是可以解决问题了。但是我在想,是不是在用了validator之后,struts就不能用ActionForm里的validate()函数验证了呢?(确实,这时候ActionForm继承的类已经变成ValidatorForm)
      

  10.   

    是可以使用的,你自己写的validate()实现和validator框架的验证只是一个验证先后的问题。
      

  11.   

    我查了一些资料,里面说ValidatorForm是ActionForm的子类,并且,其中的validate()函数也已被扩展(内容主要是读取validator设置和进行验证),不需要重载了
    所以我才想到是不是这个的缘故。