`
qilixiang012
  • 浏览: 202664 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

Struts 2模拟进度条的原理

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

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

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

java代码:
  1. <metahttp-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. publicclassProgressbarActionextendsActionSupport
  2. {
  3. privatestaticfinallongserialVersionUID=7441785390598480063L;
  4. privateintcomplete=0;
  5. //获取进度值
  6. publicintgetComplete()
  7. {
  8. complete+=10;
  9. returncomplete;
  10. }
  11. @Override
  12. publicStringexecute()
  13. {
  14. try
  15. {
  16. Thread.sleep(30000);
  17. }
  18. catch(InterruptedExceptione)
  19. {
  20. e.printStackTrace();
  21. }
  22. returnSUCCESS;
  23. }
  24. }

配置struts.xml文件:

java代码:
  1. <packagename="progressbar"extends="struts-default">
  2. <actionname="default_progressbar"class="struts2.suxiaolei.progressbar.action.ProgressbarAction">
  3. <interceptor-refname="defaultStack"></interceptor-ref>
  4. <interceptor-refname="execAndWait">
  5. <paramname="delay">1500</param>
  6. </interceptor-ref>
  7. <resultname="success">/state_ok.jsp</result>
  8. </action>
  9. <actionname="customer_progressbar"class="struts2.suxiaolei.progressbar.action.ProgressbarAction">
  10. <interceptor-refname="defaultStack"></interceptor-ref>
  11. <interceptor-refname="execAndWait">
  12. <paramname="delay">1500</param>
  13. </interceptor-ref>
  14. <resultname="wait">/customer_wait.jsp</result>
  15. <resultname="success">/state_ok.jsp</result>
  16. </action>
  17. </package>

测试页面:

java代码:
  1. <body>
  2. <s:ahref="/Struts2/default_progressbar.action">default_view</s:a>
  3. <br/>
  4. <s:ahref="/Struts2/customer_progressbar.action">customer_view</s:a>
  5. </body>

自定义等待页面:

java代码:
  1. <html>
  2. <head>
  3. <basehref="<%=basePath%>">
  4. <title>MyJSP'customer_wait.jsp'startingpage</title>
  5. <metahttp-equiv="pragma"content="no-cache">
  6. <metahttp-equiv="cache-control"content="no-cache">
  7. <metahttp-equiv="expires"content="0">
  8. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  9. <metahttp-equiv="description"content="Thisismypage">
  10. <!--下面的meta元素才是重点,其他的没什么影响,是IDE自带的-->
  11. <metahttp-equiv="refresh"content="3;url=/Struts2/customer_progressbar.action">
  12. <!--
  13. <linkrel="stylesheet"type="text/css"href="styles.css">
  14. -->
  15. </head>
  16. <body>
  17. <div>
  18. Pleasewait...(<s:propertyvalue="complete"/>)%complete
  19. </div>
  20. </body>
  21. </html>

最终结果页面:

java代码:
  1. <body>
  2. OK!
  3. </body>

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

首先点击,"default_view"链接:

查看它的源代码:

java代码:
  1. <html>
  2. <head>
  3. <metahttp-equiv="refresh"content="5;url=/Struts2/default_progressbar.action"/>
  4. </head>
  5. <body>
  6. Pleasewaitwhileweprocessyourrequest...
  7. <p/>
  8. Thispagewillreloadautomaticallyanddisplayyourrequestwhenitiscompleted.
  9. </body>
  10. </html>

这次点击"customer_view"链接:

...

...

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

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


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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics