wood burning stoves 2.0*
The moose likes Struts and the fly likes Struts: validations using 'validwhen' in validation.xml Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of EJB 3 in Action this week in the EJB and other Java EE Technologies forum!
JavaRanch » Java Forums » Frameworks » Struts
Bookmark "Struts: validations using Watch "Struts: validations using New topic
Author

Struts: validations using 'validwhen' in validation.xml

Tanveer Rameez
Ranch Hand

Joined: Dec 11, 2000
Posts: 158
In my JSP form , I have two fields: age and term
Now conditions are:
1. age is required
2. age must be an integer
3. age >18 and age <75

4. term is required
5. term must be an integer
6. term < 40 and term >0

7. sum of term and age must be less than 80 , i.e. age+term<80

Since I am using Struts framework, I am writing the validations in the validations.xml . The form bean I am using is DynaValidatorForm.
When I write the xml for all the validations from 1 to 6 (except 7), it works fine. I could also provide client-side validation in the JSP by using the script :

<html:javascript formName="/getQuotes" method="validateForm" dynamicJavascript="true" staticJavascript="true" cdata="false" />

in the <head> portion of the JSP. Now how do I implement the validation for 7 .(sum of term and age must be less than 80 , i.e. age+term<80 ).
Given below is the extract from the validation.xml without the validation for 7.. it works fine.
Here is the xml for validation without validation for 7 but for the other validations:

Now how do I add the validation for 7. I understand I have to use 'validwhen'. I did take help of the tutorial from struts website: http://struts.apache.org/userGuide/dev_validator.html. though there is example of validwhen but it does not contain any example like the condition in 7 .
I tried by doing this:
<field property="term" depends="required,integer,intRange,validwhen">
<msg
name="validwhen"
key="invalid " resource="false"/>
<arg0 key="QuoteDetailsBean.term" />
<arg1 name="intRange" key="${var:min}" resource="false"/>
<arg2 name="intRange" key="${var:max}" resource="false"/>
<var><var-name>min</var-name><var-value>0</var-value></var>
<var><var-name>max</var-name><var-value>40</var-value></var>
<var>

<var-name>test</var-name>
<var-value> ((*this* + age) < 80)</var-value>
</var>

</field>

then when I submit the form, I get this :
javax.servlet.ServletException: Servlet execution threw an exception


root cause

java.lang.NoClassDefFoundError: antlr/TokenStream
java.lang.Class.getDeclaredMethods0(Native Method)
java.lang.Class.privateGetDeclaredMethods(Class.java:1655)
java.lang.Class.getMethod0(Class.java:1901)
java.lang.Class.getMethod(Class.java:984)
org.apache.commons.validator.ValidatorAction.loadValidationMethod(ValidatorAction.java:623)
org.apache.commons.validator.ValidatorAction.executeValidationMethod(ValidatorAction.java:557)
org.apache.commons.validator.Field.validateForRule(Field.java:811)
org.apache.commons.validator.Field.validate(Field.java:890)
org.apache.commons.validator.Form.validate(Form.java:174)
org.apache.commons.validator.Validator.validate(Validator.java:367)
org.apache.struts.validator.DynaValidatorForm.validate(DynaValidatorForm.java:112)
org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:921)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:206)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1158)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
[/CODE]

so is the whole thing how I used validwhen wrong? Please let me know how should I do it. Someone told me that validwhen does not support '+','-' i.e. adding of properties. is it so?

I also want the custom message to come from message resource file like say 'registrationForm.invalidAgeTermcombination' .
Can anybody please provide me the xml code to be added to perform validation 7?
thanks
Tanveer
[ August 25, 2004: Message edited by: Tanveer Rameez ]

Author of JPhotoBrush Pro (www.jphotobrushpro.com)
Martin Podrouzek
Greenhorn

Joined: Sep 09, 2004
Posts: 10
Fine day to you Tanveer

I had simmilar problem, and this is what I came up to:

1) I forgot to copy antlr.jar to my lib folder. Make sure you have this file
in your lib folder

2) I moved validwhen to the front of depends statement like this:
depends="validwhen,required,mask">
as well as <var>...</var> tags
dunno if it has any effect.
this is how it might look:


3) I have tried your code and got several errors "not-well formed". It might be obvious but < (lesser than) is ILLEGAL in XML try using < (ampersand lt semicollumn ) instead.
ie:


After I replaced this character it worked fine

The above code is also an example of code for anyone trying to combine mask and validwhen.

Hope it will be of any help

Martin

[ September 09, 2004: Message edited by: Martin Podrouzek ]
[ September 09, 2004: Message edited by: Martin Podrouzek ]
Tanveer Rameez
Ranch Hand

Joined: Dec 11, 2000
Posts: 158
hi
thanks for the tip.

1) I forgot to copy antlr.jar to my lib folder. Make sure you have this file
in your lib folder

I forgot that i have to add this jar file too. it is not stated in the validation section in the jakarta struts website. thankx for that.
and it worked
Jasmine Wu
Greenhorn

Joined: Oct 06, 2004
Posts: 1
I am trying to do this via validator and don't know if it can be done.

I have two fields: "range" and "from". range is a drop down and from is a text field

If range value is equal to "P", I need to check if the from has format of #######.##

But if range is equal to "D", I need to check if what's entered in the from is in the yyyy-yy-yy format.

I am trying to be creative with the validwhen and mask validation rules but I can't seem to come up with something that works.

Please let me know if this is just not possible. If it is, I would appreciate any help.

Thanks,
Jasmine
Martin Podrouzek
Greenhorn

Joined: Sep 09, 2004
Posts: 10
Fine day to you Jasmine

frankly, some time ago I came across very same problem. As far as I am concerned using only provided validators

won't work. I'm going to state here how I solved the problem, as well as other possible (hypothetical) solutions.

I haven't used validator in form, you probably seek. The task requires branching and 2 different tests.
If I got it right something like this:



I used server-side validation, and validated input in the Action class.

Struts validator gives you opportunity to create your own validation classes

(http://struts.apache.org/userGuide/dev_validator.html) .
I haven't tried but after writing your own class you could also add CDATA part to validator-rules.xml file, that

would create client-side validation Javascript. Than, it's up to you how you write the validation classes. I'm going

to write my own classes with such feature. As soon as I'll have something, I'm going to post it here.

Now for the other possible solutions.

First of all it is VERY important to note one phenomena:
Using strings for conditional statements are pain (ie: contact.country == 'en'). PLEASE NOTE that this is code used

to generate JAVASCRIPT!
In case of validwhen the generated code will look like this (obviously):



neither single nor double quotes will work.
Unfortunatelly, escaping characters or using character entities won't help either, since validator will add another

backslash resulting in



Does anybody know how to enforce single backslashes?


Following part is for those willing to investigate the problem.

My other ideas:

Idea 1 (Failed):
Use 2 validator tags for one field moving less probable option prior to more probable. If the first option would

fail, second validation would override first.

example 1:


result 1:
Struts will generate 2 validator functions. One function will succeed while other will fail, rendering an error (and

vice versa).

Idea 2 (failed):
Omit mask attribute and implement reg exp. validation in validWhen directly.

example 2:


result 2:
Failure, due to problem with above-described strings.(Using single quotes won't even generate the code) Validator will generate this code:


uff...

This way seems to be a dead end.

Martin
[ October 09, 2004: Message edited by: Martin Podrouzek ]
Ashwin Puthran
Greenhorn

Joined: Mar 25, 2009
Posts: 6
HI,
5 yrs later now i am facing the same problem.
Has some one got a solution to this Dead end
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Struts: validations using 'validwhen' in validation.xml
 
Similar Threads
intRange validations
Tags in validation.xml
STRUTS:client-side validation using validation.xml for hidden field results in error
intrange validator message
Iam getting nulls in alert messages when using struts validator frame work