Struts Validation Framework tutorial with example.

      

apache struts logo
Apache Struts has changed the way we develop a Web application. Since its inception as an MVC architecture, Struts has been extensively used in J2EE world to develop robust, extendable and effective web applications.

Introduction to Struts Validation Framework

One of the important features of Struts framework is Struts Validation framework that performs validation on incoming form data. Validation framework was introduced by David Winterfeldt as an external plugin to Struts framework. It’s functionality has since been split so that validator can serve as the basis for a independant component and is now part of Jakarta Commons.

The Struts framework’s simple validation interface alleviates much of the headache associated with handling data validation, allowing you to focus on validation code and not on the mechanics of capturing data and redisplaying incomplete or invalid data.

In order to do form validation without Validator framework, one has to use validate() method of the form bean (ActionForm class) to perform this task. Also one has to handle error messages during manual validation. Lot of fields that we validate require same logic to validate them, hence code is unneccessarily duplicated (if not managed properly).

Validation framework comes with set of useful routines to handle form validation automatically and it can handle both server side as well as client side form validation. If certain validation is not present, you can create your own validation logic and plug it into validation framework as a re-usable component.

Validator uses two XML configuration files to determine which validation routines should be installed and how they should be applied for a given application, respectively. The first configuration file, validator-rules.xml, declares the validation routines that should be plugged into the framework and provides logical names for each of the validations. The validator-rules.xml file also defines client-side JavaScript code for each validation routine. Validator can be configured to send this JavaScript code to the browser so that validations are performed on the client side as well as on the server side.

The second configuration file, validation.xml, defines which validation routines should be applied to which Form Beans. The definitions in this file use the logical names of Form Beans from the struts-config.xml file along with the logical names of validation routines from the validator-rules.xml file to tie the two together.

Using the Validator framework involves enabling the Validator plug-in, configuring Validator’s two configuration files, and creating Form Beans that extend the Validator’s ActionForm subclasses. The following sections explain in detail how to configure and use Validator.

Create a Struts project

Create a struts web application project. I assume you have working environment set for a Struts project. If not then go through the tutorial: Creating Struts application using Eclipse and create a struts project.

Create Form Beans

struts validator form bean
Create a form bean in your project called CustomerForm and copy following code in it.

package net.viralpatel.struts.validation.form;

import org.apache.struts.validator.ValidatorForm;

public class CustomerForm extends ValidatorForm {

	private String name;
	private String telephone;
	private String email;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

We will use this validator plugin to validate this form. Note that the form bean is extended from class ValidatorForm and not ActionForm as we generally do in Struts project.

Add Validator Plug-in in struts-config.xml

In order to use Validator in our project we need to configure it in struts-config.xml file. For this add following code in your struts-config.xml file.

<!-- Validator Configuration -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
	<set-property property="pathnames"
		value="/WEB-INF/validator-rules.xml,
				/WEB-INF/validation.xml" />
</plug-in>

This definition tells Struts to load and initialize the Validator plug-in for your application. Upon initialization, the plug-in loads the comma-delimited list of Validator config files specified by the pathnames property. Each config file’s path should be specified by use of a Web application-relative path, as shown in the previous example.

Define validations for the form

validation.xml file struts validator framework

Create a file validation.xml in your applications WEB-INF directory. And copy following content in it.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<global>
	<constant>
	<constant-name>telephoneFormat</constant-name>
	<constant-value>^\d{5,10}$</constant-value>
	</constant>
</global>
<formset>
	<form name="CustomerForm">
		<field property="name" depends="required">
			<arg key="label.name" />
		</field>
		<field property="age" depends="required, integer, intRange">
			<arg0 key="label.age" />
			<arg1 key="${var:min}" resource="false"/>
			<arg2 key="${var:max}" resource="false"/>
			<var>
				<var-name>min</var-name>
				<var-value>1</var-value>
			</var>
			<var>
				<var-name>max</var-name>
				<var-value>125</var-value>
			</var>
		</field>
		<field property="telephone" depends="required, mask">
			<arg key="label.telephone" />
			<arg1 key="label.telephone" />
			<var>
				<var-name>mask</var-name>
				<var-value>${telephoneFormat}</var-value>
			</var>
		</field>
		<field property="email" depends="email">
			<arg0 key="label.email" />
			<arg1 key="label.email" />
		</field>
	</form>
</formset>
</form-validation>

In the above xml file, we have defined the rules for form validation. Note that we are validating form CustomerForm and the fields being validated are name, age, telephone and email. <field> tag defines the validation for a property of form. We can specify different rules like required, integer, email, intRange, mask etc in depends attribute of field tag..

Also you can define constants that can be reused in the validation xml using global constants tag.

Struts-config.xml entry for the action

Following is the entry in struts-config.xml file which maps the Action to our Validator form.

<form-beans>
	<form-bean name="CustomerForm"
		type="net.viralpatel.struts.validation.form.CustomerForm" />
</form-beans>
...
...
...
<action-mappings>
...
	<action path="/customer" name="CustomerForm" validate="true"
		input="/index.jsp"
		type="net.viralpatel.struts.validation.action.CustomerAction">
		<forward name="success" path="/Customer.jsp" />
		<forward name="failure" path="/index.jsp" />
	</action>
...
</action-mappings>

Configuring ApplicationResources.properties

Struts validation framework uses externalization of the error messages. The messages are stored in a property file (ApplicationResource.properties) and are referred by the key values. Copy following in your ApplicationResource.properties (or MessageResource.properties).

label.name= Name
label.email= Email
label.telephone= Telephone
label.age= Age

# general error msgs
errors.header=<font size="2"><UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
errors.footer=</UL></font>
errors.invalid={0} is invalid.
errors.maxlength={0} can not be greater than {1} characters.
errors.minlength={0} can not be less than {1} characters.
errors.range={0} is not in the range {1} through {2}.
errors.required={0} is required.
errors.byte={0} must be an byte.
errors.date={0} is not a date.
errors.double={0} must be an double.
errors.float={0} must be an float.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.short={0} must be an short.

Create JSP to display the form

Create a JSP file called index.jsp and copy following content in it.

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<html>
<head>
<title>Struts Validation Framework example.</title>
</head>
<body>

<html:errors />
<html:javascript formName="CustomerForm" />

<html:form action="/customer">

	<bean:message key="label.name" />
	<html:text property="name"></html:text>
	<br />
	<bean:message key="label.age" />
	<html:text property="age"></html:text>
	<br />
	<bean:message key="label.email" />
	<html:text property="email"></html:text>
	<br />
	<bean:message key="label.telephone" />
	<html:text property="telephone"></html:text>
	<br />

	<html:submit value="Submit"></html:submit>

</html:form>
</body>
</html>

Running the application

We are done with our application. Now execute it from any web container (Tomcat in my case) and open in browser.
struts validator form screen

Enter any invalid value in the form and press submit.

struts-validator-form-screen2

Post your comments / doubts on this tutorial.


Facebook  Twitter      Stumbleupon  Delicious
  

35 Comments on “Struts Validation Framework tutorial with example.”

  • chinnu wrote on 26 February, 2009, 12:48

    please provide struts 1.2 server side and client side validation

  • jj wrote on 2 March, 2009, 16:15

    Hi I read about this CustomerAction but I don’t see any codes for that. Can anyone enlighten me? Thanks

  • Viral Patel wrote on 27 April, 2009, 20:18

    Hi JJ,
    CustomerAction class file is a normal implementation of Action class that does not have anything special in it. The error handling is done using Validation framework. CustomerAction class will not be invoked in case of any validation errors.

  • ghast wrote on 15 May, 2009, 1:29

    Simple & to the point.
    Good article for the beginners.

  • Ravi Shiraguppi wrote on 21 May, 2009, 11:49

    Very good I leaned jar file creation in one shot

  • neeraj wrote on 3 June, 2009, 18:57

    Hi All,
    actually when i run this application , i got this exception
    java.lang.NoClassDefFoundError: org/apache/commons/validator/ValidatorResources

    i loaded all necessary jar file but couldnot solve this problem can anyone tell me why this happening.
    Thanks

  • Viral Patel wrote on 3 June, 2009, 19:55

    Hi Neeraj,
    Can you give the list of the jars that you have used in the project. Check struts-validation jar and struts.jar file. Open these jars and see if the class ValidatorResources is available. I am very sure the problem is with the jar only.

  • krishna kumar sahu wrote on 10 June, 2009, 15:42

    THANKS,
    I was vary confuse about this .

  • krishna kumar sahu wrote on 10 June, 2009, 15:54

    sorry ,
    in my system same this program generate different result it’s print the welcome statement which is wrote in MessageResource.properties file . ?
    why this msg is shown ?
    now what can I do .?

  • thangeswaran wrote on 6 July, 2009, 18:57

    good.thank u.i like very much for this site

  • Viral Patel wrote on 6 July, 2009, 19:00

    Thanks for the comment Thangeswaran. :) Feel free to subscribe for Email or RSS feed and get the latest articles.

  • Thulasiram wrote on 13 August, 2009, 11:29

    Hi all
    Actually when i run this application i got the errors like this..Could u please help me out in solving this error.

    org.apache.jasper.JasperException: org.apache.commons.validator.ValidatorResources.get(Ljava/util/Locale;Ljava/lang/Object;)Lorg/apache/commons/validator/Form;
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

    root cause

    javax.servlet.ServletException: org.apache.commons.validator.ValidatorResources.get(Ljava/util/Locale;Ljava/lang/Object;)Lorg/apache/commons/validator/Form;
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
    org.apache.jsp.customer_jsp._jspService(customer_jsp.java:99)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

    root cause

    java.lang.NoSuchMethodError: org.apache.commons.validator.ValidatorResources.get(Ljava/util/Locale;Ljava/lang/Object;)Lorg/apache/commons/validator/Form;
    org.apache.struts.taglib.html.JavascriptValidatorTag.doStartTag(JavascriptValidatorTag.java:316)
    org.apache.jsp.customer_jsp._jspx_meth_html_005fjavascript_005f0(customer_jsp.java:132)
    org.apache.jsp.customer_jsp._jspService(customer_jsp.java:85)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

  • marken wrote on 18 August, 2009, 13:52

    hi all

    i have 1problem,when the validate framework send message to client ,how can i make the form element() onfocus

  • Viral Patel wrote on 18 August, 2009, 15:05

    Hi Marken, I guess Struts does not provide any mechanism for focusing the element having error.

  • marken wrote on 19 August, 2009, 6:46

    hi Viral Patel ,i have some questions

    first: when i use in my project
    it will create lots of js code in my html page code .Can it only create the js which is i defined in
    the validate.xml,for example i defined “ ” ,it only create the required js.

    second : when i use validation in service and validate is failed ,how my client html field onfoucs . for example html field ,when the user is validate failed ,how can on focus

  • Viral Patel wrote on 19 August, 2009, 14:13

    @marken, The javascript code that is being generated by Struts is not very configurable. When we use tag , it generates all those javascript. You may want to disable client side validation by removing this tag altogether.

    As I said, I am not aware of any mechanism provided by Struts to call onfocus of element if validation fails.

    I will suggest to use Struts validation for server side validation.

  • ashok wrote on 21 August, 2009, 12:16

    i want a simple example using struts and mysql..

  • Tarun wrote on 31 August, 2009, 11:13

    I have got the exception while doing the validation please give me suggestion

    javax.servlet.jsp.JspException: Missing message for key “label.name”
    at org.apache.struts.taglib.bean.MessageTag.doStartTag(MessageTag.java:297)
    at org.apache.jsp.actionform.index_jsp._jspx_meth_bean_005fmessage_005f0(index_jsp.java:195)
    at org.apache.jsp.actionform.index_jsp._jspx_meth_html_005fform_005f0(index_jsp.java:126)
    at org.apache.jsp.actionform.index_jsp._jspService(index_jsp.java:88)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    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:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

  • JavaTrainer wrote on 20 September, 2009, 22:04

    Nice work. Keep it up.

  • Madhu wrote on 21 October, 2009, 23:20

    The article was very good. It worked at the first instance for me.
    The validations mentioned in this example are only client side, not server side.

  • Viral Patel wrote on 21 October, 2009, 23:38

    Hi Madhu, Thanks for the comment.
    The above example does the server side validation as well. Please comment out the following code to check server side validation:

    <html:javascript formName="CustomerForm" />
    
  • Namrata wrote on 16 November, 2009, 10:58

    Hi,
    I am new to validation and have the following doubts.

    1. The jsp file that you mentioned above – is it ‘index.jsp’ or ‘customer.jsp’
    2. What should be there in index.jsp :
    in this part in place of “login”
    Kindly help.

  • Namrata wrote on 16 November, 2009, 12:50

    Hi,
    I am getting the following error when I run. What exactly are we supposed to have in the index.jsp and customer.jsp files.

    javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:102)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

  • Viral Patel wrote on 16 November, 2009, 15:03

    @namrata, The above JSP will be called index.jsp. Customer.jsp will be a dummy JSP to display success message. You can have following content in Customer.jsp

    <h3>Customer Added Successfully.</h3>
    
  • Namrata wrote on 17 November, 2009, 10:04

    “Cannot find ActionMappings or ActionFormBeans collection”

    This problem is still there. Could you help me with this!!

  • Namrata wrote on 17 November, 2009, 10:36

    Hi, the problem got fixed. I had the wrong web.xml. But now my problem is similar to that of Tarun.

    Missing message for key “label.username”

    I have not used this anywhere…

  • Namrata wrote on 17 November, 2009, 10:40

    Could you also provide the validator-rules.xml file?

  • Namrata wrote on 17 November, 2009, 12:04

    Hi,
    My code is finally up and running. Sorry for bombarding you with so many queries :) .
    When I enter the correct values, the result is a success and the correct jsp is displayed. But, when I enter the wrong value, the result is a failure and again index.jsp is displayed … right?? The errors etc are not getting displayed. What could be the problem?

  • Namrata wrote on 17 November, 2009, 14:51

    Unfortunately, now it is giving this error :(

    exception

    org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

    root cause

    java.lang.NullPointerException
    org.apache.struts.taglib.html.JavascriptValidatorTag.renderJavascript(JavascriptValidatorTag.java:367)
    org.apache.struts.taglib.html.JavascriptValidatorTag.doStartTag(JavascriptValidatorTag.java:349)
    org.apache.jsp.index_jsp._jspx_meth_html_005fjavascript_005f0(index_jsp.java:141)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:92)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

  • hergibboppith wrote on 26 November, 2009, 2:22

    I’m often searching for brand-new articles in the WWW about this matter. Thankz!

  • shijuk wrote on 3 December, 2009, 15:35

    hi jj
    can u tel this is serverside validation or client side validation …plz i am confused

  • Viral Patel wrote on 3 December, 2009, 16:05

    @shijuk, This example shows both the server as well as client side validation.

  • Sheetal wrote on 11 December, 2009, 22:15

    Hi Viral,

    This article is really very nice, simple and well written.

    Thanks and Good Luck for future articles.

  • RJ wrote on 15 December, 2009, 14:42

    Hi VP

    I have done same done the same code for login page. In the username filed, I have set two constraints which are not null and do not allow special char. When I executed, I am got only username is required for required attribute. but mask msg is not come, if entered special char.
    my validation.xml code is here.
    Please correct me, if i did any wrong.

    Advance thanks
    RJ

  • RJ wrote on 15 December, 2009, 14:43

    mask
    ^[0-9a-zA-Z]*S

Write a Comment

Gravatars are small images that can show your personality. You can get your gravatar for free today!

Copyright © 2010 ViralPatel.net. All rights reserved.