Annotations in Struts2 with an Example

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

 

<<Previous <<   || Index ||   >>Next >>
Previous
Next