guangnian0412's BLOG

Java in my life

常用链接

统计

积分与排名

我关注的Blog

最新评论

2006年4月4日 #

Eclipse RCP与Spring的整合

     摘要: 最近上一个项目想在Eclipse RCP中使用Spring,在网上Google了一下发现这方面的资料比较少,知道Spring自己有个Spring-OSGI的项目,可以在 Spring中配置OSGI服务。可是,我只是想在RCP中引入Spring来管理Java Bean,不想去研究那个东西。于是,看看有没有什么简单的方法来解决这个问题。  阅读全文

posted @ 2006-12-30 21:11 guangnian 阅读(5505) | 评论 (5)编辑 收藏

cvsNT 2.5.03.2382添加用户后出现"no such user"错误的解决方法

     摘要: cvsNT 2.5.03.2382添加用户后出现"no such user"错误的解决方法  阅读全文

posted @ 2006-09-19 23:50 guangnian 阅读(4816) | 评论 (13)编辑 收藏

jira-enterprise-3.6.4-standalone + confluence-2.2.8 + MySQL5.0 安装破解全过程

     摘要: jira-enterprise-3.6.4-standalone + confluence-2.2.8 + MySQL5.0 安装破解全过程  阅读全文

posted @ 2006-09-19 22:30 guangnian 阅读(8106) | 评论 (10)编辑 收藏

笛米特法则详解(the Law of Demeter or Principle of Least Knowledge)

     摘要: The Law of Demeter和 Principle of Least Knowledge将的都是一回事,是说一个软件实体要尽可能的只与和它最近的实体进行通讯。通常被表述为:talk only to your immediate friends ( 只和离你最近的朋友进行交互)。   阅读全文

posted @ 2006-06-19 19:44 guangnian 阅读(4387) | 评论 (5)编辑 收藏

JBoss Rules 学习(七): Drools规则语言详解(下)

     摘要: Rule 结构是最重要的结构。 Rule 使用了形如“ IF ” something “ THEN ” action (当然,我们的关键字是“ when ”和“ then ”)的形式。

一个规则在一个 package 中必须要有唯一的名字。如果一个名字中含有空格,那就需要将名字放在双引号中(最好总是使用双引号)。

Attribute 是可选的(最好是每行只有一个 Attribute )。

规则的 LHS 跟在“ when ”关键字的后面(最好是另起一行),同样 RHS 要跟在“ then ”关键字后面(最好也另起一行)。规则以关键字“ end ”结束。规则不能嵌套。   阅读全文

posted @ 2006-06-09 19:38 guangnian 阅读(15570) | 评论 (17)编辑 收藏

JBoss Rules 学习(六): Drools规则语言详解(上)

     摘要: Drools 3 采用了原生的规则语言,那是一种非 XML 文本格式。在符号方面,这种格式是非常轻量的,并且通过“ expanders ”支持符合你问题域的 Domain Specific Language ( DSL )。这一章把焦点放在了 Drools 原生的规则格式。如果你想从技术上了解规则语言的机制,可以参考“ drl.g ”源文件,这是用 Antlr3 语法来描述规则语言。如果你使用 Rule Workbench ,内容助手将会为你完成大量的规则结构,例如输入“ ru ”,然后按 ctrl + space ,会为你建立规则结构。  阅读全文

posted @ 2006-06-09 01:16 guangnian 阅读(14172) | 评论 (7)编辑 收藏

JBoss Rules 学习(五): JBoss Rules 3.0.1 类库介绍

下载地址:

http://labs.jboss.com/portal/index.html?ctrl:id=page.default.downloads&project=jbossrules

下载文件说明:

JBoss Rules 3.0.1 Binaries (includes javadocs)  13MB )― 仅仅包含 JBoss Rules 的四个核心类库:

l         drools-core.jar 核心引擎,运行时组件。包含了 RETE 引擎和 LEAPS 引擎;

l         drools-compiler.jar 规则文件的编译组件,构建可执行的 RuleBase

l         drools-jsr94.jar 提供了 JSR-94 的兼容实现,本质上是 drools- compiler 组件的包裹层。注意:由于 JSR94 规约的限制,不是所有的特点都可以通过此接口暴露。

l         drools-decisiontables.jar 决策表的“编译”组件(使用了 drools- compiler 组件)。支持 excel CSV 输入格式。

JBoss Rules 3.0.1 Binaries with dependencies (includes javadocs) 23 MB )- 包含了 JBoss Rules 的核心类库和它们的 dependencies

l         antlr-2.7.6.jar

l         antlr-3.0ea8.jar

l         colt-1.2.0.jar

l         commons-collections-3.1.jar

l         commons-io-1.1.jar

l         commons-jci-core-1.0-406301.jar

l         commons-jci-eclipse-3.2.0.666.jar

l         commons-jci-janino-2.4.3.jar

l         commons-lang-2.1.jar

l         commons-logging-api-1.0.4.jar

l         concurrent-1.3.4.jar

l         core-3.2.0.666.jar

l         janino-2.4.3.jar

l         jsr94-1.1.jar

l         jung-1.7.2.jar

l         junit-3.8.1.jar

l         poi-2.5.1-final-20040804.jar

l         stringtemplate-2.3b6.jar

l         xercesImpl-2.6.2.jar

l         xml-apis-1.0.b2.jar

l         xpp3-1.1.3.4.0.jar

l         xstream-1.1.3.jar

如果你运行在 Java 1.5 环境下,有一些类库,例如 XML libraries ,可以不需要。需要注意的类库有:

JCI ”-这是 Apache Java Compiler Interface , 提供了运行时编译能力。可以通过 PackageBuilderConfiguration 实例来设定采用 eclipse janino 编译器,默认是 eclipse

POI ”-提供了解析 Excel 文件的能力;

antlr ”-提供了解析规则语言的能力。

JBoss Rules IDE 3.0.1 13 MB )- 这是 JBoss Rules Eclipse 插件,只支持 Eclipse 3.2 或以上版本。它提供了运行 JBoss Rules 的所有 dependencies 。你可以创建一个 Rule Project ,它能够为你编写规则文件提供自动完成的功能,并且它为你提供了 Agenda view WorkingMemory view Global Data view ,使你可以通过 eclipse 视图很清楚的看到 Agenda WorkingMemory Global Data 的情况。

你还可以通过 update site 来自动安装这个插件 ,URL 是:

http://anonsvn.labs.jboss.com/labs/jbossrules/updates/drools-ide-update/

 

posted @ 2006-06-04 23:55 guangnian 阅读(7785) | 评论 (3)编辑 收藏

JBoss Rules 学习(四): Drools规则引擎 (下)

     摘要: WorkingMemory 是运行时规则引擎的主要类。它保持了所有被 asserted 进 WorkingMemory 的数据的引用,直到取消( retracted )。 WorkingMemory 是有状态对象。它们的生命周期可长可短。如果从一个短生命周期的角度来同一个引擎进行交互,意味着你可以使用 RuleBase 对象来为每个 session 产生一个新的 WorkingMemory ,然后在结束 session 后 discard 这个 WorkingMemory (产生一个 WorkingMemory 是一个廉价的操作)。另一种形式,就是在一个相当长的时间中(例如一个 conversation ),保持一个 WorkingMemory ,并且对于新的 facts 保持持续的更新。当你希望 dispose 一个 WorkingMemory 的时候,最好的实践就是调用 dispose() 方法,此时 RuleBase 中对它的引用将会被移除(尽管这是一个弱引用)。不管怎样最后它将会被当成垃圾收集掉。术语   阅读全文

posted @ 2006-06-04 14:55 guangnian 阅读(10822) | 评论 (6)编辑 收藏

JBoss Rules 学习(三): Drools规则引擎 (上)

     摘要: Drools 分为两个主要部分:构建( Authoring )和运行时( Runtime )。

构建的过程涉及到 .drl 或 .xml 规则文件的创建,它们被读入一个解析器,使用 ANTLR 3 语法进行解析。解析器对语法进行正确性的检查,然后产生一种中间结构“ descr ”, descr 用 AST 来描述规则。 AST 然后被传到 PackageBuilder ,由 PackagBuilder 来产生 Packaged 对象。 PackageBuilder 还承担着一些代码产生和编译的工作,这些对于产生 Package 对象都时必需的。 Package 对象是一个可以配置的,可序列化的,由一个或多个规则组成的对象。  阅读全文

posted @ 2006-06-04 12:50 guangnian 阅读(22185) | 评论 (14)编辑 收藏

JBoss Rules 学习(二): RETE算法

     摘要: 在JBoss Rules 学习(一):什么是Rule中,我们介绍了JBoss Rules中对Rule的表示,其中提到了JBoss Rule中主要采用的RETE算法来进行规则匹配。下面将详细的介绍一下RETE算法在JBoss Rule中的实现,最后随便提一下JBoss Rules中也可以使用的另一种规则匹配算法Leaps。  阅读全文

posted @ 2006-06-01 17:06 guangnian 阅读(13342) | 评论 (4)编辑 收藏

JBoss Rules 学习(一): 什么是Rule

     摘要: 学习JBoss Rules有几天了,因为这方面的中文资料较少,所以这几天都在看官网上的manual。这是一份不错的教程,我把我看的一些重要的东西翻译整理了一下,希望可以对想学习JBoss Rules的同学们提供一点帮助。
在开始这份教程之前,我先简要介绍一下JBoss Rules:
JBoss Rules 的前身是Codehaus的一个开源项目叫Drools。最近被纳入JBoss门下,更名为JBoss Rules,成为了JBoss应用服务器的规则引擎。
Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。

既然JBoss Rules是一个商业规则引擎,那我们就要先知道到底什么是Rules,即规则。在JBoss Rules中,规则是如何被表示的  阅读全文

posted @ 2006-06-01 16:52 guangnian 阅读(22306) | 评论 (23)编辑 收藏

[Commons Logging]使用一个抽象的Logging接口(From Jarkata Commons Cookbook 7.10)

   (Jarkata 的 Commons Logging 包现在已经被用在几乎所有的开源项目之中,它可以使你开发的系统工作在不同的日志框架下,包括Sun的logging框架和Apache Log4j。现在Commons Logging + Apache Log4j 的身影是随处可见,Commons Logging 的易用与Log4j的强大功能形成了绝配。)

问题:
      你正在写一个可重用的代码库,而你不知道你的代码在哪里并且是如何工作的。你需要一个抽象的日志接口来写入日志信息,因为你不能确定Log4j或者是JDK 1.4 logging的存在性。

解决:
        通过Jakarta Commons Logging 的Log 接口来记录信息,然后依靠Commons Logging自身来决定在运行时使用哪种具体的日志框架。下面的代码使用了Log接口来记录trace,debug,info,warning,error和fatal信息:
 1 import org.apache.commons.logging.LogFactory;
 2 import org.apache.commons.logging.Log
 3 
 4 Log log = LogFactory.getLog( "com.discursive.jccook.SomeApp" ); 
 5 
 6 if( log.isTraceEnabled( ) ) {
 7     log.trace( "This is a trace message" );
 8 }
 9 
10 if( log.isDebugEnabled( ) ) {
11     log.debug( "This is a debug message" );
12 }
13 
14 log.info( "This is an informational message" );
15 
16 log.warn( "This is a warning" );
17 
18 log.error( "This is an error" );
19 
20 log.fatal( "This is fatal" );
      LogFactory.getInstance() 返回一个Log接口的具体实现,这个实现与底层具体的日志框架相对应。例如,如果你的系统是使用Apache Log4j ,一个Log4JLogger将被返回,对应于Log4J category
com.discursive.jccook.SomeApp 。

讨论:
        一个可重用代码库的开发者不能预知其代码库将在何时何地被用到,而现在有很多的日志框架可以使用,所以当开发可重用代码库的时候,使用Commons Logging 是非常明智的,例如Jakarta Commons 组件。当调用LogFactory.getInstance()方法的时候,Commons Logging 将通过系统属性和classpath中的类库来决定和管理适当的日志框架。对于一个小型可重用组件的开发者来说,进行日志记录只需要调用Log接口。而配置底层日志框架的负担,就转移到使用其组件库的开发者身上。

参考:
        7.11节详细的说明了Commons Logging在运行时确定适当日志框架的算法。

    

posted @ 2006-04-24 18:32 guangnian 阅读(760) | 评论 (0)编辑 收藏

[HttpClient] 创建一个HTTP POST 请求 (from Jakarta Commons cookbook 11.7 )

问题:
        你需要使用HTTP POST 方法来向一个servlet传递参数。

讨论:
        创建一个 PostMethod 对象,然后调用 setParameter() 或 addParameter() 方法设置参数。 PostMethod 对象将会传送一个 Content-Type 头为 application/x-www-form-urlencoded 的请求,并且参数将在请求body中被传送。在下列的例子中演示了用 PostMethod 对象传递参数的用法:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

HttpClient client 
= new HttpClient( );

// Create POST method
String url = "http://www.discursive.com/cgi-bin/jccook/param_list.cgi";
PostMethod method 
= new PostMethod( url );

// Set parameters on POST    
method.setParameter( "test1""Hello World" );
method.addParameter( 
"test2""This is a Form Submission" );
method.addParameter( 
"Blah""Whoop" );
method.addParameter( 
new NameValuePair( "Blah""Whoop2" ) );

// Execute and print response
client.executeMethod( method );
String response 
= method.getResponseBodyAsString( );
System.out.println( response );

method.releaseConnection( );
      
param_list.cgi CGI脚本会对所以接收到的参数进行回显,从下面的输出中,你可以看到传递给CGI脚本的三个参数:
These are the parameters I received:

test1:
  Hello World
test2:
  This is a Form Submission
Blah:
  Whoop
  Whoop2
       有几种方法来在一个PostMethod对象中设置参数。最直接的方法就是调用setParameter()方法,并传递两个字符串给它:参数的名称和参数值。setParameter()方法将会替代任何已经存在的同名参数。但是,如果一个同名的参数已经存在一个PostMethod对象中,addParameter()将会加入另一个同名参数值;addParameter()方法同样接受两个String:参数名和参数值。另一种方法,这两个方法同样接受一个包装了参数名和参数值的NameValuePair对象。在前面的例子中,通过addParameter()方法,用参数名Blah传递了两个值,第一次用两个String作为参数,第二次用一个NameValuePair对象作为参数。

posted @ 2006-04-11 22:41 guangnian 阅读(6595) | 评论 (4)编辑 收藏

[HttpClient] 在查询字符串中传送参数 (from Jakarta Commons Cookbook 11。4)

问题:
        你需要在一个URL中传送查询参数。

解答:
        使用一个HttpMethod实例的setQueryString()方法来设置查询字符串。使用URIUtil类对包含在URL中的文本进行编码。下面的例子在查询字符串中放入了两个参数:
 1 import org.apache.commons.httpclient.HttpClient;
 2 import org.apache.commons.httpclient.HttpException;
 3 import org.apache.commons.httpclient.HttpMethod;
 4 import org.apache.commons.httpclient.NameValuePair;
 5 import org.apache.commons.httpclient.methods.GetMethod;
 6 import org.apache.commons.httpclient.util.URIUtil;
 7 
 8 HttpClient client = new HttpClient( );
 9 
10 String url = "http://www.discursive.com/cgi-bin/jccook/param_list.cgi";
11 
12 HttpMethod method = new GetMethod( url );
13 
14 // 用setQueryString()来设置查询字符串
15 method.setQueryString(URIUtil.encodeQuery("test1=O Reilly&blah=Whoop"));
16 System.out.println( "With Query String: " + method.getURI( ) );
17 
18 client.executeMethod( method );
19 
20 System.out.println( "Response:\n " + method.getResponseBodyAsString( ) );
21 method.releaseConnection( );
      
param_list.cgi  CGI脚本只是简单的回显接收到的所以参数,在下面的输出中,你可以看到URIUtil如何对第一个参数进行编码:
      
With Query String: http://www.discursive.com/cgi-bin/jccook/param_list.cgi?test1=O%20Reilly&blah=Whoop
Response:
 These are the parameters I received:

test1:
  O Reilly
blah:
  Whoop
      提示:你不必在setQueryString()方法中加入?号,当HttpClient实例执行executeMethod()方法时,它会被自动加入。

讨论:
         在前面的例子中,HttpMethod的setQueryString()方法是一次性将整个查询字符串加进去,但是还有另外一种选择:通过一个NameValuePair对象的数组来设置查询字符串。当一个NameValuePair[]传入setQueryString()方法中时,HttpMethod实例会从数组中取出每一个NameValuePair对象,然后创建一系列用&号分割的参数。这种方法使程序代码更加干净,因为你不必连接字符串来传递多个参数。下面的例子用NameValuePair对象,与前一个例子设置了同样的参数:
 1 // 用NameValuePair对象设置查询参数
 2 HttpMethod method = new GetMethod( url );
 3 NameValuePair pair = new NameValuePair( "test1", URIUtil.encodeQuery( "O Reilly" ) );
 4NameValuePair pair2 = new NameValuePair( "blah", URIUtil.encodeQuery( "Whoop" ) );
 5NameValuePair[] pairs = new NameValuePair[] { pair, pair2 };
 6method.setQueryString( pairs );
 7System.out.println( "With NameValuePairs: " + method.getURI( ) );
 8client.executeMethod( method );
 9 System.out.println( "Response:\n " + method.getResponseBodyAsString( ) );
 10method.releaseConnection( );
        根据RFC1738,URL只能够包含字母和数字字符:[0-9,a-z,A-Z]和一些特殊字符。如果你需要在参数中传送一些URL所不允许的字符,你就需要对你的字符串进行编码,以符合RFC1738的规定。URIUtil类有一个方法encodeQuery()能够对前面例子中的"O Reilly"进行编码。下面的代码展示了用URIUtil类来对包含在URL中的字符串进行编码:
1 String encoded1 = URIUtil.encodeQuery( "<test>=O'Connell" );
2 String encoded2 = URIUtil.encodeQuery( "one:two=thr ee#" );
3 
4 String decoded = URIUtil.decode( "Hello%20World%3F" );
5 
6 System.out.println( "Encoded: " + encoded1 );
7 System.out.println( "Encoded: " + encoded2 );
8 System.out.println( "Decoded: " + decoded );

        这个简单的例子用URIUtil类对两个字符串进行了编码,并对一个经过编码的字符串进行解码。下面的输出展示了每个转换的结果:
Encoded: %3ctest%e3=O'Connell
Encoded: one%3atwo=thr%20ee#23
Decoded: Hello World
?
        
参考:
        在这个例子中,URLUtil对传入的查询字符串的内容进行了编码。最近,HttpClient小组将一些URL编码和解码的逻辑代码移入了Jakarta Commons Codec项目中,对应的类名为URLCodec。需要URLCodec更多的信息,请参考
Jakarta Commons Codec项目主页(http://jakarta.apache.org/codec)。
         RFC1738讨论了URL中的合法字符,并规定了对其他字符进行编码的过程。RFC1738能够在http:// www.zvon.org/tmRFC/RFC2616/Output/index.html中找到。

posted @ 2006-04-04 19:19 guangnian 阅读(4667) | 评论 (1)编辑 收藏

[HttpClient] 执行HTTP GET方法 (from Jakarta Commons Cookbook 11。3)

问题:
        你需要通过HTTP GET方法来获取信息。

解答:
        创建一个HttpClient实例,并调用以GetMethod对象为参数的executeMethod方法。然后,响应的内容就可以通过一个InputStream,byte[],或者是String来获得。下面的例子将获得 http://www.discursive.com /jccook/的内容,并且以一个String来获得响应。
       
 1 import org.apache.commons.httpclient.HttpClient;
 2 import org.apache.commons.httpclient.HttpException;
 3 import org.apache.commons.httpclient.HttpMethod;
 4 import org.apache.commons.httpclient.methods.GetMethod;
 5 
 6 HttpClient client = new HttpClient( );
 7 String url = "http://www.discursive.com/jccook/";
 8 HttpMethod method = new GetMethod( url );
 9 
10 try {
11     client.executeMethod( method );
12 
13     if( method.getStatusCode( ) == HttpStatus.SC_OK ) {
14         String response = method.getResponseBodyAsString( );
15         System.out.println( response );
16     }
17 catch( HttpException he ) {
18     System.out.println( "HTTP Problem: " + he.getMessage( ) );
19 catch( IOException ioe ) {
20     System.out.println( "IO Exeception: " + ioe.getMessage( ) );
21 finally {
22     method.releaseConnection( );
23     method.recycle( );
24 }
     这段代码用HTTP GET方法获得了
http://www.discursive.com/jccook/的内容。如果响应的状态码是HttpStatus.SC_OK(即200),下列响应将被输出到控制台:
<html>
 
<head>
  
<title>JCCook Example</title>
 
</head>
 
<body>
  
<h1>Hello World!</h1>
 
</body>
</html>


讨论:
        注意这段代码中对异常的处理。执行一个简单的HTTP GET需要捕捉两个异常:HttpException和IOException。如果是发生HTTP协议错误时,将抛出HttpException异常;如果是发生有关网络的错误时,将抛出IOException异常。这一章后面的例子将会忽略对异常的处理。你应该要知道每一次调用executeMethod()都要用适当的try/catch块包裹。
        GetMethod类是HttpMethod接口的一种实现。HttpMethod会被HttpClient所调用。HttpMethod实现类的生命周期是很简单的:一个HttpMethod实例被创建,然后被HttpClient调用;一旦响应被检测到以后,HttpMethod释放连接并被回收使用。当HttpMethod调用了recycle()方法,相当于发送了一个信号给系统表示这个HttpMethod实例可以再被使用。releaseConnection()方法指示HttpClient释放掉与这个HttpMethod相关联的连接。无论在使用HttpMethod实例的过程中发生了什么,都要调用releaseConnection()来释放网络资源。
        一旦HttpClient的executeMethod方法被调用,你可以通过HttpMethod的getStatusCode()方法来获得响应的状态码。这个方法返回一个int,对应于HttpStatus类的public static final 变量。HttpStatus类还包括下面一些常量:SC_OK(200),SC_NOT_FOUND(404),SC_INTERNAL_SERVER_ERROR(500),SC_MOVED_TEMPORARILY (302),SC_UNAUTHORIZED(401)等等。请参照HttpStatus的Javadoc来获得所有的HTTP状态列表。当服务器返回一个错误的HTTP状态是,通常还会返回一小段信息。这一小段信息可以通过HttpMethod类的getStatusText()方法获得。
 
参考:
       可以从RFC2616(http://www.zvon.org/tmRFC/RFC2616/Output/index.html)获得HTTP GET方法的官方定义;
       要获得HTTP 状态码的完整列表,请参见 HttpStatus Javadoc  (http://jakarta.apache.org/commons/ httpclient/apidocs/index.html)。

posted @ 2006-04-04 00:18 guangnian 阅读(3872) | 评论 (0)编辑 收藏