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>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2836379775501347"
     data-ad-slot="8821506761"
     data-ad-format="auto"
     data-ad-region="mkyongregion"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script><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

About the Author

author image
mkyong
Founder of Mkyong.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

Leave a Reply

avatar
newest oldest most voted
Dave
Guest
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
Guest
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
Guest
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

Mekbib
Guest
Mekbib

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

Desmond
Guest
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
Guest
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
Guest
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
Guest
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!!!!!!!!