首先,js验证和validation验证的争论
js验证的好处:
1.javascript可以令到用户一输入错误,马上可以在本页面就验证并弹出提示,而无需
转到servlet中验证后,再转到别的页面显示提示信息.从使用人性化的角度上,用js更为
直观易懂.
2.把验证转到servlet中,其实是一种低效的方法,javascript运行是不用占服务器资
源的,只靠用户端机子的CPU和内存资源运行,如果一个页面同时访问量很大的
话,servlet验证的敝端就出来了,会减低服务器的性能.而且先转到servlet中,验证完后
再转到相关页面,这本来就会相隔一段时间的,这对用户来说,也是不希望的.
3. 写javascript函数只需很少量的代码就可以完成验证了,而且javascript发展成熟
,很多代码可以在网上查得到.但如果用servlet验证,有一堆的文件要配置,还要写相关
的类,这不是简单问题复杂化,自己增加自己的工作量吗?
缺点:
客户端可能禁用JS
要做到安全的表单验证,服务端验证是必须的,JS只是作为辅助,是可选的
你写的表单别人不一定就会用,别有用心的人可以自己写个表单提交一些特别
的数据到服务器
某些复杂的验证是不可能用JS验证(当然AJAX所用的XMLHttpRequest除外)。如
在帐号注册用例中,验证某个帐号是否存在就不能用JS验证了
一般现在,现在我是这样认为的,如果用户存入不合规范的数据,是对系统全局或别
的模块没影响的,那么我们就用javascript来做,一般比较复杂的验证又或者重要数据
表的数据输入,就用正规的验证方式。 关键这个影响与否的尺度 很难把握的。
http://topic.csdn.net/t/20051218/01/4465704.html 关于框架验证的讨论
http://www.80diy.com/csdn/list.aspx?u=f/5403/7001-7500.html 关于框架和开源
的帖子列表
webwork2guide中关于 验证方式
1. JS验证
2. 服务器端的验证
重点关于 服务器端的数据验证,XWork提供了一个 Validator接口,所有的数据验证类
必须实现这个接口,同时提供了几个常用的数据验证类以及用于扩展的抽象类
数据的合法性验证在 Action 被调用前,通过 Interceptor 在 Action 运作前对其输
入参数进行验证,具体是 ValidationInterceptor 调用指定的 Validator 对输入的参
数进行合法性验证
上述的细节可以参考 Xwork 的 ActionValidatorManager 和 ValidationInterceptor
的实现代码
下面具体的 Validator 使用 (特别是涉及到的配置文件一堆) 架构之妙在于对框架
的灵活使用,好的架构不着痕迹,同时没有性能的损失
下面的记录以配置文件为主线:
1. web.xml 中配置 服务资源的注册
标准http协议中没有.action结尾的服务资源,需要在web.xml中注册
<servlet>
<servlet-name>webwork</servlet-name>
<servlet-class>
com.opensymphony.webwork.dispatcher.ServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webwork</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
这样所有 .action 结尾的服务请求由 ServletDispatcher接管
2. xwork.xml 注册 action 同时在 action 中配置 数据验证的 Interceptor
3. classpath的根目录 WEB-INF/classes 创建 validators.xml 注册当前应用中的所
有的 Validator
4. 针对页面表单字段设置 对应的 Validator XxAction-validation.xml
<field name="model.username">
<field-validator type="required">
<message>Please enter Username!</message>
</field-validator>
</field>
<field name="model.password">
<field-validator type="length">
<param name="minLength">4</param>
<param name="maxLength">6</param>
<message>
Password length must between ${minLength} and
${maxLength} chars!
</message>
</field-validator>
</field>
通过 param 节点,我们可以为对应的 Validator 设置属性值。这一点与Spring IOC非
常类似,实际上XWork也提供了内置的 IOC实现,不过与Spring的 IOC支持想比还有一
些差距
5. 修改 Action 类,使继承 ActionSupport 类
6. 修改页面 增加数据合法性校验错误提示
<ww:if test="hasFieldErrors()">
<span class="errorMessage">
<b>Errors:</b><br>
<ww:iterator value="fieldErrors">
<li><ww:property value="value[0]"/></li>
</ww:iterator>
</span>
</ww:if>
通过<ww:if test="hasFieldErrors()">判断是否存在字段验证错误,hasFieldErrors
()是 ActionSupport中提供的方法,用于判定当前是否存在字段验证错误。
LoginAction扩展了 ActionSupport类,自然继承了这个方法,我们即可在页面中通过
EL对其进行调用。如果存在FieldErrors,则通过一个迭代,在页面上显示错误信息:
<ww:iterator value="fieldErrors">
<li><ww:property value="value[0]"/></li>
</ww:iterator>
fieldErrors 是 ActionSupport 中保存字段校验错误信息的 Map 结构。针对这个Map
进行迭代,得到的每个迭代项都是一个 key-value Entry,key中保存着字段名,value
则是一个List数据结构,里面包含了针对这个 Key的错误信息列表,错误信息的数量取
决 于字 段 验证 规则配置中的设定。这里value="value[0]",也就是取当前条目
value中保存的第一条错误信息。