`
SavageGarden
  • 浏览: 222162 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

超级简单、超级实用的版本升级小工具----代码实现

    博客分类:
  • Java
阅读更多

接上篇

webserver使用的是resin3.1.9,首先在web.xml中配置invoker方式来处理请求

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <classpath id='WEB-INF/classes'
             source='WEB-INF/src'
             compile='false'/>
  <classpath id='WEB-INF/lib' library-dir='true'/>
  <servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>
</web-app>

 

然后写一个search.jsp,选择开始、结束日期后,将提交到UpdateServlet来处理

<form name="form" method="post" action="/servlet/com.swfml.update.action.UpdateServlet">
......
</form>

 然后来写UpdateServlet,根据不同的action执行不同的操作

public void doPost(HttpServletRequest request, HttpServletResponse response) {
		String defaultAction = "";
		String url = actionMap(request, response, defaultAction);
		if ((url.length() > 0) && (!response.isCommitted())) {
            try {
				response.sendRedirect(URLDecoder.decode(url));
			} catch (IOException e) {
				e.printStackTrace();
			}
        }
	}
 
private String actionMap(HttpServletRequest request, HttpServletResponse response, String defaultAction) {
		String action = defaultAction;
		String url = "";
		if ((request.getParameter("action") != null) && (request.getParameter("action").length() > 0)) {
			action = request.getParameter("action").trim();
        }
		if(action.equals("search")) {
			doSearch(request, response);
		} else if(action.equals("create")) {
			doCreate(request, response);
		} else if(action.equals("upload")){
			doUpload(request, response);
		} else if(action.equals("unzip")){
			doUnzip(request, response);
		} else if(action.equals("update")){
			doUpdate(request, response);
		} 
		return url;
	}
 

然后来处理检索

private void doSearch(HttpServletRequest request,
			HttpServletResponse response) {
		String startDate = request.getParameter("startDate");
		String endDate = request.getParameter("endDate");
		String searchDir = getServletContext().getRealPath("/");
		searchDir = searchDir.substring(0, searchDir.length() - 1);
		ArrayList updateFileList = ProUpdate.searchFile(searchDir, startDate, endDate);
		request.setAttribute("updateFileList", updateFileList);
		request.getSession().setAttribute("updateFileList", updateFileList);
		request.setAttribute("updateMessage", ProUpdate.updateMessage);
		try {
			RequestDispatcher rd = request.getRequestDispatcher("/update/search.jsp");
			rd.forward(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 

其它处理类似,包含的功能有:

文件检索、生成zip包,解压zip包、备份替换文件、servlet实现上传下载

 

生成zip包

/**
	 * 将更新文件列表打包到输出文件
	 * @param outFile
	 * @param updateFileList
	 * @throws FileNotFoundException
	 */
	public static void createZip(String zipFile, ArrayList updateFileList) throws FileNotFoundException {
		String searchDir = getSearchDir(updateFileList);
		File outfile;
		if(zipFile.length() > 0) {
			outfile = new File(zipFile);
		} else {
			outfile = new File(updateFile);
		}
		ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(outfile));
		byte[] b = new byte[1024];
		int read = 0;
		StringBuffer strBuffer = new StringBuffer();
		try {
			for(int i = updateFileList.size() - 1; i >=0; i --) {
				
				File file = (File)updateFileList.get(i);
				String filePath = "";
				if(file.getPath().length() > searchDir.length()) {
					filePath = file.getPath().substring(searchDir.length() + 1) + (file.isDirectory() ? "/" : "");
				} else {
					filePath = "/";
				}
				filePath = filePath.replace('\\', '/');
				if(!pathIsExit(filePath)) {
					outputStream.putNextEntry(new ZipEntry(filePath));
				}
				if(file.isFile()) {
					strBuffer.append("/" + filePath + "\r\n");
					FileInputStream inputStream = new FileInputStream(file);
					while((read = inputStream.read(b)) != -1) {
						outputStream.write(b, 0, read);
					}
					inputStream.close();
				}
			}
			outputStream.putNextEntry(new ZipEntry(msgFileName));
			outputStream.write(strBuffer.toString().getBytes());
			outputStream.closeEntry();
			printZipMessage(outfile.getPath());
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				outputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 解压zip包

/**
	 * 解压文件到指定目录
	 * @param zipFilePath
	 * @throws FileNotFoundException
	 */
	public static String unZip(String outputPath, String zipFilePath) throws FileNotFoundException {
		ZipInputStream inputStream = new ZipInputStream(new FileInputStream(zipFilePath));
		ZipEntry entry;
		Date date = new Date();
		if(outputPath.length() > 0) {
			outputDir = outputPath;
		}
		outputDir = outputDir + File.separator + timeDateFormat.format(date);
		File outputFile = new File(outputDir);
		outputFile.mkdirs();
		String updateMesaage = outputDir + "!";
		try {
			while((entry = inputStream.getNextEntry()) != null) {
				if(entry.isDirectory()) {
					File file = new File(outputDir + File.separator + entry.getName().substring(0, entry.getName().length() - 1));
					file.mkdirs();
				} else {
					File file = new File(outputDir + File.separator + entry.getName());
					System.out.println(file.getPath());
					if(!file.getParentFile().exists()) {
						file.getParentFile().mkdirs();
					}
					file.createNewFile();
					FileOutputStream outputStream = new FileOutputStream(file);
					byte[] b = new byte[1024];
					int read = 0;
					while((read = inputStream.read(b)) != -1) {
						outputStream.write(b, 0, read);
					}
					outputStream.close();
					if(file.getName().equals(msgFileName)) {
						BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
						String s = "";
						while((s = reader.readLine()) != null) {
							updateMesaage += s + "#";
						}
					}
				}
			}
			inputStream.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
		return updateMesaage;
	}

 下载更新包

/**
	 * 生成更新包
	 * @param request
	 * @param response
	 */
	private void doCreate(HttpServletRequest request,
			HttpServletResponse response) {
		ArrayList updateFileList = new ArrayList();
		String zipFile = getServletContext().getRealPath("/") + File.separator + "update.zip";
		if(request.getSession().getAttribute("updateFileList") != null) {
			updateFileList = (ArrayList)request.getSession().getAttribute("updateFileList");
			ProUpdate.createUpdateFile(zipFile, updateFileList);
		}
		response.setContentType("text/html");
		try {
			response.sendRedirect("/update.zip");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
 

上传更新包

/**
	 * 上传更新包
	 * @param request
	 * @param response
	 */
	private void doUpload(HttpServletRequest request,
			HttpServletResponse response) {
		try {
			File updatefile = new File(getServletContext().getRealPath("/") + File.separator + "WEB-INF" + File.separator + "update" + File.separator + "update.zip");
			File tempFile = new File(getServletContext().getRealPath("/") + File.separator + "WEB-INF" + File.separator + "update" + File.separator + "update.temp.txt");
			if(!tempFile.exists()) {
				tempFile.createNewFile();
			}
			RandomAccessFile raFile = new RandomAccessFile(tempFile, "rw"); 
			ServletInputStream inputStream = request.getInputStream();
			FileOutputStream outputStream = new FileOutputStream(updatefile);
			byte[] b = new byte[1024];
			int read = 0;
			while((read = inputStream.read(b)) != -1) {
				raFile.write(b, 0, read);
			}
			inputStream.close();
			raFile.close();
			raFile = new RandomAccessFile(tempFile, "r"); 
			String startFlag = raFile.readLine();
			String endFlag = startFlag + "--";
			String line = null;
			raFile.seek(0);
			long startIndex = 0;
			long endIndex = 0;
			while((line = raFile.readLine()) != null) {
				if(line.equals(startFlag) && !line.equals(endFlag)) {
					startIndex = raFile.getFilePointer() - (startFlag.length() + 2);
				} else if(line.equals(endFlag)){
					endIndex = raFile.getFilePointer() - (endFlag.length() + 2);
				}
			}
			raFile.seek(0);
			raFile.seek(startIndex);
			raFile.readLine();
			raFile.readLine();
			raFile.readLine();
			raFile.readLine();
			while(raFile.getFilePointer() < endIndex) {
				outputStream.write(raFile.readByte());
			}
			outputStream.close();
			raFile.close();
			if(tempFile.exists()) {
				tempFile.delete();
			}
			request.setAttribute("updatefilepath", updatefile.getPath());
			RequestDispatcher rd = request.getRequestDispatcher("/update/uploadResult.jsp");
			rd.forward(request, response);
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	}
 

具体请参见代码,欢迎拍砖!

 

 

分享到:
评论
4 楼 SavageGarden 2010-03-01  
ahpo 写道
很不错的收藏了,项目中应该会很有用,楼主是这是历年项目经验啊。

惭愧,惭愧
3 楼 SavageGarden 2010-03-01  
whiteface999 写道
项目中也需要类似的东西,感谢楼主啊。过滤的地方可以改进一下。
File[] files = rootDir.listFiles(getFileRegexFilter("\\.svn"));
public static FilenameFilter getFileRegexFilter(String regex) {  
        final String regex_ = regex;  
        return new FilenameFilter() {  
            public boolean accept(File file, String name) {  
                boolean ret = name.matches(regex_);   
                return !ret;  
            }  
        };  
    }

恩,这个工具的核心就是检索文件,所以想提高效率也就是在这里优化
2 楼 whiteface999 2010-02-26  
项目中也需要类似的东西,感谢楼主啊。过滤的地方可以改进一下。
File[] files = rootDir.listFiles(getFileRegexFilter("\\.svn"));
public static FilenameFilter getFileRegexFilter(String regex) {  
        final String regex_ = regex;  
        return new FilenameFilter() {  
            public boolean accept(File file, String name) {  
                boolean ret = name.matches(regex_);   
                return !ret;  
            }  
        };  
    }
1 楼 ahpo 2010-02-26  
很不错的收藏了,项目中应该会很有用,楼主是这是历年项目经验啊。

相关推荐

    JDY-24M超级蓝牙手册-V1.721版本

    《JDY-24M超级蓝牙手册-V1.721版本》是一份详细的技术文档,专门针对JDY-24M型号的超级蓝牙模块。这份手册是为开发者、电子爱好者以及任何对蓝牙技术感兴趣的人群准备的,旨在提供全面且深入的指导,帮助他们理解和...

    易语言 模块 超级模块 Super-EC5.5

    9. **自动更新与版本控制**:为了方便维护和升级,Super-EC5.5可能集成了自动更新和版本控制功能,使得开发者能够轻松管理和分发程序的不同版本。 10. **文档与示例**:通常,这样的高级模块会附带详尽的使用文档和...

    微信小程序开发-超级跑腿一体包案例源码.zip

    在微信小程序开发领域,"超级跑腿一体包案例源码"是一个典型的移动开发项目,它提供了从订单创建、任务分配到完成配送的全套解决方案。这个压缩包文件包含了开发者进行微信小程序构建所需的所有必要文件,旨在帮助...

    叮咚-超级外卖餐饮小程序V6.2.8.zip

    《叮咚-超级外卖餐饮小程序V6.2.8》是一款专为餐饮行业设计的微信小程序,致力于提供全面且便捷的外卖服务。该版本号V6.2.8表明这是一个经过多次迭代和优化的成熟产品,它在原有基础上进一步提升了用户体验和系统...

    超级加解密转换工具

    在"超级加解密转换工具"中,ZdxPro.dll可能包含了加密和解密算法的核心实现,这些算法可能包括对称加密(如AES、DES)、非对称加密(RSA、ECC)等,用于对用户的数据进行高强度的安全处理。 SuperSoft.exe 是主执行...

    志汇-超级外卖点餐小程序5.6.5开源可用版

    总的来说,《志汇-超级外卖点餐小程序5.6.5开源可用版》是一款综合性的餐饮解决方案,它结合了现代科技与餐饮服务,为商家提供了一套高效、灵活且可定制的点餐工具。通过深入理解和充分利用其特点,商家能够提升服务...

    上海贝尔 E-140W-P EPON 悦me光猫 v1.2s固件

    2. `悦me贝尔 E-140W-P 悦Me EPON1.2s 版本升级地址.txt` 这个文本文件很可能包含了固件升级的具体URL或步骤,用户可以通过读取这个文件来获取详细的升级指南。 总的来说,升级固件是为了提升设备的稳定性和安全性...

    hg8145c超级密码获取工具.zip

    描述中的“hg8145c v超级密码获取工具”进一步确认了这一点,表明这是一个特定版本的工具,可能包含了针对 HG8145C 版本的优化或更新。 标签“hg8145c”和“hg8145v”可能指的是 HG8145C 和 HG8145V 这两种不同的...

    超级模块8.0完整源代码

    《超级模块8.0完整源代码》集合了多种版本的解密实现,是开发者们深入理解和运用该模块的重要参考资料。这个资源包含了从基础到高级的全方位功能,为开发者提供了丰富的学习和实践素材。以下是关于“超级模块8.0”...

    riscv32-esp-elf-gcc8_4_0-esp-2021r2-patch5-macos.tar.gz

    在软件开发中,"patch"通常指的是一个小型的代码修改或升级,用于解决已知问题或引入小规模改进。这里提到的"patch5"可能表示这是针对GCC8.4.0的第五个补丁,修复了一些已知问题或增强了对RISC-V和ESP平台的支持。 ...

    天鹰超级卫士防火墙V2.92航母版【网桥版本】

    产品名称:天鹰超级卫士(Skeagle Super Guard) ------------------------------------------------------------------------------------ 【V2.91 Build2012112802 更新说明】-- 2012年11月28日 1. 新功能: 1.1 ...

    微信小程序开发-超级外卖一体包案例源码.zip

    同时,小程序支持热更新,可以在不打扰用户的情况下进行版本升级。 通过研究这个超级外卖一体包的源码,开发者不仅可以了解到外卖业务的常见功能实现,如订单管理、商品展示、用户评论、支付流程等,还能深入学习到...

    超级模块免费版本

    总的来说,"超级模块免费版本"对于易语言的学习者和开发者来说是一份宝贵的资源,它提供了强大的工具,使得开发过程更加高效和便捷。通过深入学习和实践,用户可以充分利用这个模块,开发出功能丰富的应用程序。同时...

    CLRInjection - 通用托管注入(超级灰色按钮克星升级版)

    "超级灰色按钮克星升级版"这一名称可能暗示了该工具最初的用途是为了绕过某些软件的限制或保护机制,比如取消或禁用特定的功能,但这同时也可能涉及到了合法性问题。因此,在使用此类工具时,开发者必须确保其行为...

    超级单片机小开发工具

    【超级单片机小开发工具】是一款专为单片机开发者设计的实用工具集合,它集成了多种功能,旨在简化单片机编程、调试和测试的过程。作为一个专业的IT大师,我将详细介绍这款工具可能包含的关键知识点。 1. **单片机...

    易语言程序免安装版下载

     此次重大版本升级不影响以前的源代码(.e)和模块(.ec)。只要代码或模块中未用到“不支持静态编译”的支持库、COM/OCX等,都可以静态编译。以前编译好的模块(.ec)甚至不需要重新编译即可直接支持静态编译。  支持库...

    志汇叮咚超级外卖小程序6.4.3全开源+前端.zip微信小程序模板源码

    【志汇叮咚超级外卖小程序6.4.3全开源+前端.zip】是一个包含微信小程序模板源码的压缩包,适用于开发外卖应用。这个版本号(6.4.3)表明这是一个更新迭代过的版本,通常意味着它包含了之前版本的修复、优化以及可能...

    小颖JAVA源代码反编译超级引挚 V1.4 标准版

    4. **代码兼容性检查**:在升级或迁移项目时,如果旧版本的API文档不足,反编译可以揭示接口的具体实现,以确保兼容性。 然而,值得注意的是,反编译可能涉及法律和道德问题。在未获得授权的情况下,反编译他人的...

    超级跑腿小程序 zh_cjpt 1.9.0 全开源版安装更新一体包.rar

    10. **全开源版**:此版本的超级跑腿小程序提供全部源代码,意味着开发者可以查看和修改所有代码,这对于学习、研究或者定制化开发来说非常有价值。你可以深入理解其架构设计、业务逻辑,甚至可以根据自己的需求进行...

    超级兔子升级天使软件下载

    "超级兔子升级天使"是一款备受用户喜爱的软件工具,它主要致力于帮助用户便捷地管理和升级他们的计算机系统。这款软件在IT行业中被广泛视为一款必备工具,尤其对于那些希望保持电脑性能最佳状态的用户来说,它提供了...

Global site tag (gtag.js) - Google Analytics