大家好,我想自定义一个Struts的验证规则,请问该怎么做啊

时间:2008-05-10 22:47:38   来源:论坛整理  作者:  编辑:chinaitzhe
我想在validator-rules.xml里加入一个我自己的验证规则,之后调用这个验证
有做过这方面的吗?这样的资料感觉很少哦,具体应该怎么做了 ,可不可以提示我一下,给出相关资料或者简单的代码实例,最好说的具体点
本人无比感谢
网友回复:具体怎么扩展呢 我用现成的还行 自己写一个我有点乱了 忘有人指点我一下

网友回复:还不会,up下
网友回复:望有经验的人指点一下 我正则模拟现有的写呢
网友回复:validator-rules.xml里的定义
<validator name="custom"
classname="source.src.common.Dispose"
method="custom"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.custom"/>


Dispose 类 这里的处理部分
package source.src.common;

import org.apache.struts.validator.Resources;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.*;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;

public class Dispose {
public static boolean custom(Object bean, ValidatorAction va, Field field,
ActionMessages errors, Validator validator,
HttpServletRequest request) {
String _actionObject_name = field.getVarValue("_actionObject_name");// 得到字段名的方法
String value = ValidatorUtils.getValueAsString(bean, _actionObject_name);// 得到字段的值的方法
if (errors == null) {
errors = new ActionMessages();
}
try {
String regex1 = "(?=(?:[^\u0000-\u00ff]*[\u0000-\u00ff][^\u0000-\u00ff]*){0,32}$)"
"(?=(?:[\u0000-\u00ff]*[^\u0000-\u00ff][\u0000-\u00ff]*){0,16}$)"
".{0,48}";
value.matches(regex1);
char[] cs = value.toCharArray();
int a = 0, b = 0;
for (char c : cs) {
if (c > 0xff) {
b ;
} else {
a ;
}
}

if (a > 32 ¦ ¦ b > 16) {

errors.add(field.getKey(), Resources.getActionMessage(
validator, request, va, field));
return false;
}
} catch (Exception e) {
e.printStackTrace();
errors.add(field.getKey(), Resources.getActionMessage(validator,
request, va, field));
return false;
}
return true;
}
}

validator.xml里的定义

<field property="_actionObject_name" depends="required,custom">
<msg name="required" key="errors.required"/>
<msg name="custom" key="errors.custom"/>
</field>

jsp字段
<html:text property="_actionObject_name" size="32"> </html:text>

资源文件我就不写了

这个自定义验证器的方法是我引用网上别人的写法的
这里的字段值和字段名不知是不是我写错了 这里给我讲讲 我有点糊涂了我第一次写自定义验证
String _actionObject_name = field.getVarValue("_actionObject_name");// 得到字段名的方法
String value = ValidatorUtils.getValueAsString(bean, _actionObject_name);// 得到字段的值的方法


现在报了异常


严重: Unhandled exception thrown during validation: No name specified
java.lang.IllegalArgumentException: No name specified
at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:635)
at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290)
at org.apache.commons.validator.util.ValidatorUtils.getValueAsString(ValidatorUtils.java:105)
at source.src.common.Dispose.custom(Dispose.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.commons.validator.ValidatorAction.executeValidationMethod(ValidatorAction.java:567)
at org.apache.commons.validator.Field.validateForRule(Field.java:827)
at org.apache.commons.validator.Field.validate(Field.java:906)
at org.apache.commons.validator.Form.validate(Form.java:174)
at org.apache.commons.validator.Validator.validate(Validator.java:367)
at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:110)
at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:950)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at source.src.common.Filter.doFilter(Filter.java:24)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)



网友回复:只用这一句话就可以了
String value = ValidatorUtils.getValueAsString(bean, field.getProperty());
用这句就可以了 现在我的程序已经好了


我引用的那篇文章的代码里是这样的写的 他是为了验证两个字段的一致性的 比如密码和重复密码
他是这样写的
String value = ValidatorUtils.getValueAsString(bean, field.getProperty());//得到字段名的方法1
String sProperty2 = field.getVarValue("secondProperty");//得到字段名的方法2
String value2 = ValidatorUtils.getValueAsString(bean,sProperty2);//得到字段的值的方法
我三句话我没理解 有人给我解释一下吗
//得到字段名的方法1 可以得到字段用户输入的值
后两句这样写是为了得到指定的字段 因为光写String value = ValidatorUtils.getValueAsString(bean, field.getProperty());只是得到那个xml里指定的那个 所以得到一个以上就得这样写 不知道我的理解对吗
假如不对帮我解释一下
关键字:我想,自定义,一个,Struts,验证,规则,
上一篇:在线等

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面