`

常用的jar包总结(4)

    博客分类:
  • JAVA
阅读更多

最近用新的一套web框架做项目,有很多常用的包集成在里面。

这里总结一下:


每天总结三个



Commons-Discovery.jar:

使用Apache Commons 的 Discovery 工具包可以实现接口和实现的分离,包括JAR SPI规范的简单实现。
Discovery组件被用以查找可插拔接口的实现实例,它提供了一种通用的实例化这些实现的方式,而且可以管理单例(工厂)的生命周期。本质上来讲,就是定位那些实现了给定Java接口的类,并实例化。除此之外,Discovery还可以用以在给定的classpath中查找并加载资源文件。
Discovery组件在查找所有的实现类的时候需要预先将允许被查找的实现类配置到默认的配置文件中,默认的配置文件为:
/META-INF/services/<YOUR Interface whole name including pkg name>, Discovery将依次加载该文件中配置的允许加载的实现类。
另外接口和实现类的映射关系也可以在一个properties配置文件中定义,格式是:
XXX(接口类名)=XXXimpl(实现类名)
结合面向接口的编程方法,可以实现一个简单的面向服务的调用方式。

 

 

 ClassLoaders loaders   =
ClassLoaders.getAppLoaders(serviceClass, serviceClass.getClass(),  false );

DiscoverClass discover  =   new  DiscoverClass(loaders);


//  使用newInstance方式直接产生接口实现的实例

implInstance  =  (PublicService) discover.newInstance(serviceClass, defaultImpl);
//  也可以使用find的方式返回对应的实现类

implClass  =  discover.find(serviceClass, configFile, defaultImpl); 

/****
完整程序中使用了cglib的 net.sf.cglib.proxy.Enhancer 对返回的实现类进行了增强,可以实现一个简单的面向方面的程序结构:

**/

public     class   ServiceFinder {

private   static   final  String configFile  =   " services.properties " ;

private   static  Enhancer enhancer  =   new  Enhancer();
private  ServiceFinder() {
}

public   static  PublicService lookup(Class serviceClass) {

return  lookup(serviceClass,  null );
 }

public   static  PublicService lookup(Class serviceClass, String defaultImpl) {
//  创建一个类装入器的实例

ClassLoaders loaders  =

ClassLoaders.getAppLoaders(serviceClass, serviceClass.getClass(),  false );
DiscoverClass discover  =   new  DiscoverClass(loaders);

PublicService impl  =   null ;
try  {
Class implClass  =   null ;

//  用DiscoverClass的实例来查找实现类

if  (defaultImpl  ==   null   ||   "" .equals(defaultImpl)) {

     implClass  =  discover.find(serviceClass, PropertiyFile.load(configFile));
}  else  {

implClass  =  discover.find(serviceClass, configFile, defaultImpl);

}

enhancer.setSuperclass(implClass);
enhancer.setCallback( new  ServiceInterceptor(implClass.toString()));
impl  =  (PublicService) enhancer.create();

//  using DiscoverClass instance lookup the impelement
// impl = (PublicService) discover.newInstance(serviceClass, defaultImpl);
}  catch  (Exception ex) {

ex.printStackTrace();
throw   new  IllegalArgumentException( " 无法获取指定的服务项 " );
}
return  impl;
}
 

 

Commons-Pool.jar:(参考 )

ommons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以有效地减少处理对象池化时的工作量,为其它重要的工作留下更多的精力和时间。

恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。


PoolableObjectFactory、ObjectPool和ObjectPoolFactory
在Pool组件中,对象池化的工作被划分给了三类对象:
PoolableObjectFactory用于管理被池化的对象的产生、激活、挂起、校验和销毁;
ObjectPool用于管理要被池化的对象的借出和归还,并通知PoolableObjectFactory完成相应的工作;
ObjectPoolFactory则用于大量生成相同类型和设置的ObjectPool。
相应地,使用Pool组件的过程,也大体可以划分成“创立PoolableObjectFactory”、“使用ObjectPool”和可选的“利用ObjectPoolFactory”三种动作。

创立PoolableObjectFactory

Pool组件利用PoolableObjectFactory来照看被池化的对象。ObjectPool的实例在需要处理被池化的对象的产生、激活、挂起、校验和销毁工作时,就会调用跟它关联在一起的PoolableObjectFactory实例的相应方法来操作。
PoolableObjectFactory是在org.apache.commons.pool包中定义的一个接口。实际使用的时候需要利用这个接口的一个具体实现。Pool组件本身没有包含任何一种PoolableObjectFactory实现,需要根据情况自行创立。
创立PoolableObjectFactory的大体步骤是:
创建一个实现了PoolableObjectFactory接口的类。

import org.apache.commons.pool.PoolableObjectFactory;

public class PoolableObjectFactorySample

        implements PoolableObjectFactory {

    private static int counter = 0;


}
 



为这个类添加一个Object makeObject()方法。这个方法用于在必要时产生新的对象。

public Object makeObject() throws Exception {
    Object obj = String.valueOf(counter++);
    System.err.println("Making Object " + obj);
    return obj;
}
 



为这个类添加一个void activateObject(Object obj)方法。这个方法用于将对象“激活”――设置为适合开始使用的状态。

public void activateObject(Object obj) throws Exception {


    System.err.println("Activating Object " + obj);


}
 


为这个类添加一个void passivateObject(Object obj)方法。这个方法用于将对象“挂起”――设置为适合开始休眠的状态。
public void passivateObject(Object obj) throws Exception {
    System.err.println("Passivating Object " + obj);
}

为这个类添加一个boolean validateObject(Object obj)方法。这个方法用于校验一个具体的对象是否仍然有效,已失效的对象会被自动交给destroyObject方法销毁

public boolean validateObject(Object obj) {


    boolean result = (Math.random() > 0.5);


    System.err.println("Validating Object "


            + obj + " : " + result);


    return result;


}
 



为这个类添加一个void destroyObject(Object obj)方法。这个方法用于销毁被validateObject判定为已失效的对象。

public void destroyObject(Object obj) throws Exception {


    System.err.println("Destroying Object " + obj);


}
 



使用ObjectPool
有了合适的PoolableObjectFactory之后,便可以开始请出ObjectPool来与之同台演出了。
ObjectPool是在org.apache.commons.pool包中定义的一个接口,实际使用的时候也需要利用这个接口的一个具体实现。Pool组件本身包含了若干种现成的ObjectPool实现,可以直接利用。如果都不合用,也可以根据情况自行创建。具体的创建方法,可以参看Pool组件的文档和源码。
ObjectPool的使用方法类似这样:
生成一个要用的PoolableObjectFactory类的实例。

PoolableObjectFactory factory = new PoolableObjectFactorySample();
 



利用这个PoolableObjectFactory实例为参数,生成一个实现了ObjectPool接口的类(例如StackObjectPool)的实例,作为对象池。

ObjectPool pool = new StackObjectPool(factory);
 



需要从对象池中取出对象时,调用该对象池的Object borrowObject()方法。

Object obj = null;


obj = pool.borrowObject();
 



需要将对象放回对象池中时,调用该对象池的void returnObject(Object obj)方法。

pool.returnObject(obj);
 



当不再需要使用一个对象池时,调用该对象池的void close()方法,释放它所占据的资源。

pool.close();
 



这些操作都可能会抛出异常,需要另外处理。
另外,ObjectPool接口还定义了几个可以由具体的实现决定要不要支持的操作,包括:
void clear()
清除所有当前在此对象池中休眠的对象。
int getNumActive()
返回已经从此对象池中借出的对象的总数。
int getNumIdle()
返回当前在此对象池中休眠的对象的数目。
void setFactory(PoolableObjectFactory factory)
将当前对象池与参数中给定的PoolableObjectFactory相关联。如果在当前状态下,无法完成这一操作,会有一个IllegalStateException异常抛出。

利用ObjectPoolFactory
有时候,要在多处生成类型和设置都相同的ObjectPool。如果在每个地方都重写一次调用相应构造方法的代码,不但比较麻烦,而且日后修改起来,也有所不便。这种时候,正是使用ObjectPoolFactory的时机。
ObjectPoolFactory是一个在org.apache.commons.pool中定义的接口,它定义了一个称为ObjectPool createPool()方法,可以用于大量生产类型和设置都相同的ObjectPool。
Pool组件中,对每一个ObjectPool实现,都有一个对应的ObjectPoolFactory实现。它们相互之间,有一一对应的参数相同的构造方法。使用的时候,只要先用想要的参数和想用的ObjectPoolFactory实例,构造出一个ObjectPoolFactory对象,然后在需要生成ObjectPool的地方,调用这个对象的createPool()方法就可以了。日后无论想要调整所用ObjectPool的参数还是类型,只需要修改这一处,就可以大功告成了。

import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.ObjectPoolFactory;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.StackObjectPoolFactory;
public class ObjectPoolFactorySample {
    public static void main(String[] args) {
        Object obj = null;
        PoolableObjectFactory factory
                = new PoolableObjectFactorySample();
        ObjectPoolFactory poolFactory
                = new StackObjectPoolFactory(factory);
        ObjectPool pool = poolFactory.createPool();
        try {
            for(long i = 0; i < 100 ; i++) {
                System.out.println("== " + i + " ==");
                obj = pool.borrowObject();
                System.out.println(obj);
                pool.returnObject(obj);
            }
            obj = null;
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try{
                if (obj != null) {
                    pool.returnObject(obj);
                }
                pool.close();
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

 

 

 

Commons-FileUpload.jar:

FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力。

上传文件到指定的目录。

上传文件到指定的目录,并限定文件大小。

 

利用 Servlet 来实现文件上传。(参考 )

servlet

package com.zj.sample;
 
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
@SuppressWarnings("serial")
public class Upload extends HttpServlet {
    private String uploadPath = "D:\\temp"; // 上传文件的目录
    private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录
    File tempPathFile;
 
    @SuppressWarnings("unchecked")
    public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws IOException, ServletException {
       try {
           // Create a factory for disk-based file items
           DiskFileItemFactory factory = new DiskFileItemFactory();
 
           // Set factory constraints
           factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
           factory.setRepository(tempPathFile);// 设置缓冲区目录
 
           // Create a new file upload handler
           ServletFileUpload upload = new ServletFileUpload(factory);
 
           // Set overall request size constraint
           upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
 
           List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
           Iterator<FileItem> i = items.iterator();
           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);
              }
           }
           System.out.print("upload succeed");
       } catch (Exception e) {
           // 可以跳转出错页面
           e.printStackTrace();
       }
    }
 
    public void init() throws ServletException {
       File uploadFile = new File(uploadPath);
       if (!uploadFile.exists()) {
           uploadFile.mkdirs();
       }
       File tempPathFile = new File(tempPath);
        if (!tempPathFile.exists()) {
           tempPathFile.mkdirs();
       }
    }
}

 

html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>File upload</title>
</head>
<body>
// action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置.
    <form name="myform" action="fileupload" method="post"
       enctype="multipart/form-data">
       File:<br>
       <input type="file" name="myfile"><br>
       <br>
       <input type="submit" name="submit" value="Commit">
    </form>
</body>
</html>

 web.xml

<servlet>
    <servlet-name>Upload</servlet-name>
    <servlet-class>com.zj.sample.Upload</servlet-class>
</servlet>
 
<servlet-mapping>
    <servlet-name>Upload</servlet-name>
    <url-pattern>/fileupload</url-pattern>
</servlet-mapping>
 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    maven本地仓库(常用Jar包)

    "maven常用Jar包"指的是在Java开发中频繁使用的第三方库,例如Spring框架、Hibernate ORM、Apache Commons系列库、JSON解析库如Jackson或Gson,以及测试框架JUnit等。这些库已经被广泛地接受并应用在各种项目中,...

    微信开发jar包

    微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用...

    SSH常用Jar包

    总结来说,SSH框架的常用Jar包涵盖了Web开发的多个方面,从控制层(Struts2)到业务层(Spring)再到数据访问层(Hibernate),为开发者提供了一整套完善的解决方案。理解并熟练运用这些Jar包,将有助于提升开发效率...

    spring4.3.9版本jar包及开发常用jar包

    在本知识点中,我们将深入探讨Spring 4.3.9版本以及与其相关的开发常用jar包,特别是日志jar包在Spring框架搭建和测试中的作用。 首先,Spring框架的核心jar包包括`spring-core.jar`、`spring-beans.jar`、`spring-...

    Java开发常用jar包

    总结来说,这个“Java开发常用jar包”资源集成了Java开发中必不可少的工具和库,涵盖了项目管理、数据交换、数据库连接、NoSQL支持以及Web框架等多个方面,为Java开发者提供了一站式的开发支持。使用这些库,开发者...

    android常用jar包

    "android常用jar包"这个主题涵盖了几个重要的库,包括处理JSON数据的库、XML解析库以及一个UI组件库。让我们详细了解一下这些jar包及其在Android开发中的作用。 首先,我们来看`json-jar.zip`。这通常指的是一个...

    web开发常用jar包

    总结,`jar`包在Web开发中扮演着核心角色,提供了一种高效、便捷的方式来管理和使用代码资源。无论是基础的API库,还是复杂的框架和第三方库,`jar`包都是构建Web应用的基础。通过理解`jar`包的工作原理和使用方式,...

    java开发常用jar包之sqlserver.rar

    本知识点将深入探讨Java与SQL Server交互的关键技术和相关jar包。 首先,为了在Java程序中与SQL Server数据库进行通信,我们需要使用JDBC(Java Database Connectivity)驱动。JDBC是Java平台中用于访问数据库的...

    exe4j打包(包含第三方jar包)

    以下是我个人总结的打包流程,包括如何处理项目中的第三方jar包,确保程序运行时能够正确加载所有依赖。 **步骤一:安装exe4j** 首先,我们需要下载并安装exe4j。exe4j的安装包可以在其官方网站获取。安装过程中...

    Struts 2常用jar包

    总结来说,"Struts 2常用jar包"是构建基于Struts 2的Web应用所必需的类库,它们协同工作,为开发者提供了强大的MVC框架支持,包括请求处理、数据绑定、视图渲染以及丰富的客户端交互能力。正确理解和使用这些库,...

    junit4 jar包

    总结一下,"junit4 jar包"是Java开发中不可或缺的一部分,它提供了一套完善的单元测试工具和API,帮助开发者确保代码的质量和稳定性。通过`junit-4.11.jar`和`hamcrest-core-1.3.jar`这两个关键库,我们可以编写出...

    一些常用的java jar包

    总结来说,Java JAR包在Android SSH环境下扮演了重要角色,提供了实现远程控制、自动化任务和安全通信的能力。开发者应熟悉如何正确使用和管理JAR包,以优化项目结构,提升应用性能,并确保安全性。

    一般常用的jar包总结

    "一般常用的jar包总结"这个主题旨在概述那些在Java应用开发中频繁使用的JAR库。这些库为开发者提供了丰富的功能,减少了重复工作,提高了开发效率。 1. **Apache Commons**: - Apache Commons是Apache软件基金会...

    spark相关jar包

    总结来说,"spark相关jar包"涵盖了Spark框架的各个组件以及它们所需的依赖,理解这些jar包的作用和使用方法对于成功部署和运行Spark应用程序至关重要。开发者需要根据具体项目需求,选择并管理好相应的jar包,确保...

    java连接数据库常用jar包

    总结来说,Java连接三大数据库——MySQL、Oracle和SQL Server,需要分别使用`mysql-connector-java.jar`、`ojdbc.jar`系列和`sqljdbc4.jar`系列的jar包。这些驱动实现了JDBC接口,使得Java程序能够遵循统一的JDBC...

    JAVA中常用的jar包

    总结起来,"JAVA中常用的jar包"涵盖了从提高JSP开发效率的标准标签库JSTL,到数据库连接的JDBC驱动,以及众多的第三方库。理解并熟练使用这些JAR包对于任何Java开发者来说都是至关重要的,它们能帮助我们编写更简洁...

    jar包1jar包1jar包1jar包1jar包1

    【描述】: "jar包1jar包1jar包1jar包1jar包1jar包1jar包1" 这段描述可能是在描述JAR文件在项目开发中的频繁应用,或者可能是在指出一个特定的JAR文件——"jar包1"在系统中扮演的关键角色。JAR文件通常包含运行Java...

    jar包jar包jar包jar包jar包

    总结来说,JAR文件是Java生态系统中不可或缺的一部分,它们简化了代码的分发和执行,同时也为复杂的应用场景提供了灵活的支持。理解和掌握JAR文件的原理和使用,对于任何Java开发者都是至关重要的。

    JSONObject相关jar包和maven管理jar包

    **标题解析:** 标题"JSONObject相关jar包和maven管理jar包"暗示了我们...总结,这个主题涵盖了JSON数据处理的基本概念、JSONObject库的使用,以及Java项目中依赖管理的实践,尤其是通过Maven进行jar包的自动化管理。

    Maven引入本地Jar包并打包进War包中的方法

    "Maven引入本地Jar包并打包进War包中的方法" Maven是一种流行的项目管理工具,主要用于Java项目的构建、测试和部署。在实际开发中,我们经常需要引入本地Jar包以满足项目的需求。本文将介绍Maven引入本地Jar包并...

Global site tag (gtag.js) - Google Analytics