guangnian0412's BLOG

          Java in my life

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          我關(guān)注的Blog

          最新評論

          #

          JBoss Rules 學(xué)習(xí)(一): 什么是Rule

               摘要: 學(xué)習(xí)JBoss Rules有幾天了,因?yàn)檫@方面的中文資料較少,所以這幾天都在看官網(wǎng)上的manual。這是一份不錯(cuò)的教程,我把我看的一些重要的東西翻譯整理了一下,希望可以對想學(xué)習(xí)JBoss Rules的同學(xué)們提供一點(diǎn)幫助。
          在開始這份教程之前,我先簡要介紹一下JBoss Rules:
          JBoss Rules 的前身是Codehaus的一個(gè)開源項(xiàng)目叫Drools。最近被納入JBoss門下,更名為JBoss Rules,成為了JBoss應(yīng)用服務(wù)器的規(guī)則引擎。
          Drools是為Java量身定制的基于Charles Forgy的RETE算法的規(guī)則引擎的實(shí)現(xiàn)。具有了OO接口的RETE,使得商業(yè)規(guī)則有了更自然的表達(dá)。

          既然JBoss Rules是一個(gè)商業(yè)規(guī)則引擎,那我們就要先知道到底什么是Rules,即規(guī)則。在JBoss Rules中,規(guī)則是如何被表示的  閱讀全文

          posted @ 2006-06-01 16:52 guangnian 閱讀(22715) | 評論 (23)編輯 收藏

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

          ?? (Jarkata 的 Commons Logging 包現(xiàn)在已經(jīng)被用在幾乎所有的開源項(xiàng)目之中,它可以使你開發(fā)的系統(tǒng)工作在不同的日志框架下,包括Sun的logging框架和Apache Log4j。現(xiàn)在Commons Logging + Apache Log4j 的身影是隨處可見,Commons Logging 的易用與Log4j的強(qiáng)大功能形成了絕配。)

          問題:
          ??? ? 你正在寫一個(gè)可重用的代碼庫,而你不知道你的代碼在哪里并且是如何工作的。你需要一個(gè)抽象的日志接口來寫入日志信息,因?yàn)槟悴荒艽_定Log4j或者是JDK 1.4 logging的存在性。

          解決:
          ??????? 通過Jakarta Commons Logging 的Log 接口來記錄信息,然后依靠Commons Logging自身來決定在運(yùn)行時(shí)使用哪種具體的日志框架。下面的代碼使用了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() 返回一個(gè)Log接口的具體實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)與底層具體的日志框架相對應(yīng)。例如,如果你的系統(tǒng)是使用Apache Log4j ,一個(gè)Log4JLogger將被返回,對應(yīng)于Log4J category
          com.discursive.jccook.SomeApp 。

          討論:
          ??????? 一個(gè)可重用代碼庫的開發(fā)者不能預(yù)知其代碼庫將在何時(shí)何地被用到,而現(xiàn)在有很多的日志框架可以使用,所以當(dāng)開發(fā)可重用代碼庫的時(shí)候,使用Commons Logging 是非常明智的,例如Jakarta Commons 組件。當(dāng)調(diào)用LogFactory.getInstance()方法的時(shí)候,Commons Logging 將通過系統(tǒng)屬性和classpath中的類庫來決定和管理適當(dāng)?shù)娜罩究蚣堋τ谝粋€(gè)小型可重用組件的開發(fā)者來說,進(jìn)行日志記錄只需要調(diào)用Log接口。而配置底層日志框架的負(fù)擔(dān),就轉(zhuǎn)移到使用其組件庫的開發(fā)者身上。

          參考:
          ??????? 7.11節(jié)詳細(xì)的說明了Commons Logging在運(yùn)行時(shí)確定適當(dāng)日志框架的算法。

          ????

          posted @ 2006-04-24 18:32 guangnian 閱讀(834) | 評論 (0)編輯 收藏

          [HttpClient] 創(chuàng)建一個(gè)HTTP POST 請求 (from Jakarta Commons cookbook 11.7 )

          問題:
          ??????? 你需要使用HTTP POST 方法來向一個(gè)servlet傳遞參數(shù)。

          討論:
          ??????? 創(chuàng)建一個(gè) PostMethod 對象,然后調(diào)用 setParameter() 或 addParameter() 方法設(shè)置參數(shù)。 PostMethod 對象將會(huì)傳送一個(gè) Content-Type 頭為 application/x-www-form-urlencoded 的請求,并且參數(shù)將在請求body中被傳送。在下列的例子中演示了用 PostMethod 對象傳遞參數(shù)的用法:
          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腳本會(huì)對所以接收到的參數(shù)進(jìn)行回顯,從下面的輸出中,你可以看到傳遞給CGI腳本的三個(gè)參數(shù):
          These?are?the?parameters?I?received:

          test1:
          ??Hello?World
          test2:
          ??This?is?a?Form?Submission
          Blah:
          ??Whoop
          ??Whoop2
          ?????? 有幾種方法來在一個(gè)PostMethod對象中設(shè)置參數(shù)。最直接的方法就是調(diào)用setParameter()方法,并傳遞兩個(gè)字符串給它:參數(shù)的名稱和參數(shù)值。setParameter()方法將會(huì)替代任何已經(jīng)存在的同名參數(shù)。但是,如果一個(gè)同名的參數(shù)已經(jīng)存在一個(gè)PostMethod對象中,addParameter()將會(huì)加入另一個(gè)同名參數(shù)值;addParameter()方法同樣接受兩個(gè)String:參數(shù)名和參數(shù)值。另一種方法,這兩個(gè)方法同樣接受一個(gè)包裝了參數(shù)名和參數(shù)值的NameValuePair對象。在前面的例子中,通過addParameter()方法,用參數(shù)名Blah傳遞了兩個(gè)值,第一次用兩個(gè)String作為參數(shù),第二次用一個(gè)NameValuePair對象作為參數(shù)。

          posted @ 2006-04-11 22:41 guangnian 閱讀(6734) | 評論 (4)編輯 收藏

          [HttpClient] 在查詢字符串中傳送參數(shù) (from Jakarta Commons Cookbook 11。4)

          問題:
          ??????? 你需要在一個(gè)URL中傳送查詢參數(shù)。

          解答:
          ??????? 使用一個(gè)HttpMethod實(shí)例的setQueryString()方法來設(shè)置查詢字符串。使用URIUtil類對包含在URL中的文本進(jìn)行編碼。下面的例子在查詢字符串中放入了兩個(gè)參數(shù):
          ?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()來設(shè)置查詢字符串
          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腳本只是簡單的回顯接收到的所以參數(shù),在下面的輸出中,你可以看到URIUtil如何對第一個(gè)參數(shù)進(jìn)行編碼:
          ??????
          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()方法中加入?號,當(dāng)HttpClient實(shí)例執(zhí)行executeMethod()方法時(shí),它會(huì)被自動(dòng)加入。

          討論:
          ????? ?? 在前面的例子中,HttpMethod的setQueryString()方法是一次性將整個(gè)查詢字符串加進(jìn)去,但是還有另外一種選擇:通過一個(gè)NameValuePair對象的數(shù)組來設(shè)置查詢字符串。當(dāng)一個(gè)NameValuePair[]傳入setQueryString()方法中時(shí),HttpMethod實(shí)例會(huì)從數(shù)組中取出每一個(gè)NameValuePair對象,然后創(chuàng)建一系列用&號分割的參數(shù)。這種方法使程序代碼更加干凈,因?yàn)槟悴槐剡B接字符串來傳遞多個(gè)參數(shù)。下面的例子用NameValuePair對象,與前一個(gè)例子設(shè)置了同樣的參數(shù):
          ?1?// 用NameValuePair對象設(shè)置查詢參數(shù)
          ?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(?);
          ??????? 根據(jù)RFC1738,URL只能夠包含字母和數(shù)字字符:[0-9,a-z,A-Z]和一些特殊字符。如果你需要在參數(shù)中傳送一些URL所不允許的字符,你就需要對你的字符串進(jìn)行編碼,以符合RFC1738的規(guī)定。URIUtil類有一個(gè)方法encodeQuery()能夠?qū)η懊胬又械?O Reilly"進(jìn)行編碼。下面的代碼展示了用URIUtil類來對包含在URL中的字符串進(jìn)行編碼:
          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?);

          ??????? 這個(gè)簡單的例子用URIUtil類對兩個(gè)字符串進(jìn)行了編碼,并對一個(gè)經(jīng)過編碼的字符串進(jìn)行解碼。下面的輸出展示了每個(gè)轉(zhuǎn)換的結(jié)果:
          Encoded:?%3ctest%e3=O'Connell
          Encoded:?one%3atwo=thr%20ee#23
          Decoded:?Hello?World
          ?
          ????????
          參考:
          ??????? 在這個(gè)例子中,URLUtil對傳入的查詢字符串的內(nèi)容進(jìn)行了編碼。最近,HttpClient小組將一些URL編碼和解碼的邏輯代碼移入了Jakarta Commons Codec項(xiàng)目中,對應(yīng)的類名為URLCodec。需要URLCodec更多的信息,請參考
          Jakarta Commons Codec項(xiàng)目主頁(http://jakarta.apache.org/codec)。
          ???????? RFC1738討論了URL中的合法字符,并規(guī)定了對其他字符進(jìn)行編碼的過程。RFC1738能夠在http:// www.zvon.org/tmRFC/RFC2616/Output/index.html中找到。

          posted @ 2006-04-04 19:19 guangnian 閱讀(4771) | 評論 (1)編輯 收藏

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

          問題:
          ??????? 你需要通過HTTP GET方法來獲取信息。

          解答:
          ??????? 創(chuàng)建一個(gè)HttpClient實(shí)例,并調(diào)用以GetMethod對象為參數(shù)的executeMethod方法。然后,響應(yīng)的內(nèi)容就可以通過一個(gè)InputStream,byte[],或者是String來獲得。下面的例子將獲得 http://www.discursive.com /jccook/的內(nèi)容,并且以一個(gè)String來獲得響應(yīng)。
          ???????
          ?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/的內(nèi)容。如果響應(yīng)的狀態(tài)碼是HttpStatus.SC_OK(即200),下列響應(yīng)將被輸出到控制臺(tái):
          <html>
          ?
          <head>
          ??
          <title>JCCook?Example</title>
          ?
          </head>
          ?
          <body>
          ??
          <h1>Hello?World!</h1>
          ?
          </body>
          </html>


          討論:
          ??????? 注意這段代碼中對異常的處理。執(zhí)行一個(gè)簡單的HTTP GET需要捕捉兩個(gè)異常:HttpException和IOException。如果是發(fā)生HTTP協(xié)議錯(cuò)誤時(shí),將拋出HttpException異常;如果是發(fā)生有關(guān)網(wǎng)絡(luò)的錯(cuò)誤時(shí),將拋出IOException異常。這一章后面的例子將會(huì)忽略對異常的處理。你應(yīng)該要知道每一次調(diào)用executeMethod()都要用適當(dāng)?shù)膖ry/catch塊包裹。
          ??????? GetMethod類是HttpMethod接口的一種實(shí)現(xiàn)。HttpMethod會(huì)被HttpClient所調(diào)用。HttpMethod實(shí)現(xiàn)類的生命周期是很簡單的:一個(gè)HttpMethod實(shí)例被創(chuàng)建,然后被HttpClient調(diào)用;一旦響應(yīng)被檢測到以后,HttpMethod釋放連接并被回收使用。當(dāng)HttpMethod調(diào)用了recycle()方法,相當(dāng)于發(fā)送了一個(gè)信號給系統(tǒng)表示這個(gè)HttpMethod實(shí)例可以再被使用。releaseConnection()方法指示HttpClient釋放掉與這個(gè)HttpMethod相關(guān)聯(lián)的連接。無論在使用HttpMethod實(shí)例的過程中發(fā)生了什么,都要調(diào)用releaseConnection()來釋放網(wǎng)絡(luò)資源。
          ??????? 一旦HttpClient的executeMethod方法被調(diào)用,你可以通過HttpMethod的getStatusCode()方法來獲得響應(yīng)的狀態(tài)碼。這個(gè)方法返回一個(gè)int,對應(yīng)于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狀態(tài)列表。當(dāng)服務(wù)器返回一個(gè)錯(cuò)誤的HTTP狀態(tài)是,通常還會(huì)返回一小段信息。這一小段信息可以通過HttpMethod類的getStatusText()方法獲得。
          ?
          參考:
          ?????? 可以從RFC2616(http://www.zvon.org/tmRFC/RFC2616/Output/index.html)獲得HTTP GET方法的官方定義;
          ?????? 要獲得HTTP 狀態(tài)碼的完整列表,請參見 HttpStatus Javadoc? (http://jakarta.apache.org/commons/ httpclient/apidocs/index.html)。

          posted @ 2006-04-04 00:18 guangnian 閱讀(3940) | 評論 (0)編輯 收藏

          Jakarta Commons Cookbook

          ??? 其實(shí)Jakarta Commons類庫在Java中的地位是很重要的,它為Java程序員提供了很多可重用的工具。最近在看Jakarta Commons Cookbook 這本書,是英文版,忽然有想翻譯它的沖動(dòng)。就從我最近用到的HttpClient開始吧.......

          posted @ 2006-04-03 23:25 guangnian 閱讀(1108) | 評論 (3)編輯 收藏

          Blog開張留戀

          ?? 今天我的BLOG開張了。?

          ???? 想想自己接觸JAVA也已經(jīng)半年了,這半年來我盡情的翱翔在Java的世界里,從JDK到JSP,JDBC到Hibernate,Struts到JSF,Spring、ant、CruiseControl......我如饑似渴的吸取著所有有關(guān)Java的東西。?

          ????? 感謝Java讓我有了方向.....?
          ?

          posted @ 2006-04-03 22:23 guangnian 閱讀(315) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 南木林县| 贺州市| 大安市| 庆安县| 阿鲁科尔沁旗| 兴宁市| 子洲县| 乌拉特中旗| 凤翔县| 新营市| 治县。| 炎陵县| 福贡县| 惠东县| 郯城县| 永嘉县| 盖州市| 龙胜| 华阴市| 汕头市| 东台市| 陈巴尔虎旗| 吕梁市| 泊头市| 玛纳斯县| 香港 | 台北市| 陇川县| 通城县| 武邑县| 深泽县| 台前县| 扎兰屯市| 连南| 黄浦区| 嘉义市| 靖安县| 祁东县| 合肥市| 安远县| 罗田县|