This may help - note I wrote for myself and posted to the workshop users group
a while back:
Here's how to implement data validation in Workshop 10.1. There are several
ways to validate, but this is server side Validation of a form encapsulated in
a data bean. Below is what is working for me and I am sharing it in hopes it
will aid others:
1) Modify ( or create ) your form bean to implement the Validatable interface.
public class ProvisionData implements Serializable, Validatable
{ ....
2) In your data bean implement the Validatable method. It doesn't need to do
anything, you can just put in a stub.
public void validate( ActionMapping arg0, HttpServletRequest arg1,
ActionMessages arg2 )
{
}
3) In the Page Flow Explorer, right click on any Action that takes the dataBEan
as a input parameter, then select from the pop-up menu "Validation Rules" and
ActionFromScope from the sub pop-up menu.
4) The Validation Rules Wizard opens, in it you will see a tree of all the
properties defined in your dataBean.
5) In the tree, below each property node, is a "All" Node - this is for
localization and you can define specific language nodes if you wish.
6) Any exiting Rules you have previously defined will show up. You can click
on the rule to modify it's behavior.
7) To add a new rule, right click on the ALl Node ( or a new localization node
you created) and select "Add Rule", and fill out the form the wizard generates
for you to fill in specifying the type of validation rule you created.
8) When the wizard closes, because I choose ActionFromScope in step 3, the
action methods annotation gets modified to include the validation rules you
defined. Specially it adds ( or modifies) the validatableProperties argument
of the Jpf.Action annotation.
9) The one item the wizard was not generating is the validationErrorForward
parameter of you Jpf.Action annotation, but it is easy enough to add it in
yourself. ( A common scenario is that you were on a user input page that post
to your action method on a form submit, on success it will go to the page your
[EMAIL PROTECTED] argument specified if it failed one or more validation steps,
then it will go to your [EMAIL PROTECTED] path ( typically returning back to
same input page again ).
10) Here is an example of a annotation after the wizard is done with it ( I
added white space for easier reading ). In the below example, I have defined 3
validations rules. Two rules are defined on the property "subType", and
another rule is defined for the property "subid"
@Jpf.Action
( forwards = { @Jpf.Forward(name = "addDone", path = "rtp_Input.jsp") }
, [EMAIL PROTECTED]( name="validationFail"
, path="rtp_AddProvisioningData.jsp"
)
, validatableProperties = { @Jpf.ValidatableProperty( propertyName =
"subType"
, validateMask =
@Jpf.ValidateMask(message = "Subscripton Type must be one of these values:
[A,E,F,I,N,U,V,X,B,C,H,M,P,Z,1-9]", regex = "[A,E,F,I,N,U,V,X,B,C,H,M,P,Z,1-9]")
, validateMaxLength =
@Jpf.ValidateMaxLength(message = "Subscription Type Code is a single
character.", chars = 1)
)
, @Jpf.ValidatableProperty( propertyName="subid"
, [EMAIL
PROTECTED](message="Subscription Id max length is 16 characters.", chars=16)
)
}
)
11) Your almost done - as it is this will work, if a validation rule fails it
will call your dataBeans validate() method ( where I suppose you could do some
special validation handling ), then the server will serve up what every page
your up whatever page your validationErrorForward specified.
12) To actually have the error message displayed on you served up page you will
need to and additional netui tag(s) for each property you created a rule for.
The tag goes in your jsp page like this "<netui:error key="subid"/>" and the
value for the key must equal the propertyName in the rules ValidatableProperty
tag which much match a parameter name of one of your dataBeans member
properties.
13) When all this is in place the Page Flow editor overview will display the
error path from your action ( along with your other page flows). When your
input page is initially hit, the jsp's netui:error will display nothing.
14) If you submit the form and validate one or more rules, then the input page
gets displayed again, and the "<netui:error key="subid"/>" tag will display one
or more errors. In my example I used in step 10 above, I had two netui:error
tags in my input jsp page - one for the subType, a second for the subid. If I
submit a page violating all 3 rules, then the <netui:error key="subType"/> will
display BOTH messages it defined, while the <netui:error key="subid"/> will
display its single message.
Good luck!
-Paul G.
-----Original Message-----
From: Deepak Natarajan [mailto:[EMAIL PROTECTED]
Sent: Wednesday, December 19, 2007 8:52 AM
To: [email protected]
Subject: Beehive Form Field Validation
Hi -
I have a very basic question about form validation in Beehive. Any
help/guidance will be much appreciated.
My understanding is that Beehive uses/extends Apache Commons Validatior
framework. According to the Beehive Javadocs for validationRules
(http://beehive.apache.org/docs/1.0.2/netui/apidocs/javadoc/org/apache/beehi
ve/netui/pageflow/validation/ValidatorRules.html) there are various methods
inherited from FieldChecks such as validateInteger etc. But the corresponding
annotations to use these methods seem to be missing...or am I confusing myself
here? Can anyone provide a simple example to use these? The beehive netui
samples doesnt have any extensive examples in this area.
Also, is it necessary that a form bean properties should be string types and
not their real domain type (with the conversion ability checked in a custom
rule)? Its a fundamental question, and the reason I'm asking is that for a
BigDecimal bean property for example, if I enter a String value in the form, a
NumberFormatException occurs obviously - since the validation seems to be done
after the property setter is run, not before. Other techniques that I've
encountered before are to have validation checks inside the setter, or some
client-side checks etc. For me it seemed intuitive that the
@Jpf.ValidateProperty should have been on the setter (which is where I put it
initially until the IDE corrected me!) so that before the bean property is set,
type validation is done - but now when the container does the automatic
conversion to the object type, it fails with a NumberFormatException. What is a
good pattern for this case?
Also, any idea which version of Apache commons validator is being used by
Beehive 1.0.2?
Thanks in advance
Deepak