Java利器Jakarta CommonsJakarta Commons是Jakarta的一个子项目,目的是创建和维护独立于其他框架和产品的
Java利器Jakarta Commons
Jakarta Commons是Jakarta的一个子项目,目的是创建和维护独立于其他框架和产品的程序包(packages)。这些程序包是一些服务于小范围的有效组件的集合,通常适用于服务器端编程。
Commons项目分为两部分:Sandbox和Commons库。Sandbox用于测试。本文关注库组件,包括它们什么时候使用,在那里,以及用例子说明如何使用。
简要介绍
Jakarta Commons项目源于重用,其中的程序包必须确保能够重用。有一些包来自于其他项目,例如通用日志包是Jakarta Struts的一部分。当开发者发现某个包对于其他项目很有用,可以缩短开发周期,他们决定将这些包做成通用组件。这就是Jakarta Commons项目。
要真正做到可重用,每个程序包必须独立于其他较大的框架和项目。因此,Commons项目中的每个包在很大程度上是独立的,不仅相对于其他项目,甚至对于其他包也是如此。违反这一原则的情况是存在的,但决大多数情况是使用成熟的APIs。例如,Betwixt包建立在XML APIs基础之上。尽管这个项目的本意是建立不依赖其他组件的程序包。
大多数程序包十分简洁,以至于缺少必要的文档、维护和帮助。有些包甚至只有错误的连接和极少的文档。大多数情况下,你只能自己摸索如何使用它们,为什么使用它们。希望这篇文章对你有帮助。
注意:Jakarta Commons与Apache Commons是不同的。后者是Apache Software Foundation(ASF)的顶级项目。而前者是ASF的另一个顶级项目Jakarta的子项目,是本文介绍的对象。而且,Jakarta Commons只使用Java。在本文中Commons指的是Jakarta Commons。
组件
为了组织方便,我将18个(包括EL,Latka和Jexl)Commons组件分为五类。如下:
组件类别
组件
Web相关
FileUpload,HTTPClient和Net
XML相关
Betwixt,Digester,Jelly和JXPath
工具
BeanUtils,Logging,DBCP,Pool和 Validator
打包
Codec 和 Modeler
小程序
CLI,Discovery,Lang和 Collections
要注意的是这个分类只是对本文而言,在Commons项目中是不存在的。在某种程度上分类是重叠的。本文将介绍Web相关和小程序类,下篇文章包括XML相关和打包类,工具类在最后一篇文章中。
?
运行以上代码(DiscoveryDemo.java)将得到MyInterface文件中注册的类,如下所示。再次提醒,如果实现包含在一个包结构内,文件名必须做相应的修改。如果这个文件不在规定目录下,或实现类不能实例化或定位,将抛出DiscoveryException异常,表明找不到MyInterface的实现。
MyImpl2 # Implementation 2
当然,这不是注册实现的唯一方法,否则Discovery还有什么用!事实上,这是Discovery发现类的内部机制的最后一步。其他方法包括在系统属性或用户属性中定义实现类的名字。例如,删除META-INF/services目录下的文件,按以下输入运行demo,结果相同。这里系统属性是接口名,而值是接口实现提供者。
java -DMyInterface=MyImpl1 DiscoveryDemo
Discovery也可用于创建(单例)服务提供者的实例并调用它们的函数。如下:
((MyInterface)discover.newInstance(MyInterface.class)).myMethod();
注意此时我们并不知道那个服务提供者实现myMethod函数,我们也不关心。这个函数的实现取决于以何种方式运行以上代码以及注册的服务提供者。
method="post" enctype="multipart/form-data">
Specify your name:<br />
<input type="text" name="name" size="15"/><br />
Specify your Image:<br />
<input type="file" name="myimage"><br/>
Specify your file&:<br />
<input type="file" name="myfile"><br /><br />
<input type="submit" name="Submit" value="Submit your files"/>
</form>
2.创建JSP页。
a.检查输入请求是不是多段数据。
boolean isMultipart = FileUpload.isMultipartContent(request);
b.创建请求处理器,解析请求,结果存于一个list中。
DiskFileUpload upload = new DiskFileUpload();
List items = upload.parseRequest(request);
c.遍历这个list访问每个单独的文件项。用isFormField()函数区分上传文件和常规类型域。根据需要,可以逐字节的读取上传的文件,或者使用输入流。
Iterator itr = items.iterator();
while(itr.hasNext()) {
FileItem item = (FileItem) itr.next();
// check if the current item is a form field or an uploaded file
if(item.isFormField()) {
// get the name of the field
String fieldName = item.getFieldName();
// if it is name, we can set it in request to thank the user
if(fieldName.equals("name"))
request.setAttribute("msg", "Thank You: " + item.getString());
} else {
// the item must be an uploaded file save it to disk. Note that there
// seems to be a bug in item.getName() as it returns the full path on
// the client's machine for the uploaded file name, instead of the file
// name only. To overcome that, I have used a workaround using
// fullFile.getName().
File fullFile = new File(item.getName());
File savedFile = new File(getServletContext().getRealPath("/"),
fullFile.getName());
item.write(savedFile);
}
}
可以在上传处理器中用upload.setSizeMax限制上传文件的最大尺寸,当上传文件大小超过该尺寸将会抛出异常。上例中,若将该尺寸设为-1,就可以上传任何大小的文件。
这个例子还可以有一个小变化。想上面提到的,可以使用输入流上传文件。过程是将上传的内容驻留在内存中直到某一阈值,取得内容的类型,把它们存为字符串或字节数组,最后从内存中删除。FileItem中函数完成了该过程(DefaultFileItem是它的实现)。
作者:matrix开源技术-West2snow出处:yesky责任编辑: 方舟 [ 2003-09-25 09:19 ]Jakarta Commons是Jakarta的一个子项目,目的是创建和维护独立于其他框架和产品的程序包
二.HttpClient 概要:扩展java.net包,提供类似浏览器的功能。
在那得到:主页,程序,源代码。源代码和程序为beta1版。
何时使用:当要实现Web浏览器时,或你的程序需要有效的控制HTTP/HTTPS连接时。
例子程序:HttpClientDemo.java。需要将commons-httpclient.jar和common-logging.jar加入CLASSPATH中,JDK为1.4或更高版本。
描述:HttpClient是java.net的扩展程序包,它提供许多函数帮助你创建基于HTTP协议的各种分布式应用或者嵌入应用程序处理HTTP操作。这个库提供比Commons的其他包更详细的文档,并附带很多例子。这里将讲解怎样开发一个提取Web网页的程序。HttpClient附带的文档中有一个类似的例子,我将扩展它使它支持SSL。注意这个例子必须运行于JDK 1.4或更高版本上,因为它需要JDK1.4中的Java Secure Socket Connection库。
1.找一个可以通过HTTPS下载的网页,例如https://www.paypal.com/。确保文件%JAVA_HOME%/jre/lib/security/java.security有类似如下的一行:
security.provider.2=com.sun.net.ssl.internal.ssl.Provider
这样,至少在你的程序中处理HTTPS连接的方式是没有区别的。如果远端的站点需要验证,那么你必须做相应的配置。
2.创建HttpClient类的一个实例,所有的函数都将用到它。这个类包含一个连接管理器操作实际的连接。HttpConnectionManager接口允许你创建自己的管理器,否则可以使用内建的SimpleHttpConnectionManager或MultiThreadedHttpConnectionManager。如果无参数创建HttpClient,那么默认连接管理器为SimpleHttpConnectionManager。
HttpClient client = new HttpClient();
3.创建一个method实例,用来定义使用那种HTTP方法与远端站点传递信息,可以选择的方法有GET, POST, PUT, DELETE, HEAD, OPTIONS和TRACE。这些method类是HttpMethod接口的不同实现。在这个例子中使用GetMethod,创建时将要GET的URL作为参数。
HttpMethod method = new GetMethod(url);
4.连接这个URL,也就是用刚才定义的方法连接URL。这个方法将返回server返回的状态码。注意executeMethod是client的函数而不是method的。
statusCode = client.executeMethod(method);
5.读取服务器的返回。如果连接失败,将抛出HttpException或IOException异常。IOException异常说明是网络出了问题,重试也不会成功。返回值可以字节数组﹑输入流或字符串的格式读取。这样,就可以随意处理输入了。
byte[] responseBody = method.getResponseBody();
6.最后,释放连接,使之在需要时可重用。
method.releaseConnection();
这时一个关于HttpClient库的很粗略的介绍,它还有很多功能,十分健壮。
三.Net 概要:基本Internet协议的底层API。
在那得到:主页,程序,源代码。
何时使用:当在Java应用程序中需要Internet协议的底层互连时。
例子程序:NetDemo.java。需要将commons-net-1.0.0.jar加入CLASSPATH中。
描述:Net包是很多健壮的和专业的类的集合。这些类来自于一个叫做NetComponents的商业产品的一部分。
Net包中的类既提供对协议的底层访问也有高层的抽象。在大多数情况下,抽象是足够的,它可以使你不必编写解析各种协议的底层套接字的代码。使用抽象不会损失任何功能。
SocketClient是所有协议的基类,它是一个抽象类包含所有协议的共同功能。各种协议的使用方法是很相近的:首先使用connect方法建立与远端服务器的连接,执行服务,最后断开连接。让我们通过例子来看:
1.创建一个client。我们将使用一个NNTPClient从新闻服务器上下载新闻组列表。
client = new NNTPClient();
2.连接服务器,我用的是新闻组列表较短的服务器。
client.connect("aurelia.deine.net");
3.提取新闻组列表。如下的命令返回NewsGroupInfo数组。如果服务器上没有新闻组则数组为空,出错则返回null。注意当新闻组列表很大时,这个命令会花很长时间。每个NewsGroupInfo对象包含关于新闻组的详细信息,有公用函数可以解析它们(如文章数,最后发表的文章,发表权限等)。
list = client.listNewsgroups();
4.最后,断开与服务器的连接。
if (client.isConnected())
client.disconnect();
其余的client如FingerClient, POP3Client, TelnetClient等用法相似。