Struts 2 Interceptors: Basics
Struts2 provides very powerful mechanism of controlling a request using Interceptors. Interceptors are responsible for most of the request processing. They are invoked by the controller before and after invoking action, thus they sits between the controller and action. Interceptors performs tasks such as Logging, Validation, File Upload, Double-submit guard etc.The request processing lifecycle of Struts2 framework is pretty much discussed Part 1 – Introduction to Struts2 Framework.
- Request is generated by user and sent to Servlet container.
- Servlet container invokes FilterDispatcher filter which in turn determines appropriate action.
- One by one Intercetors are applied before calling the Action. Interceptors performs tasks such as Logging, Validation, File Upload, Double-submit guard etc.
- Action is executed and the Result is generated by Action.
- The output of Action is rendered in the view (JSP, Velocity, etc) and the result is returned to the user.
Struts2 comes with default list of Interceptors already configured in the application in
struts-default.xml
file. We can create our own custom Interceptors and plugin into a Struts2 based web application.Framework creates an object of ActionInvocation that encapsulates the action and all the interceptors configured for that action. Each interceptors are called before the action gets called. Once the action is called and result is generated, each interceptors are again called in reverse order to perform post processing work. Interceptors can alter the workflow of action. It may prevent the execution of action.
Our Goal
Our goal will be to create a customer interceptor MyLoggingInterceptor, which will log the request before any action is called. Also it will prints the Action class name and execution time of action in milliseconds.Create Logging Interceptor
Create a java classMyLoggingInterceptor
in package net.viralpatel.struts2.interceptors
and copy following content into it.package net.viralpatel.struts2.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class MyLoggingInterceptor implements Interceptor{ private static final long serialVersionUID = 1L; public String intercept(ActionInvocation invocation) throws Exception { String className = invocation.getAction().getClass().getName(); long startTime = System.currentTimeMillis(); System.out.println( "Before calling action: " + className); String result = invocation.invoke(); long endTime = System.currentTimeMillis(); System.out.println( "After calling action: " + className + " Time taken: " + (endTime - startTime) + " ms" ); return result; } public void destroy() { System.out.println( "Destroying MyLoggingInterceptor..." ); } public void init() { System.out.println( "Initializing MyLoggingInterceptor..." ); } } |
Configuring Interceptor in struts.xml
Once we have created an interceptor class, all we need to do is to configure it instruts.xml
file and use it with actions.To configure newly created interceptor, add following code in struts.xml
< interceptors > < interceptor name = "mylogging" class = "net.viralpatel.struts2.interceptor.MyLoggingInterceptor" > </ interceptor > < interceptor-stack name = "loggingStack" > < interceptor-ref name = "mylogging" /> < interceptor-ref name = "defaultStack" /> </ interceptor-stack > </ interceptors > |
Here we have configured a new interceptor mylogging with tag
We can make the new loggingStack as default interceptor stack or can configure it at each action level. In order to make it default stack, we should add following in struts.xml
< default-interceptor-ref name = "loggingStack" ></ default-interceptor-ref > |
Also we may want to apply the custom interceptor stack to only certain actions. To do so, we must add interceptor-ref tag in action.
< action name = "login" class = "net.viralpatel.struts2.LoginAction" > < interceptor-ref name = "loggingStack" ></ interceptor-ref > < result name = "success" type = "tiles" >/welcome.tiles</ result > < result name = "error" >Login.jsp</ result > </ action > |
That’s All Folks
If we execute our StrutsHelloWorld application in Eclipse and see the console logs, we will find the log statements that we print in our interceptor.Initializing MyLoggingInterceptor... .. .. .. Before calling action: net.viralpatel.struts2.LoginAction .. .. After calling action: net.viralpatel.struts2.LoginAction Time taken: 313 ms .. .. .. Destroying MyLoggingInterceptor... |
No comments:
Post a Comment