有时候当我们从前台提交大量的数据到服务器时,由于服务器处理的时间较长,这个时候我们在浏览器中看到的是一片空白,不知道后台程序是否成功执行了,这个时候就设置一个友好的信息交互界面(比如在界面上提示系统正在处理等信息)来提示用户。
(1) 在struts2中,实现该功能的是使用execAndWait拦截器,它的具体实现过程如下:
1、当表单提交请求到来时,execAndWait拦截器将创建一个新的线程来执行Action,然后返回一个等待页面给用户,让用户知道请求正在处理中。
2、等待页面将包含自动刷新功能,等待界面每隔几秒就通知浏览器,向初始请求的URL再次发送请求。
3、execAndWait拦截器将再次拦截请求,判断Action是否执行完成,如果仍未执行完成,则继续返回等待界面给用户,如果已经执行完成,则向用户返回相应的执行成功界面。
(2) execAndWait拦截器的参数
1、threaPriority 可选参数,用来指定线程的优先级,默认值为Thread.NORM_PRIORITY。
2、delay 可选参数,指定显示,等待页面前,初始等待的延迟时间,以ms为单位。
3、delaySleepInterval 可选参数,只能和dalay参数一起使用,用来指定检查后台进程是否执行完毕的时间间隔,以ms为单位。
(3)execAndWait在struts.xml文件中的配置如下:
<action name="Exception" class="cn.test.action.ExceptionTestAction" method="execute">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="execAndWait"></interceptor-ref>
<result name="success">/WEB-INF/jsp/Esuccess.jsp</result>
<result name="wait">/WEB-INF/jsp/wait.jsp</result>
</action>
提示等待wait.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="refresh" content="5">
</head>
<body>
正在处理中.....
</body>
</html>
运行程序,5秒后将执行页面刷新操作,如果发现Action已经完成操作,则返回success指向的视图Esuccess.jsp,如果发现Action没有完成相应的操作,则会再次请求wait.jsp页面。
如果设置delay参数
<interceptor-ref name="execAndWait">
<param name="delay">1000</param >
</interceptor-ref>
表示在提交表单后,1000ms内不论Action是否处理完成,都不会显示等待页面。在1000ms之后,如果Action能够处理完请求,则根据Action的返回结果显示相应的视图,否则,继续显示等待wait.jsp界面。