2008年12月26日

java.util.Properties的應用:setProperty, getProperty, storeToXML, loadFromXML


在我們撰寫java的過程中常需要設定一些外部的參數
譬如說連線的IP位址或都某些路徑的設定
這些參數當然可以直接設定在 .java 的程式碼中
只是這樣每次更改都必須重新 compile 非常不便

所以這篇要介紹的是把 (key, value) 設定在檔案中的方法
只要透過 java.util.Properties 就可以輕鬆達到我們的目的
之後更改參數不用在程式碼中尋找,全都設定在一份檔案中即可

先說明一下下面的程式碼
首先我們還不知道 java.util.Properties 所能讀取的檔案格式
所以一開始我們先設定幾組參數後利用內建的功能產生 .xml 和 .properties
詳細的檔案格式內容我有列出來

知道格式之後我們以後就可以寫好參數在檔案中
然後再使用 function 把參數取出來,這些也有詳細的說明
以下是程式 Demo:
  1. import java.io.*;
  2. import java.util.Properties;

  3. public class PropertiesDemo {

  4. private static Properties props;

  5. public static void main(String[] args) {

  6. props = new Properties();

  7. // 用props.setProperty("key", "value")設定(key, value)配對
  8. props.setProperty("key1", "value1");
  9. props.setProperty("key2", "中文測試");

  10. // 用 props.list(System.out)在console 印出props中所有的(key, value)配對
  11. // -- listing properties --
  12. // key2=中文測試
  13. // key1=value1
  14. System.out.println("在console 印出props中所有的(key, value)配對");
  15. props.list(System.out);
  16. System.out.println();

  17. // 設定重覆的(key, value)配對會覆蓋掉
  18. // -- listing properties --
  19. // key2=中文測試
  20. // key1=更改value1
  21. System.out.println("印出更改後所有的(key, value)配對");
  22. props.setProperty("key1", "更改value1");
  23. props.list(System.out);
  24. System.out.println();

  25. try {
  26. // 輸出props中所有的(key, value)配對到xml(storeToXML)及txt(store)
  27. // 輸出後Stream不會自動關閉必須手動關閉,否則有可能出錯(不是在()中使用new時)
  28. // storeToXML(OutputStream os, Stirng comment, String encode)
  29. // storeToXML(OutputStream os, Stirng comment) encode預設使用 UTF-8
  30. props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
  31. props.store(new FileOutputStream("properties.properties"), "store");
  32. } catch (FileNotFoundException e) {
  33. e.printStackTrace();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }

  37. props.clear();

  38. try {
  39. // props.getProperty(key)讀出(key, value)配對
  40. // props.getProperty(String key, String defaultWhenNotFound)
  41. // props.getProperty(String key) throws exception when not found
  42. System.out.println("props.getProperty(key)讀出(key, value)配對");
  43. props.load(new FileInputStream("properties.properties"));
  44. System.out.println(props.getProperty("key", "test")); // default value test
  45. System.out.println(props.getProperty("key1"));
  46. props.clear();
  47. System.out.println();
  48. } catch (FileNotFoundException e) {
  49. e.printStackTrace();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }

  53. try {
  54. // 印出從 properties.xml 讀出的所有(key, value)配對
  55. System.out.println("印出properties.xml讀出的所有(key, value)配對");
  56. props.loadFromXML(new FileInputStream("properties.xml"));
  57. props.setProperty("key3", "new value");
  58. props.list(System.out);

  59. // 將新配對寫回 properties.xml,串流沒出錯
  60. props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
  61. } catch (FileNotFoundException e) {
  62. e.printStackTrace();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
輸出結果:
  1. 在console 印出props中所有的(key, value)配對
  2. -- listing properties --
  3. key2=中文測試
  4. key1=value1

  5. 印出更改後所有的(key, value)配對
  6. -- listing properties --
  7. key2=中文測試
  8. key1=更改value1

  9. props.getProperty(key)讀出(key, value)配對
  10. test
  11. 更改value1

  12. 印出properties.xml讀出的所有(key, value)配對
  13. -- listing properties --
  14. key3=new value
  15. key2=中文測試
  16. key1=更改value1
產生的 properties.properties內容:
#store
#Fri Dec 26 15:23:38 CST 2008
key2=\u4E2D\u6587\u6E2C\u8A66
key1=\u66F4\u6539value1
使用 store 所產生的文件並不直接支援中文
所以建議使用 storeToXML

產生的 properties.xml內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>storeToXML</comment>
<entry key="key3">new value</entry>
<entry key="key2">中文測試</entry>
<entry key="key1">更改value1</entry>
</properties>
關鍵字:Properties, setProperty, getProperty, storeToXML, loadFromXML, 參數

2008年12月23日

利用Google Reader 閱讀器查詢RSS訂閱數


我想只要是正常人都會好奇自己的部落格受不受歡迎,
尤其是對有認真在經營部落格的人更會想知道究竟有多少人在看在 follow,
部落格的閱讀人數除了實際頁面上的流量外,
那些默默使用RSS feed 或 ATOM feed 訂閱的人也不在少數喔。


要統計實際頁面的流量有很多工具可以使用,
只要找到喜歡的把相關的 javascript 或圖片嵌在網頁中即可。
我想這個大家都很熟悉了,google 也能找到許多教學,在這邊就不贅述了。

離題了,這篇的重點是要找出利用 Google Reader (Google 閱讀器) 訂閱部落格的人數,
只要利用 google 的查詢工具就可以很簡單的查出來囉。
範例:http://www.google.com/reader/directory/search?hl=zh&q=BLOG網址

例如這個blog的查詢:
http://www.google.com/reader/directory/search?hl=zh&q=

http://werdna1222coldcodes.blogspot.com/

就會得到下面這個頁面 (沒有人訂閱 = =)

透過以上的查詢方式,大家應該都可以看到自己的人氣旺不旺了。
如果上面的方法沒辦法使用,
也可以在 Google Reader 裡面新增自己的 BLOG 訂閱,
然後點選『查看詳細資料與統計資料』,
就可以看到訂閱這個部落格的人數了,任何部落格都可以喔 :p

關鍵字:RSS, ATOM, Feed, Feeds, 訂閱, 人數, 查詢, 統計, Google Reader, Google 閱讀器

[發佈] 電子賀卡平台


最近寫了一個電子賀卡的平台
下面這是正式版本的卡片預覽:


另外也附上最初版本的圖
我是覺得這種底色也蠻溫暖喜氣的呀 XD
感覺很有聖誕節的氣氛呢

2008年12月19日

Tomcat 刪除了 war 檔後資料夾也消失了?


我們都知道Tomcat有自動解壓縮war檔的功能
只要在Tomcat啟動時將war檔放到%Tomcat_Home%/webapps中
Tomcat就能自動解開war檔並deploy
deploy完看到產生了新的資料夾就可以使用我們所寫的服務了

一般我們這樣deploy完測試服務正常就不管war檔了
但如果這時候直接刪除war檔會連對應解開的資料夾也一起刪除喔
然後服務當然也就死了 我們在老闆的眼中也黑了 orz

要避免這種狀況其實也不需要什麼麻煩的動作
只要在刪除war檔前先把Tomcat關閉就可以了
這是我昨天發現資料夾一再被刪除後才找到的原因
本來還以為是被駭客入侵了 = =+

另外如果在webapps底下想直接修改檔案
也記得要先將war檔先刪除
否則修改過的檔案會不斷被war檔解壓縮後的內容給覆蓋
就會造成再怎麼改也不會更新的鬼打牆窘境....

關於更多更詳細的設定可以參考 Tomcat 設定技巧 - Top 10

關鍵字:Tomcat, war, deploy, delete, 刪除, 佈署, 消失, 不見
參考資料:
1. JSP_TomcatSetup
2. Tomcat 設定技巧 - Top 10

2008年12月15日

Java, Javascript 的網頁控制


這是一份關於網頁控制的簡短筆記
歡迎參考,如果有錯也請留言告知指教

# Java #
//從jsp, html讀取資訊:
String message = request.getParameter("message");
Object object = (Object)request.getAttribute("obj");

//轉換頁面:
response.sendRedirect("./NewPage.html");
//OR傳送資訊+轉換頁面:
request.getParameter("message", message);
request.setAttribute("obj", obj);
RequestDispatcher view = request.getRequestDispatcher("/NewPage.jsp");

# JavaScript #
//上一頁:
history.back();
//轉換頁面:
window.location.replace('./NewPage.html');
//自動跳轉:
setTimeout("window.location.replace('./eCard.html')", 3000);

關鍵字:Javascript, Java, url, getParameter, getAttribute, 網頁

2008年12月4日

用Javascript替中文網址轉碼:escape, encodeURI, encodeURIComponent 的比較


如果你要找線上轉碼的工具請至
Online UrlEncoder:線上轉換中文網址為UTF-8編碼

在程式或者網頁的應用中我們常常需要把中文轉換為其他編碼
例如在 Google Chart API:繪製中文圓餅圖(Pie Chart)
就需要把中文網址轉換為 UTF-8 的編碼
用Java替中文轉碼:URLEncoder 中已經介紹了使用Java來轉碼的方法
這一篇要介紹的則是Javascript中的三種轉碼工具以及這三者間的比較

首先先看到節錄自用javascript轉UTF-8編碼的編碼解碼介紹
其中紅色的部分是我自己更改的地方,與網頁內容不同

escape(String args),unescape(String args)
會處理#字元為%23,空白字元轉換為+,中文字處理為UniCode

encodeURI(String args),decodeURI(String args)
不會處理#字元,空白字元轉換為%20,中文字處理為UTF-8

encodeURIComponent(String args),decodeURIComponent(String args)
會處理#字元為%23,空白字元轉換為%20,中文字處理為UTF-8

而更詳細的區別則在對比 javascript url編碼可以看見
javascript 常用的編碼格式有:
escape(), encodeURL(), encodeURIComponent() 區別如下:

escape() 方法:
採用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都將被轉化成%xx格式的字符編碼(xx等於該字符在字符集表裡面的編碼的16進制數字)。比如,空格符對應的編碼是%20。
不會被此方法編碼的字符: @ * / +

encodeURI() 方法:
把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。
不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent() 方法:
把URI字符串採用UTF-8編碼格式轉化成 escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串裡面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之後URL將顯示錯誤。
不會被此方法編碼的字符:! * ( ) '

因此,對於中文字符串來說,如果不希望把字符串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要採用encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之後引進的,escape則在javascript1.0版本就有。

藉由以上的比較後得知如果需要用javascript處理utf-8的中文的話
那麼使用encodeURIComponent絕對是最佳的選擇
若是對英文不害怕的話可以再看看這篇文章
Handling UTF-8 in JavaScript, PHP, and Non-UTF8 Databases
應該會對UTF-8的使用更為了解

這篇javascript轉碼的應用也可以使用在
Google Chart API:繪製中文圓餅圖(Pie Chart)
趕快寫個簡單的測試網頁看看結果吧

關鍵字:javascript, UTF-8, escape, encodeURI, encodeURIComponent, url, encode, decode, 比較, 中文, 中文網址, 轉碼, 編碼
參考資料:
1. 用javascript轉UTF-8編碼
2. 對比 javascript url編碼
3. Handling UTF-8 in JavaScript, PHP, and Non-UTF8 Databases

Online UrlEncoder:線上轉換中文網址為UTF-8編碼


如果你要找的是用程式轉碼的方法
那麼請參考下面兩篇文章
用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
用Java替中文轉碼:URLEncoder








上面如果沒出現輸入框和按鈕的話可能是主機出問題了,請稍後重試或回報給我。
出現亂碼的話請選擇 UTF-8 編碼再重新讀取一次。

這個轉換工具是利用javascript所寫的
其實是為了Google Chart API:繪製中文圓餅圖(Pie Chart)所寫的
其中用到了encodeURIComponent和decodeURIComponent
可以將網址或者中文轉換為UTF-8的連結或編碼

關於轉換方式詳細的介紹可以看我寫的文章
用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
另外因為blog無法放上完整的html code
所以這篇裡頭也用到了iframe來把工具插入文章中
iframe的簡單介紹可以參考iframe語法

關鍵字:javascript, 線上, online, url, encode, decode, 中文, 中文網址, 轉碼, 編碼, UTF-8, encodeURIComponent
參考資料:
1. 用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
2. iframe語法