I
am going to explain step by step. I am going to develop a timer interceptor,
which is used to calculate total time taken to process this request. We use the
same example “simple form which takes a number from user, and displays success
message if it is even number, else failure message”
numCheck.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Simple struts2 Application</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form method="post" action="check"> Enter a Number<input type="text" name="number" /><br /> <input type="submit" value="submit" /> </form> </body> </html>
NumberCheckAction.java
public class NumberCheckAction { private int number; private static String SUCCESS = "success"; private static String FAILURE = "failure"; public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public String execute(){ if(getNumber() %2 == 0){ return SUCCESS; } else{ return FAILURE; } } }
success.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Success Page</title> </head> <body> <h1>Hurray you entered even number</h1> </body> </html>
failure.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Failure page</title> </head> <body> <h1>Sorry, you entered odd number</h1> </body> </html>
How to add custom interceptor
to NumberCheckAction class
Step 1: To create custom
interceptor, you must implement ‘com.opensymphony.xwork2.interceptor.Interceptor’
interface.
public interface Interceptor extends Serializable { public void destroy(); public void init(); public String intercept(ActionInvocation ai) throws Exception; }
Init
and destroy are life cycle methods, you can perform initialize and clean up
operations in these methods. Real task of interceptor happened in intercept
method.
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class Timer implements Interceptor{ @Override public void destroy() { throw new UnsupportedOperationException("Timer destroyed"); } @Override public void init() { throw new UnsupportedOperationException("Timer initialized"); } @Override public String intercept(ActionInvocation ai) throws Exception { long time1 = System.currentTimeMillis(); String result = ai.invoke(); long time2 = System.currentTimeMillis(); System.out.println("Time taken is " +(time2-time1)); return result; } }
ai.invoke()
In
the interceptor intercept() method, you must
call the ai.invoke()and return it’s result. This is the method
responsible for calling the next interceptor or the action. The action will
failed to continue without calling the ai.invoke()method.
Step 2: configure
struts.xml class
<!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"> <interceptors> <interceptor name="timerCheck" class="Timer"></interceptor> <interceptor-stack name="newStack"> <interceptor-ref name="timerCheck"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="check" class="NumberCheckAction" > <interceptor-ref name="newStack"/> <result name="success">success.jsp</result> <result name="failure">failure.jsp</result> </action> </package> </struts>
Run
numCheck.html, you can get below messages in server console.
INFO:
Timer initialized
INFO:
Time taken is 2010
No comments:
Post a Comment