Introduction:
- The chapter will explain the interceptor “chain” in Struts 2 with an example program.
chain Interceptor:
- As the name suggests, chain interceptor is used for chaining the actions in Struts 2.
- A sequence of action classes can be executed by chain interceptor. That is, more than one action class can be executed by the implemented chain interceptor.
- In our example, the web application gets the details like name, model no, price and the number of units to purchase of a car from user and displays the total amount to pay on the next page to the user. So the first.jsp can be coded as:
// first.jsp <%-- Document : first Created on : Nov 20, 2014, 12:34:17 PM Author : Wideskills.com --%> <%@page contentType = "text/html" pageEncoding = "UTF-8"%> <%@taglib prefix = "s" uri = "/struts-tags" %> <!DOCTYPE html> <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title> Get your Car Application - Main Page </title> </head> <body> <s:form action = "click" method = "POST"> <h1> Car details </h1> <hr/> <s:label value = "Enter name"/> <s:textfield name = "name"/> <s:label value = "Enter model no."/> <s:textfield name = "id"/> <s:label value = "Enter price"/> <s:textfield name = "price"/> <s:label value = "Enter the number of units to purchase"/> <s:textfield name = "units"/> <s:submit name = "SUBMIT"/> <s:reset name = "RESET"/> </s:form> </body> </html>
- The next.jsp will gather the information from first.jsp, and will calculate the total amount to pay.
- So, next.jsp can be written as follows:
//next.jsp <%-- Document : next Created on : Nov 20, 2014, 12:50:20 PM Author : Admin --%> <%@page contentType = "text/html" pageEncoding = "UTF-8"%> <%@taglib prefix = "s" uri = "/struts-tags" %> <!DOCTYPE html> <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title> Get your Car Application - Invoice Page </title> </head> <body> <h1> Purchase Invoice of Car </h1> <hr/> <h4> <s:label value = "Car Model Number : "/> <s:property value = "id"/> </h4> <h4> <s:label value = "Car Name : "/> <s:property value = "name"/> </h4> <h4> <s:label value = "Price of 1 unit : "/> <s:property value = "price"/> </h4> <h4> <s:label value = "Total Price : "/> <s:property value = "answer"/> </h4> </body> </html>
- The first.jsp will run as follows:
Figure-1
- Now, as we have to use chain interceptor (chaining of action classes), we will create two action classes here.
- Myaction_1.java – only responsible for details of Model ID and car name.
- Myaction_2.java – responsible for calculating final payable amount from the price entered and number of units of be purchased.
- So Myaciton1.java will be coded as:
// Myaction_1.java /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package action_class; import com.opensymphony.xwork2.ActionSupport; import java.io.*; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.apache.struts2.interceptor.ServletRequestAware; /** * * @author Admin */ public class Myaction_1 extends ActionSupport { private String id; private String name; public String getId() { return id; } public String getName() { return name; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public String execute() { return SUCCESS; } }
- And Myaction_2.java will be as follows:
// Myaction_2.java /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package action_class; import com.opensymphony.xwork2.ActionSupport; /** * * @author Admin */ public class Myaction_2 extends ActionSupport { private int price,units,answer; public int getUnits() { return units; } public void setUnits(int units) { this.units = units; } public int getAnswer() { return answer; } public void setAnswer(int answer) { this.answer = answer; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String execute() { answer = units * price; return "success"; } }
- Now to combine our JSP’s with action class, we need to configure our struts.xml.
//struts.xml <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name = "default" namespace = "/" extends = "struts-default"> <action name = "click" class = "action_class.Myaction_1"> <result name = "success" type = "chain"> Myaction_2 </result> </action> <action name = "Myaction_2" class = "action_class.Myaction_2"> <result name = "success"> jsp/next.jsp </result> </action> </package> </struts>
- The chain interceptor element is given in result element with following syntax:
<result name = “Name of result” type = “chain” > JSP page name </result>
- In our example, on click of submit button, Myaction_1.java should be executed followed by another action class (chain) – Myaction_2.java. So the action element can be written as:
<action name = "click" class = "action_class.Myaction_1">
<result name = "success" type = "chain"> Myaction_2 </result>
</action>
- And again, on the success of Myaction_2.java, next.jsp is to be displayed. That is,
<action name = "Myaction_2" class = "action_class.Myaction_2">
<result name = "success"> jsp/next.jsp </result>
</action>
- And at last, web.xml can be given as:
//web.xml <?xml version = "1.0" encoding = "UTF-8"?> <web-app version = "3.1" xmlns = "http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name> struts2 </filter-name> <url-pattern> /* </url-pattern> </filter-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file> jsp/first.jsp </welcome-file> </welcome-file-list> </web-app>
- So the application will run as follows:
Figure: First run of application