Apache Commons
包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。我选了一些比较常用的项目做简单介绍。文中用了很多网上现成的东西,我只是做了一个汇总整理。
Commons BeanUtils
http://jakarta.apache.org/commons/beanutils/index.html
说明:针对
Bean
的一个工具集。由于
Bean
往往是有一堆
get
和
set
组成,所以
BeanUtils
也是在此基础上进行一些包装。
使用示例:功能有很多,网站上有详细介绍。一个比较常用的功能是
Bean Copy
,也就是
copy bean
的属性。如果做分层架构开发的话就会用到,比如从
PO
(
Persistent Object
)拷贝数据到
VO
(
Value Object
)。
传统方法如下:
//
得到
TeacherForm
TeacherForm 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
后,代码就大大改观了,如下所示:
//
得到
TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//
构造
Teacher
对象
Teacher teacher=new Teacher();
//
赋值
BeanUtils.copyProperties(teacher,teacherForm);
//
持久化
Teacher
对象到数据库
HibernateDAO= ;
HibernateDAO.save(teacher);
Commons CLI
http://jakarta.apache.org/commons/cli/index.html
说明:这是一个处理命令的工具。比如
main
方法输入的
string[]
需要解析。你可以预先定义好参数的规则,然后就可以调用
CLI
来解析。
使用示例:
// create Options object
Options 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 value
String countryCode = cmd.getOptionValue("c");
if(countryCode == null) {
// print default date
}
else {
// print date for country specified by countryCode
}
Commons Codec
http://jakarta.apache.org/commons/codec/index.html
说明:这个工具是用来编码和解码的,包括
Base64
,
URL
,
Soundx
等等。用这个工具的人应该很清楚这些,我就不多介绍了。
Commons Collections
http://jakarta.apache.org/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
http://jakarta.apache.org/commons/configuration/
说明:这个工具是用来帮助处理配置文件的,支持很多种存储方式
<[if !supportLists]>
1. <[endif]>
Properties files
<[if !supportLists]>
2. <[endif]>
XML documents
<[if !supportLists]>
3. <[endif]>
Property list files (.plist)
<[if !supportLists]>
4. <[endif]>
JNDI
<[if !supportLists]>
5. <[endif]>
JDBC Datasource
<[if !supportLists]>
6. <[endif]>
System properties
<[if !supportLists]>
7. <[endif]>
Applet parameters
<[if !supportLists]>
8. <[endif]>
Servlet parameters
使用示例:举一个
Properties
的简单例子
# usergui.properties, definining the GUI,
colors.background = #FFFFFF
colors.foreground = #000080
window.width = 500
window.height = 300
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setProperty("colors.background", "#000000);
config.save();
config.save("usergui.backup.properties);//save a copy
Integer integer = config.getInteger("window.width");
Commons DBCP
http://jakarta.apache.org/commons/dbcp/
说明:
Database Connection pool, Tomcat
就是用的这个,不用我多说了吧,要用的自己去网站上看说明。
Commons DbUtils
http://jakarta.apache.org/commons/dbutils/
说明:我以前在写数据库程序的时候,往往把数据库操作单独做一个包。
DbUtils
就是这样一个工具,以后开发不用再重复这样的工作了。值得一体的是,这个工具并不是现在流行的
OR-Mapping
工具(比如
Hibernate
),只是简化数据库操作,比如
QueryRunner run = new QueryRunner(dataSource);
// Execute the query and get the results back from the handler
Object[] result = (Object[]) run.query(
"SELECT * FROM Person WHERE name=?", "John Doe");
Commons FileUpload
http://jakarta.apache.org/commons/fileupload/
说明:
jsp
的上传文件功能怎么做呢?
使用示例:
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item);
}
}
Commons HttpClient
http://jakarta.apache.org/commons/httpclient/
说明:这个工具可以方便通过编程的方式去访问网站。
使用示例:最简单的
Get
操作
GetMethod get = new GetMethod("http://jakarta.apache.org");
// execute method and handle any error responses.
...
InputStream in = get.getResponseBodyAsStream();
// Process the data from the input stream.
get.releaseConnection();
Commons IO
http://jakarta.apache.org/commons/io/
说明:可以看成是
java.io
的扩展,我觉得用起来非常方便。
使用示例:
1
.读取
Stream
标准代码:
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
InputStreamReader inR = new InputStreamReader( in );
BufferedReader buf = new BufferedReader( inR );
String line;
while ( ( line = buf.readLine() ) != null ) {
System.out.println( line );
}
} finally {
in.close();
}
使用
IOUtils
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}
2
.读取文件
File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");
3
.察看剩余空间
long freeSpace = FileSystemUtils.freeSpace("C:/");
Commons JXPath
http://jakarta.apache.org/commons/jxpath/
说明:
Xpath
你知道吧,那么
JXpath
就是基于
Java
对象的
Xpath
,也就是用
Xpath
对
Java
对象进行查询。这个东西还是很有想像力的。
使用示例:
Address address = (Address)JXPathContext.newContext(vendor).
getValue("locations[address/zipCode='90210']/address");
上述代码等同于
Address address = null;
Collection locations = vendor.getLocations();
Iterator it = locations.iterator();
while (it.hasNext()){
Location location = (Location)it.next();
String zipCode = location.getAddress().getZipCode();
if (zipCode.equals("90210")){
address = location.getAddress();
break;
}
}
Commons Lang
http://jakarta.apache.org/commons/lang/
说明:这个工具包可以看成是对
java.lang
的扩展。提供了诸如
StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils
等工具类。
Commons Logging
http://jakarta.apache.org/commons/logging/
说明:你知道
Log4j
吗?
Commons Math
http://jakarta.apache.org/commons/math/
说明:看名字你就应该知道这个包是用来干嘛的了吧。这个包提供的功能有些和
Commons Lang
重复了,但是这个包更专注于做数学工具,功能更强大。
Commons Net
http://jakarta.apache.org/commons/net/
说明:这个包还是很实用的,封装了很多网络协议。
<[if !supportLists]>
1. <[endif]>
FTP
<[if !supportLists]>
2. <[endif]>
NNTP
<[if !supportLists]>
3. <[endif]>
SMTP
<[if !supportLists]>
4. <[endif]>
POP3
<[if !supportLists]>
5. <[endif]>
Telnet
<[if !supportLists]>
6. <[endif]>
TFTP
<[if !supportLists]>
7. <[endif]>
Finger
<[if !supportLists]>
8. <[endif]>
Whois
<[if !supportLists]>
9. <[endif]>
rexec/rcmd/rlogin
<[if !supportLists]>
10. <[endif]>
Time (rdate) and Daytime
<[if !supportLists]>
11. <[endif]>
Echo
<[if !supportLists]>
12. <[endif]>
Discard
<[if !supportLists]>
13. <[endif]>
NTP/SNTP
使用示例:
TelnetClient telnet = new TelnetClient();
telnet.connect( "192.168.1.99", 23 );
InputStream in = telnet.getInputStream();
PrintStream out = new PrintStream( telnet.getOutputStream() );
...
telnet.close();
Commons Validator
http://jakarta.apache.org/commons/validator/
说明:用来帮助进行验证的工具。比如验证
Email
字符串,日期字符串等是否合法。
使用示例:
// Get the Date validator
DateValidator validator = DateValidator.getInstance();
// Validate/Convert the date
Date fooDate = validator.validate(fooString, "dd/MM/yyyy");
if (fooDate == null) {
// error...not a valid date
return;
}
Commons Virtual File System
http://jakarta.apache.org/commons/vfs/
说明:提供对各种资源的访问接口。支持的资源类型包括
<[if !supportLists]>
1. <[endif]>
CIFS
<[if !supportLists]>
2. <[endif]>
FTP
<[if !supportLists]>
3. <[endif]>
Local Files
<[if !supportLists]>
4. <[endif]>
HTTP and HTTPS
<[if !supportLists]>
5. <[endif]>
SFTP
<[if !supportLists]>
6. <[endif]>
Temporary Files
<[if !supportLists]>
7. <[endif]>
WebDAV
<[if !supportLists]>
8. <[endif]>
Zip, Jar and Tar (uncompressed, tgz or tbz2)
<[if !supportLists]>
9. <[endif]>
gzip and bzip2
<[if !supportLists]>
10. <[endif]>
res
<[if !supportLists]>
11. <[endif]>
ram
这个包的功能很强大,极大的简化了程序对资源的访问。
使用示例:
从
jar
中读取文件
// Locate the Jar file
FileSystemManager fsManager = VFS.getManager();
FileObject jarFile = fsManager.resolveFile( "jar:lib/aJarFile.jar" );
// List the children of the Jar file
FileObject[] children = jarFile.getChildren();
System.out.println( "Children of " + jarFile.getName().getURI() );
for ( int i = 0; i < children.length; i++ )
{
System.out.println( children[ i ].getName().getBaseName() );
}
从
smb
读取文件
StaticUserAuthenticator auth = new StaticUserAuthenticator("username", "password", null);
FileSystemOptions opts = new FileSystemOptions();
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile("smb://host/anyshare/dir", opts);
有人说
Apache
就像是丐帮,里面的项目多而杂。的确如此,
Apache
的项目水平参差不齐,而且不同的项目之间也常常会有功能重叠,甚至有撞车,比如
Ant
和
Maven
。不过
Apache
的优秀项目还是有很多的,比如
Apache Http Server
,
Tomcat
,
Ant, Geronimo
等等。
Apache Commons
是工具包,为其他项目提供支持,很多
Commons
中的项目就是从其他项目中抽取出来的。希望我的介绍能对你有所帮助,有些我提到的
Commons
中的项目我也没有用过,只是现学现卖,难免错误和疏漏,希望谅解。