- 浏览: 1605139 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (603)
- T_java (145)
- T_script&ASP (51)
- T_C/C++ (25)
- T_PowerBuilder (11)
- T_Database (53)
- T_odoo (7)
- T_应用服务器 (50)
- T_专_条形码 (6)
- T_专_负载均衡器 (4)
- T_操作系统 (94)
- T_信息安全 (41)
- T_专_搜索引擎 (14)
- T_L_PHP (58)
- T_L_Delphi (18)
- T_L_.NET、C#、VisualStudio (25)
- T_L_Objective-C (6)
- T_移动开发 (53)
- T_网络 (109)
- T_大数据 (2)
- T_嵌入式 (2)
- T_小众技术 (24)
- T_未分类 (58)
- L_旅游印记 (1)
- L_生活随笔 (48)
- L_中国文化 (18)
- L_户外与生存 (0)
最新评论
-
csbean4004:
不知道哪传来得恶习,发帖子不好好发,故意弄错一些东西,很讨厌
让HTML5支持后置摄像头 -
withthewind:
终于找到一个可以用的了。。。
如何用VBA取得Word文档中的标题前面的序号 -
busbby:
兄弟,无法下载,说文件不完整
一个好用的Outlook ost格式文件转pst文件的工具 -
yijavakevin:
密码啊~解压密码多少?
一个二维条形码组件 -
vipbooks:
你给的那个链接根本无法下载,跳到官网看了下最新版12M,但点下 ...
十步以内完成精细web打印
这几天接到项目组一个需求,要求把某一目录下的某一类文件进行Base64编码,考虑到该项目用ANT进行打包发布,于是乎想到了用自定义的Ant Task来实现Base64,以减少操作步骤。花几个小时看了一下Ant的Task,拼凑出一个类,基本能满足要求,就先贴出来,省得下次遇到同样问题再到处找。
仅供自己备忘及跟我一样的新手参考,方家勿笑。
实现类如下,其中Base64实现代码就不贴了
/** * */ package com.pansky.etax.invoice.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import java.util.Vector; import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.taskdefs.condition.Condition; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import cn.com.XXX.YYY.ZZZ.util.Base64; /** * * @author BrokenStone * http://sheng.iteye.com * @email: wdmsyf@yahoo.com * @Since 2010-12-29 */ public class JspEncodeTask extends MatchingTask implements Condition { private File file = null; private File todir = null; private String fileext; private Vector filesets = new Vector(); private Path classpath = null; private Hashtable includeFileMap = new Hashtable(); private boolean verbose=false; private boolean forceOverwrite = false; private String base64Chars = null; private String base64Pad = null; public String getBase64Pad() { return new StringBuffer(Base64.getB64Pad()).toString(); } public void setBase64Pad(String base64Pad) { Base64.setB64Pad( base64Pad.charAt(0) ); } public String getBase64Chars() { return Base64.getB64Chars(); } public void setBase64Chars(String base64Chars) { Base64.setB64Chars(base64Chars); } public void setFile(File file) { this.file = file; } public void setTodir(File todir) { this.todir = todir; } public void setFileext(String fileext) { this.fileext = fileext; } public void addFileset(FileSet set) { this.filesets.addElement(set); } public Path getClasspath() { return classpath; } public void setClasspath(Path classpath) { this.classpath = classpath; } public boolean isForceOverwrite() { return forceOverwrite; } public void setForceOverwrite(boolean forceOverwrite) { this.forceOverwrite = forceOverwrite; } public Path createClasspath(){ if(this.classpath ==null){ this.classpath = new Path(getProject()); } return this.classpath.createPath(); } public void setClasspathRef(Reference ref){ createClasspath().setRefid(ref); } public void execute() throws BuildException { AntClassLoader loader = null; try{ // if(this.classpath!=null){ // this.createClasspath(); // } boolean value = validateAndExecute(); }catch(Throwable ex){ throw new BuildException(ex); }finally{ if(loader!=null){ loader.resetThreadContextLoader(); loader.cleanup(); } } } public boolean eval() throws BuildException { return validateAndExecute(); } private boolean validateAndExecute() throws BuildException { String savedFileExt = this.fileext; FileSet fs = null; if ((this.file == null) && (this.filesets.size() == 0)) { throw new BuildException("Specify at least one source - a file or a fileset."); } if ((this.file != null) && (this.file.exists()) && (this.file.isDirectory())) { throw new BuildException("Checksum cannot be generated for directories"); } if (this.fileext == null) this.fileext = (".jspe"); else if (this.fileext.trim().length() == 0) { throw new BuildException("File extension when specified must not be an empty string"); } String baseDir = getProject().getBaseDir().getAbsolutePath(); try { int sizeofFileSet = this.filesets.size(); for (int i = 0; i < sizeofFileSet; i++) { fs = (FileSet) this.filesets.elementAt(i); DirectoryScanner ds = fs.getDirectoryScanner(getProject()); String[] srcFiles = ds.getIncludedFiles(); for (int j = 0; j < srcFiles.length; j++) { File src = new File(fs.getDir(getProject()), srcFiles[j]); if(src ==null || !src.exists()) continue; if ( this.todir != null ) { String absPath = this.todir + File.separator + srcFiles[j] + "." + this.fileext; absPath = absPath.replace(File.separatorChar, '/'); this.includeFileMap.put(src, absPath); }else{ String absPath = src.getAbsolutePath() + "." + this.fileext; absPath = absPath.replace(File.separatorChar, '/'); this.includeFileMap.put(src, absPath); } } } if(this.file != null && this.file.exists()){ if ( this.todir != null ) { String relativePath = this.file.getAbsolutePath().replace(baseDir, ""); String absPath = this.todir + File.separator + relativePath + "." + this.fileext; absPath = absPath.replace(File.separatorChar, '/'); this.includeFileMap.put(this.file, absPath); }else{ String absPath = this.file.getAbsolutePath() + "." + this.fileext; absPath = absPath.replace(File.separatorChar, '/'); this.includeFileMap.put(this.file, absPath); } } return doEncodeOrDecode(); } finally { this.fileext = savedFileExt; this.includeFileMap.clear(); } } private boolean doEncodeOrDecode() throws BuildException { boolean checksumMatches = true; FileInputStream fis = null; FileOutputStream fos = null; try { for (Enumeration e = this.includeFileMap.keys(); e.hasMoreElements();) { File src = (File) e.nextElement(); if(this.verbose) log("Processing file: " + src.getName()); Object destination = this.includeFileMap.get(src); fis = new FileInputStream(src); File dest = new File((String)destination); if(!dest.getParentFile().exists()){ dest.getParentFile().mkdirs(); } if(!this.forceOverwrite){ if(dest.exists()){ throw new BuildException("File ["+dest.getAbsolutePath()+"] exist.", getLocation()); } } fos = new FileOutputStream(dest); Base64.encode(fis, fos); fos.flush(); fos.close(); fos = null; } } catch (Exception e) { throw new BuildException(e, getLocation()); } finally { if (fis != null) try { fis.close(); } catch (IOException e) { } if (fos != null) try { fos.close(); } catch (IOException e) { } } return checksumMatches; } }
Build.xml如下:
<project name="MyJSPConvertor" default="encode_jsp" basedir="."> <property name="app.dir" value="app"/> <property name="web.dir" value="${app.dir}/web"/> <property name="lib.dir" value="${app.dir}/web"/> <property name="server.dir" value="server"/> <property name="server.admin.dir" value="${server.dir}/admin"/> <property name="server.common.dir" value="${server.dir}/common"/> <property name="server.lib.dir" value="${server.dir}/lib"/> <property name="encode.src.dir" value="${web.dir}"/> <property name="encode.dest.dir" value="${app.dir}/web_bak"/> <taskdef name="EncodeJsp" classname="com.XXX.YYY.ZZZ.util.JspEncodeTask"/> <target name="encode_jsp" description="encode jsp"> <echo message="创建目标路径" /> <mkdir dir="${encode.dest.dir}" /> <echo message="加密JSP……" /> <EncodeJsp forceOverwrite="yes" todir="${encode.dest.dir}" fileext="jspe" base64Chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" base64Pad="=" > <classpath refid="classpath" /> <fileset dir="${encode.src.dir}"> <include name="**/*.jsp"/> </fileset> </EncodeJsp> </target> </project>
发表评论
-
SpringBoot Fat Jar解压运行
2018-06-28 21:40 2254SpringBoot已经成为当前最流行的微服务 ... -
一句话实现五星评分显示
2018-06-05 08:31 988Python: rate = 1 #rate 取值 ... -
来算google的可视化编程工具——Blockly,不仅仅是玩具
2017-10-16 21:34 33088Blockly - 来自Google的可 ... -
安卓动态分析工具 Inspeckage
2017-08-07 08:46 0工具介绍 一个基于Xposed 开发的应用动态分析工具 g ... -
Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息
2017-08-07 08:37 0一、猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用 ... -
破解微信数据库 并查询数据上传服务器
2017-08-07 08:29 0由于工作需求破解了微信的数据库 并获取想要的信息上传服 ... -
安卓黑科技之HOOK详解
2017-08-07 08:21 0本文带大家进入到安卓另一个世界 互联网攻防大战 Xpos ... -
安卓逆向之基于Xposed-ZjDroid脱壳
2017-08-07 08:18 0前言 之前介绍了普通常见的反编译模式 但对于使用了 360 ... -
十步以内完成精细web打印
2017-06-21 11:44 7366注意: 康虎云报表组 ... -
浏览器端精准打印或套打组件
2017-01-18 13:05 6693注意: 康虎云报表 ... -
疯狂软件对Oracle放弃Java EE的看法
2016-08-14 22:38 517来源:http://javaligang ... -
几个Java相关的思维导图
2016-03-17 13:07 954来源:http://blog.csdn.net/jackf ... -
jasperReport Applet 打印
2016-02-01 16:33 859Applet方式的原理是本地下载Applet以及Jas ... -
为Java说句公道话
2016-01-24 10:59 707为Java说句公道话 有些 ... -
Mybatis Generator配置详解(中文)_转
2015-12-17 16:44 909来自: http://www.jianshu.com/p/e ... -
一个提供大量数据模型的网站
2015-12-17 14:00 970网站地址是:http://www.databaseansw ... -
采用ajp代理模式配置Apache+tomcat实现负载均衡(转)
2015-11-13 10:22 851这一种方法,配置简单,性能也高。附AJP介绍: AJP ... -
MyBatis配置文件修改侦测及重载的实现
2015-07-31 13:53 2323MyBatis配置文件修改侦测及重载的实现: /** ... -
Spring optional @PathVariable?
2015-07-09 13:13 901Q: Is it possible to somehow ... -
The forked VM terminated without saying properly goodbye. VM crash or System.exi
2015-07-07 18:22 4268The forked VM terminated witho ...
相关推荐
"android-launcher_custome"这个项目显然关注的是如何创建一个自定义的启动器,特别是涉及到图片的加载和自定义视图的实现。下面我们将详细探讨相关的知识点。 1. **自定义Launcher**: 自定义Launcher主要是通过...
《SpringBoot Starter 案例解析》 在Java开发领域,SpringBoot框架因其简洁、高效的特点,已经成为构建微服务应用的首选。为了简化项目配置,SpringBoot引入了Starter概念,它是一种开箱即用的依赖集合,允许开发者...
OPC 自定义接口组件(DLL) OpcRcw.Ae.dll OpcRcw.Batch.dll OpcRcw.Cmd.dll OpcRcw.Comn.dll OpcRcw.Da.dll OpcRcw.Dx.dll OpcRcw.Hda.dll OpcRcw.Sec...
"LLM-Custome.zip" 提供的是一种经过中文开源大模型定制化微调的解决方案,使得用户即使在计算资源有限的环境下也能运行自己的专属语言模型。 首先,我们来了解一下“开源大模型”。开源大模型是指那些开放源代码、...
在JavaScript的世界里,Dojo Toolkit是一个强大的开源JavaScript库,它为开发者提供了丰富的功能,包括UI组件、数据管理、异步操作等。本话题主要聚焦于如何利用Dojo创建自定义的Widget,这是一个对于提高代码复用性...
"itags.build" 是一个专为JavaScript开发设计的模块,它提供了一系列自定义元素(custom elements),用于构建更丰富的Web应用程序。... 在"itags.build"中,你可以找到各种预定义的组件,这些组件可能包括表单控件、...
《jQuery UI 1.11.1 自定义版本:深入解析与应用》 jQuery UI 是一个基于 jQuery 的开源库,提供了丰富的用户界面组件和交互功能,使得开发者能够更轻松地创建具有吸引力和交互性的Web应用。这个“jquery-ui-1.11.1...
MEI定制服务 此Web应用程序为提供基于Web的前端,以基于MEI定制创建用于验证MEI XML文件的架构。 什么是定制? 定制是MEI的一种版本,专门用于验证特定类型的MEI文件... 您将需要安装ant Java构建工具才能使它们运行。
在Android开发中,自定义Dialog是一种常见的需求,用于提供与用户交互的个性化界面。`Custom_Dialog_Usage`这个主题正是关注如何在Android应用中创建并使用自定义对话框。通常,系统默认的Dialog样式可能无法满足...
在"custome-go"中,我们看到它基于Gojs的v2.1.34版本进行克隆和扩展,这意味着项目可能包含了Gojs的核心功能,并根据特定需求进行了定制和优化。Gojs v2.1.34是一个稳定版本,可能包含了该版本发布时的所有特性、...
CustomePanel.m
2. 修改UG安装目录(如D:\Unigraphics NX X.0 \UGII\menus)的custome_dirs.dat, 3. 在该文件最后增加以下行: ${UGII_BASE_DIR}\stdlib $UGII_BASE_DIR/stdlib $UGII_BASE_DIR/CUSTOM/UGOpen $UGII_BASE_...
**Python库定制Tkinter界面——customtkinter-2.3详解** 在Python的GUI编程领域,Tkinter作为标准库提供了一种基础的图形用户界面工具,但其默认样式较为单一,无法满足开发者对于美观和个性化的追求。...
CodeFlow不和谐机器人安装npm install 在观看模式下开始npm run start-watch目前的待办事项检查每个人是否都喜欢此安装程序结束要使用哪个Discord库离开测试框架(茉莉,摩卡,柴) 最低测试覆盖率? 收集更多想法...
iOS 8 自定义键盘扩展模板 这个通用键盘模板使用 Objective-C 编写并使用故事板和自动布局,是一个完整的入门套件,适合任何想要创建自定义键盘的人。 所有基本键都已创建,并且键盘可以以与系统键盘相同的方式在...
在IT行业中,自定义物体检测(Custom Object Detection)是一项关键技术,它允许用户针对特定应用场景训练模型来识别和定位图像中的特定对象。本项目“custom_object_detection”显然聚焦于这一领域,采用Jupyter ...
《酷派YGDP_Setup_Custome:官方手机升级与刷机详解》 酷派YGDP_Setup_Customer是一款专为酷派手机用户设计的官方升级软件,它集成了刷机功能,是酷派用户进行系统更新和恢复的重要工具。这款软件界面虽然简洁,但...
"RTDCustomerTool_V3.6_20180810" 是一个特定版本的软件工具,专为RTD(Real-Time Database)客户服务设计。这个工具的主要目的是协助用户与RTD数据库进行交互,执行各种操作,如数据读取、写入、更新和管理。...
自定义键盘快捷键 这是 Google Chrome 的一个简单扩展,通过chrome.commands API 提供键盘快捷键自定义。 这意味着快捷方式可用于所有标签页,也可用于下载和设置等特殊标签页。 不需要特殊权限。...
source insight官方给arm的clf不太好用,加了些关键词,加了些custome parsing