guangnian0412's BLOG

Java in my life

常用链接

统计

积分与排名

我关注的Blog

最新评论

2006年4月3日 #

Eclipse RCP与Spring的整合

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

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

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

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

posted @ 2006-09-19 23:50 guangnian 阅读(5424) | 评论 (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 阅读(8675) | 评论 (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 阅读(5019) | 评论 (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 阅读(16323) | 评论 (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 阅读(14517) | 评论 (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 阅读(8235) | 评论 (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 阅读(11461) | 评论 (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 阅读(23267) | 评论 (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 阅读(13727) | 评论 (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 阅读(23612) | 评论 (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 阅读(987) | 评论 (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 阅读(7092) | 评论 (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 阅读(4970) | 评论 (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 阅读(4109) | 评论 (0) | 编辑 收藏

Jakarta Commons Cookbook

    其实Jakarta Commons类库在Java中的地位是很重要的,它为Java程序员提供了很多可重用的工具。最近在看Jakarta Commons Cookbook 这本书,是英文版,忽然有想翻译它的冲动。就从我最近用到的HttpClient开始吧.......

posted @ 2006-04-03 23:25 guangnian 阅读(1408) | 评论 (3) | 编辑 收藏

Blog开张留恋

   今天我的BLOG开张了。 

     想想自己接触JAVA也已经半年了,这半年来我尽情的翱翔在Java的世界里,从JDK到JSP,JDBC到Hibernate,Struts到JSF,Spring、ant、CruiseControl......我如饥似渴的吸取着所有有关Java的东西。 

      感谢Java让我有了方向..... 
 

posted @ 2006-04-03 22:23 guangnian 阅读(420) | 评论 (0) | 编辑 收藏