2009年11月30日

Apache HttpClient 4.x 使用 GET, POST 範例


 
先前我曾經發了一篇介紹如何抓取網頁的教學:
利用Jakarta.Commons.HttpClient抓取網頁、網站(Parser),不過當時用的是 HttpClient 3.1。
經過時間的演進 Apache 已經在 14 August 2009 發佈HttpComponents HttpClient 4.0 (GA)
由 3.1 到 4.0 因為底層幾乎全部重新改寫,所以也使有些舊的程式無法使用。
這篇就是我自己寫的一個簡單範例。

在看範例之前先把一些重要連結整理給大家:
想知道這次到底更動了哪些東西可以看:Apache HttpClient 首頁
官方的 Tutorial 在:Apache HttpClient Tutorial
而 API DOC、說明文件則在:Apache HttpClient apidocs

相關的程式碼、jar 檔在:HttpComponents HttpClient 4.0 (GA)
注意,在寫程式前必需先將四個 jar 檔正確匯入,最後兩個(*)是選用,
請參考:http://hc.apache.org/httpcomponents-client/quickstart.html
  • commons-logging-x.x.x.jar
  • commons-codec-x.x.x.jar
  • httpcore-x.x.x.jar
  • httpclient-x.x.x.jar
  • apache-mime4j-x.x.x.jar (*)
  • httpmime-x.x.x.jar (*)
說了這麼多,以下是程式的範例,
第一個是傳回在 google 查詢 httpclient 的結果。
第二則是傳回台大圖書館查詢 Head First Java 的結果。

 1 package demo.httpclient;
 2 
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 
 6 import org.apache.commons.httpclient.HttpStatus;
 7 import org.apache.http.HttpResponse;
 8 import org.apache.http.NameValuePair;
 9 import org.apache.http.client.methods.HttpGet;
10 import org.apache.http.client.methods.HttpPost;
11 import org.apache.http.client.utils.URLEncodedUtils;
12 import org.apache.http.entity.StringEntity;
13 import org.apache.http.impl.client.DefaultHttpClient;
14 import org.apache.http.message.BasicNameValuePair;
15 import org.apache.http.util.EntityUtils;
16 
17 /**
18 * Apache HttpClient 4.x 使用 GET, POST 查詢網頁的範例
19 *
20 * @author werdna at http://werdna1222coldcodes.blogspot.com/
21 */
22 
23 public class HttpClientDemo extends DefaultHttpClient {
24 
25     public static void main(String[] args) throws IOException {
26 
27         DefaultHttpClient demo = new DefaultHttpClient();
28         demo.getParams().setParameter("http.protocol.content-charset", "UTF-8");
29 
30         // Get Request Example,取得 google 查詢 httpclient 的結果
31         HttpGet httpGet = new HttpGet("http://www.google.com.tw/search?q=httpclinet");
32         HttpResponse response = demo.execute(httpGet);
33         String responseString = EntityUtils.toString(response.getEntity());
34         if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
35             // 如果回傳是 200 OK 的話才輸出
36             System.out.println(responseString);
37         } else {
38             System.out.println(response.getStatusLine());
39         }
40 
41         // Post Request Example,查詢台大圖書館書籍
42         ArrayList<NameValuePair> pairList = new ArrayList<NameValuePair>();
43         pairList.add(new BasicNameValuePair("searchtype", "t"));
44         pairList.add(new BasicNameValuePair("searchscope", "keyword"));
45         pairList.add(new BasicNameValuePair("searcharg", "Head First Java"));
46         pairList.add(new BasicNameValuePair("SORT", "D"));
47 
48         HttpPost httpPost = new HttpPost("http://tulips.ntu.edu.tw:1081/search*cht/a?");
49         StringEntity entity = new StringEntity(URLEncodedUtils.format(pairList, "UTF-8"));
50         httpPost.setEntity(entity);
51         response = demo.execute(httpPost);
52         responseString = EntityUtils.toString(response.getEntity());
53         if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
54             // 如果回傳是 200 OK 的話才輸出
55             System.out.println(responseString);
56         } else {
57             System.out.println(response.getStatusLine());
58         }
59     }
60 }

更多的程式範例可以參考其教學: 
HttpClient 4 HTTP request 
HttpClient 4 使用POST方式提交普通表单数据的例子

關鍵字:Apache、HttpClient、4、教學、示範、範例、設定
參考資料:
  1. Apache HttpClient 首頁
  2. HttpComponents HttpClient 4.0 (GA)
  3. Apache HttpClient Tutorial
  4. Apache HttpClient apidocs
  5. HttpClient 4 HTTP request
  6. HttpClient 4 使用POST方式提交普通表单数据的例子 

2009年11月19日

Java:Log4j 的簡單教學


 
Log4j 是目前開發 java 時很常用到的 log 套件,
以下整理一些我目前用到的功能,並附上更多更深入的教學。

首先在使用  Log4j 時我們要先將一些 jar 檔匯入,
如果有出現意外的 Exception 記得先找看看是不是有 jar 檔沒有匯入,
類似的問題將 Exception 丟到 google 就會有解答,所以在這邊就不詳細說明。
只列出官方的使用前須知:http://logging.apache.org/log4j/1.2/faq.html#1.3

(2011.10.04更新)
若您只是要快速產生或下載 Log4j 的設定檔,請參考:
Logback, Log4j 設定檔自動產生器

使用 Log4j 時我們可以建立一個 Log4j.properties 檔來描述我們要記錄的項目,
這個設定檔長得像下面這樣:
--------------------------------------------------------------------------------------------------------------
log4j.rootLogger=Info, A1, A2


# A1 is set to be a ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n

# A2 is set to be a file
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n
log4j.appender.A2.File=./log/Log4j.log
--------------------------------------------------------------------------------------------------------------
關於設定檔的詳細設定說明可以參考史帝芬心得筆記,重要部份節錄如下:
  1. 階層:
  2. Log4j將輸出訊息分成五個等級,分別為DEBUG、INFO、WARN、ERROR、FATAL,在上面設定檔將輸出等級 設為INFO,就表示INFO~FATAL等級的訊息將會輸出,因此DEBUG等級的訊息就會被忽略,如果將設定檔的 第一行改為log4j.rootLogger=DEBUG, A1, A2,就會兩個訊息都輸出了。除了這五個等級外,也可以設為ALL或OFF, ALL很示全部訊息都輸出,OFF則表示不輸出訊息。
  3. 輸出格式:
  4. # %c 輸出日誌訊息所屬的類別的全名 # %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。 # %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。 # %m 輸出訊息,如log(message)中的message。 # %n 輸出一個列尾符號。 # %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。 # %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。 # %t 輸出產生該日誌事件的線程名。 # %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。 # %f 輸出日誌訊息所屬的類別的類別名。 值得注意的是A2的appender被設為org.apache.log4j.DailyRollingFileAppender表示Log4j會將日誌檔依日期分開。
完成設定檔後可以開始寫程式,程式的內容非常簡單:
    1 package demo.log4j;
    2 
    3 import org.apache.log4j.Logger;
    4 import org.apache.log4j.PropertyConfigurator;
    5 
    6 public class Log4jDemo {
    7 
    8     static public void main(String args[]) {
    9 
   10         // 純 java project 中,若將 Log4j.properties 和 java 檔放在一起,
   11         // 則 Eclipse 會把他複製到 .class 檔的位置,(project路徑/build/classes/package路徑/檔名)
   12         // 若是 web-application 的話,會在 (project路徑/WEB-INF/classes/package路徑/檔名)
   13         PropertyConfigurator.configure("build/classes/demo/log4j/Log4j.properties");
   14         Logger logger = Logger.getLogger(Log4jDemo.class);
   15 
   16         // 對應的 Log4j.properties 設定要在等級 Info 之上才會顯示,所以logger.debug 不會出現
   17         logger.debug("Hello Log4j, this is debug message");
   18 
   19         // 以下的訊息會出現在 console 和 log file 中
   20         logger.info("Hi Log4j, this will appear in console and log file");
   21         logger.error("This is error message!!!");
   22     }
   23 }
其結果會在 console 和 log file 中出現這些log :
[09/11/19 18:44:39][INFO][demo.log4j.Log4jDemo-20] Hi Log4j, this will appear in console and log file
[09/11/19 18:44:39][ERROR][demo.log4j.Log4jDemo-21] This is error message!!!

除了將 log 寫在 console 和 log file 外,Log4j 還可以寫入其他更多地方,如 DB、Email等等,
這些應用可以參考:利用log4j實作console log + file log + mail log + db log 

關鍵字:Log4j、properties、設定檔、教學、示範、範例、設定
參考資料:
  1. Log4j 官方網站
  2. Log4j 官方網站 F&Q
  3. 史帝芬心得筆記
  4. 利用log4j實作console log + file log + mail log + db log 

Gliffy:取代 Visio 的線上繪圖網站


 
當我們想畫流程圖的時候常想到 Visio,
但因為 Visio 太貴學校公司不一定有購買故取得不易,
而且只是偶爾用卻得安裝肥大的程式,這都讓人相當不開心。

然而自從發現 Gliffy 後感覺生命出現了光采呢!(好像老套的廣告 XD)
Gliffy 這個網站如同他自己的介紹,是個 Online Diagram Software,
雖然陽春,但免費又免安裝就讓人用起來相當舒服,
而且 Visio 中比較常用到的功能也都有支援,真的相當不錯。

目前 Gliffy 有提供一些常用的圖片,也支援自己上傳,
另外也有一些基本的功能如:區塊連線、圖形旋轉、調整大小等功能,
但他的群組功能還有點小問題,建議使用時要常存檔,不然格式跑掉很慘。
在繪圖完成後 Gliffy 支援的儲存格式包括 JPG, PNG 和 SVG,
其中 SVG 格式可以透過 Visio 開啟和編輯。

關鍵字:Gliffy、Visio、線上繪圖、繪圖軟體、流程圖、破解、序號
參考資料:
  1. Gliffy
  2. [webapp] Visio 苦手的救星,線上畫圖靠 Gliffy
下面是介紹圖:


2009年11月18日

使用 Dom4j 時的 XPath 問題


 
我們使用 dom4j 時可使用 XPath 來取得特定的 node,如:
List list = document.selectNodes(specificColumnXPath);

此時可能會出現這樣的 Exception:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
其原因是因為少了 jaxen,下載 jar 檔匯入後應該就可以解決了。

另外如果確定 XPath 正確,selectNodes() 卻一直回傳空值(null)的話,
有可能是因為 xmlns 不是 default 值的關係,相關討論網址如下:
  1. JavaWorld@TW Java論壇- 請教dom4j 的 xpath 問題
  2. 主题:解决dom4j无法解析xml命名空间的问题
關於Dom4j、XPath的教學則可以參考:
  1. http://www.dom4j.org/dom4j-1.6.1/guide.html
  2.  http://www.zvon.org/xxl/XPathTutorial/General/examples.html
關鍵字:dom4j、XPath、jaxen、問題、錯誤、無法使用、xmlns、命名空間
參考資料:
  1. jaxen
  2. 在Dom4j中使用xpath
  3. JavaWorld@TW Java論壇- 請教dom4j 的 xpath 問題
  4. 主题:解决dom4j无法解析xml命名空间的问题
  5. http://www.dom4j.org/dom4j-1.6.1/guide.html
  6. http://www.zvon.org/xxl/XPathTutorial/General/examples.html   

2009年11月16日

XP常用的「開始-執行」指令


 
在XP中的「開始 - 執行」其實能做很多事,
只要輸入簡單的指令就可以省去在重重資料夾中尋找捷徑的麻煩,
對常用某些服務的人記住幾個字母的指令也許方便得多。

以下是我常用的指令,往後會慢慢更新:
  1. 計算機:calc 
  2. 工作管理員:taskmgr
  3. 遠端桌面:mstsc
  4. 登錄編輯程式:regedit
  5. 系統設定公用程式:msconfig
  6. ping
其他更多的指令可參考別人所整理的文件:開始-執行指令大全

關鍵字:Windows XP、XP、開始、執行、指令、輸入、快速
參考資料:
  1. 開始-執行指令大全

2009年11月12日

加快XP開機速度和停頓問題(ADSL使用者)


 
這篇算是給自己的小筆記。

XP的ADSL使用者常常遇到和我一樣的狀況,
就是開機時網路要等很久或停頓一下才能連線,
連帶地也影響到開機的速度。

面對這種問題可以依以下的步驟解決:
  1. 開始-連線-顯示所有連線 
  2. 區域網路-右鍵-選內容
  3. 一般-Internet Protocol(TCP/IP)-內容
  4. 使用下列的ip位址:IP位址:192.168.0.1,子網路遮罩:255.255.255.0
套用後就可以解決上面的問題了。

關於這個解法很久之前有看過說明,
大意是說XP原本設定會由DHCP自動找IP,但ADSL用戶在連線前並沒有IP,
而XP一直到檢查找不到IP後才會用ADSL連線,也因此會停頓一下。
剛剛google了一下有個大陸的網頁有說明:
如何消除XP开机ADSL拨号等待的问题

其他的XP加速法可參考:
XP使用及加速法!!

關鍵字:Windows XP、ADSL、網路連線、網路、加速
參考資料:
  1. XP使用及加速法!!
  2. 如何消除XP开机ADSL拨号等待的问题