No-reply? :(
However, I solved. Now all works well.
**********
SERVER-SIDE
**********
To avoid the deprecated method
Resources.getActionMessage(HttpServletRequest request, ValidatorAction va,
Field field)
I used
Resources.getActionMessage(Validator v, HttpServletRequest request,
ValidatorAction va, Field field)
in my custom validator java class.
I added "org.apache.commons.validator.Validator" to methodParams of the
"twofields" custom validator in validator-rules.xml.
**********
CLIENT-SIDE
**********
I changed
oTwoFields = new twofields();
with
eval('oTwoFields = new ' + form.name + '_twofields();');
<validator name="twofields"
classname="it.sfidiamoci.validator.ValidatorPersonalizzati"
method="validateTwoFields"
methodParams="java.lang.Object,
org.apache.commons.validator.Validator,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
javax.servlet.http.HttpServletRequest"
depends="required"
msg="errors.twofields">
<javascript><![CDATA[
function validateTwoFields(form) {
var bValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
eval('oTwoFields = new ' + form.name + '_twofields();');
for (x in oTwoFields) {
var field = form[oTwoFields[x][0]];
var secondField = form[oTwoFields[x][2]("secondProperty")];
if (field.type == 'text' ||
field.type == 'textarea' ||
field.type == 'select-one' ||
field.type == 'radio' ||
field.type == 'password') {
var value;
var secondValue;
// get field's value
if (field.type == "select-one") {
var si = field.selectedIndex;
value = field.options[si].value;
secondValue = secondField.options[si].value;
} else {
value = field.value;
secondValue = secondField.value;
}
if (value != secondValue) {
if (i == 0) {
focusField = field;
}
fields[i++] = oTwoFields[x][1];
bValid = false;
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join('\n'));
}
return bValid;
}]]></javascript>
</validator>
That's all.
cacodemon79 wrote:
>
> I'm using Struts 1.3.
> I'm trying to write a custom validator to check that 2 fields are
> identical.
>
> 1) I modified my validator-rules.xml by adding my own validator (called
> "uguale"):
> **************
> validator-rules.xml
> **************
> <validator name="uguale"
>
> classname="it.sfidiamoci.validator.ValidatorPersonalizzati"
> method="validateUguale"
>
> 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.uguale">
>
> <javascript><![CDATA[
> function validateUguale(form) {
> var bValid = true;
> var focusField = null;
> var i = 0;
> var fields = new Array();
> oTwoFields = new twofields();
> for (x in oTwoFields) {
> var field = form[oTwoFields[x][0]];
> var secondField =
> form[oTwoFields[x][2]("secondProperty")];
>
> if (field.type == 'text' ||
> field.type == 'textarea' ||
> field.type == 'select-one' ||
> field.type == 'radio' ||
> field.type == 'password') {
>
> var value;
> var secondValue;
> // get field's value
> if (field.type == "select-one") {
> var si = field.selectedIndex;
> value = field.options[si].value;
> secondValue = secondField.options[si].value;
> } else {
> value = field.value;
> secondValue = secondField.value;
> }
>
> if (value != secondValue) {
>
> if (i == 0) {
> focusField = field;
> }
> fields[i++] = oTwoFields[x][1];
> bValid = false;
> }
> }
> }
>
> if (fields.length > 0) {
> focusField.focus();
> alert(fields.join('\n'));
> }
>
> return bValid;
> }]]></javascript>
>
> </validator>
>
> 2) I modified my validation.xml by adding the new validator (called
> "uguale"):
> **************
> validator-rules.xml
> **************
> <i<field property="password" depends="required,minlength,mask,uguale">
> <arg position="0" key="errors.password" />
> <arg position="1" name="minlength"
> key="${var:minlength}"
> resource="false" />
> <msg name="mask" key="errors.mask.password" />
> <msg name="uguale" key="errors.password.uguale"
> />
> <var>
> <var-name>minlength</var-name>
> <var-value>8</var-value>
> </var>
> <var>
> <var-name>mask</var-name>
> <var-value>^[a-zA-Z0-9_.]*$</var-value>
> </var>
> <var>
> <var-name>secondProperty</var-name>
> <var-value>password2</var-value>
> </var>
> </field>
>
> 3) I added the key "errors.password.uguale" in
> ApplicationResources.properties
> ***********************
> ApplicationResources.properties
> ***********************
> errors.password.uguale=Le password inserite non sono uguali
>
> 4) I created the class "ValidatorPersonalizzati" to handle the custom
> validator "validateUguale":
> ********************
> ValidatorPersonalizzati.java
> ********************
> package it.sfidiamoci.validator;
>
> import javax.servlet.http.HttpServletRequest;
>
> import org.apache.commons.validator.Field;
> import org.apache.commons.validator.GenericValidator;
> import org.apache.commons.validator.ValidatorAction;
> import org.apache.commons.validator.util.ValidatorUtils;
> import org.apache.struts.action.ActionErrors;
> import org.apache.struts.validator.Resources;
>
>
> public class ValidatorPersonalizzati{
>
> public static boolean validateUguale(Object bean, ValidatorAction
> va,Field field, ActionErrors errors,HttpServletRequest request){
>
> String value =
> ValidatorUtils.getValueAsString(bean,field.getProperty());
> System.out.println("value="+value);
> String sProperty2 = field.getVarValue("secondProperty");
> String value2 =
> ValidatorUtils.getValueAsString(bean,sProperty2);
> System.out.println("value2="+value2);
> if (!GenericValidator.isBlankOrNull(value)){
> try{
> if (!value.equals(value2)){
>
> errors.add(field.getKey(),Resources.getActionMessage(request, va,
> field));
> return false;
> }
> }
> catch (Exception e){
>
> errors.add(field.getKey(),Resources.getActionMessage(request, va,
> field));
> return false;
> }
> }
>
> return true;
>
> }
> }
>
> 5) I have two fields ("password", "password2") to check in my jsp:
> ******
> test.jsp
> ******
> <tr>
> <td
> class="col1"><bean:message
> key='registrazioneUtente.password.label'/></td>
> <td><html:password
> property="password" styleId="password"
> maxlength="<%= passwordMaxLength %>" /></td>
> <td><bean:message
> key='registrazioneUtente.password2.label'/></td>
> <td><html:password
> property="password2" styleId="password2"
> maxlength="<%= passwordMaxLength %>" /></td>
> </tr>
>
>
> When I submit the form in my jsp, standard validations (e.g. required,
> minlength, ...) of other fields are performed in the correct way.
> Instead, my own validation called "uguale" ("password==password2") doesn't
> work!
> On the client-side, I see a javascript warning in browser: "twofields is
> not defined" but no javascript alert.
> On the server-side, I get the following exception:
>
> value=cvcxvxvczczx
> value2=czzxcczxczczczcz
> 24-giu-2008 20.54.30 org.apache.commons.validator.ValidatorAction
> executeValidationMethod
> GRAVE: Unhandled exception thrown during validation: null
> java.lang.NullPointerException
> at
> it.sfidiamoci.validator.ValidatorPersonalizzati.validateUguale(ValidatorPersonalizzati.java:30)
> 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:544)
> at org.apache.commons.validator.Field.validateForRule(Field.java:796)
> at org.apache.commons.validator.Field.validate(Field.java:876)
> at org.apache.commons.validator.Form.validate(Form.java:288)
> at org.apache.commons.validator.Validator.validate(Validator.java:351)
> at
> org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:116)
> at
> org.apache.struts.chain.commands.servlet.ValidateActionForm.validate(ValidateActionForm.java:58)
> at
> org.apache.struts.chain.commands.AbstractValidateActionForm.execute(AbstractValidateActionForm.java:120)
> at
> org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
> at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
> at
> org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
> at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
> at
> org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
> at
> org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
> at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
> 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
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> 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:102)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
> at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> at
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
> at java.lang.Thread.run(Unknown Source)
>
> In the log I have left 2 System.out.println to be sure that "value" and
> "value2" variables had the correct value submitted through the form.
>
> Moreover, I'm not sure that
> Resources.getActionMessage(request, va, field)
> method in my custom validator class is correct. This method is deprecated
> and I don't know how to replace it.
>
> I can't understand where is the problem both on client-side and on
> server-side validation.
>
> Can you help me?
>
> Thanks in advance.
>
--
View this message in context:
http://www.nabble.com/Struts-Validator-Framework%3A-problem-with-Custom-Validator-tp18098053p18137561.html
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]