首先是对HTTP进行文件上传的了解:
function ajaxFileUpload()
{
var file = document.getElementById("file1").files[0];
var data = new FormData();
data.append('file1', file);
$.ajax({url:"upload.action",
processData: false,
contentType: false,
cache: false,
async:true,
type:"POST",
data:data
});
}
从这段Jquery ajax中可以看出,在使用ajax()方式上传文件时,需要取消浏览器对传输文件的自动处理以及对内容的处理,而使用form自带的处理方式。
因为正常情况下发送Http消息浏览器会自动对其进行相应的处理,而文件上传是需要用特殊的方式的,enctype="multipart/form-data" ←
只有把这两个都设为false才可以让文件流传输到后台
processData: false,
contentType: false,
接下来是第二段Ajax
function getPro()
{
var int=self.setInterval("progress()",1000)
function progress()
{
getP();
}
}
function getP()
{
$.ajax({
url:"progress.action",
type:"GET",
cache: false,
async:false,
dataType: "text",
success:function (data)
{
document.getElementById("pro").value = data;
}
})
}
getP是单一的一条请求获取进度,getPro是对这条请求进行轮询。使用的是setInterval方法。
这段中最主要的是getP()中的ajax方法。
这个ajax是访问进度条servlet,因为一个servlet处理传输时,需要靠另外一个servlet返回进度条数据,因为文件传输的那个servlet是无法在文件未传输成功前返回数据的。
也就是说,response一旦返回数据,则请求无法继续,所以要另开一个servlet。
所以异步上传并显示进度条的话,也要开两个ajax、
另外要关注的就是,如果servlet返回的是String的话,那么,ajax的dataType要指定为"text",
如果servlet返回Json的话,那么dataType:"json"
======================================================
前台传输数据到后台→http方式get/post(...),后台拿到数据,两个servlet传递数据用session,作用域是会话级别的,request的话另一个ajax会访问不到。
servlet返回数据可以用response.getWriter().print();直接输出。或者 response.sendRedirect跳转页面,又或者通过request redirect/forword跳转到新的页面