- 浏览: 611597 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
niuqiang2008:
谢了谢了 就是要找这个问题
struts2的<s:set><s:if>标签应用 -
love_zongming:
赞一个! 谢谢分享
向eclipse中添加user library的方式 -
MyPointOne:
后面的异常为什么出现?好像没说清楚!
Jboss中的web-console与jmx-console的配置 -
nysin:
顶一个,现在明白了...
JAVA静态和非静态内部类 -
chenhua_1984:
很不错!
Cause: net.sf.cglib.beans.BulkBeanException异常
基本对象
1. 接口。它是Commons Chain中最重要的接口,表示在Chain中的具体某一步要执行的命令。它只有一个方法:boolean execute(Context context)。如果返回true,那么表示Chain的处理结束,Chain中的其他命令不会被调用;返回false,则Chain会继续调用下一个 Command,直到: Command
- 返回true; Command
- 抛出异常; Command
- 的末尾; Chain
2. 接口。它表示命令执行的上下文,在命令间实现共享信息的传递。Context接口的父接口是Map,ContextBase实现了Context。对于 web环境,可以使用WebContext类及其子类(FacesWebContext、PortletWebContext和 ServletWebContext)。 Context
3. 接口。它表示“命令链”,要在其中执行的命令,需要先添加到Chain中。Chain的父接口是Command, ChainBase 实现了它。 Chain
4. 接口。它的父接口是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。 Filter
5. 接口。它是逻辑命名的Chain和Command集合。通过使用它,Command的调用者不需要了解具体实现Command的类名,只需要通过名字就可以获取所需要的Command实例。 Catalog
基本使用
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是一种特殊的Command,它除了execute方法会被执行之外,同时还会在Chain执行完毕之后(不论是正常结束还是异常结束)执行postprocess。因此,可以将它和Servlet中的Filter做类比:execute相当于处理前操作(相对下一个Command来说),postprocess相当于处理后操作。Filter的使用以及配置和Command完全一样,为了在Command1之前添加一个 Filter: 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. 的使用。配置文件的引入,使得Commons Chain的灵活性大大的提高。在实际的使用过程中,存在着同一个Command被多个Chain使用的情形。如果每次都书写Command的类名,尤其是前面的包名特别长的情况下,是非常枯燥的。而<define>的作用就是为了解决这样的麻烦。通过定义Command和Chain的别名,来简化书写。例5的配置文件,可以书写成: <define>
<?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>
总结
Commons Chain 实现了Chain of Responsebility和Command模式,其中的Catalog + 配置文件的方式使得调用方和Command的实现方的耦合度大大的降低,提高了灵活性。对于配置文件,通常可以:
- 作为Command的索引表,需要时按名字索引创建实例。
- 利用Chain以及内嵌Chain,完成一组连续任务和Command的复用,引入Filter可以获得与Servlet Filter一样的好处。
- 使用<define>定义别名,简化书写。
1. 接口。它是Commons Chain中最重要的接口,表示在Chain中的具体某一步要执行的命令。它只有一个方法:boolean execute(Context context)。如果返回true,那么表示Chain的处理结束,Chain中的其他命令不会被调用;返回false,则Chain会继续调用下一个 Command,直到: Command
- 返回true; Command
- 抛出异常; Command
- 的末尾; Chain
2. 接口。它表示命令执行的上下文,在命令间实现共享信息的传递。Context接口的父接口是Map,ContextBase实现了Context。对于 web环境,可以使用WebContext类及其子类(FacesWebContext、PortletWebContext和 ServletWebContext)。 Context
3. 接口。它表示“命令链”,要在其中执行的命令,需要先添加到Chain中。Chain的父接口是Command, ChainBase 实现了它。 Chain
4. 接口。它的父接口是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。 Filter
5. 接口。它是逻辑命名的Chain和Command集合。通过使用它,Command的调用者不需要了解具体实现Command的类名,只需要通过名字就可以获取所需要的Command实例。 Catalog
基本使用
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是一种特殊的Command,它除了execute方法会被执行之外,同时还会在Chain执行完毕之后(不论是正常结束还是异常结束)执行postprocess。因此,可以将它和Servlet中的Filter做类比:execute相当于处理前操作(相对下一个Command来说),postprocess相当于处理后操作。Filter的使用以及配置和Command完全一样,为了在Command1之前添加一个 Filter: 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. 的使用。配置文件的引入,使得Commons Chain的灵活性大大的提高。在实际的使用过程中,存在着同一个Command被多个Chain使用的情形。如果每次都书写Command的类名,尤其是前面的包名特别长的情况下,是非常枯燥的。而<define>的作用就是为了解决这样的麻烦。通过定义Command和Chain的别名,来简化书写。例5的配置文件,可以书写成: <define>
<?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>
总结
Commons Chain 实现了Chain of Responsebility和Command模式,其中的Catalog + 配置文件的方式使得调用方和Command的实现方的耦合度大大的降低,提高了灵活性。对于配置文件,通常可以:
- 作为Command的索引表,需要时按名字索引创建实例。
- 利用Chain以及内嵌Chain,完成一组连续任务和Command的复用,引入Filter可以获得与Servlet Filter一样的好处。
- 使用<define>定义别名,简化书写。
发表评论
-
Tomcat6.x + p6spy + IronTrackSQL 监控sql性能
2013-05-15 17:41 1370具体内容见附件!!! <script> (f ... -
说说Statement、PreparedStatement和CallableStatement的异同.
2012-05-15 16:22 23621.Statement、PreparedStatement和C ... -
JSP中Session对象的由来
2012-02-10 16:39 1659如果JSP没有显示的使用 <% @page sessio ... -
Jave的autoboxing与autounboxing
2012-02-03 13:21 1247Java 自动装箱与拆箱 一 ... -
ASCII码表图片
2011-12-08 10:10 4072ASCII对照码表 -
Linux上的Cron命令集合
2011-09-22 10:43 1178关于linux下的Cron 查看当前用户的cron列表命 ... -
Eclipse或MyEclipse设置启动JVM时的字符集
2011-08-31 22:34 3682Eclipse或MyEclipse设置启动JVM时的字符集 ... -
Ajax与JSP防止缓存介绍
2011-06-22 20:36 3213一:清除AJAX缓存的方法介绍: 1.在ajax发送请求前加上 ... -
Eclipse下怎么打jar包 jar怎么运行
2011-01-31 18:05 2857一、怎么打jar包 第一步:选中要打jar包的工程 第二步 ... -
Jboss中的web-console与jmx-console的配置
2010-10-10 15:34 9975JBoss安装成功后,一般 ... -
使用jboss服务器时遇到的相关问题
2010-09-27 23:50 4310Eclipse启动Jboss服务器,如何指定JVM虚拟内存大小 ... -
设置Tomcat,Jboss应用服务器的端口
2010-09-27 13:13 2279Tomcat,Jboss,Oracle端口号的修改 转载于ht ... -
向eclipse中添加user library的方式
2010-09-22 22:33 35571以前做项目都是把需要的jar包直接copy到工程的lib目录下 ... -
用LinkedList实现队列和栈
2010-07-13 11:01 1734队列实现: package com.test.unicode; ... -
摘抄一段关于HashSet的描述
2010-07-13 10:20 1119HashSet介绍: 1.只有类的实例对象要被采用哈希算法进 ... -
JAVA静态和非静态内部类
2010-06-23 15:14 13240一致对java的静态和非静态内部类的东东理解不清楚,今天测试了 ... -
找不到 java 类: org.apache.catalina.startup.Bootstrap
2010-06-18 10:55 17684今天启动服务器时,在catalina.out文件日志中出现了异 ... -
BigDecimal
2010-06-12 17:30 1205前段时间看见一个关于 2.0-1.9非0.1结果的文章。 在此 ... -
设置ECLIPSE自动编译
2010-06-11 12:34 8290设置eclipse自动编译的2中方式: 1. 确保 proje ... -
代码自我审查的一些体会
2010-05-24 14:20 1125代码自我审查的一些体 ...
相关推荐
Apache Commons Chain API 是一个用于构建和执行工作流程的Java库,它源于Apache Jakarta项目,旨在提供一种灵活且可扩展的方式来组织和执行一系列处理任务。这个API的核心概念是“链”(Chain),它允许开发者定义...
Apache Commons Chain 是一个Java库,它提供了一种用于组织和执行命令或操作的框架。这个“commons-chain-1.2-bin”是Apache Commons Chain 1.2版本的二进制发行版,通常包含编译好的类库、文档和其他运行时需要的...
Apache Commons Chain 是一个Java库,它提供了一种用于构建可配置、模块化的应用程序处理流程的框架。这个"commons-chain-1.2-src"是Apache Commons Chain项目的源代码包,版本为1.2。这个框架主要关注的是应用中的...
Apache Commons Chain 是一个Java库,它提供了一种结构化处理任务的方法,允许开发者定义一系列操作(或称为“命令”)并按照特定顺序执行。这个库主要用于构建应用中的业务流程和工作流,它允许灵活地组合和配置...
Apache Commons Chain 是一个Java库,它提供了一种用于构建应用程序业务流程和服务的框架。这个"commons-chain-1.2-src.tar.gz"文件包含了Apache Chain项目的1.2版本的源代码,使得开发者能够深入理解其内部工作原理...
apache commons chain 提供了对CoR模式的基础支持。。CoR模式,是Chain of Responsebility的缩写。CommonsChain实现了Chain of Responsebility和Command模式,其中的Catalog + 配置文件的方式使得调用方和Command的...
commons-chain.jar commons-chain.jar
Commons BeanUtils、Commons Chain 和 Commons Digester 是 Apache 软件基金会开发的三个重要的 Java 开源库,它们在 Java 开发中起到了关键的作用。这三个库通常被用于处理对象属性、构建应用程序流程以及解析XML...
Apache-commons源码其中包括(commons-email-1.5-src、commons-fileupload-1.4-src、commons-io-2.8.0-src、commons-jelly-1.0.1-src、commons-lang3-3.11-src...)
5. **Commons Chain** (commons-chain-1.2-src.zip): Chain 提供了一种可配置的命令链(Chain of Responsibility)模式实现,用于构建和执行复杂的业务流程。开发者可以定义一系列处理命令,并根据需要组合它们,...
类似于Commons Chain和Commons Pipeline这样的Java Pipeline Step Chain用于组织复杂处理流程执行的流行技术。支持通用业务job、services子流程无限制拆分。支持业务子流程串行化、业务子流程并行化,可配置化。...
10. **Chain**:Apache Commons Chain 提供了责任链模式的实现,允许定义一系列操作的执行顺序,使得业务流程更加灵活和可扩展。 11. **DBCP**:Apache Commons DBCP 是一个开源的数据库连接池实现,能够有效地管理...
4. **Commons Chain**: 实现了设计模式中的“责任链模式”,允许构建复杂的处理流程,每个处理者可以决定是否处理请求,或者传递给下一个处理者。 5. **Commons CLI**: 提供命令行参数、选项、选项组等的处理,简化...
commons-chain-1.1.commons-chain-1.1.jarjar
chain-1.2-bin.zip commons-chain-1.2-src.zip commons-cli-1.1-src.zip commons-cli-1.1.zip commons-codec-1.3-src.zip commons-codec-1.3.zip commons-collections-3.2.1-bin.zip commons-...
类似于Commons Chain和Commons Pipeline这样的Java Pipeline Step Chain用于组织复杂处理流程执行的流行技术. Java Pipeline Step Chain like Apache Commons Chain and Commons Pipeline.A popular technique for ...
commons-chain-1.2.0.jar
apache-sanselan-incubating-0.97-bin bcel-5.2 commons-beanutils-1.9.2-bin commons-chain-1.2-bin commons-cli-1.3.1-bin commons-codec-1.10-bin commons-collections4-4.0-bin commons-configuration-1.10-bin...
apache commons jar(commons所有的jar包... apache-sanselan-incubating-0.97-bin bcel-5.2 commons-beanutils-1.9.2-bin commons-chain-1.2-bin commons-cli-1.3.1-bin commons-codec-1.10-bin commons-collections4-4
以下是压缩文件的jar包名称: commons-validator-1.3.0.jar ...commons-chain-1.1.jar commons-beanutils-1.6.jar 包含两个最常用的源码: commons-beanutils-1.6-src.zip commons-collections-3.2.1-src.zip