We can achieve Zero Configuration in struts2 using java 5 annotations feature. Previously we normally configured struts.xml for all the configurations . The XML file wires up the action names (employee), with ActionSupport classes (EmployeeAction.java), and with the result to render back to the browser (success.jsp). Struts 2 provides an alternative to using XML to configure your application by using standard naming conventions and annotations for your action names, ActionSupport classes, and results.
We will use annotations in a small example and it is being developed in Eclipse.
Here we will take an example of Employee whose name, emailid, age and telephone would be captured using a simple page and we will put two validation to make sure that use always enter a name , a emailid and a telephone and age should be in between 18 and 65.
To start using annotations in your project, make sure you have included following jar files in your WebRoot/WEB-INF/lib folder:
- struts2-convention-plugin-x.y.z.jar
- asm-x.y.jar
- asm-commons-x.y.jar
- antlr-x.y.z.jar
- commons-fileupload-x.y.z.jar
- commons-io-x.y.z.jar
- commons-lang-x.y.jar
- commons-logging-x.y.z.jar
- commons-logging-api-x.y.jar
- freemarker-x.y.z.jar
- javassist-.xy.z.GA
- ognl-x.y.z.jar
- struts2-core-x.y.z.jar
- xwork-core.x.y.z.jar

Create main page:
Let us write main page JSP file employee.jsp, which will be used to collect Employee related information mentioned above.
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title><s:property value="getText('global.form')" /> - Struts2 Demo | dineshonjava.com</title>
<s:head />
</head>
<body>
<h2><s:property value="getText('global.form')" /></h2>
<s:form action="employee" method="post" validate="true" >
<s:textfield name="name" key="global.name" size="20"/>
<s:textfield name="age" key="global.age" size="20" />
<s:textfield name="email" key="global.email" size="20" />
<s:textfield name="telephone" key="global.telephone" size="20" />
<s:submit name="submit" key="global.submit" align="center" />
</s:form>
<s:url id="localeEN" namespace="/" action="locale" >
<s:param name="request_locale" >en</s:param>
</s:url>
<s:url id="localeHN" namespace="/" action="locale" >
<s:param name="request_locale" >hn</s:param>
</s:url>
<s:url id="localeES" namespace="/" action="locale" >
<s:param name="request_locale" >es</s:param>
</s:url>
<s:url id="localezhCN" namespace="/" action="locale" >
<s:param name="request_locale" >zh_CN</s:param>
</s:url>
<s:url id="localeDE" namespace="/" action="locale" >
<s:param name="request_locale" >de</s:param>
</s:url>
<s:url id="localeFR" namespace="/" action="locale" >
<s:param name="request_locale" >fr</s:param>
</s:url>
<s:a href="%{localeEN}" >English</s:a>
<s:a href="%{localeHN}" >Hindi</s:a>
<s:a href="%{localeES}" >Spanish</s:a>
<s:a href="%{localezhCN}" >Chinese</s:a>
<s:a href="%{localeDE}" >German</s:a>
<s:a href="%{localeFR}" >France</s:a>
</body>
</html>
Create Views:
We will use JSP file success.jsp which will be invoked in case defined action returns SUCCESS.
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title><s:property value="getText('global.form')" /> - Struts2 Demo | dineshonjava.com</title>
</head>
<body>
<h2><s:property value="getText('global.success')" />.</h2>
</body>
</html>
Create Action:
This is the place where annotation will be used. Let us re-define action class Employee with annotation, and then add a method called validate() as shown below in EmployeeAction.java file. Make sure that your action class extends the ActionSupport class, otherwise your validate method will not be executed.
package com.dineshonjava.struts2.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;
/**
* @author Dinesh Rajput
*
*/
@Results({
@Result(name="success", location="/success.jsp"),
@Result(name="input", location="/employee.jsp")
})
public class EmployeeAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
private String email;
private String telephone;
@Action(value="/employee")
public String addEmployee() {
return SUCCESS;
}
@RequiredFieldValidator( message = "The name is required" )
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@IntRangeFieldValidator(message = "Age must be in between 28 and 65",
min = "18", max = "65")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@RequiredFieldValidator( message = "The email is required" )
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@RequiredFieldValidator( message = "The phone is required" )
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
We have used few annotations in this example. Let me go through them one by one:
- First, we have included the Results annotation. A Results annotation is a collection of results. Under the results annotation, we have two result annotations. The result annotations have the name that correspond to the outcome of the execute method. They also contain a location as to which view should be served corresponding to return value from addEmployee().
- The next annotation is the Action annotation. This is used to decorate the addEmployee() method. The Action method also takes in a value which is the URL on which the action is invoked.
- Finally, I have used two validation annotations. I have configured the required field validator on name field and the integer range validator on the age field. I have also specified a custom message for the validations.
Configuration Files:
We really do not need struts.xml configuration file, so let us remove this file and let us check the content of web.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Struts2I18N</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>struts.custom.i18n.resources</param-name>
<param-value>global</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>employee.jsp</welcome-file>
</welcome-file-list>
</web-app>
Now, right click on the project name and click Export > WAR File to create a War file. Then deploy this WAR in the Tomcat’s webapps directory. Finally, start Tomcat server and try to access
URL http://localhost:8080/doj/employee.jsp.
This will give you following screen:

Employee error page because of validation fails

Employee page on success

Download Source Code
Struts2Annotation.zip





