目前的需求是要 web application 被重新 deploy 的時候,使用者必須能保留 session
原本在找用 session migration 把 session 遷移出去,deploy 完成後再遷移回來
不過後來找到比較簡單的方式,可以直接即時把 session 寫進資料庫
deploy 完成後 tomcat 會自動把 session 再抓出來。
Software entities (class, modules, functions, etc.) should be open for extension, but closed for modification. Junior programmers create simple solutions to simple problems. Senior programmers create complex solutions to complex problems. Great programmers find simple solutions to complex problems. 註1:本部落格的範例程式碼在 2015 年以前的文章中,大多是以全型空白做縮排。如需服用,請自行用文字編輯器的取代功能把全型空白取代成半型空白。
- Bertrand Meyer
- Charles Connell
註2:本部落格的內容授權請參閱部落格底部的授權宣告。
2011年12月16日 星期五
把 Session 寫入資料庫的方法:Session Persistent
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日 星期二
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日 星期五
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日 星期五
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日 星期三
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