`

常用的jar包总结(3)

    博客分类:
  • JAVA
阅读更多

 

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

这里总结一下:


 

每天总结三个

commons-dbutil.jar:

对传统操作数据库的类进行二次封装,可以把结果集转化成 List

 

(1)org.apache.commons.dbutils

 

DbUtils  : 提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类

 

QueryRunner : 该类简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

 

QueryLoader : 属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。

 

(2)org.apache.commons.dbutils.handlers

 

ArrayHandler :将ResultSet中第一行的数据转化成对象数组 ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]

 

BeanHandler :将ResultSet中第一行的数据转化成类对象

 

BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象

 

ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象

 

KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据

 

MapHandler :将ResultSet中第一行的数据存成Map映射

 

MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map

 

ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object

 

(3)org.apache.commons.dbutils.wrappers

 

SqlNullCheckedResultSet :该类是用来对sql语句执行完成之后的的数值进行null的替换。

 

StringTrimmedResultSet :去除ResultSet中中字段的左右空格。Trim()

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
public class DbutilsJDBCTest{
    public static void main(String[] args) {
        Connection conn = null;
        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
        String jdbcDriver = "com.mysql.jdbc.Driver";
        try {
            DbUtils.loadDriver(jdbcDriver);
            // Username "root". Password "root"
            conn = DriverManager.getConnection(jdbcURL, "root", "root");
            QueryRunner qRunner = new QueryRunner();
            System.out.println("***Using MapListHandler***");
            //以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理
            List lMap = (List) qRunner.query(conn,
                    "select title,authors  from books", new MapListHandler());
            //以下是处理代码,可以抽取出来
System.out.println("title ------------- authors ");
                for (int i = 0; i < lMap.size(); i++) {
                        Map vals = (Map) lMap.get(i);
                        System.out.println(vals.get("title")+"-------------"+ vals.get("authors"));
                }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
    }
}
/**
上例在处理结果集时,它把数据库中的每一行映射成一个Map,其中列名作为Key,该列对应的值作为Value存放,
查询的所有的数据一起放在一个List里,然后进行处理,当然,一个更明智的处理是直接返回List然后再单独进行处理。
事实上上例返回的结果集中的每一行不必放在一个Map里,你可以放在一个Bean里,

如果使用Bean而不是用Map,那么,你也许需要建立一个Bean,如下:
**/
package cn.qtone.test;
public class Book {
    public int id;
    public String title;
    public String authors ;
    public StudentBean() {
    }
    public String getAuthors() {
        return authors;
    }
    public void setAuthors(String authors) {
        this.authors = authors;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}
/**
然后简单修改一下DbutilsJDBCTest 中的部分代码即可,代替之后的源代码如下:
**/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class DbutilsJDBCTest{
    public static void main(String[] args) {
        Connection conn = null;
        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
        String jdbcDriver = "com.mysql.jdbc.Driver";
        try {
            DbUtils.loadDriver(jdbcDriver);
            // Username "root". Password "root"
            conn = DriverManager.getConnection(jdbcURL, "root", "root");
            QueryRunner qRunner = new QueryRunner();
            System.out.println("***Using BeanListHandler ***");
            //以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理
List lBeans = (List) qRunner.query(conn," select title,authors from books ", new BeanListHandler(Book.class));
    //以下是处理代码,可以抽取出来
System.out.println("title ------------- authors ");
    for (int i = 0; i < lBeans.size(); i++) {
            Book vals = (Book) lBeans.get(i);    
          System.out.println(vals.getTitle ()+"-------------"+ vals. getAuthors ());
                }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
    }
}
/**
采用Map的方式即第一种方式性能要好的多,采用Bean性能比较低可能是因为采用反射的缘故,
采用反射的东东性能和不采用反射的还是有点差距。
**/

 

 

 

 

commons-mail.jar:

是对 JavaMail进行封装从而简化其操作,
功能:简单文本邮件、带附件的邮件、HTML格式的邮件
代码说明:

 

// 简单文本邮件
    SimpleEmail email = new SimpleEmail();
    email.setHostName("mail.fastunit.com");
    email.setAuthentication("support@fastunit.com", "***");//邮件服务器验证:用户名/密码
    email.setCharset("UTF-8");// 必须放在前面,否则乱码
    email.addTo("fastunit.com@hotmail.com");
    email.setFrom("support@fastunit.com", "support");
    email.setSubject("subject中文");
    email.setMsg("msg中文");
    email.send();

// 带附件的邮件
    MultiPartEmail email = new MultiPartEmail();
    email.setHostName("mail.fastunit.com");
    email.setAuthentication("support@fastunit.com", "***");
    email.setCharset("UTF-8");
    email.addTo("fastunit.com@hotmail.com");
    email.setFrom("support@fastunit.com", "support");
    email.setSubject("subject中文");
    email.setMsg("msg中文");
    
    EmailAttachment attachment = new EmailAttachment();
    attachment.setPath("d:/a.gif");// 本地文件
    // attachment.setURL(new URL("http://xxx/a.gif"));//远程文件
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    attachment.setDescription("a");
    attachment.setName("a");
    
    email.attach(attachment);
    email.send();

// HTML格式邮件
    HtmlEmail email = new HtmlEmail();
    email.setHostName("mail.fastunit.com");
    email.setAuthentication("support@fastunit.com", "***");
    email.setCharset("UTF-8");
    email.addTo("fastunit.com@hotmail.com");
    email.setFrom("support@fastunit.com", "support");
    email.setSubject("subject中文");
    email.setHtmlMsg("<b>msg中文</b>");
    email.send();
/****
一些问题:首先是jar包的问题,因为不是只下载commons-mail的jar包,
如果是jdk1.5或者1.5以下的版本,还需要下载sun的mail.jar和jaf的jar包,
如果是jdk6的话只需要mail.jar就可以了。具体下载地址去sun网站自己找找就行了,
然后就是要开启邮箱的smtp服务,具体的进入邮箱进行设置就可以了。一般都很简单。
最后就是gmail,gmail跟其他的邮箱的不同之处在于它的默认端口不是普通的25,
而是465,所以需要在程序中动态设置一下,设置的具体方法就是:
   email.setSSL(Boolean.TRUE); // 设定是否使用SSL
   email.setSslSmtpPort("465"); // 设定SSL端口
***/

 

 

 

 

 

Commons-Chain.jar: (参考)

Chain提供实现组织复杂的处理流程的“责任链模式”。


 

(1).Command接口。它是Commons Chain中最重要的接口,表示在Chain中的具体某一步要执行的命令。它只有一个方法:boolean execute(Context context)。如果返回true,那么表示Chain的处理结束,Chain中的其他命令不会被调用;返回false,则Chain会继续调用下一个Command,直到:
-Command返回true;
-Command抛出异常;
-Chain的末尾;


(2).Context接口。它表示命令执行的上下文,在命令间实现共享信息的传递。Context接口的父接口是Map,ContextBase实现了Context。对于web环境,可以使用WebContext类及其子类(FacesWebContext、PortletWebContext和ServletWebContext)。


(3).Chain接口。它表示“命令链”,要在其中执行的命令,需要先添加到Chain中。Chain的父接口是Command,ChainBase实现了它。


(4).Filter接口。它的父接口是Command,它是一种特殊的Command。除了Command的execute,它还包括一个方法:boolean postprocess(Context context,Exception exception)。Commons Chain会在执行了Filter的execute方法之后,执行postprocess(不论Chain以何种方式结束)。Filter的执行execute的顺序与Filter出现在Chain中出现的位置一致,但是执行postprocess顺序与之相反。如:如果连续定义了filter1和filter2,那么execute的执行顺序是:filter1->filter2;而postprocess的执行顺序是:filter2->filter1。


(5).Catalog接口。它是逻辑命名的Chain和Command集合。通过使用它,Command的调用者不需要了解具体实现Command的类名,只需要通过名字就可以获取所需要的Command实例。

基本使用
1.         执行由顺序的命令组成的流程,假设这条流程包含1、2和3步。
实现要执行的命令步骤:
public class Command1 implements Command {
    public boolean execute(Context arg0) throws Exception {
        System.out.println("Command1 is done!");
        return false;
    }
}
public class Command2 implements Command {
    public boolean execute(Context arg0) throws Exception {
        System.out.println("Command2 is done!");    
        return false;
    }
}
public class Command3 implements Command {
    public boolean execute(Context arg0) throws Exception {
        System.out.println("Command3 is done!");
        return true;
    }
}
 注册命令,创建执行的Chain:
public class CommandChain extends ChainBase {
    //增加命令的顺序也决定了执行命令的顺序
    public CommandChain(){
        addCommand( new Command1());
        addCommand( new Command2());
        addCommand( new Command3());
    }
   
    public static void main(String[] args) throws Exception{
        Command process = new CommandChain();
        Context ctx= new ContextBase();
        process.execute( ctx);
    }
}
 
2.         使用配置文件加载Command。除了在程序中注册命令之外,还可以使用配置文件来完成。
对于例1,配置文件可以写成:
<?xml version="1.0" encoding="gb2312"?>
<catalog>
       <chain name="CommandChain">
        <!-- 定义的顺序决定执行的顺序 -->
              <command id="command1" className= "chain.Command1"/>
              <command id="command2" className= "chain.Command2"/>
              <command id="command3" className= "chain.Command3"/>
       </chain>

    <command name="command4" className="chain.Command1"/>
</catalog>
 
装入配置文件的代码如下:
public class CatalogLoader {
    static final String cfgFile= "/chain/chain-cfg.xml";   
    public static void main(String[] args) throws Exception{
        CatalogLoader loader= new CatalogLoader();
        ConfigParser parser= new ConfigParser();
       
        parser.parse( loader.getClass().getResource( cfgFile));
        Catalog catalog= CatalogFactoryBase.getInstance().getCatalog();
        //加载Chain
        Command cmd= catalog.getCommand("CommandChain");
        Context ctx= new ContextBase();
        cmd.execute( ctx);
//加载Command
cmd= catalog.getCommand( "command4");
        cmd.execute( ctx);
    }
}

 注意:使用配置文件的话,需要使用Commons Digester。而Digester则依赖:Commons Collections、Commons Logging和Commons BeanUtils。
3.         加载Catalog到web应用。为了在web应用中加载Catalog,需要在对应的web.xml中添加:
<context-param>

 <param-name>org.apache.commons.chain.CONFIG_CLASS_RESOURCE</param-name>

 <param-value>resources/catalog.xml</param-value>

</context-param>

<listener>

 <listener-class>org.apache.commons.chain.web.ChainListener</listener-class>
</listener>
 
缺省情况下,Catalog会被加载到Servlet Context中,对应的属性名字是“catalog”。因此获取Catalog:
Catalog catalog = (Catalog) request.getSession() .getServletContext().getAttribute("catalog");

4.    Filter 的使用。Filter是一种特殊的Command,它除了execute方法会被执行之外,同时还会在Chain执行完毕之后(不论是正常结束还是异常结束)执行postprocess。因此,可以将它和Servlet中的Filter做类比:execute相当于处理前操作(相对下一个Command来说),postprocess相当于处理后操作。Filter的使用以及配置和Command完全一样,为了在Command1之前添加一个 Filter:

定义Filter

public class Filter1 implements Filter {
    public boolean postprocess(Context arg0, Exception arg1) {
        System.out.println("Filter1 is after done!");
        return false;
    }
    public boolean execute(Context arg0) throws Exception {
        System.out.println("Filter1 is done!");
        return false;
    }
}
 
修改配置文件,在上述的配置文件中的command1之前添加:
<command id="filter1" className= "chain.Filter1"/>
       Filter的还有一个常用的用法:对于异常的过滤。当Command抛出异常时,最终中会返回到最开始的调用处。有时期望不抛出这些异常,而在内部消化掉,那么就可以利用Filter。因为Commons Chain确保会调用已经执行了execute方法的Filter的postprocess方法,即使在出现异常时也是如此。因此,对应的 postprocess方法可以写为:
       public boolean postprocess(Context arg0, Exception arg1) {
        //返回true,表示非空异常已被处理,无需再抛出。
        //否则,异常会被抛出
        if( null!= arg1) return true;
        else return false;
    }
 
5.         对于复杂的Chain,可能需要使用内嵌的Chain,内嵌Chain可以类比一个子过程。此时,可以使用LookupCommand。以例1为例,假设其中的command2需要扩展成为一个子过程,那么配置文件修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
       <chain name="CommandChain">
              <command id="command1" className= "chain.Command1"/>
              <command id="filter1" className= "chain.Filter1"/>

              <command

className="org.apache.commons.chain.generic.LookupCommand"

                     name="chain_command3"
                     optional="true"/>
              <command id="command2" className= "chain.Command2"/>
       </chain>

       <chain name="chain_command3">

              <command id="command3" className= "chain.Command3"/>
       </chain>
</catalog>
 
其中,optional如果设为true,那么如果没有找到对应的类时,程序不会抛出异常。此时,仿佛命令不存在一样。如果为false,那么在找不到对应的类时,会抛出异常。
6.      <define>的使用。配置文件的引入,使得Commons Chain的灵活性大大的提高。在实际的使用过程中,存在着同一个Command被多个Chain使用的情形。如果每次都书写Command的类名,尤其是前面的包名特别长的情况下,是非常枯燥的。而<define>的作用就是为了解决这样的麻烦。通过定义Command和Chain的别名,来简化书写。例5的配置文件,可以书写成
<?xml version="1.0" encoding="gb2312"?>
<catalog>
    <!-- Command的别名,以后直接使用即可 -->
       <define name="command1" className="chain.Command1"/>
       <define name="command2" className="chain.Command2"/>
       <define name="command3" className="chain.Command3"/>
       <define name="filter1" className="chain.Filter1"/>
       <define name="lookupCommand"
                  className="org.apache.commons.chain.generic.LookupCommand"/>
      
       <chain name="CommandChain">
              <command1 id="1"/>
              <filter1 id="2"/>
              <lookupCommand name="chain_command3" optional="true"/>
              <command2 id="3"/>
       </chain>
      
       <chain name="chain_command3">
              <command3 id="3"/>
       </chain>
      
       <command1 name="command4"/>
</catalog>
 
分享到:
评论

相关推荐

    微信开发jar包

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

    一般常用的jar包总结

    一般常用的jar包总结

    java web 常用jar包

    希望能够帮助到大家,一点小小的总结,里面包含了freemarker包和其他常用web开发包

    struts常用jar包和简单配置文件

    自己总结的struts常用jar包和配置文件的简单编写,其中包括项目的web.xml和struts.xml,给初学者很好礼物!

    java开发常用jar包

    个人在学习中总结的Java开发常用jar包,或有不全敬请包涵

    ssh整合去不jar包总结

    ssh三大框架整合让很多人很头疼,这里我总结了所用的jar包,如要扩展请大家自己添加其他jar包。

    spring security3.0所需要的最精简的jar包

    早一段时间学习了springsecurity3.0 框架,在开始阶段不知道导入那些必需jar包,经过摸索,总结出来最精简的jar包

    java中webservice常用jar包

    在做webservice的过程中,总结的常用webservice的jar包,wsdl4j-1.6.1.jar、wstx-asl-3.2.0.jar、xfire-all-1.2.6.jar、XmlSchema-1.4.2.jar,jdom.jar,emayclient.jar,commons-codec-1.5.jar

    JPA开发所需jar包总结

    JPA开发所需jar包总结

    spring4各个功能的jar总结

    使用Spring4框架时,对于使用不同的功能来导入不同的jar包的总结

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

    自己总结的java项目打包,软件加自己总结打包步骤

    SSH框架整合的jar包

    这个压缩包包含了SSH框架的的一些jar包,是自己写ssh项目总结出来的,小伙伴们有兴趣可以下载哟。

    axis2客户端需要的jar包

    axis2客户端需要的jar包总结,包含axis2客户端搭建需要的全部jar包。

    easyexcel相关jar包.zip

    Java使用EasyExcel操作Excel表格的相关jar包,总结的一些包,想要的兄弟们来下载把!!

    各类常用JDBCjar包及连接数据的方法已打包

    包括mysql oracle sqlserver sqlserver2005 在内的各驱动jar包。并且为大家总结了java连接各类数据库的方法。希望对大家有所帮助。

    使用JSONObject需要的jar包

    使用json格式的数据需要的jar包,除了本身的jar包,还有一些需要依赖的jar包 总结一下包括: 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar ...

    spring完整jar包

    spring比较全面的jar包,整合项目必用,在项目开发中,我也曾经遇到jar包冲突,缺少jar等问题,这是我自己总结出来的jar。各位大佬不要嫌弃小弟渣

    ssh三大框架整合所需jar包

    这是本人在尝试好多次后总结的三大框架整合时所需的jar包,解决了三大框架初学者因为jar问题导致错误而找不到原因的问题,欢迎初学者下载。

    实现WebService 的 Axis jar包

    使用Axis开发Webservice时,需要用到相应的jar包,总结我们项目中的jar包,分享学习!

    sshjar包SSH开发

    在进行ssh开发环境搭建的时候,要不断挑选需咬掉jar包,很是麻烦,这里总结了ssh开发环境搭建的基础jar包,以后需要那个jar包在添加就行了

Global site tag (gtag.js) - Google Analytics