好幾年前寫過線上人數,當初用JSP寫 似乎 沒遇到多大的問題
最近,碰到需要檢測帳號只能同時一個在線上,才遇到了一些問題
一般有了問題才會深入,才更瞭解session的監控原理及模式
唉~~這就是所謂的半調子呀!
Session表示使用者連到系統的請求暫存記錄,每個使用者(瀏覽器)連至系統時,系統會自動給予一組Session ID去辨別這個使用者
而有些連結的資訊就會透過這組session id保留在主機,以便使用者連線使用。
在java Servlet實作session時,可透過監聽session 建立及結束當被觸發時以進行初始化及還原的動作
只要implements HttpSessionListener並實作 sessionCreated 及 sessionDestroyed method即可
或是可以針對session傳出傳入值時進行監聽,如此一來即可在傳入的時候(即使用用HttpSession的setAttribute方法時)
以及移除的時候(即使用用HttpSession的removeAttribute方法或session time out時)觸發valueBound和valueUnbound方法
只要在傳入的object implements HttpSessionBindingListener 並實作valueBound和valueUnbound 即可
這樣就可以在上述提到的時機點觸發相關的方法
因此,我們就可以利用上述特性進行客戶的日誌記錄或上線人數的統計等
而再一提的,如果要做到上線人數的統計或是像我這次記錄使用者只能一組在線上
就還要再使用一個全域的system session,在JSP是叫application (顧名思義就是整個WEB應用系統都可以使用的session)
而在Servlet,可以從session或request 取出ServletContext
(這個等同於jsp的application,有關ServletContext的敘述請參考Servlet規範),
如此就可以利用ServletContext的全局特性,去記錄和整個系統有關的資訊了!!
參考資料:Servlet中如何捕獲Session事件–MaYong – 希賽IT博客,中國最大的IT專業博客
最近在使用 StringTokenizer 發現有一些要注意的地方 與大家分享
不過可能大家都知道啦~^^
以下是我的程式碼
StringTokenizer parser = new StringTokenizer(s, v);
String[] str = new String[parser.countTokens()];
int i = 0;
while (parser.hasMoreElements()) {
str[i++] = (String) parser.nextToken();
}
當s=”,a,,c,,e,” 時,v=”,”
切開來的String arrey 竟然只有
str[0]=”a”;
str[1]=”c”;
str[2]=”e”;
那些空的不見了
最後用了s.split(“,”) 才可以看到str[0]=””;
str[1]=”a”;
str[2]=””;
str[3]=”c”;
str[4]=””;
str[5]=”e”;
以前原本想說StringTokenizer 和String.split 很像 沒想到有這種大的差異
PS.要提醒 用String.split 最後的那個, 它不會有值 …
原本想找如何利用Date() 可以得到年月日並轉成Timestamp ,不過查了JAVA API都沒有直接可以使用的method,所以就在網路上找尋,後來有看到這篇寫到一些關鍵點,小小測了一下就可以得到只有年月日的Timestamp
SimpleDateFormat df = new SimpleDateFormat(“yyyy/MM/dd 00:00:00”);
Date d1= df.parse(df.format(d.getTime()));
System.out.println(d.getTime());
System.out.println(df.format(d.getTime()));
System.out.println(d1.getTime());
PS.Timestamp :就是從1970-1-1開始起算的毫秒數..是long型態
more..
來源出處:
www.javaworld.com.tw
如何不用oracle的to_date()把Date存進資料庫
當我們在資料庫的欄位型態是DATE的時候,而我們又是用oracle,要把日期的資料塞進去通常會這樣下SQL:
1
|
"insert into order (order_id, order_date) values ('0001', to_date('2004/12/30 12:00:00','YYYY/MM/DD HH24:MI:SS'))"
|
使用oacle的to_date()的function,可以很方便的達到這個目的,但是這樣會有一個問題,就是今天如果客戶端的資料庫不想用oracle,想換另一個資料庫(ex:
SQLServer), 這樣的話就得改程式了
其實JAVA有提供一個方法,一樣可以達到這個目的,而可以不用oracle的to_date()
function
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
|
String driver = "oracle.jdbc.driver.OracleDriver'; String url = "jdbc:oracle:thin:@127.0.0.1:1521:ora1"; String user = "system"; String password = "manager"; Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, password);
String sql = "insert into order (order_id, order_date) values (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "0001");
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = (Date) format.parse("2004/12/30 12:00:00"); Timestamp ts = new Timestamp(date.getTime()); statement.setTimestamp(2, ts);
|
目標:針對某字串進行置換,但針對該字串當有符合某一條件時就不置換
說明:一般我們遇到上述時,往往會寫好長的程式進行判斷,但遇上Regular Expressions 時,短短的幾行code 就能解決啦!!
情境:今天要針對 ” 和尚端湯上塔,'和尚'端茶下塔 “這字串 進行置換, 想對 和尚 關鍵字 換成老王,但第二個有單引號的 '和尚' 不想置換
程式:
String str=” 和尚端湯上塔,'和尚'端茶下塔 “;
//二擇其一
str=str.replaceAll(“[^']?和尚[^']?”,”老王”);
str=str.replaceAll(“(?=[^'])和尚(?=[^'])”,”老王”);
簡單吧,用了一行就搞定了,這行的意思是說 非單引號任意0~1字元加上和尚,如果符合就換成老王
不過怪怪的是,照理來說第一個就可以用了,但在實戰時並無作用,但測試時卻可以~怪….=.=|||
而第二個就是自己亂組出來的 反正能用就好!!
Java 在 1.4 版後開始才加入一個 java.util.regex 的函式庫 ,但是對sed和awk這樣的Unix的標準實用工具,以及Python,Perl之類的語言來講,它早就已經成為其不可或缺的組成部分了。
正規表示式的“祖先”可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網路。
1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇標題為“神經網事件的表示法”的論文,引入了正規表示式的概念。正規表示式就是用來描述他稱為“正則集的代數”的運算式,因此採用“正規表示式”這個術語。
隨後,發現可以將這一工作應用於使用 Ken Thompson 的計算搜索演算法的一些早期研究,Ken Thompson 是 Unix 的主要發明人。正規表示式的第一個實用應用程式就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現在正規表示式都是基於文本的編輯器和搜索工具中的一個重要部分。
雖然初看起來正規表示式的語法有點讓人望而生畏,但它提供了一種精練的動態語言,使我們能用一種通用的方式來解決各種字串的問題,包括匹配,選擇,編輯以及校驗。
以前都只會用基本的Regular Expression,而且都沒有熟讀,所以半調子的用法下,就是對它產生敬畏,不過在自已實際玩了之後,還蠻容易的,加上Eclipse 工具中plug in工具 (QuickREx)可以進行驗證,這下更讓人很容易可以寫出神奇的表示式了,原本是想再更用功的,寫一篇詳細點的工具文章,不過在查了一下網路上的文章後,發現大家都寫的還不錯,所以就以純欣賞的角度來觀看其它人的文章囉 。能靈活運用Regular Expression,可以讓程式精簡、效率增強,重點是~一堆符號可以讓一些低階工程師對你景仰不已…呵~~呵!!
以下是二套在Eclipse 可以驗證Regular Expression的工具,使用蠻方便的,我目前是使用QuickRex,簡單好用,大家可以去試試看!!
QuickRex match 的字串他會highlight起來,感覺還不賴!! 但要注意的是,這裡寫好的R egular Expression的字串,在Java程式使用時,因為 \的問題,所以都要再多補一個才行喔!
Regular Expression Tester 蠻不錯用的功能,最重點的是他有tip 提示,這樣就不用在傷透腦筋時一直在翻文件了,不過這個需要license
我有閱讀的相關文章出處:
JavaWorld@TW – Java Regular Expression的學習筆記 作者:kebin_liu
Java 與 Regular Expression 作者:陳鍾誠
正则表达式——Java篇 作者:mienflying
正则表达式的历史
近期留言