- 浏览: 255760 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
lliiqiang:
软件中出错都是分类和层级的,所以错误减少不代表有进步,关键有结 ...
nio框架apache mina使用经验总结(转) -
lliiqiang:
对于整体来说有一个错误和多个错误一样,但是进度上几个错误是不同 ...
nio框架apache mina使用经验总结(转) -
lliiqiang:
最好要分离,否则相互影响的话就没有办法分离,特别是有的错误出现 ...
nio框架apache mina使用经验总结(转) -
lliiqiang:
关键是有jar包冲突,只能调整先后顺序,即自己框架的jar包是 ...
nio框架apache mina使用经验总结(转) -
baso4233:
学习了。可能会用到。
Nio 框架 Apache Mina 2 总结(自定义编解码)
digiflow数据导入与实时进度条实现
本文档只是稍微解析下数据导入的流程,以及讲解实时进度条实现方法
【数据批量导入流程】
1、客户把.txt数据打包成.gz文件,发给我们。
GZ文件格式,每个文件的第一行是唯一的数据,导入完成后要插入到ImportRecord表
名字格式:DigiFlow_南宁 - 平安出单中心_20100201_000100ECHW8P8708.txt
内容格式:以”||”为分割符
比如:00||000100ECHW8P8708||8||18:08:17
00代表表名称
000100ECHW8P8708 代表这个文件的唯一标识
2、JAVA解压缩GZ文件
JAVA提供了GZIPInputStream 解压API,把里面的内容写入到txt文件里。
3、解压的文件临时存放目录
一种是在安装的TOMCAT根目录下新建file目录,然后System.getProperty("user.dir") + "/file/"
二种是System.getProperty("java.io.tmpdir")得到的是tomcat的临时目录
项目中用到的是第一种
4、读取解压的文件
if("00".equals(fileinfos[0])) 读取到第一行时,根据UID判断是否导入过该文件。如果导入过则系统提示,并删除解压的文件。如果没有导入过,则继续执行下一步直到导入完成,完成后再插入这个文件的唯一标识。如:000100ECHW8P8708
读取到其他行时,获取其UID,判断是否插入过该记录。如果插入过,则执行update。如果没插入过,则执行insert.
5、拼SQL实现方式实现DML(insert,update)
程序中的insert和update语句是获得文件的中的列名之后,通过表名和列明去查找相应的字段信息,有的字段是varchar、char、datetime型则加上‘’号。详细参见源码bossdataimport中BusinessDAOImpl.java类的getStringType()方法。
【AJAX实现实时WEB进度条】
我们为了改善用户界面,通常会在处理量大或者是网络速度较慢的时候,给用户显示一个处理进度,让用户心理有底,增强用户等待结果的耐心,以改善用户体验。为了达到这个效果,通常做法有两大类:简单等待和真实的处理进度,本文着重讨论第二种方法的实现。
1)简单的等待界面:这种做法之所以说简单,就是在用法发送了处理命令后,立即在页面的某个地方替换一个waiting的图片,比如一个转圈的GIF,一张Loading的图片等,这种不称之为进度条,顶多就是个等待条,但通常还是可以给用户带来那么点满足,在业务量不大的情况下,也够用了,例子参见http://www.belitastone.com的首页。
2)真实的等待进度:比如说,我要在B/S系统中实现一个数据导入的功能,数据文件总共有100个,每个文件包含成千上万的数据,导入过程可能需要15分钟,那么我还用一个图片在那边打转吗?现在这样还是不够的,我可能需要让使用者知道,我当前处理的是第几个文件,还剩下几个,处理的百分比,并显示一个加载的真实进度条,这个进度条要如实反映处理的百分比。
实现1:由于用户处理的数据量大,可以在文件导入过程中,循环计算进度,并将进度信息存储在上下文中,并在前台页面定时从上下文读取进度数据,并在页面显示。这种方法思路比较直接。
实现2:使用观察者模式,实现进度主动通知。思路是:在文件导入过程中,计算进度信息,并将进度数据通知给观察者,前台页面定时向观察者咨询进度,并将进度显示到页面中。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhengtanyun/archive/2009/07/06/4325528.aspx
|
我来说下我的实现方式
关于他说的“实现1”,说把进度信息存储到上下文,这个貌似有问题,这个上下文是servlet上下文?据我所知,上下文作用域和Application作用域一样大,进度条每个用户执行不同的导入操作,存到上下文做什么,还不乱套?
我的实现方式和“实现2”有点像。思路是:在文件导入过程中,循环计算进度信息,并将进度数据放入SESSION,前台页面通过AJAX定时调用,获取进度,并将进度显示到页面中.
进度数据有:总的数据量、已导入数据量、已经上传时间。
另外一种情况:当正在进行导入时,点击了别的页面,从而页面上的进度条就没有了,而后台却还在运行。有几种方法,一是弹出模式对话框,在模式框里面进行导入,但是这样还有点麻烦。二是当用户点击了别的页面再回到导入页面时,又重新读取SESSION中的进度信息。这需要在ACTION中设置一个全局变量来作为是否正在执行导入操作的标记。
最终效果图:(见附件)
代码实现参考源代码manage中的DigimpAction.java以及dimpImport.jsp
核心代码如下:
ACTION类 部分代码
// 读取数据导入实时状态
public ActionForward doStatus(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 设置该响应不在缓存中读取
response.addHeader("Expires", "0");
response.addHeader("Cache-Control",
"no-store, no-cache, must-revalidate");
response.addHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
int totalSize = 0;// 总数据的条数
int bytesRead = 0;// 已导入数据条数
long getElapsedTimeInSeconds=0;// 获得已经上传得时间
HttpSession session = request.getSession(false);
if (session.getAttribute("TOTALSIZE") != null) {
if(count == 0){
session.removeAttribute("TOTALSIZE");
}else{
totalSize=Integer.parseInt(session.getAttribute("TOTALSIZE").toString());
}
}
if (session.getAttribute("BYTESREAD") != null) {
if(count == 0){
session.removeAttribute("BYTESREAD");
}else{
bytesRead=Integer.parseInt(session.getAttribute("BYTESREAD").toString());
}
}
if (session.getAttribute("STARTTIME") != null) {
long stime=Long.parseLong((String)session.getAttribute("STARTTIME"));
getElapsedTimeInSeconds=(System.currentTimeMillis() - stime) / 1000;
}
//计算上传完成的百分比
String percentComplete="0";
if(totalSize > 0){
double k = (double)bytesRead/totalSize*100;
BigDecimal big=new BigDecimal(k);
percentComplete = big.setScale(2,BigDecimal.ROUND_HALF_UP).toString();
}
//获得上传已用的时间
long timeInSeconds = getElapsedTimeInSeconds;
//计算平均上传速率
//double uploadRate = bytesRead / (timeInSeconds + 0.00001);
//System.out.println("**************计算平均上传速率="+bytesRead);
// 计算总共所需时间
//double estimatedRuntime = totalSize / (uploadRate + 0.00001);
//将上传状态返回给客户端
response.getWriter().println("<b>Import Status:</b><br/>");
if (bytesRead != totalSize) {
response.getWriter().println(
"<div class=\"prog-border\"><div class=\"prog-bar\" style=\"width: "
+ percentComplete + "%;\"></div></div>");
response.getWriter().println(
"Imported: " + bytesRead + " out of " + totalSize
+ " Records (" + percentComplete + "%) <br/>");
response.getWriter().println(
"Runtime: " + formatTime(timeInSeconds) + " <br/>");
} else {
response.getWriter().println(
"Imported: " + bytesRead + " out of " + totalSize
+ " Records<br/>");
response.getWriter().println("Complete.<br/>");
}
//如果文件已经导入完毕
if (bytesRead == totalSize) {
response.getWriter().println("<b>Imported complete.</b>");
}
return null;
}
private String formatTime(double timeInSeconds) {
long seconds = (long) Math.floor(timeInSeconds);
long minutes = (long) Math.floor(timeInSeconds / 60.0);
long hours = (long) Math.floor(minutes / 60.0);
if (hours != 0) {
return hours + "hours " + (minutes % 60) + "minutes "
+ (seconds % 60) + "seconds";
} else if (minutes % 60 != 0) {
return (minutes % 60) + "minutes " + (seconds % 60) + "seconds";
} else {
return (seconds % 60) + " seconds";
}
}
//页面调用此方法,检查导入工作是否正在进行时,0:无 1:正在进行
public int checkImportStatus(){
return count;
}
dimpImport.jsp 部分代码
<script type="text/javascript">
var xmlHttp;
function createXMLHttpRequest()//创建XMLHttpRequest对象
{
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}
//导入程序入口
function tijiao(){
document.forms[0].action=" ";
document.forms[0].submit();
go();
}
function go()
{
createXMLHttpRequest();//创建XMLHttpRequest对象
xmlHttp.onreadystatechange = callBack;//设置回调函数
var url = "digimp.do?method=doStatus";//请求的地址
var button = document.getElementById("go");
button.disabled = true;//设置按钮不可用
xmlHttp.open("post",url,true);//打开对服务器的连接
xmlHttp.send();//发送请求
}
function callBack()
{
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
setTimeout("go()",500);//定时调用
document.getElementById('status').innerHTML =xmlHttp.responseText;
}
}
}
//检查是否有正在进行的导入操作
function page_init(){
DigimpAction.checkImportStatus(function callback_init(data){
if(data != '0'){
document.getElementById("go").disabled = true;
go();
}else{
document.getElementById("go").disabled = false;
}
});
}
</script>
<body onload="page_init();">
<!-- 这里显示进度条 -->
<div id="status"></div>
</body>
发表评论
-
Struts2 在JDK1.4下运行(J4)
2011-07-13 13:52 1848注:项目部署到TOMCAT没问题,到weblogic就有问题: ... -
(转)ibatis Tips 之 java.util.Map作为parameterClass和resultClass
2010-10-20 14:31 52761.Map作为parameterClass 映射文件: ... -
ibatis的几种resultClass(转)
2010-10-20 14:28 7656ibatis在编写sqlmap的查询时,可以使用多种输出格式, ... -
静态类 静态方法 静态变量
2010-10-19 15:16 1594一、static 请先看下面这段程序: pu ... -
浅谈Java多线程的同步问题(转)
2010-09-26 11:40 1139多线程的同步依靠的是 ... -
Hibernate3.1.X 多线程下BUG
2010-08-27 16:01 1737刚写过一篇Java笔记-使用JConsole进行JVM性能监测 ... -
全面总结Java泛型--实例
2010-07-28 16:11 1222虽然Scala创始人Martin Odersky说当年正是因为 ... -
rapid validation 自定义验证
2010-07-28 10:52 2945学习了下 rapid-validation,发现这个验证框架是 ... -
div中动态插入javascript代码
2010-07-15 17:08 8104<div id="test"> ... -
[转]一款可以反编译jar包的java反编译工具-JD-GUI(绿色软件)
2010-07-02 11:31 8386该软件无需安装,界面清爽。 转自:http: ... -
Javascript版 UrlEncode和UrlDecode函数 (URL地址栏参数加密解密)
2010-03-05 12:44 10041在做项目的时候需要对(Internet) Search Eng ... -
JSON初识
2010-02-02 17:18 1622什么是JSON? JSON(JavaScript Objec ... -
Dwr+AutoComplete+pinyin4j 自动匹配(中文,拼音)
2009-12-04 15:55 4482忙里偷闲,想弄个像google那样输入中文或拼音下面就自动匹配 ... -
JS 金额自动计算与合计(监听事件)
2009-11-30 15:34 77491: 项目中有时要在页面里面自动计算金额,如:左边框里面是数 ... -
JS 格式化金额
2009-11-30 15:08 3983//格式话金额 function fmoney(s ... -
windows 使用7-zip把文件打包成**.gz压缩包
2009-11-26 12:38 17481、下载7-zip这个软件并安装 2、将你要打包的文 ... -
hql中常用函數CAST 带来的日期转换问题
2009-11-20 16:51 9711以前都是连接的ORACLE,MYSQL数据库,写程序一直也没出 ... -
hibernate进行对象删除操作
2009-11-20 16:50 1169用hibernate进行对象删除操作,只要把ID和不为空的字段 ... -
hibernate生成主键方式,一直也不太明白(期待指点迷津)
2009-11-20 16:49 1219关于主键生成方式,在网上有很多文章,但都是说一些概念性的问题, ... -
Filter解决session 过期,跳转到登陆页面
2009-11-20 12:49 10347环境:DWR+ Struts 配置: 1、过滤.DO请求, ...
相关推荐
在实现Excel数据导入进度条的过程中,我们将分为以下几个步骤: 1. **前端设计**:创建一个HTML界面,包含一个用于显示进度的进度条(可以使用Bootstrap或其他UI库的进度条组件)和一个用于显示当前状态的文本框。...
在提供的压缩包文件名称“数据导入与进度条实现(java)”中,我们可以推测这可能是一个Java项目的源代码,专门用于演示如何在数据导入过程中实现进度条。项目可能包括了读取数据文件、处理数据、更新进度条状态等核心...
在Java Web开发中,实现一个模拟数据导入或文件上传进度条功能可以极大提升用户体验,让用户在等待过程中心中有数。这个功能通常涉及到前端与后端的交互,涉及到的技术包括Servlet、JSP、jQuery和Ajax。下面我们将...
本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,增强了用户体验。 首先,Apache POI的核心类HSSFWorkbook和XSSFWorkbook分别用于处理老版本的.xls和新版本的.xlsx文件。在导入...
因项目需要,需要导入大量excel,为体现页面友好度,不让客户认为页面死机了,故添加了页面实时显示...ASP.NET实现EXCEL数据导入进度条ajax。有已经实现的工程源代码。有进度条和百分比统计,已导入数量和总数统计。
在C#编程中,"导入Excel 委托 进度条 可复用"是一个常见的需求,特别是在处理大量数据时。以下是对这个主题的详细解释: 1. **导入Excel**:C#提供了多种方式来读取和操作Excel文件。其中最常用的是使用Microsoft ...
图书管理系统(C# .NET)可能是一个实际应用示例,其中可以集成这样的实时进度条来增强用户在数据导入、导出或搜索等操作时的感知。 总之,ASP.NET 2.0结合AJAX技术,提供了强大的工具来构建实时反馈的Web应用,...
该示例使用简单,完成插入指定数量的数据,ajax写入数据库,并显示精准进度,实时返回运行过程。对于大量插入数据库的操作,可以做到无刷,不超时; 目录结构: Css/style.css -------------进度条样式 Js/...
由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中。考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户...
本教程将详细讲解如何利用Java技术实现数据导入过程中显示进度条,以及实时更新导入的时间和百分比。 首先,我们需要理解数据导入的基本流程。通常,数据导入涉及读取外部数据源(如CSV、Excel文件或数据库),然后...
在描述中提到的"测试可用"意味着已经有一个可行的解决方案,可以成功地从Excel文件中读取数据,将其显示在DataGridView控件上,并且能够将这些数据导入到SQL数据库。在实际开发中,这通常涉及以下步骤: 1. **创建...
Spring Boot简化了Java Web开发,提供了快速构建独立应用程序的方式,而WebSocket则是一种在客户端和服务器之间建立长连接的协议,可以实现双向通信,非常适合于实时数据更新的需求,如进度条显示。 首先,我们需要...
这涉及到Excel的数据导入功能,包括“数据”菜单下的“从文本/CSV”、“从工作簿”或“从外部数据源”选项。用户可以通过设置列宽、数据类型、分隔符等参数,确保数据正确导入。 2. **批量处理**:批量处理是指对...
这篇文章通过实例的形式介绍了如何在.net中实现Excel数据导入时,在Web应用程序中动态显示进度条。 首先,文章中提到了创建一个Web应用程序,并在其中创建一个HTML文件来定义进度条的布局。这个HTML文件名为...
### Java 实现显示进度条 #### 背景与需求 在软件开发过程中,特别是涉及到长时间运行的任务时,向用户展示任务完成进度是一项非常实用的功能。进度条是实现这一功能的一种常见方式。本文将详细介绍如何使用Java...
对于自定义进度条,我们可以利用VBA(Visual Basic for Applications)编写宏来实现。以下是一个基本的VBA代码示例,用于显示进度条: ```vba Sub PrintWithProgress() Dim wb As Workbook Dim totalSheets As ...
提供的"Extjs进度条.doc"可能是关于进度条实现的详细文档,包括代码示例和解释。而"ExtJs实现进度条实例.htm.rar"则可能包含了实际的HTML和JS源代码,供我们下载、解压并参考学习。这将帮助我们更好地理解如何在...
在本文中,我们将详细介绍如何使用 SpringBoot 实现一个实时更新的进度条。本示例代码将指导您一步步完成进度条的实现,从前端到后端的设计思路,到实现进度条的关键代码。 首先,让我们来了解一下进度条的需求。...
在数据导入过程中,为了给用户提供实时反馈,会有一个进度条显示导入进度。这通常通过异步编程和事件处理来完成。例如,可以使用BackgroundWorker组件或者async/await关键字进行后台处理,同时更新UI上的进度条。...