当前位置:编程学习 > JAVA >>

关于进度条,是基于Struts2的,实现ProgressListener接口

按照网上的方法,实现MultiPartRequest接口,配置自己的 自己新建监听器 ,每次上传,都可以监听到,具体是在新建ProgressListener的实现类,但是过后就没反应了,意思不是说ProgressListener的实现类中update方法会不停去获取上传文件进度吗,怎么我就运行update方法。。。。 --------------------编程问答-------------------- 简单说,就是能监听到上传,但是没有隔段时间自动去获取上传文件进度 --------------------编程问答-------------------- 有做过的朋友看看是哪里出问题了 --------------------编程问答-------------------- --------------------编程问答-------------------- 本来上传也是要弄进度条,参照网上弄了下,我的项目action是调用别人提供的方法,貌似实现不了,也没深究,直接弄个了遮罩层提示上传,弄个gif在那一直转-。-,不是非要实现进度条可以考虑用遮罩层,坐等会的大神回答。 --------------------编程问答-------------------- 这个问题之前就有人问过回答了不下三次了struts2自身就有MultiPartRequest的实现。楼主到官网把struts2的对应版本的源码下载下来。找到struts2-core.jar的org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类的代码。自己写个类实现MultiPartRequest或者继承org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest把org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest的代码copy进来主要的监听部分就在

//这里面就是解析上传文件的核心代码
 private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
    DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
    ServletFileUpload upload = new ServletFileUpload(fac);
    upload.setSizeMax(this.maxSize);
/*注册上传进度监听器这里面你就可以记录进度到session中,你前台再用setInterval到另一个action中取session的进度就可以了*/
    upload.setProgressListener(new ProgressListener(){
/*第一个参数代表当前已读了多少字节,第二个参数代表整个表单的长度也可以当做文件的总大小,第三个参数是代表已解析到第几个(这里对你不重要)*/
      public void update(long readBytes, long contentLength, int items){
        HttpSession session=ServletActionContext.getRequest().getSession();
        session.setAttribute("currentProgress",readBytes);
        session.setAttribute("contentLength",contentLength);
      }
    });
    return upload.parseRequest(createRequestContext(servletRequest));
  }

前台在用一个setInterval来请求另一个action那个action就从session里取进度就是了。前台的进度条显示可以用jquery的progressbar.js --------------------编程问答-------------------- 恩,我只是专门写了个类FileUploadListener实现了ProgressListener接口,在parseRequest方法里面是这样的
FileUploadListener progressListener = new FileUploadListener(
servletRequest);
upload.setProgressListener(progressListener);
每次上传能够执行FileUploadListener的构造方法,但是过后就没反应了,update方法没执行哦 --------------------编程问答--------------------
引用 6 楼 wind_sizemore 的回复:
恩,我只是专门写了个类FileUploadListener实现了ProgressListener接口,在parseRequest方法里面是这样的
FileUploadListener progressListener = new FileUploadListener(
servletRequest);
upload.setProgressListener(progressListener);
每次上传能够执行FileUploadListener的构造方法,但是过后就没反应了,update方法没执行哦

代码改动完要让你自己写的这个类起作用也就是要在struts.xml里面指定文件上传的解析类为你自己的这个类
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="multipart" class="你自己的解析类" scope="default" />
<constant name="struts.multipart.parser" value="multipart" /> --------------------编程问答-------------------- 恩,这个肯定要配置啊<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="requestParser"
        class="com.emily.relation.sys.model.MyMultiPartRequest" scope="default" optional="true" />
  <constant name="struts.multipart.handler" value="requestParser" />
话说常量名不一样哦 --------------------编程问答--------------------
引用 8 楼 wind_sizemore 的回复:
恩,这个肯定要配置啊<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="requestParser"
        class="com.emily.relation.sys.model.MyMultiPartRequest" scope="default" optional="true" />
  <constant name="struts.multipart.handler" value="requestParser" />
话说常量名不一样哦

楼主这个常量名是哪个版本的我没见过.我所用版本的常量名就是我写的,要知道你自己所用版本的常量名你可以直接到你自己所用版本的struts2-core.jar里面看那个struts-default.xml里面就有了. --------------------编程问答-------------------- 恩,我的是   
 <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/>
    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" />
    <constant name="struts.multipart.handler" value="jakarta" /> --------------------编程问答-------------------- 现在就很奇怪了,我上传是被监听到的,但是久没运行update方法,这个方法我看是说隔段时间去检查上传进度,需要设置周期吗之类的 --------------------编程问答-------------------- 还有个问题,监听到后传完会出现上传失败。。。 --------------------编程问答--------------------
引用 11 楼 wind_sizemore 的回复:
现在就很奇怪了,我上传是被监听到的,但是久没运行update方法,这个方法我看是说隔段时间去检查上传进度,需要设置周期吗之类的

如果你监听器已经起作用了不可能没执行update方法,这个方法不会隔断时间去检查上传进度.每次解析就会执行update --------------------编程问答--------------------
引用 12 楼 wind_sizemore 的回复:
还有个问题,监听到后传完会出现上传失败。。。

那你肯定动了其它地方我说了你把人家原来实现的那个JakartaMultiparRequestParser源码复制进来只要改动parseRequest部分增加一个监听器就可以了其它的完全不动 --------------------编程问答-------------------- 问题找到了,就是版本的原因,我现在把我用的struts2源码的JakartaMultiPartRequest类全部复制,再改parseRequest方法,就可以了。之前是直接复制别人的代码,谢谢了,耐心的帮我分析原因,分很少,我也只有这点分了,呵呵呵,再次感谢
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,