struts2 应用程序创建进度条(等待页面)

来源:互联网 发布:淘宝banner图尺寸 编辑:程序博客网 时间:2024/04/29 07:14

Struts 2模拟进度条的原理

      对于一些需要较长时间才能完成的任务,在Web开发中,会由HTTP协议会因为超时而断开而面临许多风险,这是在桌面开发不曾遇到的。Struts 2提供的execAndWait拦截器就是为了处理和应付这种情况而设计的。注意,该拦截器不在"defaultStack"中,所以必须在使用它的动作里声明它,并且必须放在拦截器栈的最后一个。

      使用了该拦截器后,动作依然正常执行,只是该拦截器会分配一个后台线程处理动作的运行,并在动作完成之前把用户带到一个"等待"页面。,该页面每隔一段时间刷新一次,直到那个后台线程执行完毕为止。如果用户随后又触发了同一个动作,但顶一个动作尚未执行完毕,这个拦截器将继续向用户发送"等待"结果;如果他已经执行完毕,用户会看到该动作的最终结果。

      "等待"结果的行为与"dispatcher"结果的行为很相似,但是要注意的是,"等待"结果对应的视图带有如下的meta标签:

 

java代码:
查看复制到剪贴板打印
  1. <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>  

 

该标签的作用就每隔多少秒就重新加载一次同样的URL。这里"5"表示5秒,"url=/Struts2/default_progressbar.action"表示要加载的URL。

Struts 2是一个灵活强大的框架,如果你不喜欢Struts 2提供的默认"等待页面",你也可以自己设计自己的等待页面,若在动作声明中,没有找到"等待"结果,将使用默认值。


execAndWait拦截器

execAndWait拦截器 可以接收以下参数:

  • threadPriority:分配给相关线程的优先级,默认值为Thread.NORM_PRIORITY。
  • delay:向用户发送"等待"结果前的毫秒数,默认值为0。如果你不想立刻发送"等待"结果,可以将该参数设置为一个值。例如,你想让动作超过2秒还未完成时才发送"等待"结果,需要将其值设置为2000.
  • delaySleepInterval:每隔多少毫秒唤醒主线程(处理动作的后台线程)去检查后台线程是否已经处理完成,默认值是100。这个值设为0时无效。

示例:使用默认视图与自定义视图

创建一个动作类,该动作类的工作为挂起30秒:

 

java代码:
查看复制到剪贴板打印
  1. public class ProgressbarAction extends ActionSupport  
  2. {  
  3.     private static final long    serialVersionUID    = 7441785390598480063L;  
  4.   
  5.     private int                    complete            = 0;  
  6.   
  7.     // 获取进度值  
  8.     public int getComplete()  
  9.     {  
  10.         complete += 10;  
  11.         return complete;  
  12.     }  
  13.   
  14.     @Override  
  15.     public String execute()  
  16.     {  
  17.         try  
  18.         {  
  19.             Thread.sleep(30000);  
  20.         }  
  21.         catch (InterruptedException e)  
  22.         {  
  23.             e.printStackTrace();  
  24.         }  
  25.         return SUCCESS;  
  26.     }  
  27. }  

 

配置struts.xml文件:

 

java代码:
查看复制到剪贴板打印
  1. <package name="progressbar" extends="struts-default">  
  2.     <action name="default_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">  
  3.         <interceptor-ref name="defaultStack"></interceptor-ref>  
  4.         <interceptor-ref name="execAndWait">  
  5.             <param name="delay">1500</param>  
  6.         </interceptor-ref>  
  7.         <result name="success">/state_ok.jsp</result>  
  8.     </action>  
  9.           
  10.     <action name="customer_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">  
  11.         <interceptor-ref name="defaultStack"></interceptor-ref>  
  12.         <interceptor-ref name="execAndWait">  
  13.             <param name="delay">1500</param>  
  14.         </interceptor-ref>  
  15.         <result name="wait">/customer_wait.jsp</result>  
  16.         <result name="success">/state_ok.jsp</result>  
  17.     </action>  
  18. </package>  

 

测试页面:

 

java代码:
查看复制到剪贴板打印
  1. <body>  
  2.     <s:a href="/Struts2/default_progressbar.action">default_view</s:a>  
  3.     <br />  
  4.     <s:a href="/Struts2/customer_progressbar.action">customer_view</s:a>  
  5. </body>  

 

自定义等待页面:

 

java代码:
查看复制到剪贴板打印
  1. <html>  
  2.   <head>  
  3.     <base href="<%=basePath%>">  
  4.       
  5.     <title>My JSP 'customer_wait.jsp' starting page</title>  
  6.       
  7.     <meta http-equiv="pragma" content="no-cache">  
  8.     <meta http-equiv="cache-control" content="no-cache">  
  9.     <meta http-equiv="expires" content="0">      
  10.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  11.     <meta http-equiv="description" content="This is my page">  
  12.       
  13.     <!-- 下面的meta元素才是重点,其他的没什么影响,是IDE自带的  -->  
  14.     <meta http-equiv="refresh" content="3;url=/Struts2/customer_progressbar.action">  
  15.     <!--  
  16.     <link rel="stylesheet" type="text/css" href="styles.css">  
  17.     -->  
  18.   
  19.   </head>  
  20.     
  21.   <body>  
  22.     <div>  
  23.         Please wait...(<s:property value="complete"/>)% complete  
  24.     </div>  
  25.   </body>  
  26. </html>  

 

 

最终结果页面:

 

java代码:
查看复制到剪贴板打印
  1. <body>  
  2.     OK!  
  3. </body>  

 

在浏览器中输入:http://localhost:8081/Struts2/test.jsp,获得如下页面

首先点击,"default_view"链接:

查看它的源代码:

 

java代码:
查看复制到剪贴板打印
  1. <html>  
  2.     <head>  
  3.         <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>  
  4.     </head>  
  5.     <body>  
  6.         Please wait while we process your request...  
  7.         <p/>  
  8.   
  9.         This page will reload automatically and display your request when it is completed.  
  10.     </body>  
  11. </html>  

 

这次点击"customer_view"链接:

...

...

这是自定义界面,最后动作执行完毕后,都会获得最终页面

我们使用Struts 2模拟进度条就完成了!


转载自:http://sishuok.com/forum/blogPost/list/508.html

0 0
原创粉丝点击