收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


struts2的笔记
状态: 离线
人气:566205
访问用户量:841
笔记经验:470
总积分:567
级别:普通会员
搜索本笔记
ta的交流分类
ta的交流主题贴(5)
ta的所有交流贴(5)
ta的全部笔记
全部笔记(89)
未分类笔记(3)
研磨struts2(86)
存档
2012-04(85)
2012-03(4)

2012-04-24 09:59:23
《研磨struts2》19.2 使用execAndWait拦截器模拟进度条 之 19.2.1 模拟长时间运行的Action
浏览(7356)|评论(0)   交流分类:Java|笔记分类: 研磨struts2

19.2.1模拟长时间运行的Action

       为了示例,首先来模拟一个运行时间长的Action:在这个Action中首先定义了一个int类型的progress属性及其getter/setter,用来向外界返回当前任务的完成进度。在execute方法中,让Action所在的线程在每次循环的时候sleep一秒钟,每次循环把进度加十。

这样,随着外界不断访问progress属性,就可以知道当前任务运行的进度了。示例代码如下:

 

java代码:
public class WaitAction extends ActionSupport{
	/**
	 * 准备向等待页面返回工作的进度
	 */
	private int progress;
	public int getProgress() {
		return progress;
	}
	public void setProgress(int progress) {
		this.progress = progress;
	}
	
	public String execute() throws Exception {
		//循环十次,每次线程睡1秒,且进度加10
		for (int i=0;i<10;i++){
			Thread.sleep(1000L);
			progress += 10;
		}
		return SUCCESS;
	}
}

19.2.2配置Action

       首先,在配置Action的时候,要让这个Action引用execAndWait拦截器,而且,这个拦截器会中止声明在它以后的拦截器的执行,因此这个拦截器的引用要出现在defaultStack拦截器栈之后。

       其次,还要为这个Action声明一个名称为wait的Result,由它来指定具体的等待页面。示例代码如下:

 

java代码:
    <package name="helloworld" extends="struts-default">
        <action name="waitAction" class="cn.javass.wait.WaitAction">
        	<interceptor-ref name="defaultStack"/>
        	<interceptor-ref name="execAndWait"/>
        	<result>/wait/success.jsp</result>
        	<result name="wait">/wait/wait.jsp</result>
        </action>
    </package>

19.2.3实现“进度条”页面

       由于HTTP页面在显示之后,不会再与服务器交互,所以,要不断的刷新这个“进度条”页面才行。

可以简单的使用<html>标签中的<meta>标签来设置这个页面不断进行自我刷新。示例代码如下:

 

java代码:
<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="refresh" content="2;url=/helloworld/waitAction.action">
<title>Insert title here</title>
</head>
<body>
	您好,任务还未完成,已经运行到了任务的<s:property value="progress"/>%
</body>
</html>

       <meta http-equiv="refresh" content="2;url=/helloworld/waitAction.action">这句话代表了当前页面会在显示2秒之后访问” /helloworld/waitAction.action”这个URL。由于wait.jsp就是从这个Action中跳转出来的,所以就相当于每隔2秒就刷新一次wait.jsp页面。同样可以通过<s:property/>标签访问值栈。

19.2.4实现完成页面

       实现一个完成页面,在完成页面中,简单的告知用户已经成功执行。示例代码如下:

 

java代码:
<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
	恭喜您,任务结束!

19.2.5运行测试

       在浏览器的地址栏输入“http://localhost:9080/helloworld/waitAction.action”,来直接访问waitAction。

在访问这个WaitAction的时候,第一次访问会使execute方法开始运行。但是,由于引用了execAndWait拦截器,并不是一直等到execute方法运行完之后再跳转到下一个页面,而是马上跳转到struts.xml中注册的名为wait的Result,也就是wait.jsp。

在wait.jsp中仍然可以访问值栈里面的值,因此,通过访问了progress属性来显示当前任务运行的进度。如下图所示:

图19.1  显示任务进度一

在wait.jsp,又指定了每隔2秒访问一次WaitAction,这时候,只要execute方法还没运行完,就马上再次转发到名为wait的Result,依次类推,直到execute方法运行完之后。因此页面显示的进度数据会一直增加,如图所示:

图19.2  显示任务进度二

       因此,如果不引用execAndWait拦截器,在访问WaitAction的时候,本应该等到10秒后浏览器才有反应。但是,现在引用了execAndWait拦截器,在访问WaitAction的时候,马上跳转到了wait.jsp,而且每隔2秒刷新一次,直到10秒之后,直到execute方法运行完成,浏览器正确的跳转到success.jsp。如下图所示:

图19.3 任务结束

19.2.6图形化的进度条

       看到这里,肯定有朋友会说,这哪里像是进度条啊,明明只是显示了一个运行进度而已。确实,从表现上看,不像我们熟悉的进度条,尤其是不像图形化的进度条。

1:JavaScript的图形化进度条

       其实,要实现图形化的进度条也很简单,使用Javascript就可以很方便的实现。先看个最简单的Javascript的进度条的实现,示例代码如下:

 

java代码:
<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<style type="text/css">
#out{width:300px;height:20px;background:#EEE000;}
#in{width:10px; height:20px;background:#0000ff;color:white;text-align:center;}
</style>
</HEAD>
<BODY onload="start();" >
<div id='out'>
	<div id="in" style="width:10%">10%</div>
<div>
<script type="text/javascript">
	var i=0;
	function start(){
		ba=setInterval("begin()",100);
	}
	function begin(){
		i+=1;
		if(i<=100){
			document.getElementById("in").style.width=i+"%";
			document.getElementById("in").innerHTML=i+"%";
		}else{
			clearInterval(ba);
			document.getElementById("out").style.display="none";
			document.write("进度条运行成功");
		}
	}
</script>
</BODY>

具体的Javascript的知识,这里就不去深入了,要注意下面几点:

  • 进度条的效果是通过两个Div来实现的,id为out的div作为底框,id为in的div作为动态显示进度的进度框
  • 启动方法是<body>元素的onload属性所指定的方法
  • Start方法里面的setInterval(表达式,间隔时间),意思是:启动后,每隔指定的间隔时间,就执行前面的表达式一次,这个方法相当于一个定时器
  • 在begin方法里面,通过动态的改变id为in的div框所包含的文字,从而实现动态显示进度的效果
  • 运行到最后,一定要记得清除掉setInterval所设置的定时器,用的是clearInterval方法

当然,使用Javascript来实现进度条有很多种方式,这里只是其中的一种而已。

2:把Struts2的进度条图形化

       接下来把前面的wait.jsp页面显示的进度,改成图形化的进度条的形式。

       同样需要使用Javascript来图形化的显示进度条,只不过具体的进度数据应该从Struts2的waitAction中去获取,也就是直接把从Action中获取的进度数据,直接赋值给Javascript,然后通过Javascript来显示进度条。示例代码如下:

 

java代码:
<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<style type="text/css">
#out{width:300px;height:20px;background:#EEE000;}
#in{width:10px; height:20px;background:#0000ff;color:white;text-align:center;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="refresh" content="2;url=/helloworld/waitAction.action">
<title>Insert title here</title>
</head>
<body>
<BODY onload="start();" >
<div id='out'>
	您好,任务还未完成,已经运行到了任务的<div id="in" style="width:10%">10%</div>
<div>
<script type="text/javascript">	
	function start(){
		ba=setInterval("begin()",100);
	}
	function begin(){
		var i = <s:property value="progress"/>;
		if(i<=100){
			document.getElementById("in").style.width=i+"%";
			document.getElementById("in").innerHTML=i+"%";
		}else{
			clearInterval(ba);
			document.getElementById("out").style.display="none";
			document.write("进度条运行成功");
		}
	}
</script>
</BODY>
</html>

       最重要的变化就在加粗的那句话,把从Action获取的数据直接设置给了Javascript,要注意这个过程是在服务端完成的,到了客户端,值已经设置好了,因此Javascript同样能正常地运行。

       运行URL:http://localhost:9080/helloworld/waitAction.action,测试一下看看效果,如下图所示:

图19.4  Struts2的进度条图形化

       进度条会不断滚动,直到运行结束,转向success.jsp为止。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4174.html

欢迎访问http://sishuok.com获取更多内容

相关笔记推荐
精品视频课程推荐

研磨设计模式——跟着cc学设计系列视频教程
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制 课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力 技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

struts2防重复提交视频教程
深入浅出的讲解在Struts2开发中,如何防止页面的重复提交

深入浅出学Spring Web MVC视频教程
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识

struts2验证器框架视频教程
深入浅出的讲解Struts2的验证器框架,包括:预定义验证器和自定义开发验证器

浏览(7356)|评论(0)   交流分类:Java|笔记分类: 研磨struts2

评论(0)
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网