为Struts 2应用程序创建进度条(等待页面)

来源:未知 责任编辑:智问网络 发表时间:2013-09-22 21:32 点击:

 

 

Struts 2模拟进度条的原理

 

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

 

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

 

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

 

<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秒:

 

public class ProgressbarAction extends ActionSupport

{

    private static final long    serialVersionUID    = 7441785390598480063L;

 

    private int                    complete            = 0;

 

    // 获取进度值

    public int getComplete()

    {

        complete += 10;

        return complete;

    }

 

    @Override

    public String execute()

    {

        try

        {

            Thread.sleep(30000);

        }

        catch (InterruptedException e)

        {

            e.printStackTrace();

        }

        return SUCCESS;

    }

}

配置struts.xml文件:

 

<package name="progressbar" extends="struts-default">

    <action name="default_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">

        <interceptor-ref name="defaultStack"></interceptor-ref>

        <interceptor-ref name="execAndWait">

            <param name="delay">1500</param>

        </interceptor-ref>

        <result name="success">/state_ok.jsp</result>

    </action>

       

    <action name="customer_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">

        <interceptor-ref name="defaultStack"></interceptor-ref>

        <interceptor-ref name="execAndWait">

            <param name="delay">1500</param>

        </interceptor-ref>

        <result name="wait">/customer_wait.jsp</result>

        <result name="success">/state_ok.jsp</result>

    </action>

</package>

测试页面:

 

<body>

    <s:a href="/Struts2/default_progressbar.action">default_view</s:a>

    <br />

    <s:a href="/Struts2/customer_progressbar.action">customer_view</s:a>

</body>

自定义等待页面:

 

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'customer_wait.jsp' starting page</title>

   

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

   

    <!-- 下面的meta元素才是重点,其他的没什么影响,是IDE自带的  -->

    <meta http-equiv="refresh" content="3;url=/Struts2/customer_progressbar.action">

    <!--

    <link rel="stylesheet" type="text/css" href="styles.css">

    -->

 

  </head>

 

  <body>

    <div>

        Please wait...(<s:property value="complete"/>)% complete

    </div>

  </body>

</html>最终结果页面:

 

	<body>
    OK!
</body>

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

\

首先点击,"default_view"链接:

\
查看它的源代码:

	<html>
    <head>
        <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>
    </head>
    <body>
        Please wait while we process your request...
        <p/>

        This page will reload automatically and display your request when it is completed.
    </body>
</html>

这次点击"customer_view"链接:

\

...

\

...

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

\

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

 

摘自 消逝の纸屑

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Gb2312转utf-8编码的方法(vbs+js)
    • 如何使用Ajax技术开发Web应用程序(1)
    • js跳转路径问题
    • JavaScript模仿桌面窗口
    • 用js检测两个线段是否相交
    • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
    • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
    • 我是如何去了解jquery的(六),案例之幻灯片轮换
    • Jquery封装幻灯片效果
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1