首先用EasyUI做界面:
ProgressUploadServlet .java
<div id="loading2">
<div class="inputdiv" >
<img class="prtspan span_1" src="images/loading.gif"/>
<h3 class="prtspan span_1" >war包正在部署,请稍候......</h3>
</div>
</div>
<div id="loading1" style="display:none;">
<div id="loading" class="easyui-progressbar" style="width:700px;"></div>
</div>
前端主要的js代码:
//定时器:文件上传是否完成了
var _finished = false;
function update_file_percent(){
if(_finished) return;
$.get("deploy/ProgressUploadServlet",{}
,function(data,textStatus){
if(data=="100" || data==100){
$('#loading').progressbar('setValue',0);
$('#loading1').css("display","none");
$('#loading2').window('open');
return;
}
$('#loading').progressbar('setValue', parseInt(data));//返回的data包含有换行符,必须要转成数字,否则进度条出不来颜色
setTimeout("update_file_percent()", 1000);
});
}
//部署应用程序
function list_to_deploy_app(){
$("#btnAddWar").click(function(){
_finished = false;
$("btnAddWar").attr("disabled","true");
$('#loading').progressbar('setValue', 0);
$('#loading1').css("display","block");
//这里的post是为了是服务器重新初始化session,否则会导致连续上传文件出bug
$.post("deploy/ProgressUploadServlet",{type:"first"},function(data,textStatus){
setTimeout("update_file_percent()", 1000);
$('#addWar').form('submit',
{
url:"deploy/ProgressUploadServlet",
onSubmit: function(){
$("#hip").val(ip);
$("#hport").val(port);
},
success:function(data){
_finished = true;
$('#loading2').window('close');
$('#loading1').css("display","none");
$('#loading').progressbar('setValue',0);
var m_obj = JSON.parse(data);
$("btnAddWar").attr("disabled","false");
if(m_obj && m_obj.success == true){
messagebox_tip('war包' + $("#incontext").val() + '部署成功!');
}else{
messagebox_tip('war包' + $("#incontext").val() + '部署失败!\n失败原因是:'+m_obj.message);
}
}
}
);//form submit
});
}
);
}
修改web.xml文件,添加如下Servlet
<servlet>
<servlet-name>ProgressUploadServlet</servlet-name>
<servlet-class>
com.southgis.scout.hub.action.deploy.ProgressUploadServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProgressUploadServlet</servlet-name>
<url-pattern>/deploy/ProgressUploadServlet</url-pattern>
</servlet-mapping>
UploadListener.java
package com.southgis.scout.hub.action.deploy;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.ProgressListener;
public class UploadListener implements ProgressListener {
private HttpSession session1;
public UploadListener(HttpServletRequest request) {
session1=request.getSession(false);
}
public void update(long bytesRead, long contentLength, int items) {
int percent = (int) (100 * (double) bytesRead / (double) contentLength);
session1.setAttribute("read",String.valueOf(percent));
}
}
ProgressUploadServlet .java
package com.southgis.scout.hub.action.deploy;
import static com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteMapNullValue;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullListAsEmpty;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullNumberAsZero;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullStringAsEmpty;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.southgis.scout.core.util.Constant;
import com.southgis.scout.core.util.DateUtil;
import com.southgis.scout.core.util.HttpUtil;
public class ProgressUploadServlet extends HttpServlet {
private static final long serialVersionUID = -4935921396709035718L;
protected static final SerializerFeature[] features = { WriteMapNullValue, WriteNullListAsEmpty,
WriteNullNumberAsZero, WriteNullStringAsEmpty, DisableCircularReferenceDetect };
protected void outputString(String str,HttpServletResponse response) throws IOException {
response.setContentType(Constant.CONTENT_TYPE_HTML);
response.setCharacterEncoding(Constant.UTF8);
response.getWriter().print(str);
response.getWriter().flush();
response.getWriter().close();
}
protected void outJsonResult(Object obj,HttpServletResponse response) throws IOException {
String result = JSON.toJSONStringWithDateFormat(obj, DateUtil.SHORT_TIME_FORMAT, features);
outputString(result,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String type=request.getParameter("type");
if(type!=null){
//第一次初始化session,如果不这样做,会导致连续上传文件出bug
HttpSession session = request.getSession(false);
if(session!=null)
{
session.invalidate();
}
session = request.getSession(true);
return;
}
String filePath="";
// 监听器
UploadListener listener = new UploadListener(request);
// Apache 上传工具
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置 listener
upload.setProgressListener(listener);
Map<String, String> map = new HashMap<String, String>();
try {
List itemList = upload.parseRequest(request);
for (Iterator it = itemList.iterator(); it.hasNext();) {
FileItem item = (FileItem) it.next();
if (!item.isFormField()) {
// 获取文件输出目录
String nowpath; //当前tomcat的bin目录的路径 如 D:\java\software\apache-tomcat-6.0.14\bin
String tempdir;
nowpath=System.getProperty("user.dir");
tempdir=nowpath.replace("bin", "wars"); //把bin 文件夹变到 webapps文件里面
//如果不存在tempdir则新建目录
File myPath = new File(tempdir);
if (!myPath.exists()) {
myPath.mkdir();
}
//tempdir="F:/wars";测试用
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
// 统一 Linux 与 windows 的路径分隔符
String fileName =formatter.format(new Date()) + item.getName().replace("/", "\\");
filePath=tempdir+"/"+fileName;
File saved = new File(filePath);
saved.getParentFile().mkdirs();
item.write(saved);
}
else{
map.put(item.getFieldName(),item.getString());
}
}
} catch (Exception e) {
outJsonResult(new JSONObject(),response);
}
String url = "http://" + map.get("ip") + ":" + map.get("port") + "/plug/deploy/deploywar";
String a="true";
if(map.get("update")==null){
a="false";
}
map.put("update", a);
String result = HttpUtil.postFile(url, "attach", filePath, map);
JSONObject jsonObj = JSONObject.parseObject(result);
outJsonResult(jsonObj,response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragrma", "no-cache");
response.setDateHeader("Expires", 0);response.setContentType("text/html;charset=UTF-8");
//如果不这样就会出现firefox 的jQuery.get返回object xmldocument的问题,或者你在jQuery.get中设置dataType为text
HttpSession session = request.getSession(false);
String value=(String )session.getAttribute("read");
if (value != null) {
response.getWriter().println(value);
}
else{
response.getWriter().println("0");
}
}
}