`
jinvasshole
  • 浏览: 770299 次
文章分类
社区版块
存档分类
最新评论

struts中自定义validator验证

 
阅读更多

struts中自定义validator验证

很多时候需要验证“密码”与“重复密码”是否一致,如果放在服务器端验证就浪费资源了。
如何在客户端进行验证呢?JS可以实现,但是struts的validator框架是否能实现呢?
跟着我一起做一个例子吧。
代码见:http://download.csdn.net/user/qing2005

在原有的验证框架内容上进行改善
1. 新增MyFieldChecks.java类
-----------------------------------------------------------------------------------------------
package common;

import java.io.*;
import org.apache.struts.validator.Resources;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorUtil;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.ValidatorAction;
import org.apache.struts.action.ActionErrors;
import org.apache.commons.validator.Arg;

public class MyFieldChecks implements Serializable {
public static boolean validateCompare(Object bean,
ValidatorAction va, Field field,
ActionErrors errors,
HttpServletRequest request) {

String value = null;
if (isString(bean)) {
value = (String) bean;
} else {
value = ValidatorUtil.getValueAsString(bean, field.getProperty());
}

if (!GenericValidator.isBlankOrNull(value)) {
Arg arg=field.getArg1();
String arg1Key=field.getVarValue("compareControl");
String strCompare=ValidatorUtil.getValueAsString(bean,arg1Key);
if(strCompare==null || !value.equals(strCompare)){
errors.add(field.getKey(), Resources.getActionError(request, va, field));
return false;
}
}
return true;
}

/**
* Return <code>true</code> if the specified object is a String or a <code>null</code>
* value.
*
* @param o Object to be tested
* @return The string value
*/
protected static boolean isString(Object o) {
return (o == null) ? true : String.class.isInstance(o);
}
}
==========================================================================

2. 在validator-rules.xml最后新增片段
-----------------------------------------------------------------------------------------------
<validator name="compare" classname="common.MyFieldChecks" method="validateCompare" methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest" depends="required" msg="errors_compare">
<javascript>
<![CDATA[ function validateCompare(form) {
var isValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
oRange = new compare();
for (x in oRange) {
var field = form[oRange[x][0]];

if ((field.type == 'text' ||
field.type == 'textarea' ||
field.type=='password') &&
(field.value.length > 0)) {

var iCompareControl = oRange[x][2]("compareControl");

var iValue=document.getElementsByName("iCompareControl").value;

if(field.value!=iValue){
if (i == 0) {
focusField = field;
}
fields[i++] = oRange[x][1];
isValid = false;
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join('/n'));
}
return isValid;
}]]>
</javascript>
</validator>
==========================================================================
注意:classname是common.MyFieldChecks

3.在validation.xml中添加一个compare验证
-----------------------------------------------------------------------------------------------
<field property="reply" depends="compare">
<arg0 key="register_password"/>
<arg1 key="${var:compareControl}" resource="false"/>
<var>
<var-name>compareControl</var-name>
<var-value>password</var-value>
</var>
</field>
==========================================================================
注意:一定要定义compareControl,这和JS等都有关

4. 在JSP页面中使用验证
-----------------------------------------------------------------------------------------------
1)先测试不用JS方式
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
<html:form action="/registerAction.do" method="post" >
......
结果:验证成功!

2)测试JS方式
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
<html:form action="/registerAction.do" method="post" onsubmit="return validateRegisterForm(this)">
......
</html:form>
<html:javascript formName="registerForm"/>
结果:验证成功!
==========================================================================

总结:
1)环境:Winxp+JBuilder2006+Tomcat5.5+JDK1.5

2) 一开始怎么都不成功,跟踪调试后发现common.MyFieldChecks空指针异常,
百思不得其解,最后发现在“项目/RegisterModule/WEB-INF/classes/common”下没有MyFieldChecks类,
于是我把“项目/classes/common”下的MyFieldChecks类拷贝到上述目录,结果就可以了。
为了不让初学者绕圈子,请注意这点,并且,如果更改了MyFieldChecks类,也需要做上述复制。切记!

3)写JS验证时调试了很久,一方面不是很熟这种写法,另一方面每次调试都非常不方便,
后来干脆调试生成的HTML文本,调试通过后再写到validator-rules.xml中。

4)翻了很多资料、很多文章,写完整的实在太少,我想象我这样的初学者一定很多,
一次次的打击不仅仅是程序运行的失败,更是信心的考验。希望这篇文章能给你有所帮助!

分享到:
评论

相关推荐

    struts自定义Validator示例

    struts中自定义validator验证 &lt;br&gt;很多时候需要验证“密码”与“重复密码”是否一致,如果放在服务器端验证就浪费资源了。 如何在客户端进行验证呢?JS可以实现,但是struts的validator框架是否能实现呢?-见...

    struts验证器validator使用,以及自定义验证器

    该demo是struts验证器validator使用,以及struts基本配置,自定义创建struts的验证器,使用maven创建管理工程,使用eclipse编译器

    struts 2.0自定义验证器

    struts 2.0自定义验证器

    如何自定义验证器(完整源码)

    struts2中自定义验证器的使用,我自己写的一个完整代码,详细的展示了如何写自定义验证器以及使用和注意事项,代码解压后可以直接部署到MyEclipse上运行,相信你看完后也能很快掌握如何自定义验证器以及它的使用。

    自定义验证框架

    struts自定义的验证框架

    validate验证帮助文档

    表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。 Validator是基于JavaScript技术...

    商城之家JSP商城基于jsp+mysql开发

    互动性,这一层在STRUTS的视图层View用STRUTS标签+HTML等实现,同时使用validator验证框架进行 数据检验。数据的存储和持久化由HIENATER持久层实现,数据库采用MYSQL,数据源采用数 据源连接池机制,整个系统完全贯穿...

    JSP商城之家商城企业版

    互动性,这一层在STRUTS的视图层View用STRUTS标签+HTML等实现,同时使用validator验证框架进行 数据检验。数据的存储和持久化由HIENATER持久层实现,数据库采用MYSQL,数据源采用数 据源连接池机制,整个系统完全贯穿...

    商城之家JSP商城企业版 v7.0

    页面调转由STRUTS的控制层Controller实现,页面负责显示请求和响应,大大增强“人机”的互动性,这一层在STRUTS的视图层View用STRUTS标签+HTML等实现,同时使用validator验证框架进行数据检验。数据的存储和持久化由...

    JSP企富商贸网开发

    互动性,这一层在STRUTS的视图层View用STRUTS标签+HTML等实现,同时使用validator验证框架进行 数据检验。数据的存储和持久化由HIENATER持久层实现,数据库采用MYSQL,数据源采用数 据源连接池机制,整个系统完全贯穿...

    商城之家JSP商城企业版V1.0

    互动性,这一层在STRUTS的视图层View用STRUTS标签+HTML等实现,同时使用validator验证框架进行 数据检验。数据的存储和持久化由HIENATER持久层实现,数据库采用MYSQL,数据源采用数 据源连接池机制,整个系统完全贯穿...

Global site tag (gtag.js) - Google Analytics