2011年12月16日 星期五

把 Session 寫入資料庫的方法:Session Persistent

目前的需求是要 web application 被重新 deploy 的時候,使用者必須能保留 session
原本在找用 session migration 把 session 遷移出去,deploy 完成後再遷移回來
不過後來找到比較簡單的方式,可以直接即時把 session 寫進資料庫
deploy 完成後 tomcat 會自動把 session 再抓出來。

參考資料:Tomcat 6 Session Persistence through JDBCStore

2011年12月14日 星期三

Session migration

定義(來源:http://www.roseindia.net/interviewquestions/servlet/session-tracking.shtml):
Session Migration is a mechanism of moving the session from one server to another in case of server failure. Session Migration can be implemented by:
a) Persisting the session into database
b) Storing the session in-memory on multiple servers.

關鍵字:Session migration、Session replication、Cluster
相關資源:
1、Cluster:Tomcat 叢集設置
2、用terracotta達成tomcat session
3、How to integrate two web applications having two different context paths

後來發現我需要的不是 Session migration,而是 Session Persistent,所以這篇的資料整理就先停在這了。

2011年12月7日 星期三

字串切割遇到 "點" (period) 時會回應空陣列

參考資料:http://www.velocityreviews.com/forums/t139874-string-method-split-doesnt-work.html

如上述的連結回應所說,split() 函式裡面實際上用的是 regular expression
"." 在 regular expression 中是 metacharacter
所以必須改成以下的寫法才會有效果:

String string = "aaa.bbb";
String[] result = string.split("\\.");

2011年11月29日 星期二

Java 定時執行 (1)

Java 中要定時執行某個動作,有三種選擇:
1、Timer 和 TimerTask
2、ScheduledExecutorService
3、quartz 套件
原本我是用 1 的方法來實作定時執行,但後來遇到 Timer 的 thread 難以控制的問題
如果定時執行到一半突然必須強制關閉時,Timer 很難做到讓我找出它的 thread 並且關掉
在查了一些資料後看到這篇文章:Java Timer vs ExecutorService?
其中回應裡有一段「ScheduledThreadPoolExecutor can be configured with any number of threads. Furthermore, you have full control over created threads, if you want (by providing ThreadFactory)」
而 quartz 因為不明原因把網路上找到的 sample code 貼上去以後程式就爆了
而且有看到有文章說 ScheduledExecutorService 是比較底層的 API,雖然很多事情要自己做
但也因此能夠自己對 Thread 有比較完整的控制權
因此最後是決定改用 ScheduledExecutorService 來實作定時執行。

2011年11月16日 星期三

eclipse 更換不同編輯套件

在 eclipse 上安裝了 Aptana 套件,但是用 eclipse 開啟 html 或者 js 檔的時候
預設還是會用 eclipse 自己原生的 html editor
今天突然發現原來只要設定檔案關聯就好了!XD

Window → Preferences → General → Editors → File Associations
在上半部的框框中選擇要變更的副檔名
選定後下面的框框會列出可用的編輯器
可以把想要的編輯器設為預設(點右邊的 default),下次開啟時就會自動用指定的編輯器開啟了!

2011年11月4日 星期五

jQuery 讀取 JSONArray 的方法

一般透過 $.ajax 送 JSON 格式的資料給後端處理
後端回應一個 JSON 回來,都可以直接用 .xxx 來存取回應的 JSON
例如回應的 JSON 是 {"statuscode", 200}
可以直接用:

$.ajax({
  type: "GET",
  url: endpoint,
  contentType: "application/json",
  dataType: "json",
  success: function(data){
    consile.log("statuscode: " + data.statuscode);
  },
  error: function(){
    unblock(); // TODO
  }
});

這樣在 FireFox 的 FireBug 中就會跑出:「statuscode: 200」的記錄。

當回應的 JSON 是個巢狀的 JSON array 時,則處理方式稍微複雜一點點

2011年10月29日 星期六

jQuery validate 套件:觸發驗證的事件

jQuery validate 預設的事件很奇妙
使用者按過一次 submit 觸發驗證以後,再回去改欄位內容
欄位內容就會每次 onChange 的時候都會觸發驗證
但因為有時候驗證是要送 AJAX 去給伺服器檢查
我們就不會很希望使用者每按一個鍵都會送一次 request
這樣當使用者一多的時候,或者是有人開機器人在亂按時
伺服器有可能會被這些訊息塞爆掉....

jQuery validate 套件的多國語言:更換 message 內容

在我們的專案中,由於語言資料已經寫在特定的檔案內
因此似乎不適用 jQuery validate 套件內建的 localization 方法
(我查到的資料好像都是說要把 message 寫在指定的 message.js 裡?)

要讓 error message 跟著使用者選取的語言更換,容易想到的可能作法有三種:
1、更換語言時讓整個網頁重新整理。
2、更換語言時把 validate 套件的 message dictionary 內容置換掉。
3、重新初始化 validate 套件。

其中 1 被主管打槍,主管要求我們不准重新整理網頁
2 找不到方法...(其中 disctionary 這個概念是搜尋時看到有人這麼說的,實際上我原本一直以為 validate 套件是需要時即時去讀字串的)
3 就是本篇的重點了~雖然是個笨一點的方法,但總是能夠做到效果....

2011年10月26日 星期三

Runtime.exec 容易發生的問題

最基本大概就是執行 Runtime.exec 實際上回傳的是 Process 物件
要用 InputStream 之類的物件接下來再轉成 String 才能顯示。
其他可能的問題可以參考下面的連結!

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

2011年10月25日 星期二

JSP:檔案下載

先記一下相關網址:

 

其中第二個連結有提到設定 content length,也許可以解決 UrlConnection.getContentLength = -1 的問題?

2011年10月19日 星期三

Java 的多國語言:在 ResourceBundle 中使用絕對路徑

原本 ResourceBundle 是依照 package name 來做相對路徑的
不過在我們的專案中,因為 NAND 容量不夠,必須把資源檔放在別的地方
所以只能以絕對路徑去指定它的位置。

2011年10月3日 星期一

jQuery 表單驗證的常見錯誤

這是我自己在放 validate 時沒效果,花了很多時間 debug 以後發現的幾種蠢原因...

1、$(" ").validate 必須放在 $(function(){ .... }); 內,例如:

$(function(){
 $(" ").validate( .... );
}

放在 $(function() { }); 之外的話會因為沒有被初始化,所以不會真的生效,按下 submit 按鈕就會變成沒有指定 method 和 target 的 submit 了。

2、頁面要引用 jquery.validate.js。有時候讀不到語言檔好像也可能是因為忘了引用函式庫的關係。

3、輸入的欄位們跟 submit 按鈕必須夾在 <form> .... </form> 之間。這其實我不是非常確定,但之前測試時 submit 放在 </form> 之後就沒辦法觸發 $("form").submit() 了,所以自然也不會跳進驗證。

4、變數名稱記得改.................因為驗證的程式碼常常是複製貼上的!XD

5、validate 套件看的是 name 屬性,所以需要被驗證的欄位一定都要有 name 屬性。

6、validate 觸發方法是表單被送出 (submit) 的時候觸發,所以如果 submit 按鈕是由 JavaScript 觸發,要記得加上 form 的 submit 事件 (例如 $("#form_name").submit(); )。

附帶基本使用教學:jQuery教學-jQuery.validate萬用表單驗證元件直接套用

2011年9月29日 星期四

jQuery 取得 GET 變數的方法

參考資料:Get URL parameters & values with jQuery

上面那篇文章是自己做函式取得 URL 再拆字串
也許 jQuery 本身並沒有提供函式取得?
程式碼如下 (跟上面文章內的 code 一樣):

2011年9月9日 星期五

Java 的多國語言

在 Java 上要做多國語言,方法其實不太難,只要使用 ResourceBundle 搭配 properties 檔就可以了。

2011年9月8日 星期四

使用 Java 寄信:JavaMail 範例 (2012-10-12 修正)

自己寫的寄信程式的範例~
測試過公司、以前學校的郵件伺服器(未加密),以及 Gmail、Yeah、QQ 的 SSL 連線,還有 Gmail 的 TLS 連線。
其中 TLS 連線可以參考 [1] 的討論,原本我以為 TLS 是加密連線
不過似乎 TLS 其實是明文,因此需要加密內文的 SSL 在設定屬性時要用 "smtps",但 TLS 要用 "smtp"。

2011年9月7日 星期三

ANSI 字母

之前就知道一個數字代表一個字母或符號
不過一直沒有用到過,就沒試過對應關係是怎樣 XD
今天測試了一下,其實還蠻簡單的!
 

for(int i=1 ; i<128 ; i++) {
 System.out.println(i + " " + (char)i);
}

跑出來的結果如下:
1
2
3
4
5
6
7
8
9  
10

11
12
13

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 
33 !
34 "
35 #
36 $
37 %
38 &
39 '
40 (
41 )
42 *
43 +
44 ,
45 -
46 .
47 /
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
57 9
58 :
59 ;
60 <
61 =
62 >
63 ?
64 @
65 A
66 B
67 C
68 D
69 E
70 F
71 G
72 H
73 I
74 J
75 K
76 L
77 M
78 N
79 O
80 P
81 Q
82 R
83 S
84 T
85 U
86 V
87 W
88 X
89 Y
90 Z
91 [
92 \
93 ]
94 ^
95 _
96 `
97 a
98 b
99 c
100 d
101 e
102 f
103 g
104 h
105 i
106 j
107 k
108 l
109 m
110 n
111 o
112 p
113 q
114 r
115 s
116 t
117 u
118 v
119 w
120 x
121 y
122 z
123 {
124 |
125 }
126 ~
127 

2011年5月23日 星期一

Android 函式說明設定問題

參考網址:http://stackoverflow.com/questions/4980002/problems-with-javadoc

android 的 document 好像在安裝 SDK 時本來就包含在內了
只不過大概是我的 NB 安裝時曾經有安裝過 SDK 的安裝包,後來又改用 zip 的 SDK
所以 eclipse 指向的 document 位置是錯的。

2011年5月19日 星期四

嵌入自訂內容的 Dialog

簡單的作法可以參考 [Android] AlertDialog-嵌入客製化表單
在 AlertDialog 中加入 EditText,不過上面沒有取得 EditText 內容的方法
下面是我的 code:

2011年4月29日 星期五

自訂 ListView 項目

想要讓 ListView 顯示比較複雜的樣子,可以利用自訂 Adapter 的方式來達到目的。

2011年4月5日 星期二

在模擬器中查看 SQLiteDatabase 內容

有時候直接看資料庫內容還是比較方便,可以確認寫入的資料是否正確
在模擬器中是必須先進去 Android 的 Android Debug Bridge(即 adb)模式
才有辦法讀取資料庫的檔案並且直接對資料庫下 SQL statement 查看或更改資料庫內容。

圖文說明可以參考一個大陸的網頁:adb shell下查看sqlite數據庫

2011年2月18日 星期五

DatePicker 和 Button Click 的小範例

範例內容跟 Android Developer 官方的範例其實有點類似
不過我個人傾向的事件寫法是在別的地方寫好 function
然後在設定 onClick 之類的事件時再指定到我寫好的 function
官方範例用下面這種寫法我覺得會讓程式碼很亂....

pucliv onCreate() {
  ...
  mPickDate.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      showDialog(DATE_DIALOG_ID);
    }
  });
  ...
}

2011年2月14日 星期一

@+id/name 跟 @android:id/name 的差別

官方的文件 Declaring Layout 中有以下說明:

The at-symbol (@) at the beginning of the string indicates that the XML parser should parse and expand the rest of the ID string and identify it as an ID resource. The plus-symbol (+) means that this is a new resource name that must be created and added to our resources (in the R.java file). There are a number of other ID resources that are offered by the Android framework. When referencing an Android resource ID, you do not need the plus-symbol, but must add the android package namespace, like so:

android:id="@android:id/empty"

 

意即,@ 表示 XML parser 需要將接下來的字串轉換成 ID resource,其中 @+ 表示這是新的 resource name,必須新建到 R.java 內;@android:id 則表示指向的這個 resource name 是已經存在的 resource。

2011年1月5日 星期三

Google Maps 基本範例教學

Google 官方的教學:Hello, MapView
不過覺得官方的範例教學沒有圖,有些東西就搞不太清楚~

2011年1月3日 星期一

Android 入門的相關資源

gasolin 寫的 Android 入門教學
http://code.google.com/p/androidbmi/wiki/IntroAndroid

「Brad Free School 趙令文自由學校」,也是入門教學的網站
http://school.brad.tw/mod/resource/index.php?id=67

「Android學習筆記」,有一些比較基本的 Android 範例程式碼!
http://cooking-java.blogspot.com/search/label/Android

「A Visual Guide to Android GUI Widgets」,顯示 Android 上可用的一些 view 的長相,另外這個網站本身有提供 droiddraw 這個圖形化介面,可以幫助使用者快速產生 Android 需要的介面的 XML 檔。
http://www.droiddraw.org/widgetguide.html

「國立金門大學 九十六學年度資訊工程學系專題 Android教學範例」,有一些基本應用的範例,註解也寫得還蠻詳細的~
http://gogkmit.wikidot.com/start

「靈機一動:我的專案網」,有一些比較基本的 Android 程式教學
http://www.myproject.com.tw/node/19