Struts2 框架上传文件的进度条的实现
//-------------------------------------------------------------------------------------------------------------
Struts上传文件是在拦截器中实现的!!在action中文件的处理是对在服务器端的临时文件操作的也就是在action中文件已经上传完毕。拦截器中自己重新实现org.apache.struts2.dispatcher.multipart.MultiPartRequest的接口 创建一个自己MyMultiPartRequest的类!里面的方法和org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest 里面的方法基本上一样只要在 pareRequest方法里面添加自己的监听器就可以!
//创建自己的监听器
MyProgressListener progressListener;
progressListener =new MyProgressListener(servletRequest);
//添加自己的监听器
upload.setProgressListener(progressListener);MyProgressListener
//---------------------------------------------------------------
创建自己的监听器的类MyProgressListener实现的是org.apache.commons.fileupload.ProgressListener的接口 里面的方法有:
private HttpSession session;
public MyProgressListener(HttpServletRequest request) {
session=request.getSession();
State state=new State();
session.setAttribute("state", state);
}
public void update(long readedBytes, long totalBytes,int currentItem) {
State state=(State) session.getAttribute("state");
state.setReadedBytes(readedBytes);
state.setTotalBytes(totalBytes);
state.setCurrentItem(currentItem); }
//---------------------------------------------------------------
State是状态类:
里面属性有readedBtyes当前读大小;
totalBytes文件总大小;
currentItem 传输量;
rate百分比;
这几个属性有对应的get和set方法
//---------------------------------------------------------
Action类里面包含2个方法
(1):文件上传按照Struts的文档中file-upload.html这个文件可以详细说明
(2):文件进度条的方法里可以先得到HttpSession session; session=ServletActionContext.getRequest().getSession();
根据监听器里面session.setAttribute("state", state);
可以得到相应的State对象 (State) session.getAttribute("state");
//---------------------------------------------------------------
Struts.xml文件中加入对应的配置:
这个配置的功能是使系统调用自己创建的MyMultiPartRequest而不是JakartaMultiPartRequest 是按照Struts-default.xml来配的 因为jsp页面用的是jquery来实现异步的, 需要导入对应的struts2-json-plugin-2.2.3.jar
//--------------------------------------------------------------
Jsp :
<script type="text/javascript" src="jquery-1.8.3.js"></script>
<script >
function callback(){
$.post(
'./uploading_updateplan',//对应的action路径
function(data)
if(data.state.rate!=100){
$("#m").text(data.state.readedBytes+'/'+data.state.totalBytes+':'+data.state.rate+'%');
}else{
$("#m").text(data.state.readedBytes+'/'+data.state.totalBytes+':'+'100% 上传完成!');
}
},
'json'
);
}
function f() {
window.setInterval("callback()", 100);//每隔100毫秒执行callback
document.form.submit();//提交数据
}