Struts 2 execAndWait interceptor example

Struts 2 comes with a very interesting “Execute and Wait” interceptor named “execAndWait“, it’s a very convenient interceptor for long running actions in the background while showing the user an custom waiting page. In this tutorial, it shows a complete example to use the Struts 2 execAndWait interceptor.

1. Action

A normal action class, with a long running process to demonstrate the execAndWait effect.

LongProcessAction.java

package com.mkyong.common.action;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class LongProcessAction extends ActionSupport{
 
	public String execute() throws Exception {
 
		//it should be delay few seconds, 
		//unless you have a super powerful computer.
		for(int i =0; i<1000000; i++){
			System.out.println(i);
		}
		return SUCCESS;
 
	}
}

2. JSP pages

Create two pages :

  1. wait.jsp – show to user while process the long running process.
  2. success.jsp – show to user after the process is done.
HTML meta refresh
Remember to put the meta refresh on top of the waiting page; Otherwise, the page will not redirect to the success page, even the process is completed.

In this wait.jsp, the meta refresh is set the page to reload at every 5 seconds, If the process is done, it will redirect to the success.jsp, else stay at the same page.

wait.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="refresh" content="5;url=<s:url includeParams="all" />"/>
</head>
 
<body>
<h1>Struts 2 execAndWait example</h1>
 
<h2>Please wait while we process your request...</h2>
 
</body>
</html>

success.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
 
<body>
<h1>Struts 2 execAndWait example</h1>
 
<h2>Done</h2>
 
</body>
</html>

3. Execute and Wait Interceptor

Link the action class and declared the “execAndWait” interceptor.

execAndWait parameters

  1. delay (optional) : Initial delay in milliseconds to show the wait.jsp. Default is no delay.
  2. delaySleepInterval (optional) : Interval in milliseconds to check if the background process is already done. Default is 100 milliseconds.

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 	<constant name="struts.devMode" value="true" />
 
	<package name="default" namespace="/" extends="struts-default">
 
		<action name="longProcessAction" 
			class="com.mkyong.common.action.LongProcessAction" >
 
			<interceptor-ref name="execAndWait">
		        <param name="delay">1000</param>
		        <param name="delaySleepInterval">500</param>
		    </interceptor-ref>
 
		    <result name="wait">pages/wait.jsp</result>
		    <result name="success">pages/success.jsp</result>
		</action>
 
	</package>
 
 
</struts>

In this case, it will delay 1 second to show the wait.jsp, and check if the background process is already done at every 500 milliseconds. Even the process is done, it’s still need to wait the wait.jsp meta refresh to fire the page reload.

4. Demo

Acess the URL : http://localhost:8080/Struts2Example/longProcessAction.action

Delay 1 second and show the wait.jsp.

Struts 2 ExecAndWait interceptor example

When the process is completed, show the success.jsp automatically.

Struts 2 ExecAndWait interceptor example

Reference

  1. Struts 2 execAndWait interceptor documentation
  2. HTML Meta Refresh
Tags :

About the Author

mkyong
Founder of Mkyong.com and HostingCompass.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

  • Dave

    hi,

    First i want to thank you for all your tutorials and links,help. And i just want to inform you and other users who wants to try this example that this is throwing issue because in code we are not adding page address in wait.jsp….. To make it work and redirect to page you should add like this. it work for me. And one more thing remove 1000 from struts.xml file then it will work. I am hoping it will help others.

  • Marco

    I know this post is very old, but it’s my only hope :-D

    When i use execAndWait with uploadFile, this interceptor delete my file from temp direcotry and my action run in NullPointerException.

  • qwerty

    Hi myyong

    I have used exec and wait interceptor for file downloading. I want to redirect the page to success page on downloading rather than remaining in the wait page.
    Please help me!

    my struts.xml :

    1000
    500

    application/octet-stream
    fileInputStream
    attachment;filename=”fileABC.txt”
    1024

  • http://amekbib.blogspot.com Mekbib

    I found this article very helpful, keep up the good work Mkyong

  • Desmond

    Hello,

    Do you know if it is possible to do execute and wait if you have a stream result?

    For example I am generating an XLS file which takes a long time and i want to display a loading gif. However the Stream result will allow the user to Save or open the file but the Wait page will remain…….

    Thanks

    Des

    • Omizo

      I am facing the same problem you had. Please let me know if you were able to resolve the issue with long run when dealing stream result.

  • Jitendra

    Hi,

    Please help how i can subclass of BackgroundProcess class.

    I m getting problem Unable to instantiate an instance of Interceptor class when

  • live_for_java

    In given example..
    May i know where we have declare the result name “wait”…
    is it from execandwait interceptor?
    Please clear me.. Really its a awesome interceptor!!!!!!!!

    • http://www.mkyong.com mkyong
      • Live_for_java

        Hi mkyoung;

        Thanks for your suggestion. I try this example i stated below how i did and what problem i faced. I have one login.jsp,wait.jsp, and welcome.jsp and loginAction.java class. I configured execAndWait in my struts.xml. I have one forloop (limit 1000000) in action class which will looped before returning of success. Problem is i am getting nullpointer exception for user name and password fields. If i commented interceptor decleration in struts.xml then its working fine. so please tell me where i am getting wrong.But i strongly conclude that due to this interceptor only i am getting nullpointer. i used meta tag in wait.jsp.Please help…

        if(this.userName.equalsIgnoreCase(“admin”)
        && this.passWord.equalsIgnoreCase(“admin123″))
        {
        for(int i = 1; i <= 1000000;i++)
        {
        System.out.println("Current i value is :"+ i);
        }

        addActionMessage("Thanks For Your Successfull Login…….");
        return "Success";
        }
        else
        {
        addActionError(getText("error.login"));
        return "Invalid";
        }

        with regards;
        Live_for_java

        • Nikhil

          Hi Live_for_java,
          Did you get soln of your problem?
          I am also facing this issue. In all examples available on net, the method has been used without instance varible, which is useless. The moment you start using you instanace variable allong with this interceptor, we are getting null pointer. There is somethign else which has not been mentioned,

          Thanks
          Nikhil