JSFValidation by manimoney707

VIEWS: 15 PAGES: 50

More Info
									Validation
1

Topics
● ● ● ● ● ●

When to use validators Validator interface and classes Displaying validation error messages Requiring a value Using standard validators Creating a custom validator

2

When to use validators
3

When to Use Validators?
●

Validation can only be performed on UIInput components or components whose classes extend UIInput
–

UI components that accept values from an end user

4

Validator Interface & Classes
5

Displaying Validation Error Messages
6

How to Display Validation Error Messages?
●

A page author can output error messages resulting from both standard and custom validation failures using <h:messages> tag
–

– –

<h:messages> tag causes validation error messages to be displayed wherever the tag is located on the page “for” attribute of the tag must match the “id” of the component whose data needs to be validated “style” attribute specifies a style for the entire message
7

Example: greeting.jsp (guessNumber)
<h:inputText id="userNo" value="#{UserNumberBean.userNumber}" validator="#{UserNumberBean.validate}"/> <h:commandButton id="submit" action="success" value="Submit" /> <p> <h:messages style="color: red; font-family: 'New Century Schoolbook', serif; font-style: oblique; text-decoration: overline" id="errors1" for="userNo"/>

8

Example: greeting.jsp (guessNumber)

9

Requiring a Value
10

How to set “Value required” Validation?
●

Set “required” attribute to “true”
–

– –

Used when your component must have a non-null value or a String value at least one character in length JSF implementation checks if the value is null or empty If set to true, this validation is done before any other validations

11

Example: customerInfo.jsp (cardemo)
<h:inputText id="zip" value="#{CustomerBean.zip}" size="10" required="true"> <cs:format_validator formatPatterns="99999|99999-9999|### ###"/> </h:inputText> <h:messages for="zip" />

12

Example: customerInfo.jsp (cardemo)

13

Using Standard Validators
14

What are Standard Validators?
●

Provided by JSF implementation
– –

DoubleRangeVaidator via <f:validate_doublerange> LengthValidator via <f:validate_length>

15

How to use Standard Validators?
●

By nesting the standard validator tag of your choice inside a tag that represents a component of type UIInput (or a subclass of UIInput) and provide the necessary constraints

16

Example: <f:validateDoubleRange>
<h:inputText id="bidPrice" maxlength="7" value="#{CustomerBean.bidPrice}" > <f:validateDoubleRange minimum="5000.00"/> </h:inputText> <h:messages for="bidPrice"/>

17

Example: <f:validateLength>
<h:inputText id="symbol" required="true" size="6" value="#{customer.symbol}"> <f:validateLength maximum="6" minimum="2"/> </h:inputText>

18

Writing a Validation Method in a Backing Bean
19

Two Different Ways of Performing Custom Validations
1.Implement Validator interface 2.Implement validate() method in a backing bean

20

Implement a Validation Method in a Backing Bean
●

●

Backing bean can contain validation method that performs validation on the data of a component to which it is bound The validation method is then referred to as the value of validator attribute

21

Example: validateEmail() method (CoffeeBreak)
public void validateEmail(FacesContext context, UIInput toValidate) { String message = ""; String email = (String) toValidate.getValue(); if (email.indexOf('@') == -1) { toValidate.setValid(false); message = CoffeeBreakBean.loadErrorMessage(context, CoffeeBreakBean.CB_RESOURCE_BUNDLE_NAME, "EMailError"); context.addMessage(toValidate.getClientId(context), new FacesMessage(message, "")); } else { toValidate.setValid(true); } }
22

Example: Referencing validateEmail() method from Component Tag (CoffeeBreak)
<h:inputText id="email" value="#{checkoutFormBean.email}" size="25" maxlength="125" validator="#{checkoutFormBean.validateEmail}"/>

23

Creating Custom Validators
24

Example: Custom validator used for zip code in customerInfo.jsp (cardemo)
<cs:format_validator formatPatterns="99999|99999-9999|### ###" />

A 5-digit number ● A 9-digit number, with a hyphen between the 5th and 6th digits ● A 6-character string, consisting of numbers or letters, with a space between the 3rd and 4th character
●

25

Example: Custom validator used for zip code in customerInfo.jsp (cardemo)

26

Steps of Implementing Validator Interface
1.Implement Validator interface 2.Register error messages with the application or queue them onto the FacesContext 3.Register the Validator implementation 4.Create a custom tag or use the validator tag if you implemented a Validator interface 5.Reference the validator from the component tag
27

Step 1: Implemention Class of Validator Interface
● ●

validate() method a set of accessor methods for any attributes on the tag

28

Example: validate() method of FormatValidator (cardemo)–page1
public void validate(FacesContext context, UIInput component) { boolean valid = false; String value = null; if ((context == null) || (component == null)) { throw new NullPointerException(); } if (!(component instanceof UIOutput)) { return; } if ( formatPatternsList == null ) { component.setValid(true); return; }

29

Example: validate() method of FormatValidator (cardemo)-page2
Object input = ((UIOutput)component).getValue(); if(input != null) { value = input.toString(); //validate the value against the list of valid patterns. Iterator patternIt = formatPatternsList.iterator(); while (patternIt.hasNext()) { valid = isFormatValid( ((String)patternIt.next()), value); if (valid) { break; } }

30

Example: validate() method of FormatValidator (cardemo)-page3
if ( valid ) { component.setValid(true); } else { component.setValid(false); FacesMessage errMsg = MessageFactory.getMessage(context, FORMAT_INVALID_MESSAGE_ID, (new Object[] {formatPatterns})); context.addMessage(component.getClientId(context)), errMsg); } } }

31

Step 2.a: Register Error Messages
●

●

●

Application instance to be populated with the messages contained in the specified ResourceBundle message-bundle element represents a set of localized messages locale-config element lists the default locale and the other supported locales

32

Example: Registering Error Messages through App. Conf. File (cardemo)
<application> <message-bundle>carstore.bundles.Messages</message-bundle> <locale-config> <default-locale>en</default-locale> <supported-locale>de</supported-locale> <supported-locale>fr</supported-locale> <supported-locale>es</supported-locale> </locale-config> </application>

33

Step 2.b: Queuing an Error Message
●

Instead of registering messages in the configuration file, you can queue the message on the FacesContext programmatically

34

Example: Queuing an Error Message Programmatically (CoffeeBreak)-page1
... String message = ""; ... message = CoffeeBreakBean.loadErrorMessage(context, CoffeeBreakBean.CB_RESOURCE_BUNDLE_NAME, "EMailError"); context.addMessage(toValidate.getClientId(context), new FacesMessage(message, "")); ...

35

Example: Queuing an Error Message Programmatically (CoffeeBreak)-page2
public static String loadErrorMessage(FacesContext context, String basename, String key) { if ( bundle == null ) { try { bundle = ResourceBundle.getBundle(basename, context.getViewRoot().getLocale()); } catch (Exception e) { return null; } } return bundle.getString(key); }

36

Step 3: Registering the Validator Implementation in App. Conf. File
●

Custom validator needs to be available to application at startup time

37

Example: Registering Validator Implementation
<validator> <description> Registers the concrete Validator implementation, cardemo.FormatValidator with the validator identifier, FormatValidator </description> <validator-id>FormatValidator</validator-id> <validator-class>cardemo.FormatValidator</validator-class> <attribute> <description> List of format patterns separated by '|'. The validator compares these patterns against the data entered in a component that has this validator registered on it. </description> <attribute-name>formatPatterns</attribute-name> <attribute-class>java.lang.String</attribute-class> </attribute> </validator>

38

Step 4: Create a Custom Tag or Use the validator Tag
●

Option1:
– –

Specify which validator class to use with the validator tag The Validator implementation defines its own properties Create a custom tag that provides attributes for configuring the properties of the validator from the page Use it when you want to allow the page author to configure properties on the validator
39

●

Option2:
–

–

Step 4: Option 1 (<f:validator> tag)
●

●

Nest a <f:validator> tag inside the tag of the component whose data needs to be validated Set the validator tag's id attribute to the ID of the validator that is defined in the application configuration file
<f:validator validatorId="FormatValidator" /> ...

<h:inputText id="zip" value="#{CustomerBean.zip}" size="10" ... >

</h:inputText>

40

Step 4: Option 2 (Creating Custom Tag)
●

Steps to follow
1.Write a tag handler to create and register the Validator instance on the component 2.Write a TLD to define the tag and its attributes 3.Add the custom tag to the page

41

sub-step1: Write Tag Handler
●

Tag handler must extend the ValidatorTag class
– –

base class for all custom tag handlers that create Validator instances register custom tag handlers on a UI component FormatValidatorTag is the class that registers the FomatValidator instance

●

Example in CarDemo
–

42

Example: FormatValidatorTag (page1)
public class FormatValidatorTag extends ValidatorTag { ... // Attribute Instance Variables protected String formatPatterns = null; ... public FormatValidatorTag() { super(); super.setValidatorId("FormatValidator"); } public String getFormatPatterns() { return formatPatterns; } public void setFormatPatterns(String fmtPatterns){ formatPatterns = fmtPatterns; }

43

Example: FormatValidatorTag (page2)
protected Validator createValidator() throws JspException{ FormatValidator result = null; result = (FormatValidator) super.createValidator(); result.setFormatPatterns(formatPatterns); return result; } } // end of class FormatValidatorTag

44

sub-step2: Write TLD
●

A TLD contains information about a library and each tag contained in the library
–

carstore.tld defines custom validator tag

45

Example: carstore.tld (page1)
<taglib> <!-- ============== Tag Library Description Elements ============= -> <tlib-version>0.03</tlib-version> <jsp-version>1.2</jsp-version> <short-name>JavaServerFaces Framework Tag Library</short-name> <uri>carstoretaglibrary_1.1</uri> <description> This tag library contains tags used by the CarStore application. </description>

46

Example: carstore.tld (page2)
<!-- ===================== ImageMap tags ====================== --> <tag> <name>format_validator</name> <tag-class>carstore.FormatValidatorTag</tag-class> <description>Defines the format-validator tag, with the tag-handler class, carstore.FormatValidatorTag. This tag must be nested inside a UI component tag. The value of the UI component whose tag encloses the format_validator tag is validated against the format patterns defined by the formatPatterns attribute. </description> <attribute> <name>formatPatterns</name> <required>true</required> <rtexprvalue>false</rtexprvalue> <description> Defines the format patterns to use to validate the data of the UI component, whose tag encloses the format_validator tag. </description> </attribute> </tag> </taglib> 47

sub-step3: Add Custom Tag to JSP Page
● ●

Declare the custom tag library Nest the tag within UI component tag

48

Example: customerInfo.jsp (cardemo)
<%@ taglib uri="/WEB-INF/cardemo.tld" prefix="cd" %> ... <h:inputText id="zip" value="#{CustomerBean.zip}" size="10" required="true"> <cd:format_validator formatPatterns="99999|99999-9999|### ###" /> </h:inputText> <h:messages for="zip" />

49

Passion!
50


								
To top