`
反求诸己
  • 浏览: 543283 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

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

 
阅读更多
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模拟进度条就完成了!
分享到:
评论

相关推荐

    struts2带进度条的异步上传

    Struts2是一个流行的Java web框架,它为开发者提供了构建MVC(模型-视图-控制器)应用程序的强大工具。在Web开发中,文件上传是常见的需求,而实现带进度条的异步上传则能提供更好的用户体验。这个【标题】"struts2...

    struts拦截器实现等待页面

    在SSH(Struts2、Spring、Hibernate)系统中,拦截器用于增强应用程序的功能,比如权限检查、日志记录、事务管理等。在本场景中,我们关注的是如何利用Struts拦截器来实现一个等待页面,以提升用户体验。 当系统...

    带进度条的Struts2文件上传

    Struts2是一个强大的Java web框架,它为开发者提供了构建MVC(模型-视图-控制器)应用程序的结构。在Struts2中实现带进度条的文件上传是一项实用功能,能够提高用户体验,让用户在等待文件上传时能清晰地看到进度。 ...

    struts2异步上传

    Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,用于简化Java Web应用程序的开发。它提供了拦截器、插件、结果类型等机制,使得开发者能够方便地处理HTTP请求、业务逻辑和视图展示。 2. **...

    文件异步上传,显示进度条

    在IT领域,文件异步上传和进度条显示是常见的用户交互功能,特别是在Web应用程序中。这一功能提高了用户体验,因为用户可以继续浏览其他页面或者执行其他操作,而不必等待文件上传的完成。以下是对这一主题的详细...

    AJAX实现页面等待效果

    Struts2是一个流行的Java Web应用程序框架,用于构建MVC(Model-View-Controller)结构的Web应用。在我们的示例中,Struts2将处理AJAX请求,调用相应的业务逻辑,可能包括与MySQL数据库的交互。Struts2的Action类会...

    uploadify+struts2+json前台动态向后台传数据

    设置`uploader`属性为Struts2的Action地址,`scriptData`属性用于传递额外的参数,`fileTypeDesc`和`fileTypeExts`定义可上传的文件类型和扩展名。 ```html &lt;script src="js/uploadify/jquery.uploadify.min.js"&gt;&lt;/...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 27 2.5.2 动作类 28 2.5.3 运行app02a程序 29 2.6 依赖注入 29 2.6.1 概述 29 2.6.2 依赖注入的几种方式 31 2.7 小结 31 第3章 动作与结果 32 3.1 ...

    struts2实现多文件异步上传

    Struts2是一个非常流行的Java Web框架,用于构建可维护、可扩展且结构良好的应用程序。在Struts2中实现多文件异步上传是一个常见的需求,它能够提高用户体验,因为用户可以在不等待所有文件上传完成的情况下继续浏览...

    jsp实现文件上传以及类似百度文库在线阅读

    2. **Struts2框架**:Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,用于简化开发流程。在这个例子中,Struts2用于处理用户提交的表单数据,如文件上传和表单字段,并将控制流导向...

    jquery上传java版

    2. **Struts框架**:Struts是基于MVC(Model-View-Controller)设计模式的Java Web开发框架,用于构建企业级应用程序。在文件上传场景中,Struts的Action类接收上传的文件,进行处理,并返回响应结果。 3. **Struts...

    JAVA上百实例源码以及开源项目源代码

    Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...

    FileUpLoad:异步的文件上传,提供了上传进度的监听

    在IT行业中,文件上传是常见的功能之一,尤其是在Web应用程序中。`FileUpLoad`是一个针对异步文件上传的解决方案,特别关注于提供上传进度监听,让用户能够了解文件上传的状态。这个功能对于大文件的上传或者多文件...

Global site tag (gtag.js) - Google Analytics