apache common 工具锦集
ApacheCommonBeanUtils
ApacheCommonBeanUtils目前 Commons 简介目前已经开发有release 出来的版本有BeanUtils, Betwixt, CLI, Collections, DBCP, Digester, Discovery, EL, FileUpload, HttpClient, Jelly, Jexl, JXPath, Lang, Latka, Logging, Modeler, Net, Pool, Validator 等等每个版本都不太一样, 随时都有更新的可能, 至于还没有 release 出来正式的版本, 有一些项目, 可能也正在使用了 !! 也是有可能因为其他项目做出来的一些元件, 可以抽出来共用的, 例如目前struts 用的Resources ( Resource bundle component ) , 也被列入 SandBox 研发中, 准备 release 更符合所有项目的组件.jakarta 为何要有 commons 这个 project 出现, 就是希望大家不用重复开发一样的组件, 达到 reusable 的目的 !! 而且他们都有容易使用的特性, 也是各个 jakarta committer 牛人们的精华杰作, 因此, 绝对不能错过这一个open source project !! 各位亲爱的java 同胞们 .................BeanUtils 介绍当我在选择要先介绍哪一个组件, 实在犹豫了很久, 因为每一个实在都是精华, 久久无法做出决定, 所以呢, 只好按照是否 release 再按照字母的先后, 做一个排序, 希望大家明白 ....所谓 BeanUtils 为何要开发呢, 每个工程师或许在写 JavaBean 的时候, 都会乖乖地去写 getters 和 setters, 就是 getXXX() 及 setXXX()methods, 但是当你的 object 是动态产生的, 也许是用文件, 也许是其他原因, 那你该如何去存取数据呢 !!几个例子你可能会用到 BeanUtils, 当然, 这是已经存在的项目了•BSF : Script Language 和 Java Object Model 之间•Velocity/JSP : 使用 template 建立相似的网页•jakarta taglibs/ Struts/ Cocoon: 建立自己特殊的Tag Libraries for JSP 或 XSP•ant build.xml / tomcat server.xml : XML-based 的配置文件( configuration resources )你大可以使用 java api 中的 ng.reflect 及 java.beans 来达到这些数据交换 ~~ 不过呢, 难度有点高 =.="" ,但是, BeanUtils 将会减低你开发的时间 !!目前最新的版本为 1.6.1 (2003/2/18 released),下载位置为Binary & SourceBeanUtils API 介绍BeanUtils 的Java API主要的 package 总共四项mons.beanutilsmons.beanutils.convertersmons.beanutils.localemons.beanutils.locale.converters其实除了第一项之外, 其他的都是后来的版本才加上去的, converters 就是专门处理不同传入的 object 该如何转换, locale 呢,就是为了国际化的处理, 所以重点我都会摆在第一项!!而其中最常用到的 class 是 PropertyUtils 及 ConvertUtils 还有DynaBeans( 有用 struts dynaform 的应该不陌生 )BeanUtils.PropertyUtils 介绍基本上, 我假设大家对JavaBean 的开发都没有问题, 就是对getters 及 setters 都了解是什么. 先假设, Employee classpublic class Employee {public Address getAddress(String type);public void setAddress(String type, Address address);public Employee getSubordinate(int index);public void setSubordinate(int index, Employee subordinate);public String getFirstName();public void setFirstName(String firstName);public String getLastName();public void setLastName(String lastName);}在 PropertyUtils 中会区分为三种 method 状态•Simple - 如果你是用到 primitive 语法, 如 int, String 或其他自行开发的 objects 等等, 只需要单一的对象就可以取得数据••PropertyUtils.getSimpleProperty(Object bean, String name)••PropertyUtils.setSimpleProperty(Object bean, String name, Object value)••Employee employee = ...;String firstName = (String)PropertyUtils.getSimpleProperty(employee, "firstName");String lastName = (String)PropertyUtils.getSimpleProperty(employee, "lastName");.............PropertyUtils.setSimpleProperty(employee, "firstName", firstName);PropertyUtils.setSimpleProperty(employee, "lastName", lastName);•Indexed - 如果你是用到Collection 或List 实作出来的objects , 只需要使用一个 index 数值就可以取得对象的状态••PropertyUtils.getIndexedProperty(Object bean, String name)••PropertyUtils.getIndexedProperty(Object bean, String name, int index)••PropertyUtils.setIndexedProperty(Object bean, String name, Object value)••PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)••Employee employee = ...;int index = ...;String name = "subordinate[" + index + "]";Employee subordinate = (Employee)PropertyUtils.getIndexedProperty(employee, name);Employee employee = ...;int index = ...;Employee subordinate = (Employee)PropertyUtils.getIndexedProperty(employee, "subordinate", index);•Mapped - 如果你是用到 Map 延伸出來的 objects , 只需要使用一个 key 值就可以取得数据••PropertyUtils.getMappedProperty(Object bean, String name)••PropertyUtils.getMappedProperty(Object bean, String name, String key)••PropertyUtils.setMappedProperty(Object bean, String name, Object value)••PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)••Employee employee = ...;Address address = ...;PropertyUtils.setMappedProperty(employee, "address(home)", address);Employee employee = ...;Address address = ...;PropertyUtils.setMappedProperty(employee, "address", "home", address);但是如果你是巢状(nested)的数据结构, 你该如何取得你要的数据呢PropertyUtils.getNestedProperty(Object bean, String name)PropertyUtils.setNestedProperty(Object bean, String name, Object value)你只需要简单地使用 ".", 就可以得到你要的数据了String city = (String)PropertyUtils.getNestedProperty(employee,"address(home).city");千万要记住, BeanUtils 是要让你随心所欲使用, 所以呢 index ,mapped 当然都可以这样使用Employee employee = ...;String city = (String) PropertyUtils.getProperty(employee,"subordinate[3].address(home).city");BeanUtils.DynaBean and BeanUtils.DynaClass 介绍所有的 Dynamic JavaBean 都是实现 DynaBean 或 DynaClass 这两个interface, 也可能会用到DynaProperty class 来存取properties . 我们为何要用到 Dynamic JavaBean 呢, 例如, 你从数据库取出来的数据, 有时候可能是三个栏位, 有时候是四个栏位, 如果我们对于每个Bean 都要去写一个class, 就会很累, 所以对于每一种javabean 我们就设定他的属性有哪些, 接着就可以使用 PropertyUtils 来将他的数值取出, 如此, 可以减少很多开发工时. 在 Struts 的课程中, 很多人问到我, 请问每一个 ActionForm 都必须写成 java 文件吗, 当然, 不需要的, 否则一个网页一个 ActionForm ( 假设都不一样 ), 那么, 这么浪费时间的工作, 为何还要使用 Struts 来作为 Framework 呢, 所以我们都是使用 org.apache.struts.action.DynaActionForm!!MutableDynaClass ( since $1.5 ) 这是蛮新的一个 DynaClass, 是为了动态可以调整 properties !•BasicDynaBean and BasicDynaClass - 基本的 Dynamic 类型••BasicDynaClass(ng.String name, ng.Class dynaBeanClass, DynaProperty[] properties)••BasicDynaBean(DynaClass dynaClass)••DynaProperty[] props = new DynaProperty[]{new DynaProperty("address", java.util.Map.class),new DynaProperty("subordinate", mypackage.Employee[].class),new DynaProperty("firstName", String.class),new DynaProperty("lastName", String.class)};BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props);DynaBean employee = dynaClass.newInstance();employee.set("address", new HashMap());employee.set("subordinate", new mypackage.Employee[0]);employee.set("firstName", "Fred");employee.set("lastName", "Flintstone");•ResultSetDynaClass (Wraps ResultSet in DynaBeans) - 使用 ResultSet 的 Dynamic JavaBean••ResultSetDynaClass(java.sql.ResultSet resultSet)••ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)••如果 lowerCase 设为 false , 返回的数据栏位名将根据 JDBC 返回的为准. default 为 true.Connection conn = ...;Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select account_id, name from customers");Iterator rows = (new ResultSetDynaClass(rs)).iterator();while (rows.hasNext()) {DynaBean row = (DynaBean) rows.next();System.out.println("Account number is " +row.get("account_id") +" and name is " + row.get("name"));}rs.close();stmt.close();•RowSetDynaClass (Disconnected ResultSet as DynaBeans) - 使用 RowSet 的 Dynamic JavaBean••RowSetDynaClass(java.sql.ResultSet resultSet)••RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)••如果 lowerCase 设为 false , 返回的数据栏位名将根据 JDBC 返回的为准. default 为 true.••Connection conn = ...; // Acquire connection from pool Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT ...");RowSetDynaClass rsdc = new RowSetDynaClass(rs);rs.close();stmt.close();...; // Return connection to poolList rows = rsdc.getRows();...; // Process the rows as desired•WrapDynaBean and WrapDynaClass - 包装过的Dynamic JavaBean••如果你对于 DynaBean 的功能强大, 非常佩服的同时, 手边的JavaBean 又不能随随便便就不用那你就把他包装起来 ....••••WrapDynaClass(ng.Class beanClass)••WrapDynaBean(ng.Object instance)••ConvertingWrapDynaBean(ng.Object instance) ••MyBean bean = ...;DynaBean wrapper = new WrapDynaBean(bean);String firstName = wrapper.get("firstName");BeanUtils.ConvertUtils 介绍在很多情况, 例如struts framework 中, 就常常用到request.getParameter 的参数, 需要转换成正确的数据类型, 所以ConvertUtils 就是来处理这些动作.ConvertUtils().convert(ng.Object value)ConvertUtils().convert(ng.String[] values, ng.Class clazz)ConvertUtils().convert(ng.String value, ng.Class clazz)HttpServletRequest request = ...;MyBean bean = ...;HashMap map = new HashMap();Enumeration names = request.getParameterNames();while (names.hasMoreElements()) {String name = (String) names.nextElement();map.put(name, request.getParameterValues(name));}BeanUtils.populate(bean, map);// it will use ConvertUtils for convertings目前支持的类型有•ng.BigDecimal•ng.BigInteger•boolean and ng.Boolean•byte and ng.Byte•char and ng.Character•ng.Class•double and ng.Double•float and ng.Float•int and ng.Integer•long and ng.Long•short and ng.Short•ng.String•java.sql.Date•java.sql.Time•java.sql.Timestamp也可以建立自己的 converterConverter myConverter =newmons.beanutils.converter.IntegerConverter();ConvertUtils.register(myConverter, Integer.TYPE); // Native typeConvertUtils.register(myConverter, Integer.class); //Wrapper class。
《Java常用工具包大全》
《Java常用工具包大全》Java常用工具包大全Java发展至今已经有20多年的历史,而作为一个开源的编程语言,越来越多的工具包被开发出来,为我们的开发工作提供了便利和效率。
下面是Java常用工具包大全,包括了Java开发过程中最常用的各类工具包及其功能特性、使用场景和注意事项等。
一、Apache工具包Apache是世界著名的非营利组织,其旗下的工具包非常适合Java开发者使用。
除此之外,Apache还提供了广泛的文档和示例供开发者参考学习。
1. Apache CommonsApache Commons是Apache组织提供的一系列开源Java库和框架。
它包含了数十个组件,涉及了文件上传、线程池、日期转换、加密解密、JSON解析等方面。
使用场景:Apache Commons中的每个组件都有助于快速实现复杂的应用程序,针对每一种拓展都能够省去自己编写的时间和精力。
2. Apache POIApache POI是Apache组织推出的一个用于读写Excel的工具包。
POI是“Poor Obfuscation Implementation”的缩写,是一款很好的操作Excel 文件的开源类库。
使用场景:在Java应用程序中读取或者写入Excel文档或者其他Office 文档的时候,使用Apache POI是一个不错的选择。
3. Log4jLog4j是Apache组织提供的一种可扩展的日志系统。
可以对日志记录进行详细的控制,譬如记录级别、输出到文件或者控制台等。
使用场景:通过Log4j记录详细的日志,可在排查问题时帮助开发人员快速找到问题所在。
4. VelocityVelocity是一种模板引擎,它通过将动态内容组合到模板中来生成输出。
在开发Java应用程序时,使用Velocity能够轻松生成格式一致的输出。
使用场景:在Java程序中处理动态内容和输出时,使用Velocity是一个很不错的选择。
二、Spring工具包Spring是目前Java领域最流行的应用程序开发框架。
apache工具类常用方法
apache工具类常用方法
Apache Commons是一组开源工具库,提供了一些实用的方法和工具类,用于简化常见的编程任务。
以下是Apache Commons工具类中一些常用
的方法:
1. Apache Commons Lang:提供了一些用于处理Java基本类型的实用方法,例如字符串操作、数字格式化、数组操作等。
2. Apache Commons IO:提供了一些用于处理文件和IO操作的实用方法,例如文件操作、文件过滤、文件复制等。
3. Apache Commons Collections:提供了一些用于处理集合的实用方法,例如集合转换、集合过滤、集合映射等。
4. Apache Commons Math:提供了一些用于数学计算的实用方法,例如
数学函数、线性代数、统计计算等。
5. Apache Commons Validator:提供了一些用于数据验证的实用方法,
例如字符串验证、电子邮件验证、IP地址验证等。
这些工具类中的方法都是静态的,可以直接通过类名调用,无需创建对象实例。
使用这些工具类可以大大简化代码,提高开发效率。
Apache-Commons包作用说明
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。
项目地址/Commons BeanUtils提供对Java反射和自省API的包装。
依赖包:Commons Codec、Commons LoggingCommons Codec是编码和解码组件,提供常用的编码和解码方法,如DES、SHA1、MD5、Base64、URL和Soundx 等。
Commons Collections是一个集合组件,扩展了Java标准Collections API,对常用的集合操作进行了很好的封装、抽象和补充,在保证性能的同时大大简化代码。
Commons Compress是一个压缩、解压缩文件的组件,可以操作ar、cpio、Unix dump、tar、zip、gzip、XZ、Pack200和bzip2格式的压缩文件。
Commons Configuration是一个Java应用程序的配置管理工具,可以从properties或者xml文件中加载配置信息。
依赖包:Commons Lang、Commons Log、Commons BeanUtils、Commons Collections、Commons CodecCommons CSV是一个用来读写各种Comma Separated Value(CSV)格式文件的Java类库。
Commons Daemon实现将普通的Java应用变成系统的后台服务。
Commons DBCP数据库连接池。
依赖包:Commons Logging、Commons PoolCommons DBUtils是JDBC工具组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。
Commons Digester是XML到Java对象的映射工具集。
Commons Email是邮件操作组件,对Java Mail API进行了封装,提供了常用的邮件发送和接收类,简化邮件操作。
Apache-Commons各工具集简介
Apache Commons目录Apache Commons (1)Commons-configuration (2)Commons-FileUpload: (3)Apache Commons DbUtils (5)Commons BeanUtils (7)Commons CLI (7)Commons Codec (8)Commons Collections (9)Commons DBCP (9)Commons HttpClient (9)Commons IO (9)Commons JXPath (10)Commons Lang (10)Commons Math (11)Commons Net (12)Commons Validator (12)Commons Email (13)Commons-configuration1.如果要使用configuration这个包,首先要保证使用JDK1.2以上,还要引入如下jar包commons-beanutils commons-lang commons-logging commons-collections commons-digester commons-codec commons-jxpathmons-configuration最新的版本是1.5,这个工具是用来帮助处理配置文件的,支持很多种存储方式1. Properties files2. XML documents3. Property list files (.plist)4. JNDI5. JDBC Datasource6. System properties7. Applet parameters8. Servlet parameters最主要的作用是读取资源文件,每一种文件格式都有一个对应的类,如下properties文件--PropertiesConfiguration类; xml文件—XMLConfiguration; .ini文件—INIConfiguration;.plist文件—PropertyListConfiguration;还可以从JNDI中读取properties—JNDIConfiguration;当然还可以使用system的properties--SystemConfiguration 3.用Properties读取配置文件usergui.properties(放在类根路径下面):colors.background = #FFFFFFcolors.foreground = #000080window.width = 500window.height = 300keys=cn,com,org,uk,edu,jp,hk(1)一般写法:public static void readProperties(){InputStream in=null;try {in = new BufferedInputStream((new ClassPathResource("usergui.properties")).getInputStream());} catch (IOException e1) {e1.printStackTrace();}Properties p=new Properties();try {p.load(in);System.out.println(p.getProperty("colors.background"));} catch (IOException e) {}}(2)另一种ResourceBundle方式:public static void readProperties() {Locale locale = Locale.getDefault();ResourceBundlelocalResource = ResourceBundle.getBundle("usergui", locale);String value = localResource.getString("colors.background");System.out.println("ResourceBundle: " + value);}(3)使用PropertiesConfigurationpublic static void loadProperty(){try {PropertiesConfigurationconfig = new PropertiesConfiguration("usergui.properties");config.setProperty("colors.background", "#00000F");//更改值config.save();config.save("usergui.backup.properties");//save a copySystem.out.println(config.getProperty("colors.background"));System.out.println(config.getInt("window.width"));System.out.println(keys[i]);}for(Object str:key2){System.out.println(str.toString());}}catch(Exception e){}}Commons-FileUpload:packagecom.logcd.servlet;importjava.io.File;importjava.io.IOException;importjava.util.Iterator;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;mons.fileupload.FileItem;mons.fileupload.disk.DiskFileItemFactory;mons.fileupload.servlet.ServletFileUpload;public class Upload extends HttpServlet {private String uploadPath = "D:\\uploadDir"; // 上传文件的目录public void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException { try {DiskFileItemFactory factory = new DiskFileItemFactory();factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kbServletFileUpload upload = new ServletFileUpload(factory);upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MBList<FileItem> items = upload.parseRequest(request);// 得到所有的文件Iterator<FileItem> i = items.iterator();StringBuildermsgBuilder = new StringBuilder();//用于返回上传的文件while (i.hasNext()) {FileItem fi = (FileItem) i.next();String fileName = fi.getName();if (fileName != null) {File fullFile = new File(fi.getName());File savedFile = new File(uploadPath, fullFile.getName());fi.write(savedFile);msgBuilder.append(fullFile.getName());msgBuilder.append(" ");msgBuilder.append("<a href=\"javascript:void(0);\" onclick=\"\" >");msgBuilder.append("删 除");msgBuilder.append("</a><br/>");}}request.setCharacterEncoding("GBK");//设置页面编码response.setContentType("text;charset=GBK");//内容类型response.getWriter().println("<script>parent.callback('"+ msgBuilder.toString() +"')</script>");} catch (Exception e) {e.printStackTrace();response.sendRedirect("<script>parent.callback('sorry,文件上传失败!')</script>");}if (!uploadFile.exists()) {uploadFile.mkdirs();}}}upload.html实现无刷新文件上传。
ApacheCommons-logging+log4j配置
ApacheCommons-logging+log4j配置Apache Commons-logging+log4j配置原文:/tianlincao/article/details/6055744 1.Commons-Loggin简介Jakarta Commons Logging (JCL)提供的是一个日志 (Log)接口(interface) ,同时兼顾轻量级和不依赖于具体的日志实现工具。
它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。
用户被假定已熟悉某种日志实现工具的更高级别的细节。
JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现。
2.快速入门JCL有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例) 。
当commons-logging.jar被加入到CLASSPATH之后,它会合理地猜测你想用的日志工具,然后进行自我设置,用户根本不需要做任何设置。
默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量mons.logging.Log,找到则使用其定义的Log实现类;如果在T omact中可以建立一个叫:CATALINA_OPTS 的环境变量给他的值:- mons.logging.Log = mons.lo gging.impl.SimpleLog -mons.logging.simplelog.defaultlog = warn3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;mons.logging.Log的具体实现有如下:mons.logging.impl.Jdk14Logger 使用JDK1.4。
Apachecommonexec包的相应使用总结
Apachecommonexec包的相应使⽤总结最近在写⼀个Java⼯具,其中调⽤了各种SHELL命令,使⽤了Runtime.getRuntime().exec(command);这个⽅法。
但是在我调⽤某个命令执⾏操作时,程序就卡在那了,但是其他操作却能够正常输出,经过了⼀番查找和摸索,终于明⽩了原来Java在执⾏命令时输出到某个Buffer⾥,这个Buffer是有容量限制的,如果满了⼀直没有⼈读取,就会⼀直等待,造成进程锁死的现象,知道这⼀点,我们就可以在执⾏的过程中新开启⼏个线程来不断地读取标准输出,以及错误输出:final Process p = Runtime.getRuntime().exec(command);new Thread(new Runnable() {@Overridepublic void run() {while (true){try {p.exitValue();break;} catch (Exception e){showInfo(System.err,p.getErrorStream());}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true){try {p.exitValue();break;} catch (Exception e){showInfo(System.out,p.getInputStream());}}}}).start();int exitValue = p.waitFor();需要注意的是,在waitFor执⾏完成之前,错误输出和标准要分开处理。
Apache commons-exec提供⼀些常⽤的⽅法⽤来执⾏外部进程,Apache commons exec库提供了监视狗Watchdog来设监视进程的执⾏超时,同时也还实现了同步和异步功能,Apache commonsexec 涉及到多线程,⽐如新启动⼀个进程,Java中需要再开三个线程来处理进程的三个数据流,分别是标准输⼊,标准输出和错误输出。
Java的Apache_Commons库
Java的Apache Commons库引言:Java是一种广泛使用的编程语言,具有丰富的类库和框架。
其中,Apache Commons库是一个非常受欢迎的Java类库,提供了大量的可重用组件和工具,帮助开发人员提高开发效率和代码质量。
本文将介绍Apache Commons库的一些常用模块和功能。
第一章:Apache Commons库概述1.1 什么是Apache Commons库1.2 Apache Commons库的优点1.3 Apache Commons库的组成部分第二章:Apache Commons库的常用模块2.1 Apache Commons Lang模块2.1.1 字符串操作2.1.2 数组操作2.1.3 类型转换2.1.4 异常处理2.2 Apache Commons IO模块2.2.1 文件操作2.2.2 流操作2.2.3 序列化和反序列化2.3 Apache Commons Collections模块2.3.1 集合操作2.3.2 迭代器操作2.3.3 转换器操作2.4 Apache Commons BeanUtils模块2.4.1 对象属性操作2.4.2 对象复制2.4.3 对象转换2.5 Apache Commons Codec模块2.5.1 编码和解码操作2.5.2 摘要操作2.6 Apache Commons Math模块2.6.1 数学函数2.6.2 随机数生成2.6.3 线性代数运算第三章:Apache Commons库的使用示例3.1 示例一:字符串操作3.2 示例二:文件操作3.3 示例三:集合操作3.4 示例四:对象属性操作3.5 示例五:编码和解码操作第四章:Apache Commons库的最佳实践4.1 使用合适的模块4.2 避免滥用Apache Commons库4.3 阅读文档和源代码4.4 参与Apache Commons库的开发和贡献结论:Apache Commons库是Java开发中不可或缺的工具,它提供了丰富的功能和模块,帮助开发人员提高开发效率和代码质量。
J2EE课程设计《技术应用指导》——第4章 Apache Commons典型组件及应用(第1部分)
第4章Apache Commons典型组件及应用(第1/7部分)软件工程学倡导开发人员在软件系统的设计、开发实现和测试工作中尽可能地重用现有的系统设计方案、功能实现代码和成熟的测试用例,以减少重复性的开发和实现工作。
基于此原则,在各种语言平台中都为该平台下的开发人员提供有功能丰富的API类库——在Java语言中主要是以J2SDK(Java2 Platform Standard Edition Development Kit)为典型代表,而且Sun公司对J2SDK系统库的版本还在不断地丰富和发展,完善Java技术体系。
在Apache开源社区中(),为了进一步地丰富和扩展、增强J2SDK 的系统库功能,并使得Java平台下的开发人员能够更简单、方便地完成应用系统的开发实现,提供了一套Apache Commons组件集,在该组件集中提供有大量的通用功能类。
读者在学习和掌握Java平台下的各种编程技术时,有必要熟悉和掌握Apache Commons 组件集内的各个典型和常用的功能类的编程及应用——这不仅可以减少读者在课程设计的项目开发中对通用功能逻辑的功能实现代码的重复开发工作量,也能够进一步地提高项目中的代码质量。
作者在本章中将为读者介绍Apache Commons典型组件及应用。
1.1Apache Commons组件中的核心组件尽管Sun公司通过J2SDK为Java平台下的开发人员提供了功能丰富的API类库,但由于要考虑到多种不同层次和不同应用需求的开发人员的需要,在API类库的设计和实现方面有点不尽人意——琐碎和繁杂。
在Apache Commons组件中则提供有一类核心组件——它们是对J2SDK中的核心API 类库中有关功能类的再包装和功能扩展、简化编程实现。
作者在下面的章节中将为读者重点介绍几个主要的和典型应用的核心组件的功能及编程应用的代码示例。
1.1.1Apache Commons通用组件库1、Apache Commons工具类组件集在Apache的开源社区的官方网站/上有一个实现应用系统开发中的通用功能的Commons项目——请见下图4.1所示的网站页面内容的截图。
apachecommons常用工具类
apachecommons常用工具类1.有些情况下,Arrays满足不到你对数组的操作?不要紧,ArrayUtils 帮你ArrayUtilspublic class TestMain {public static void main(String[] args) {int[] nums1 = { 1, 2, 3, 4, 5, 6 };// 通过常量创建新数组int[] nums2 = ArrayUtils.EMPTY_INT_ARRAY;// 比较两个数组是否相等ArrayUtils.isEquals(nums1, nums2);// 输出数组,第二参数为数组为空时代替输出ArrayUtils.toString(nums1, "array is null");// 克隆新数组,注意此拷贝为深拷贝int[] nums3 = ArrayUtils.clone(nums1);// 截取数组ArrayUtils.subarray(nums1, 1, 2);// 判断两个数组长度是否相等ArrayUtils.isSameLength(nums1, nums2);// 判断两个数组类型是否相等,注意int和Integer比较时不相等ArrayUtils.isSameType(nums1, nums2);// 反转数组ArrayUtils.reverse(nums1);// 查找数组元素位置ArrayUtils.indexOf(nums1, 5);// 查找数组元素最后出现位置stIndexOf(nums1, 4);// 查找元素是否存在数组中ArrayUtils.contains(nums1, 2);// 将基本数组类型转为包装类型Integer[] nums4 = ArrayUtils.toObject(nums1);// 判断是否为空,length=0或null都属于ArrayUtils.isEmpty(nums1);// 并集操作,合并数组ArrayUtils.addAll(nums1, nums2);// 增加元素,在下标5中插入10,注意此处返回是新数组ArrayUtils.add(nums1, 5, 1111);// 删除指定位置元素,注意返回新数组,删除元素后面的元素会前移,保持数组有序ArrayUtils.remove(nums1, 5);// 删除数组中值为10的元素,以值计算不以下标ArrayUtils.removeElement(nums1, 10);}}2.还在使用传统反射吗?还在被反射的样板代码困扰?看commons 如何帮助我们简化反射的工作,从样板代码抽身ClassUtilspublic class TestMain {public static void main(String[] args) {// 获取Test类所有实现的接口ClassUtils.getAllInterfaces(Test.class);// 获取Test类所有父类ClassUtils.getAllSuperclasses(Test.class);// 获取Test类所在的包名ClassUtils.getPackageName(Test.class);// 获取Test类简单类名ClassUtils.getShortClassName(Test.class);// 判断是否可以转型ClassUtils.isAssignable(Test.class, Object.class);// 判断是否有内部类ClassUtils.isInnerClass(Test.class);}}ConstructorUtilspublic class TestMain {public static void main(String[] args) {// 获取参数为String的构造函数ConstructorUtils.getAccessibleConstructor(Test.class, String.class);// 执行参数为String的构造函数Test test = (Test) ConstructorUtils.invokeConstructor(Test.class,"Hello");}}MethodUtilspublic static void main(String[] args) throws NoSuchMethodException,IllegalAccessException, InvocationTargetException {// 调用无参方法Test test = new Test();MethodUtils.invokeMethod(test, "publicHello", null);// 调用一参方法MethodUtils.invokeMethod(test, "publicHello", "Hello");// 调用多参方法MethodUtils.invokeMethod(test, "publicHello", new Object[] { "100",new Integer(10) });// 调用静态方法MethodUtils.invokeStaticMethod(Test.class, "staticHello", null);}FieldUtilspublic class TestMain {public static void main(String[] args) throws IllegalAccessException {Test test = new Test("1", "Ray", "hello");// 以下两个方法完全一样,都能获取共有或私有变量,因为第三个参数都设置了不检查FieldUtils.getDeclaredField(Test.class, "username", true);FieldUtils.getField(Test.class, "username", true);// 读取私有或公共变量的值FieldUtils.readField(test, "username", true);// 读取静态变量FieldUtils.readStaticField(Test.class, "STATIC_FIELD");// 写入私有或共有变量FieldUtils.writeField(test, "username", "RayRay", true);// 写入静态变量FieldUtils.writeStaticField(Test.class, "STATIC_FIELD", "static_value");}}3. 很多情况下我们都需要将字符串转换为数字,或判断字符串是否是数字等等操作,NumberUtils帮助我们方便的从字符串转换为数字,在不使用NumberUtils情况下,若然字符串值不是数字,使用Integer.parseInt()时会报出ng.NumberFormatException,但在NumberUtils的情况下,只会返回0而不产生错误NumberUtils and RandomUtilspublic class TestMain {public static void main(String[] args) throws IllegalAccessException {String str = "12.7";/** ng.NumberUtils已经被弃用,* 注意要引入ng.math.NumberUtils*/// 判断字符串是否为整数NumberUtils.isDigits(str);// 判断字符串是否为数字NumberUtils.isNumber(str);// 获取参数中最大的值,支持传入数组NumberUtils.max(10, 20, 30);// 获取参数中最小的值,支持传入数组NumberUtils.min(10, 20, 30);// 将字符串转换为int类型,支持float,long,short等数值类型NumberUtils.toInt(str);// 通过字符串创建BigDecimal类型 ,支持int,float,long等数值NumberUtils.createBigDecimal(str);/** RandomUtils帮助我们产生随机数,不止是数字类型 ,* 连boolean类型都可以通过RandomUtils产生*/RandomUtils.nextBoolean();RandomUtils.nextDouble();RandomUtils.nextLong();// 注意这里传入的参数不是随机种子,而是在0~1000之间产生一位随机数RandomUtils.nextInt(1000);}}4. 在开发当中字符串的使用和操作时最为频繁的,而null的字符串经常让我们报出NullPointerException,在使用StringUtils后,将不需要为字符串的null值而烦恼,却又提供了更多的操作让我们更方便的操作字符串StringUtilspublic class TestMain {public static void main(String[] args) throws IllegalAccessException {String str = "Hello World";/** 由于StringUtils拥有100+的方法,笔者不逐一列举用法,* 只列举笔者认为常用的或笔者使用过的*/// isEmpty和isBlank的区别在于isEmpty不会忽略空格,// " "<--对于这样的字符串isEmpty会认为不是空,// 而isBlank会认为是空,isBlank更常用StringUtils.isEmpty(str);StringUtils.isNotEmpty(str);StringUtils.isBlank(str);StringUtils.isNotBlank(str);// strip --> 去除两端的aa// stripStart --> 去除开始位置的hell// stripEnd --> 去除结尾位置的orldStringUtils.strip(str, "aa");StringUtils.stripStart(str, "hell");StringUtils.stripEnd(str, "orld");// 返回字符串在第三次出现A的位置StringUtils.ordinalIndexOf(str, "A", 3);// 获取str 开始为hello结尾为orld中间的字符串// 注意此方法返回字符串 -->substringBetween// 注意此方法返回字符串数组(多了个s) --> substringsBetween StringUtils.substringBetween(str, "hell", "orld"); StringUtils.substringsBetween(str, "hell", "orld");// 重复字符串,第二种重载形式为在重复中用hahah拼接StringUtils.repeat(str, 3);StringUtils.repeat(str, "hahah", 2);// 统计参数2在字符串中出现的次数StringUtils.countMatches(str, "l");// 判断字符串是否全小写或大写StringUtils.isAllLowerCase(str);StringUtils.isAllUpperCase(str);// isAlpha --> 全部由字母组成返回true// isNumeric -->全部由数字组成返回true// isAlphanumeric -->全部由字母或数字组成返回true// isAlphaSpace -->全部由字母或空格组成返回true// isWhitespace -->全部由空格组成返回true StringUtils.isAlpha(str);StringUtils.isNumeric(str);StringUtils.isAlphanumeric(str);StringUtils.isAlphaSpace(str);StringUtils.isWhitespace(str);// 缩进字符串,第二参数最低为 4,要包含...// 现在Hello World输出为H...StringUtils.abbreviate(str, 4);// 首字母大写或小写StringUtils.capitalize(str);StringUtils.uncapitalize(str);// 将字符串数组转变为一个字符串,通过","拼接,支持传入iterator 和collectionStringUtils.join(new String[] { "Hello", "World" }, ",");/** 经常性要把后台的字符串传递到前提作为html代码进行解释, * 可以使用以下方法进行转换,以下方法输出为* <p>Hello</p>*/StringEscapeUtils.escapeHtml("Hello");}}5.DateUtils and DateFormatUtilspublic class TestMain {public static void main(String[] args) throws IllegalAccessException {Date day1 = new Date();/** 由于Aache的DateUtils和DateFormatUtils并没有Joda强大,* 所以在这里只作简单的示例*/// 增加一天DateUtils.addDays(day1, 1);// 减少一年DateUtils.addYears(day1, -1);// 格式化时间,第三参数为国际化,表示按美国时间显示DateFormatUtils.format(day1, "yyyy-MM-dd", );}}读者在使用时可能会发现,MethodUtils和ConstructUtils在ng.reflect和mons.beanutils都存在,但FieldUtils和ClassUtils 只在reflect当中存在,因为beanutils提供了另外一种名为PropertyUtils的对属性存取更为方便的工具,但PropertyUtils不能获取传统反射的Field对象,笔者建议MethodUtils和ConstructUtils应该倾向使用beanutils,因为beanutils就是为反射而存在,更专业(虽然提供的方法几乎一样),而使用ClassUtils和要获取传统的Field对象时使用reflect中的FieldUtils总结:commons工具包很多开源组织都有提供,例如google,spring,apache都有各自的工具包,有众多的选择,但最终的目的只是为了方便我们程序的开发和维护,简化我们编写一些常用的逻辑,提升我们开发的效率,从而达到活在开源,善用开源ps:Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问BeanUtilsCommons-BeanUtils 提供对 Java 反射和自省API的包装BetwixtBetwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务.ChainChain 提供实现组织复杂的处理流程的“责任链模式”.CLICLI 提供针对命令行参数,选项,选项组,强制选项等的简单API.CodecCodec 包含一些通用的编码解码算法。
Apache Commons 工具类介绍及简单使用
1、BeanUtils提供了对于JavaBean进行各种操作,比如对象,属性复制等等。
[java]view plaincopy1.//1、克隆对象2.// 新创建一个普通Java Bean,用来作为被克隆的对象3.4.public class Person {5.private String name = "";6.private String email = "";7.8.private int age;9.//省略 set,get方法10. }11.12.// 再创建一个Test类,其中在main方法中代码如下:13.import ng.reflect.InvocationTargetException;14.import java.util.HashMap;15.import java.util.Map;16.import mons.beanutils.BeanUtils;17.import mons.beanutils.ConvertUtils;18.public class Test {19.20./**21.22. * @param args23.24. */25.public static void main(String[] args) {26. Person person = new Person();27. person.setName("tom");28. person.setAge(21);29.try {30.//克隆31. Person person2 = (Person)BeanUtils.cloneBean(person);32. System.out.println(person2.getName()+">>"+person2.getAge());33. } catch (IllegalAccessException e) {34. e.printStackTrace();35. } catch (InstantiationException e) {36. e.printStackTrace();37. } catch (InvocationTargetException e) {38. e.printStackTrace();39. } catch (NoSuchMethodException e) {40. e.printStackTrace();41.42. }43.44. }45.46. }47.48.// 原理也是通过Java的反射机制来做的。
apachecommon工具
common-lang (2.1)
ArrayUtils
常量中包含了基本类型(及其相对应类)的空数组。
提供向数组增加元素(包括增加单个元素或是整个数组),删除元素,翻转元素排列次序
克隆数组(基本类型)
查找数组中ቤተ መጻሕፍቲ ባይዱ元素(是否包含,返回索引)
获得数组长度(null安全,返回为0)
数组是否为空,数组是否相等,长度是否相等,元素类型是否相同,
基本类型对应类数组转换成基本类型数组
转成字符串
BooleanUtils
Boolean的转换(可转成int,String)
CharUtils
针对Char的工具类包括判断是不是ASCII字符,是不是控制符可打印与否,转成整形
ClassUtils
复制一个对象的指定属性至另一个对象
将一个对象的所有属性都到一个Map
获得一个对象的一个数组属性
直接访问对象的Map类型的属性中的元素
将一个Map对象的键值复制到目标对象的相应属性
ConstructorUtils
从一个类获得其构造器
DynaBean
动态Bean。
Validator 1.1.4
看样子是从Struts里面剥离出来的,用用其工具类就OK了。其他的太繁琐。
获得包名,获得类的所有超类。
RandomStringUtils
随机字符串生成,可生成数字串,也可生成Ascii范围的字串
StringEscapeUtils
编码/解码针对xml/html/sql/javascript/java(主要是转义标记符号等)
StringUtils
String的增强。类似vb的函数。截断、查找、替换、判断空、大小写、合并、分割,反写,对比
ApacheCommons各个jar包的功能说明
ApacheCommons各个jar包的功能说明BeanUtilsCommons-BeanUtils 提供对 Java 反射和⾃省API的包装BetwixtBetwixt提供将 JavaBean 映射⾄ XML ⽂档,以及相反映射的服务.ChainChain 提供实现组织复杂的处理流程的“责任链模式”.CLICLI 提供针对命令⾏参数,选项,选项组,强制选项等的简单API.CodecCodec 包含⼀些通⽤的编码解码算法。
包括⼀些语⾳编码器, Hex, Base64, 以及URL encoder.CollectionsCommons-Collections 提供⼀个类包来扩展和增加标准的 Java Collection框架ConfigurationCommons-Configuration ⼯具对各种各式的配置和参考⽂件提供读取帮助.Daemon⼀种 unix-daemon-like java 代码的替代机制DBCPCommons-DBCP 提供数据库连接池服务DbUtilsDbUtils 是⼀个 JDBC helper 类库,完成数据库任务的简单的资源清除代码.DigesterCommons-Digester 是⼀个 XML-Java对象的映射⼯具,⽤于解析 XML配置⽂件.DiscoveryCommons-Discovery 提供⼯具来定位资源 (包括类) ,通过使⽤各种模式来映射服务/引⽤名称和资源名称.ELCommons-EL 提供在JSP2.0规范中定义的EL表达式的解释器.FileUploadFileUpload 使得在你可以在应⽤和Servlet中容易的加⼊强⼤和⾼性能的⽂件上传能⼒HttpClientCommons-HttpClient 提供了可以⼯作于HTTP协议客户端的⼀个框架.IOIO 是⼀个 I/O ⼯具集JellyJelly是⼀个基于 XML 的脚本和处理引擎。
Jelly 借鉴了 JSP 定指标签,Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。
apachecommons使用 4 个 Apache Commons Lang
apachecommons:使用 4 个 Apache Commons Lang 类了解代码重用的优点疯狂代码 / ĵ:http://DeveloperUtil/Article57525.html 开始的前 有关本教程 Commons Lang 是 Apache Commons 个组件后者是个宏大项目其中很多子项目涉及到 Java™ 语言软件Software开发区别方面Commons Lang 扩展了标准 ng API增加了串操作思路方法、基本数值思路方法、对象反射、创建和串行化以及 属性它还包含个可继承 enum 类型、对多种嵌套 Exception 类型支持、对java.util.Date 增强以及用于构建思路方法实用例如 hashCode、toString 和 equals我发现 Commons Lang 对应用很多方面都很有帮助通过使用 Commons Lang您将编写更少代码从而可以更快地交付缺陷更少、生产就绪软件Software本教程从基本概念上逐步指导您如何使用些区别 Commons Lang 类并利用它们代码从而不必自己编写那么多代码 目标 您将学习如何: 实现对象契约例如 equals 和 hashCode 验证它们功能 实现 Comparable 接口 compareTo 思路方法 当您按本教程操作时您将理解 Commons Lang 库优点并学会如何编写更少代码 先决条件 为了从本教程获得最大收益您应该熟悉 Java 语法和 Java 平台上面向对象开发基本概念您还应该熟悉重构和常规单元测试 系统需求 为了实战本教程中举例和代码您需要: 安装以下软件Software的: Sun JDK 1.5.0_09(或更高版本) IBM® Developer Kit for Java technology 1.5.0 SR3 Commons Lang 项目当前发行版(撰写本文时是 2.4)下载和解压缩发行包将 commons-lang-2.4.jar 包含到类路径中 对于本教程推荐系统配置是: 个支持 Sun JDK 1.5.0_09(或更高版本)或 IBM JDK 1.5.0 SR3 系统至少有 500MB 主内存 至少有 20MB 磁盘空间用于安装本教程涉及软件Software组件和例子 本教程中介绍说明和例子基于 Microsoft® Windows® 操作系统本教程中涉及所有工具也可以在 Linux®和 UNIX® 系统上运行 代码重用优点 在早期软件Software开发中都认为开发人员生产率和他编写代码数量成正比在那时有这么个看似合理标尺:代码最终导致个大概能用 2进制资产所以编写很多代码人必定是在勤奋地工作以实现个可用应用这个标尺似乎也适用于其他行业处理大量纳税申报会计或者做浓咖啡饮料咖啡师定是富有生产率对吗?他们都为各自生意带来更多收入他们都按预期生产了很多产品 但是不久前我们才知道更多代码并等区别于高生产率大量代码当然表明高度积极性但是积极性并不定等同于进步每天产生大量纳税申报表会计确实很积极但是他们为客户和雇员带来价值却很少每天以闪电般速度制造咖啡但弄错了订单咖啡师确很积极不过其生产率显然不高 更多代码可能意味着更多缺陷 幸好软件Software行业普遍接受这样个观点:太多代码可能是件坏事有两项研究发现般应用每 1,000 行代码就包含 20 到 250 个 bug(参见 参考资料)!这个度量被称作缺陷密度(defect density)据此可得出个重要结论:更少代码意味着更少缺陷 当然仍然需要编写代码虽然应用本身不能为我们编写代码但是现在我们可以借用很多代码我们还没有实现业务组件中重用(例如开发人员可以重用其他人 Account 对象)但是平台中重用已经存在开源框架和支持代码激增可以帮助您以尽可能少代码编写出个 Account 对象(举个例子) 例如Hibernate 和 Spring 在 Java 社区中十分普遍以 Account 对象为例着手于 greenfield 开发项目团队(Team)准备构建个在线订购应用(需要个 Account 对象)和从头开始编写个面向对象映射(ORM)框架区别他们可通过利用 Hibernate 或个有竞争力面向对象映射(ORM)框架并且会因此大大受益对于应用其他方面也是样例如单元测试(您使用 JUnit对吗?)或依赖项注入(显然Spring 是不错选择)那就是重用只是和我们曾经想象不样 通过借用或重用这些框架只需编写更少代码从而可以更专注于业务问题这些框架本身有大量代码不过关键是您不需要编写或维护它这正是成功开源项目妙处:其他人在为您做这些事而且他们可能比您更专业 越少越好 更少代码意味着可以更快地将缺陷更少软件Software推向市场但是重用很重要它不仅意味着编写更少代码而且还意味着可以利用 “群众智慧”些流行开源框架和工具 — 例如 Hibernate、Spring、JUnit 和 Apache Web server — 正在被全球各地人在区别应用中使用这种久经考验、经过测试软件Software并不是没有缺陷但是您可以放心地认为即使出现问题也可以很快发现并将其解决而且无需付出成本 Apache Commons 项目已经存在多年了它非常稳定最新发行版包含大约 90 个类和将近 1,800 个单元测试虽然没有公布覆盖信息(当然有人可能会说这个项目代码覆盖率比较低)但是数据是最好介绍说明每个类基本上有 20 个测试我敢打赌对这个项目代码测试是很严格至少不亚于您测试自己代码 对象契约 Commons Lang 库带有套方便类它们统称为 builders在本节中您将学习如何使用其中个类来构建ng.Object equals 思路方法以帮助减少编写代码数量 思路方法实现挑战 所有 Java 类都自动继承 ng.Object您可能已经知道Object 类有 3 个思路方法通常需要被覆盖: equals hashCode toString equals 和 hashCode 思路方法特殊的处在于Java 平台其他方面例如集合甚至是持久性框架(包括Hibernate)要依赖于这两个思路方法正确实现 如果您没有实现过 equals 和 hashCode那么您可能会认为这很简单 — 但是您错了Joshua Bloch 在Effective Java 书(参见 参考资料)以超过 10 页篇幅论述了实现 equals 思路方法特殊的处如果最终实现 equals 思路方法那么还需要实现 hashCode 思路方法( equals 契约表明两个相等对象必须有相同散列码)Bloch 又以 6页篇幅解释了 hashCode 思路方法也就是说至少有 16 页有关适当实现两个看上去很简单思路方法详细信息 实现 equals 思路方法挑战在于该思路方法必须遵从契约equals 必须: 具有反射性: 对于某个对象foo(不为 null)foo.equals(foo) 必须返回 true 具有对称性: 对于对象 foo 和 bar(不为 null)如果 foo.equals(bar) 返回 true那么 bar.equals(foo) 也必须返回 true 具有传递性: 对于对象 foo、bar 和 baz(不为 null)如果 foo.equals(bar) 为 true 且 bar.equals(baz)为 true那么 foo.equals(baz) 必须也返回 true 具有致性: 对于对象 foo 和 bar如果 foo.equals(bar) 返回 true那么无论 equals 思路方法被多少次equals 思路方法总是应该返回 true(假设两个对象都没有实际变化) 能够适当地处理 null: foo.equals(null) 应该返回 false 读到这里或者研读过 Effective Java 的后您将面临在 Account 对象上适当地实现 equals 思路方法挑战但是请记住前面我就生产率和积极性所说话 假设您要为企业构建个在线 Web 应用这个应用越早投入使用您企业就能越早赚钱在此情况下您还会花几个小时(或者数天)来适当地实现和测试 对象上 equals 契约吗?— 还是重用其他人代码? 构建 equals 当实现 equals 思路方法时Commons Lang EqualsBuilder 比较有用这个类很容易理解实际上您需要知道它两个思路方法:append 和 isEqualsappend 思路方法带有两个属性:个是本身对象属性个是相比较对象同个属性由于 append 思路方法返回 EqualsBuilder 个例子因此可以将随后链接起来比较个对象所有必需属性最后可以通过 isEquals 思路方法完成这个链 例如像清单 1 中那样创建个 Account 对象: 清单 1. 个简单 Account 对象import pareToBuilder; import ng.builder.EqualsBuilder; import ng.builder.HashCodeBuilder; import ng.builder.Builder;import java.util.Date;public Account implements Comparable {private long id;private String firstName;private String lastName;private String emailAddress;private Date creationDate;public Account(long id, String firstName, String lastName, String emailAddress, Date creationDate) { this.id = id; this.firstName = firstName; stName = lastName; this.emailAddress = emailAddress; this.creationDate = creationDate;}public long getId { id;}public String getFirstName { firstName;}public String getLastName { lastName;}public String getEmailAddress { emailAddress;}public Date getCreationDate { creationDate;}} 我们需要 Account 对象很简单而且是独立此时您可以运行个快速测试如清单 2 所示看看是否可以信赖equals 默认实现: 清单 2. 测试 Account 对象默认 equals 思路方法import org.junit.Test;import org.junit.Assert;import com.acme.app.Person;import java.util.Date;public AccountTest {@Testpublic void veryEquals{ Date now = Date; Account acct1 = Account(1, "Andrew", "Glover", "ajg@", now); Account acct2 = Account(1, "Andrew", "Glover", "ajg@", now); Assert.assertTrue(acct1.equals(acct2));}} 在清单 2 中可以看到我创建了两个相同 Account 对象每个对象有它自己引用(因此 将返回 false)当我想看看它们是否相等时JUnit 友好地通知我返回是 false 记住Java 平台许多方面都可以利用 equals 思路方法包括 Java 语言集合类所以有必要为这个思路方法实现个有效版本因此我将覆盖 equals 思路方法 记住equals 契约不适用于 null 对象而且两种区别类型对象(例如 Account 和 Person)不能相等最后在Java 代码中equals 思路方法显然有别于 操作符(还记得吗如果两个对象有相同 引用后者将返回 true;因此那两个对象必定相等)两个对象可以相等(并且 equals 返回 true)但是不使用相同引用 因此可以像清单 3 中这样编写 equals 思路方法第个方面: 清单 3. equals 中快速条件(this obj) {true;}(obj null || this.getClass != obj.getClass) {false;} 在清单 3 中我创建了两个条件在比较基对象和传入 obj 参数各自属性的前应该验证这两个条件 接下来由于 equals 思路方法带有 Object 类型参数所以可以将 obj 参数转换为 Account如清单 4 所示: 清单 4. 转换 obj 参数Account account = (Account) obj; 假设 equals 逻辑到此为止接下来可以利用 EqualsBuilder 对象记住这个对象被设计为使用 append 思路方法将基对象(this)类似属性和传入 equals 思路方法类型进行比较由于这些思路方法可以链接起来最终可以以isEquals 思路方法完成这个链该思路方法返回 true 或 false因此实际上只需编写行代码如清单 5 所示: 清单 5. 重用 EqualsBuilderEqualsBuilder()append(this.id, account.id) .append(this.firstName, account.firstName) .append(stName, stName) .append(this.emailAddress, account.emailAddress) .append(this.creationDate, account.creationDate) .isEquals; 合并的后可以产生如清单 6 所示 equals 思路方法: 清单 6. 完整 equalspublic boolean equals(Object obj) {(this obj) { true;}(obj null || this.getClass != obj.getClass) { false;}Account account = (Account) obj;EqualsBuilder()append(this.id, account.id) .append(this.firstName, account.firstName) .append(stName, stName) .append(this.emailAddress, account.emailAddress) .append(this.creationDate, account.creationDate) .isEquals;} 现在重新运行的前失败测试(参见 清单 2)应该会成功 您没有花任何时间来编写自己 equals如果您仍然想知道自己如何编写个适当 equals 思路方法那么只需知道这涉及到很多条件例如清单 7 中是个非 EqualsBuilder 实现 equals 思路方法个小片段它比较 creationDate 属性: 清单 7. 您自己 equals 思路方法个片段(creationDate != null ? !creationDate.equals( person.creationDate) : person.creationDate != null){false;} 注意在这种情况下虽然可以使用个 3元操作符(ternary)使代码更精确但是代码更加费解关键是我本可以编写系列条件来比较每个对象属性区别方面或者可以利用 EqualsBuilder(它也会做相同事情)您会选择哪种思路方法? 还需注意如果您真想优化自己 equals 思路方法并编写尽可能少代码(这也意味着维护更少代码)那么可以利用反射威力编写清单 8 中代码: 清单 8. 使用 EqualsBuilder 反射 APIpublic boolean equals(Object obj) {EqualsBuilder.reflectionEquals(this, obj);} 这对于减少代码是否有帮助? 清单 8 确减少了代码但是EqualsBuilder 必须关闭基对象中访问控制(以便比较 private 字段)如果在配置VM 时考虑了安全性那么这可能失败而且清单 8 中使用反射会影响 equals 思路方法运行时性能但是从好方面考虑如果使用反射 API当增加新属性时就不需要更新 equals 思路方法(如果不使用反射则需要更新) 通过 EqualsBuilder可以利用重用威力它为您提供两种思路方法来实现 equals 思路方法选择哪种思路方法由具体情况决定单行风格比较简单但是您现在已经理解这样做并非没有风险 对象散列 现在您已经实现个适当 equals 思路方法而且也没有编写太多代码但是别忘了还要覆盖 hashCode本节展示如何操作 构建 hashCode hashCode 思路方法也有个契约但是不像 equals 契约那样正式然而重要是要理解它和 equals 样结果必须致对于对象 foo 和 bar如果 foo.equals(bar) 返回 true那么 foo 和 bar hashCode 思路方法必须返回相同值如果 foo 和 bar 不相等则不要求返回区别散列码但是Javadocs 提到如果这些对象有区别结果那么通常会运行得更好些 还需注意和的前样如果没有覆盖它hashCode 会返回个看似随机整数这是底层平台通常会将基对象地址位置转换成个整数;虽然如此但文档中提到这并不是必需因此可以改变无论如何如果最终覆盖 equals 思路方法那么也有必要覆盖 hashCode 思路方法(记住虽然 hashCode 思路方法看上去是开箱即用但是 Joshua Bloch Effective Java 花了 6 页篇幅讨论如何适当地实现 hashCode 思路方法) Commons Lang 库提供个 HashCodeBuilder 类这个类和 EqualsBuilder 几乎是样但是它不是比较两个属性而是附加个属性以生成遵从我刚才描述契约个整数 在您 Account 对象中覆盖 hashCode 思路方法如清单 9 所示: 清单 9. 默认 hashCode 思路方法public hashCode {0;} 由于生成个散列码时没有什么可以比较因此使用 HashCodeBuilder 只需行代码重要是正确地化HashCodeBuilder构造带有两个 它使用这两个参数来创建个散列码这两个 必须是奇数append 思路方法带有个属性因此和的前样这些思路方法可以链接起来最后可以通过 toHashCode 思路方法完成这个链 根据这些信息您可以像清单 10 中那样实现个 hashCode 思路方法: 清单 10. 用 HashCodeBuilder 实现个 hashCode 思路方法public hashCode {HashCodeBuilder(11, 21)append(this.id) .append(this.firstName) .append(stName) .append(this.emailAddress) .append(this.creationDate) .toHashCode;} 注意我在构造中传入了个 11 和个 21这些完全是为该对象随机选择奇数打开前面 AccountTest(参见 清单2)添加个快速检查以验证如下契约:对于这两个对象如果 equals 返回 true那么 hashCode 应该返回相同数字清单 11 显示了修改后测试: 清单 11. 验证 hashCode 有关两个相等对象契约import org.junit.Test;import org.junit.Assert;import com.acme.app.Account;import java.util.Date;public AccountTest {@Testpublic void veryAccountEquals{ Date now = Date; Account acct1 = Account(1, "Andrew", "Glover", "ajg@", now); Account acct2 = Account(1, "Andrew", "Glover", "ajg@", now); Assert.assertTrue(acct1.equals(acct2)); Assert.assertEquals(acct1.hashCode() acct2.hashCode);}} 在清单 11 中我验证了两个相等对象具有相同散列码接下来在清单 12 中我还验证两个区别 对象具有区别散列码:2009-1-18 2:39:52疯狂代码 /。
apache commons 使用说明
(转)Apache Commons工具集简介Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。
我选了一些比较常用的项目做简单介绍。
文中用了很多网上现成的东西,我只是做了一个汇总整理。
一、Commons BeanUtils/commons/beanutils/index.html说明:针对Bean的一个工具集。
由于Bean往往是有一堆get和set组成,所以BeanUtils 也是在此基础上进行一些包装。
使用示例:功能有很多,网站上有详细介绍。
一个比较常用的功能是Bean Copy,也就是copy bean的属性。
如果做分层架构开发的话就会用到,比如从PO(Persistent Object)拷贝数据到VO(Value Object)。
传统方法如下://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//构造Teacher对象Teacher teacher=new Teacher();//赋值teacher.setName(teacherForm.getName());teacher.setAge(teacherForm.getAge());teacher.setGender(teacherForm.getGender());teacher.setMajor(teacherForm.getMajor());teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher对象到数据库HibernateDAO= ;HibernateDAO.save(teacher);使用BeanUtils后,代码就大大改观了,如下所示://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//构造Teacher对象Teacher teacher=new Teacher();//赋值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher对象到数据库HibernateDAO= ;HibernateDAO.save(teacher);二、Commons CLI/commons/cli/index.html说明:这是一个处理命令的工具。
apachecommons
apachecommonsapahe commons与⽇常应⽤开发apache commons项⽬⼤家都应该有或多或少的了解了,⽬前它在其他许多开源项⽬中被⼴泛得应⽤,基本上已经成为项⽬开发的⼀些基本(⼯具)类,像其中对字符串的处理、对⽇期、数字的处理,对javabean的处理、以及对xml和模板的处理等,都为项⽬开发提供了很⼤的⽅便。
希望⼤家也将这些⼯具类应⽤到⾃⼰的⽇常开发中来。
下⾯仅举⼏例,实际的⽤途要更为⼴泛得多:判断⼀个字符串(str)是否为空我们习惯的做法:if(str!=null&&!str.equals("")){...}通过commcons StringUtils:if(StringUtils.isNotBlank(str)){...}计算⼀个字符串(str1)在另⼀个字符串(str2)中出现的次数我们习惯的做法:使⽤substring⽅法依次往下查找,直⾄查出所有的为⽌,个数也就计算了处理。
通过commons StringUtils:int matchCount=StringUtils.countMatches(str2,str1);在项⽬中经常遇到这样的问题:在信息列表中,每⼀⾏信息(str)最多显⽰n个字符,如果超过,则折⾏或使⽤...来表⽰超出部分我们习惯的做法:通过折⾏解决该问题,因为⽤...⽅式可能会涉及汉字的字符计算问题,经常会将⼀个汉字截为两半的情况。
通过commons StringUtils 我们可以⽣成⽤...表⽰超出部分的字符串:String aStr=StringUtils.abbreviate(str,n);放⼼,不⽤考虑汉字问题!打印⼀个数组(array)中的值我们通常的做法://通常的做法可能有更好的String str="[";for(int i=0;i<array.length;i++){str+=array[i]+",";if(i==array.length-1){str+=array[i];}}str+="]";return str;通过使⽤commons ArrayUtils:return ArrayUtils.toString(array);直接了当将⼀组bean按照其某个属性(propertyName)进⾏排序我们通常的做法:实现⼀个Comparator接⼝(在compare⽅法还要使⽤commons PropertyUtils来取bean的属性值),然后通过Collections的sort排序通过使⽤commons beanutils:Collections.sort(list, new BeanComparator(propertyName));在⼀个Map中,如果知道keys和values都是唯⼀的,希望既可以通过key来获取value,也希望可以通过value来获取key 我们通常的做法:⽣成两个map,⼀个是正常的key、value⽅式,⼀个是反过来的value、key⽅式通过使⽤commns collections:BidiMap map=new DualHashMap();map.get(key)或map.inverseBidiMap().get(value)希望在⼀个List中只能存储某个类型的对象,例如只能存储字符串类型我们通过的做法:在向List加⼊值之前进⾏instanceof判断通过使⽤commons collections:List l=TypedList.decorator(new ArrayList(),String.class);有⼀个xml配置⽂件,服务器启动时将其读⼊,并解析xml⽣成各个相关的对象例如:<?xml version=1.0 encoding=utf-8 ?><users><users><user><name>zhangsan</name><sex>male</sex><job><name>software engineer<name><salary>10000</salary></job></user>...</users>我们通常的做法:通过w3c dom或jdom或sax等读取并解析xml,然后根据xml⼿⼯创建相应的对象,并初始化对象之间的关系(例如user和job两个对象对象之间的关系)通过使⽤commons digester:通过设置读取规则,digester按照xml和规则描述,⾃动实例化对象并初始化对象之间的关系。
Apache Commons CLI教程(2020年版)说明书
iAbout the T utorialThe Apache Commons CLI are the components of the Apache Commons which are derived from Java API and provides an API to parse command line arguments/options which are passed to the programs. This API also enables to print the help related to options available. This tutorial covers most of the topics required for a basic understanding of Apache Commons CLI and to get a feel of how it works.AudienceThis tutorial has been prepared for the beginners to help them understand the basic to advanced concepts related to the Apache Commons CLI.PrerequisitesBefore you start practicing various types of examples given in this reference, we assume that you are already aware about computer programs and computer programming languages.Copyright & DisclaimerCopyright 2020 by Tutorials Point (I) Pvt. Ltd.All the content and graphics published in this e-book are the property of Tutorials Point (I) Pvt. Ltd. The user of this e-book is prohibited to reuse, retain, copy, distribute or republish any contents or a part of contents of this e-book in any manner without written consent of the publisher.We strive to update the contents of our website and tutorials as timely and as precisely as possible, however, the contents may contain inaccuracies or errors. Tutorials Point (I) Pvt. Ltd. provides no guarantee regarding the accuracy, timeliness or completeness of our website or its contents including this tutorial. If you discover any errors on our website or inthistutorial,******************************************T able of ContentsAbout the Tutorial (i)Audience (i)Prerequisites (i)Copyright & Disclaimer (i)Table of Contents (ii)1.Apache Commons CLI — Overview (1)Definition Stage (1)Parsing Stage (1)Interrogation Stage (1)2.Apache Commons CLI — Environment Setup (3)Local Environment Setup (3)Path for Windows 2000/XP (3)Path for Windows 95/98/ME (3)Path for Linux, UNIX, Solaris, FreeBSD (3)Popular Java Editors (4)Download Common CLI Archive (4)Apache Common CLI Environment (4)CLASSPATH Variable (5)3.Apache Commons CLI — First Application (6)4.Apache Commons CLI — Option Properties (8)5.Apache Commons CLI — Boolean Option (10)6.Apache Commons CLI — Argument Option (12)7.Apache Commons CLI — Properties Option (14)8.Apache Commons CLI —Posix Parser (16)9.Apache Commons CLI — GNU Parser (18)10.Apache Commons CLI — Usage Example (20)11.Apache Commons CLI — Help Example (21)Apache Commons CLI The Apache Commons CLI are the components of the Apache Commons which are derived from Java API and provides an API to parse command line arguments/options which are passed to the programs. This API also enables to print help related to options available. Command line processing comprises of three stages. These stages are explained below: ∙Definition Stage ∙Parsing Stage ∙ Interrogation StageDefinition StageIn definition stage, we define the options that an application can take and act accordingly. Commons CLI provides Options class, which is a container for Option objects. Here we have added an option flag a , while false as second parameter, signifies that option is not mandatory and third parameter states the description of option. Parsing StageIn parsing stage, we parse the options passed using command line arguments after creating a parser instance.Interrogation StageIn Interrogation stage, we check if a particular option is present or not and then, process the command accordingly.1.Apache Commons CLI2.Apache Commons CLIIn this chapter, we will learn about the local environment setup of Apache Commons CLIand how to set up the path of Commons CLI for Windows 2000/XP, Windows 95/98/MEetc. We will also understand about some popular java editors and how to downloadCommons CLI archive.Local Environment SetupIf you are still willing to set up your environment for Java programming language, thenthis chapter will guide you on how to download and set up Java on your machine. Pleasefollow the steps mentioned below to set up the environment.Java SE is freely available from the link https:///java/technologies/oracle-java-archive-downloads.html. So you can download a version based on your operatingsystem.Follow the instructions to download Java and run the .exe to install Java on your machine.Once you have installed Java on your machine, you would need to set environmentvariables to point to correct installation directories.Path for Windows 2000/XPWe are assuming that you have installed Java in c:\Program Files\java\jdk directory.∙Right-click on 'My Computer' and select 'Properties'.∙Click on the 'Environment variables' button under the 'Advanced' tab.∙Now, alter the 'Path'variable, so that it also contains the path to the Java executable. Example, if the path is currently set to 'C:\WINDOWS\SYSTEM32',then change your path to read 'C:\WINDOWS\SYSTEM32;c:\ProgramFiles\java\jdk\bin'.Path for Windows 95/98/MEWe are assuming that you have installed Java in c:\Program Files\java\jdk directory.∙Edit the 'C:\autoexec.bat'file and add the following line at the end − 'SET PATH=%PATH%;C:\Program Files\java\jdk\bin'.Path for Linux, UNIX, Solaris, FreeBSDEnvironment variable PATH should be set to point, where the Java binaries have beeninstalled. Refer to your shell documentation, if you have trouble doing this.Example, if you use bash as your shell, then you would add the following line to the endof your '.bashrc: export PATH=/path/to/java:$PATH'Popular Java EditorsTo write your Java programs, you need a text editor. There are many sophisticated IDEs available in the market. But for now, you can consider one of the following: ∙Notepad− On Windows machine you can use any simple text editor like Notepad (Recommended for this tutorial), TextPad.∙Netbeans− It is a Java ID E that is open-source and free which can be downloaded from https:///index.html.∙Eclipse− It is also a Java IDE developed by the eclipse open-source community and can be downloaded from https:///.Download Common CLI ArchiveDownload the latest version of Apache Common CLI jar file from commons-cli-1.4-bin.zip. At the time of writing this tutorial, we have downloaded commons-cli-1.4-bin.zip and copied it into C:\>Apache folder.Apache Common CLI EnvironmentSet the APACHE_HOME environment variable to point to the base directory location where, Apache jar is stored on your machine. Assume that we have extracted commons-collections4-4.1-bin.zip in Apache folder on various Operating Systems as follows:CLASSP A TH V ariableSet the CLASSPATH environment variable to point to the Common CLI jar location. Assume that you have stored commons-cli-1.4.jar in Apache folder on various Operating Systems as follows:3.Apache Commons CLILet's create a sample console based application, whose purpose is to get either sum ofpassed numbers or multiplication of passed numbers based on the options used.Create a java class named CLITester.ExampleCLITester.javaApache Commons CLIOutputRun the file, while passing -a as option and numbers to get the sum of the numbers as result.Run the file, while passing -m as option and numbers to get the multiplication of the numbers as result.4.Apache Commons CLIOption object is used to represent the Option passed to command line program. Followingare various properties that an Option object possess.Apache Commons CLI5.Apache Commons CLIA boolean option is represented on a command line by its presence. For example, if optionis present, then its value is true, otherwise, it is considered as false. Consider the followingexample, where we are printing current date and if -t flag is present. Then, we will printtime too.ExampleCLITester.javaApache Commons CLIOutputRun the file without passing any option and see the result.Run the file, while passing -t as option and see the result.6.Apache Commons CLIAn Argument option is represented on a command line by its name and its correspondingvalue. For example, if option is present, then user has to pass its value. Consider thefollowing example, if we are printing logs to some file, for which, we want user to entername of the log file with the argument option logFile.ExampleCLITester.javaApache Commons CLIOutputRun the file, while passing --logFile as option, name of the file as value of the option andsee the result.7.Apache Commons CLIA Properties option is represented on a command line by its name and its correspondingproperties like syntax, which is similar to java properties file. Consider the followingexample, if we are passing options like -DrollNo=1 -Dclass=VI -Dname=Mahesh, weshould process each value as properties. Let's see the implementation logic in action.ExampleCLITester.javaApache Commons CLIOutputRun the file, while passing options as key value pairs and see the result.8.Apache Commons CLIA Posix parser is use to parse Posix like arguments passed. It is now deprecated and is replaced by DefaultParser.ExampleCLITester.javaApache Commons CLIOutputRun the file while passing -D -A as options and see the result.Run the file while passing --D as option and see the result.9.Apache Commons CLIA GNU parser is use to parse gnu like arguments passed. It is now deprecated and is replaced by DefaultParser.ExampleCLITester.javaApache Commons CLIOutputRun the file while passing -p -g -n 10 as option and see the result.Apache Commons CLI provides HelpFormatter class to print the usage guide of command line arguments. See the example given below:ExampleCLITester.javaOutputRun the file and see the result.Apache Commons CLI provides HelpFormatter class to print the help related to command line arguments. See the example.ExampleCLITester.javaOutputRun the file and see the result.Apache Commons CLI。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Apache Commons工具集简介分类:java2009-09-23 22:10 202人阅读评论(0) 收藏举报Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问/commons/index.HTMLBeanUtilsCommons-BeanUtils 提供对Java 反射和自省API的包装BetwixtBetwixt提供将JavaBean 映射至XML 文档,以及相反映射的服务. ChainChain 提供实现组织复杂的处理流程的“责任链模式”.CLICLI 提供针对命令行参数,选项,选项组,强制选项等的简单API.CodecCodec 包含一些通用的编码解码算法。
包括一些语音编码器,Hex, Base64, 以及URL encoder.CollectionsCommons-Collections 提供一个类包来扩展和增加标准的Java Collection框架ConfigurationCommons-Configuration 工具对各种各式的配置和参考文件提供读取帮助.Daemon一种unix-daemon-like java 代码的替代机制DBCPCommons-DBCP 提供数据库连接池服务DbUtilsDbUtils 是一个JDBC helper 类库,完成数据库任务的简单的资源清除代码.DigesterCommons-Digester 是一个XML-Java对象的映射工具,用于解析XML 配置文件.DiscoveryCommons-Discovery 提供工具来定位资源(包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。
.ELCommons-EL 提供在JSP2.0规范中定义的EL表达式的解释器.FileUploadFileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力HttpClientCommons-HttpClient 提供了可以工作于HTTP协议客户端的一个框架.IOIO 是一个I/O 工具集JellyJelly是一个基于XML 的脚本和处理引擎。
Jelly 借鉴了JSP 定指标签,Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。
Jelly 可以用在命令行,Ant 或者Servlet之中。
JexlJexl是一个表达式语言,通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言。
.JXPathCommons-JXPath 提供了使用Xpath语法操纵符合Java类命名规范的JavaBeans的工具。
也支持maps, DOM 和其他对象模型。
.LangCommons-Lang 提供了许多许多通用的工具类集,提供了一些ng中类的扩展功能LatkaCommons-Latka 是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试.LauncherLauncher 组件是一个交叉平台的Java 应用载入器。
Commons-launcher 消除了需要批处理或者Shell脚本来载入Java 类。
.原始的Java 类来自于Jakarta Tomcat 4.0 项目LoggingCommons-Logging 是一个各种logging API实现的包裹类.MathMath 是一个轻量的,自包含的数学和统计组件,解决了许多非常通用但没有及时出现在Java标准语言中的实践问题.ModelerCommons-Modeler 提供了建模兼容JMX规范的Mbean的机制.NetNet 是一个网络工具集,基于NetComponents 代码,包括FTP 客户端等等。
PoolCommons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现.PrimitivesCommons-Primitives提供了一个更小,更快和更易使用的对Java基本类型的支持。
当前主要是针对基本类型的collection。
.ValidatorThe commons-validator提供了一个简单的,可扩展的框架来在一个XML 文件中定义校验器(校验方法)和校验规则。
支持校验规则的和错误消息的国际化。
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。
我选了一些比较常用的项目做简单介绍。
文中用了很多网上现成的东西,我只是做了一个汇总整理。
Commons BeanUtils/commons/beanutils/index.html说明:针对Bean的一个工具集。
由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。
使用示例:功能有很多,网站上有详细介绍。
一个比较常用的功能是Bean Copy,也就是copy bean的属性。
如果做分层架构开发的话就会用到,比如从PO (Persistent Object)拷贝数据到VO(Value Object)。
传统方法如下://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//构造Teacher对象Teacher teacher=new Teacher();//赋值teacher.setName(teacherForm.getName());teacher.setAge(teacherForm.getAge());teacher.setGender(teacherForm.getGender());teacher.setMajor(teacherForm.getMajor());teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher对象到数据库HibernateDAO= ;HibernateDAO.save(teacher);使用BeanUtils后,代码就大大改观了,如下所示://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//构造Teacher对象Teacher teacher=new Teacher();//赋值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher对象到数据库HibernateDAO= ;HibernateDAO.save(teacher);Commons CLI/commons/cli/index.html说明:这是一个处理命令的工具。
比如main方法输入的string[]需要解析。
你可以预先定义好参数的规则,然后就可以调用CLI来解析。
使用示例:// create Options objectOptions options = new Options();// add t option, option is the command parameter, false indicates that// this parameter is not required.options.addOption(“t”, false, “display current time”);options.addOption("c", true, "country code");CommandLineParser parser = new PosixParser();CommandLine cmd = parser.parse( options, args);if(cmd.hasOption("t")) {// print the date and time}else {// print the date}// get c option valueString countryCode = cmd.getOptionValue("c");if(countryCode == null) {// print default date}else {// print date for country specified by countryCode}Commons Codec/commons/codec/index.html说明:这个工具是用来编码和解码的,包括Base64,URL,Soundx等等。
用这个工具的人应该很清楚这些,我就不多介绍了。
Commons Collections/commons/collections/说明:你可以把这个工具看成是java.util的扩展。
使用示例:举一个简单的例子OrderedMap map = new LinkedMap();map.put("FIVE", "5");map.put("SIX", "6");map.put("SEVEN", "7");map.firstKey(); // returns "FIVE"map.nextKey("FIVE"); // returns "SIX"map.nextKey("SIX"); // returns "SEVEN"Commons Configuration/commons/configuration/说明:这个工具是用来帮助处理配置文件的,支持很多种存储方式1. Properties files2. XML documents3. Property list files (.plist)4. JNDI5. JDBC Datasource6. System properties7. Applet parameters8. Servlet parameters使用示例:举一个Properties的简单例子# usergui.properties, definining the GUI,colors.background = #FFFFFFcolors.foreground = #000080window.width = 500window.height = 300PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");config.setProperty("colors.background", "#000000);config.save();config.save("usergui.backup.properties);//save a copyInteger integer = config.getInteger("window.width");Commons DBCP/commons/dbcp/说明:Database Connection pool, Tomcat就是用的这个,不用我多说了吧,要用的自己去网站上看说明。