Struts2 execAndWait攔截器例子


在Struts2中附帶一個名為「execAndWait」一個非常有趣的「執行和等待」攔截器,這是一個非常方便的攔截器長時間執行操作在後台,顯示使用者的自定義的等待頁面。在本教學中,它顯示了一個完整的使用 Struts2 execAndWait 攔截器的例子。

1. 動作

一個普通的動作類,有一個長時間執行進程,證明了execAndWait效果。

LongProcessAction.java

package com.tw511.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頁面

建立兩個頁面:
  1. wait.jsp - 顯示給使用者,長時間執行的進程。
  2. success.jsp - 顯示給使用者的過程完成之後。
HTML meta refresh
記得把元重新整理的等待頁面頂部; 否則,該網頁將不重定向到成功頁面,即使該過程完成。

在這個wait.jsp,元重新整理設定在每5秒網頁重新載入,如果該過程完成後,將重定向到 success.jsp, 否則留在同一個頁面。

wait.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Struts 2 execAndWait 範例</title>
<meta http-equiv="refresh" content="5;url=<s:url includeParams="all" />"/>
</head>
 
<body>
<h1>Struts 2 execAndWait 範例</h1>

<h3>Please wait while we process your request...</h3>

</body>
</html>

success.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Struts 2 execAndWait 範例</title>
</head>
 
<body>
<h1>Struts 2 execAndWait 範例</h1>

<h3>Done</h3>

</body>
</html>

3. 執行和等待攔截器

連結動作類並宣告「execAndWait」攔截器。
execAndWait 引數
  1. delay (optional) : 以毫秒為單位初始延遲顯示在wait.jsp。預設是沒有延遲的。
  2. delaySleepInterval (optional) : 時間間隔是以毫秒為單位來檢查後台進程是否已經完成,預設值是100毫秒。

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.tw511.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> 

在這種情況下,將延遲1秒顯示至wait.jsp,並檢查後台進程是否在每500毫秒完成。即使這個過程完成後,它仍然需要等待 wait.jsp 元重新整理來觸發頁面過載。

4. 範例

存取網址: http://localhost:8080/struts2execandwait/longProcessAction.action

延時1秒,顯示在 wait.jsp 。
Struts 2 ExecAndWait interceptor example

當該過程完成時,自動顯示在 success.jsp。

Struts 2 ExecAndWait interceptor example

程式碼下載:http://pan.baidu.com/s/1o62BHGY

參考

  1. Struts2 execAndWait攔截器文件
  2. HTML Meta Refresh