
2006年2月24日
摘要: 廢話不多說,先看看我們最終達(dá)到的效果.? 源碼下載在文章最后。Style1:Style2:上面的tag cloud實(shí)現(xiàn)思想如下:1. Server端提供Tag的相關(guān)信息,包括TagName,Posts等,使用JSON格式傳輸數(shù)據(jù)??? 這個(gè)例子中,我使用Servlet,使用json-lib將Bean轉(zhuǎn)成JSON字符串。當(dāng)然Tag的相關(guān)信息這里只是演示,真實(shí)環(huán)境中可能就需要從數(shù)據(jù)庫取出來再處理了。?...
閱讀全文
posted @
2008-09-28 16:10 jht 閱讀(3160) |
評論 (3) |
編輯 收藏
1. response.setHeader("Cache-Control","no-cache");
This is used to prevent the browser from caching your dynamic content generated by a JSP or Servlet.
You set this attribute in the HTTP header of the response object which would tell the browser not to cache this content. So everytime you request the page again, the browser would make a new request, instead of showing you a cached page.
2.使用服務(wù)器端控制AJAX頁面緩存:??? response.setHeader( "Pragma", "no-cache" );
??? response.addHeader( "Cache-Control", "must-revalidate" );
??? response.addHeader( "Cache-Control", "no-cache" );
??? response.addHeader( "Cache-Control", "no-store" );
??? response.setDateHeader("Expires", 0);
單純的使用 xmlhttp.setRequestHeader("Cache-Control","no-cache")無效。
3.Cache-Control頭域
Cache-Control指定請求和響應(yīng)遵循的緩存機(jī)制。在請求消息或響應(yīng)消息中設(shè)置Cache-Control并不會修改另一個(gè)消息處理過程中的緩存處理過程。請求時(shí)的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應(yīng)消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各個(gè)消息中的指令含義如下:
Public指示響應(yīng)可被任何緩存區(qū)緩存。
Private指示對于單個(gè)用戶的整個(gè)或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)用戶的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。
no-cache指示請求或響應(yīng)消息不能緩存
no-store用于防止重要的信息被無意的發(fā)布。在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存。
max-age指示客戶機(jī)可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)。
min-fresh指示客戶機(jī)可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)。
max-stale指示客戶機(jī)可以接收超出超時(shí)期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時(shí)期指定值之內(nèi)的響應(yīng)消息。
Read more:
???
http://www.jiehoo.com/browser-cache-problem.htm?(作者:
Cherami?原載:
瀏覽器緩存)
???
再論怎么有效利用瀏覽器緩存之怎么避免瀏覽器緩存靜態(tài)文件???
HTTP協(xié)議header頭域- PetitPrince - 博客園
posted @
2008-09-27 10:23 jht 閱讀(16590) |
評論 (3) |
編輯 收藏
<
link?id
=
"
css
"
?rel
=
StyleSheet?type
=
"
text/css
"
?href
=
"
./button.css
"
?
/>
<
script?type
=
"
text/javascript
"
>
?
var
?cssArray?
=
?
new
?Array(
"
button.css
"
,
"
button1.css
"
,
"
button2.css
"
,
"
button3.css
"
,
"
button4.css
"
,
"
button5.css
"
,
"
button6.css
"
);
?
var
?index?
=
?
0
;
?
function
?changeCssFile()

?
{
??
var
?css?
=
?document.getElementById(
"
css
"
);
??index
++
;
??
if
(index
<
cssArray.length)

??
{
???css.href?
=
?cssArray[index];
??}
??
else
??
{
???index?
=
0
;
???css.href?
=
?cssArray[index];
??}
?}
</
script
>
?
<
a?
class
="button"
?href
="#"
?onclick
="changeCssFile()"
>
??
<
span?
id
="buttonText"
>
Change?another?style
</
span
>
?
</
a
>
posted @
2008-09-25 12:26 jht 閱讀(767) |
評論 (0) |
編輯 收藏
A:瀏覽器問題,可能會把透明區(qū)域顯示成有灰度的區(qū)域,解決辦法,轉(zhuǎn)成gif格式吧,支持比較好
see:
GIF or PNG? - Quality Web Tips
posted @
2008-09-24 23:02 jht 閱讀(1190) |
評論 (1) |
編輯 收藏
比如說下面的這個(gè)header.jsp中有中文,那么包含這個(gè)文件的網(wǎng)頁可能就會出現(xiàn)亂碼
<jsp:include page="header.jsp"></jsp:include>
解決辦法是在header.jsp里加上下面這段話:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
posted @
2008-09-23 12:46 jht 閱讀(462) |
評論 (0) |
編輯 收藏
摘要: log4j 支持運(yùn)行時(shí)修改日志的相關(guān)配置,看了一下他的source code, 用FileWatchdog這個(gè)類來做的,代碼也很簡單,通過循環(huán)在一定時(shí)間間隔讀取配置文件,如果文件變更,調(diào)用一個(gè)doOnChange()方法。如果自己要做一個(gè)支持運(yùn)行時(shí)修改配置的系統(tǒng)可參考上面的做法。下面是一段支持運(yùn)行時(shí)修改配置的系統(tǒng)Prototype代碼,和log4j的做法稍有不同,使用Observer模式,使其更加...
閱讀全文
posted @
2008-09-04 14:49 jht 閱讀(1321) |
評論 (0) |
編輯 收藏
可以用下面這個(gè)方法來做到
import
?org.apache.log4j.Logger;
import
?org.apache.log4j.PropertyConfigurator;


public
?
class
?DemoRunTimeChangeLog4J?
{

?
private
?
static
?
final
?Logger?logger?
=
?Logger.getLogger(DemoRunTimeChangeLog4J.
class
);


?
public
?
static
?
void
?main(String[]?args)?
{
??PropertyConfigurator.configureAndWatch(
"
src/log4j.configureAndWatch
"
,
60000
);
??

??
while
?(
true
)?
{

???
if
?(logger.isDebugEnabled())?
{
????logger.debug(
"
DEBUG?MESSAGE
"
);
???}
???logger.info(
"
Info?Message
"
);


???
try
?
{
????Thread.sleep(
5000
);

???}
?
catch
?(InterruptedException?e)?
{
???}
??}
?}
}
posted @
2008-09-03 17:35 jht 閱讀(634) |
評論 (0) |
編輯 收藏
自定義TagLib的時(shí)候碰到這個(gè)錯(cuò)誤,原因是編輯tld文件的時(shí)候沒有使用DTD或者Schema文件驗(yàn)證,拼寫錯(cuò)誤導(dǎo)致最終報(bào)這個(gè)錯(cuò)誤消息
如果遇到同樣問題的同學(xué),不妨檢查一下自己的tld文件對不對。
BTW: tld類的異常需要處理好
posted @
2008-08-19 15:53 jht 閱讀(7765) |
評論 (1) |
編輯 收藏
這個(gè)問題可能由兩個(gè)地方導(dǎo)致
1. 你的POJO類不是一個(gè)JavaBean,
最可能的原因是沒有一個(gè)無參構(gòu)造函數(shù)
2. 在dwr.xml里這個(gè)類的<convert>指定的不對,
或者是沒有指定
posted @
2008-08-11 11:21 jht 閱讀(4203) |
評論 (4) |
編輯 收藏
數(shù)獨(dú)游戲小程序
數(shù)獨(dú)的游戲規(guī)則很簡單:在九個(gè)九宮格里,填入1到9的數(shù)字,讓每個(gè)數(shù)字在每個(gè)行、列及九宮格里都 只出現(xiàn)一次就可以過關(guān)了!?雖然游戲的規(guī)則十分簡單,但很多人在沒有計(jì)算機(jī)輔助時(shí),常常會不小心造成違規(guī)狀況。
下面是我做的一個(gè)數(shù)獨(dú)小程序 1.0 版本,目前功能如下:
選擇外觀;
數(shù)獨(dú)自動出題;
數(shù)獨(dú)自動解題;
游戲計(jì)時(shí)功能;
開啟解答輔助功能,出錯(cuò)提示;
開啟解答輔助功能,輔助線;
程序基于Java Swing,運(yùn)行需要JRE1.6以上版本。
?
可雙擊執(zhí)行的JAR包,點(diǎn)此下載。(Napkin的LookAndFeel蠻好玩,我就一起弄在里面了)
對數(shù)獨(dú)有興趣的朋友可以玩一下這個(gè)小工具,歡迎留下寶貴意見,讓這個(gè)小程序更完善。
可能我會另開一篇日志說一下Source Code相關(guān)的東西。
?
Figure: 填值的出錯(cuò)提示
Figure: 填值的出錯(cuò)提示2
演示如何使用輔助線功能:
首先選中Enable help system選項(xiàng),
然后選擇按鈕 1 ,這時(shí)候關(guān)于 1 的輔助線開啟,把不能填1的單元格都畫了線,畫線規(guī)則是,1所在的行畫桃紅色橫線,1所在的列畫橙色豎線,1所在的九宮格畫粉色X線,如下圖,這時(shí)候我們發(fā)現(xiàn),在第五行只有第二列這一單元格格沒有被畫上線,那么這一個(gè)肯定只能填上1。
這時(shí)候我們就可以把1填入到 第五行第二列,這時(shí)輔助線會自動更新。如下圖,此時(shí)沒有可以確定填入1的單元格了,我們可以換一個(gè)數(shù)看輔助線。
?OK,我們選擇3,這時(shí)候輔助線如下,我們發(fā)現(xiàn)第五行第四格可以確定填入3這個(gè)值。
填入3之后的圖如下:
解答成功之后,會彈出恭喜解答成功的對話框。
自動解答功能可能出現(xiàn)的異常情況
當(dāng)題目比較復(fù)雜的時(shí)候,可能會彈出如下的提示異常的對話框,這是因?yàn)榻獯饠?shù)獨(dú)用了遞歸的解法,難度大時(shí)遞歸深度很深,導(dǎo)致棧溢出,可以通過運(yùn)行JVM時(shí)指定線程棧大小的方法來解決這個(gè)問題。
posted @
2008-08-02 17:32 jht 閱讀(2714) |
評論 (4) |
編輯 收藏
new & valueof & 直接賦值的區(qū)別
首先來看下面這段代碼
public static void main(String[] args) {
??String s1 = "s1";
??String s2 = new String("s2");
??String s3 = String.valueOf(12345);
}
?
編譯成class文件之后,使用eclipse class file viewer查看
?
? // Method descriptor #15 ([Ljava/lang/String;)V
? // Stack: 3, Locals: 4
? public static void main(java.lang.String[] args);
???? 0? ldc <String "s1"> [16]
???? 2? astore_1 [s1]
???? 3? new java.lang.String [18]
???? 6? dup
???? 7? ldc <String "s2"> [20]
???? 9? invokespecial java.lang.String(java.lang.String) [22]
??? 12? astore_2 [s2]
??? 13? sipush 12345
??? 16? invokestatic java.lang.String.valueOf(int) : java.lang.String [25]
??? 19? astore_3 [s3]
??? 20? return
????? Line numbers:
??????? [pc: 0, line: 12]
??????? [pc: 3, line: 13]
??????? [pc: 13, line: 14]
??????? [pc: 20, line: 20]
????? Local variable table:
??????? [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[]
??????? [pc: 3, pc: 21] local: s1 index: 1 type: java.lang.String
??????? [pc: 13, pc: 21] local: s2 index: 2 type: java.lang.String
??????? [pc: 20, pc: 21] local: s3 index: 3 type: java.lang.String
}
?
對于第一行代碼 String s1 = "s1"; 編譯成字節(jié)碼之后,對應(yīng)兩條指令,
-
ldc指令從運(yùn)行時(shí)常量池push一個(gè)值到Frame的操作數(shù)棧上面,這個(gè)值在這里就是"s1"字符串的引用,
-
astore指令將objectref存儲到局部變量,這里也就是存儲到局部變量s1。
?
對于第二行代碼???String s2 = new String("s2");編譯成字節(jié)碼之后,對于的指令也用高亮標(biāo)注出來了,這里把操作數(shù)棧的情況畫了出來,希望能幫助理解。橙色標(biāo)注的為棧頂元素。
-
new指令會在堆上創(chuàng)建對象,操作數(shù)棧里壓入創(chuàng)建的objectref,
-
dup指令復(fù)制操作數(shù)棧頂?shù)脑兀?
-
ldc指令依然是從常量池push一個(gè)值到Frame的操作數(shù)棧上,這個(gè)值是"s2"字符串的引用。?
|
"s2"_ref |
objectref |
objectref |
... |
-
invokespecial 指令調(diào)用一個(gè)方法,這里就是調(diào)用String的構(gòu)造函數(shù),調(diào)用完成之后棧上還有一個(gè)objectref?
-
astore指令將objectref存儲到局部變量,這里也就是存儲到局部變量s2。?
?
對于第三行代碼??String s3 = String.valueOf(12345); 編譯成字節(jié)碼之后對應(yīng)的指令,
-
sipush 將 12345 壓棧
-
invokestatic 調(diào)用 String.valueof(int) 方法
-
astore 將棧頂?shù)膶ο笠么鎯Φ奖镜刈兞縮3 (這里不再深究這個(gè)棧頂元素是怎么來的了)
?
PMD檢查代碼的時(shí)候,有這樣的warning: Avoid instantiating?String objects.Call String.valueOf() instead. PMD給出的原因是In JDK 1.5, calling new String() causes memory allocation. String.valueOf() is more memory friendly.
?
經(jīng)過上面的分解,我們應(yīng)該知道原因了,以后寫代碼的時(shí)候,初始化一個(gè)字符串,??String s1 = "s1"; 這樣的代碼肯定比??String s2 = new String("s2");代碼強(qiáng),將其他類型的值轉(zhuǎn)換成String的時(shí)候,valueof方法比new方法效率也高。
?
備注:
A frame is used to store data and partial results(局部變量,操作數(shù)棧), as well as to perform dynamic linking , return values for methods, and dispatch exceptions.
?
ldc指令的操作數(shù)棧: ...->...,value (value是int,float 或者 string 類型的引用)
astore的操作數(shù)棧: ...,objectref->...
new指令的操作數(shù)棧: ...->...,objectref
dup指令的操作數(shù)棧: ...,value->...,value,value
invokespecial的操作數(shù)棧: ...,objectref, [agr1,[arg2...]]->...
invloestatic的操作數(shù)棧:..., [arg1, [arg2...]]?-> ...
?
如果要理解的更透徹建議閱讀以下參考資料:
posted @
2008-07-28 14:27 jht 閱讀(1704) |
評論 (1) |
編輯 收藏
java.awt.Component.requestFocusInWindow
posted @
2008-07-22 14:34 jht 閱讀(386) |
評論 (1) |
編輯 收藏
http://m.tkk7.com/Files/jht/MyScreenSnap_2.0.zip
截圖程序,設(shè)計(jì)目標(biāo):簡單易用
支持全屏截圖和選擇截圖,運(yùn)行需要JRE1.5以上版本
在1.0版
http://m.tkk7.com/Files/jht/MyScreenSnap.zip的基礎(chǔ)上,
?? * 修改了一下主界面,增加圖片保存為BMP,GIF,JPG,PNG格式的功能
?? * 參考了
千里冰封的代碼,加上了調(diào)整選擇區(qū)域的功能
Source Code已經(jīng)包含在壓縮包里面了,有興趣的可以down下來改改。
下面是1.0版本和2.0版本的兩個(gè)界面。
posted @
2008-07-02 09:17 jht 閱讀(331) |
評論 (1) |
編輯 收藏
其實(shí)是個(gè)簡單的小問題,僅在此做個(gè)記錄。
遇到這個(gè)問題的不妨讀一下這篇文章先:Access查詢和過濾條件
http://www.fontstuff.com/access/acctut06.htm我遇到的報(bào)錯(cuò)語句如下:
update?monitor_table?set?logoffTime?='2008-04-06?16:58:54',?keyClickCount?='17'?where?userName?='abcd'?and?logonTime?='2008-04-06?16:56:36'?讀了上面的文章,知道
MS Access的時(shí)間分隔符號為 # ,而 MS SQL Server的時(shí)間分隔符為 '
所以正確的語句應(yīng)該是:
update?monitor_table?set?logoffTime?='2008-04-06?16:58:54',?keyClickCount?='17'?where?userName?='abcd'?and?logonTime?=#2008-04-06?16:56:36#?
posted @
2008-05-19 15:39 jht 閱讀(1912) |
評論 (1) |
編輯 收藏
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96616/arxml24.htm
posted @
2008-05-19 15:38 jht 閱讀(192) |
評論 (0) |
編輯 收藏
如題,有人真的遇到過這個(gè)問題,開始被問到的時(shí)候還真覺得奇怪,心想不會啊,從JDK5開始就支持這個(gè)枚舉類型了啊,為什么呢?
開始還懷疑他的JDK版本太低導(dǎo)致的,但是一看是JDK1.6的,迷惑了幾秒。。。
然后我打開了Eclipse的Java編譯選項(xiàng),
發(fā)現(xiàn)原來遇到這個(gè)問題的人的Java編譯級別設(shè)置的是1.4,如下圖,當(dāng)然就會出問題了。

呵呵,雖然,這是個(gè)小問題,但是如果遇到了還真夠新手郁悶一陣的。
posted @
2008-04-02 20:56 jht 閱讀(899) |
評論 (2) |
編輯 收藏
作者簡介
徐皓,北京航空航天大學(xué)計(jì)算機(jī)系本科生,你可以通過ertri@163.com與他聯(lián)系。
正文
不靈敏的圖形用戶界面會降低應(yīng)用程序的可用性。當(dāng)以下現(xiàn)象出現(xiàn)的時(shí)候,我們通常說這個(gè)用戶界面反應(yīng)不靈敏。
- 不響應(yīng)事件的現(xiàn)象;
- 沒有更新的現(xiàn)象
[@more@]
這些現(xiàn)象在很大程度上與事件的處理方法相關(guān),而在編寫Swing應(yīng)用程序的時(shí)候,我們幾乎必然要編寫方法去響應(yīng)鼠標(biāo)點(diǎn)擊按鈕,鍵盤回車等事件。在這些方法中我們要編寫一些代碼,在運(yùn)行時(shí)去觸發(fā)一些動作。常見動作包括查找,更新數(shù)據(jù)庫等。在這篇文章中通過對一個(gè)實(shí)例的分析,介紹了一些基本概念,常見的錯(cuò)誤以及提出了一個(gè)解決方案。
event-dispatching thread
我們一定要記住,事件響應(yīng)方法的代碼都是在event-dispatching thread中執(zhí)行的,除非你啟用另一個(gè)線程。
那么,什么是event-dispatching thread呢?在《Java Tutorial》[1]中,作者給出了一條單一線程規(guī)則:一旦一個(gè)Swing組件被實(shí)現(xiàn)(realized),所有的有可能影響或依賴于這個(gè)組件的狀態(tài)的代碼都應(yīng)該在event-dispatching thread中被執(zhí)行。而實(shí)現(xiàn)一個(gè)組件有兩種方式:
- 對頂層組件調(diào)用show(), pack(), 或者setVisible(true);
- 將一個(gè)組件加到一個(gè)已經(jīng)被實(shí)現(xiàn)的容器中。
單一線程規(guī)則的根源是由于Swing組件庫的大部分方法是對多線程不安全的,盡管存在一些例外。這些例外的情況可以在《Java Tutorial》[1]的相關(guān)章節(jié)找到,這里不再展開。
為了支持單一線程模型,Swing組件庫提供了一個(gè)專門來完成這些與Swing組件相關(guān)的操作的線程,而這一線程就是event-dispatching thread。我們的事件響應(yīng)方法通常都是由這一線程調(diào)用的,除非你自己編寫代碼來調(diào)用這些事件響應(yīng)方法。在這里初學(xué)者經(jīng)常犯的一個(gè)錯(cuò)誤就是在事件響應(yīng)方法中完成過多的與修改組件沒有直接聯(lián)系的代碼。其最有可能的效果就是導(dǎo)致組件反應(yīng)緩慢。比如以下響應(yīng)按鈕事件的代碼:
String str = null;
this.textArea.setText("Please wait...");
try {
//do something that is really time consuming
str = "Hello, world!";
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.textArea.setText(str); ? ?
執(zhí)行之后的效果就是按鈕似乎定住了一段時(shí)間,直到Done.出現(xiàn)之后才彈起來。原因就是Swing組件的更新和事件的響應(yīng)都是在event-dispatching thread中完成的,而事件響應(yīng)的時(shí)候,event-dispatching thread被事件響應(yīng)方法占據(jù),所以組件不會被更新。而直到事件響應(yīng)方法退出時(shí)才有可能去更新Swing組件。
為了解決這個(gè)問題,有人也許會試圖通過調(diào)用repaint()方法來更新組件:
final String[] str = new String[1];
this.jTextArea1.setText("Please wait...");
this.repaint();
try {
Thread.sleep(1000L);
}catch(InterruptedException e) {
e.printStackTrace();
}
str[0] = "Done.";
jTextArea1.setText(str[0]);
但是這一個(gè)方法沒有起到預(yù)期的作用,按鈕仍然定住一段時(shí)間,在察看了repaint()方法的源代碼之后就知道原因了。
PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,
new Rectangle(x, y, width, height));
Toolkit.getEventQueue().postEvent(e); ? ? ? ?
repaint()方法實(shí)際上是在事件隊(duì)列里加了一個(gè)UPDATE的事件,而沒有直接去重畫組件,而且這一個(gè)事件只能等待當(dāng)前的事件響應(yīng)方法結(jié)束之后才能被分配。因此只有繞過分配機(jī)制直接調(diào)用paint方法才能達(dá)到目的。
final String[] str = new String[1];
this.jTextArea1.setText("Please wait...");
this.paint(this.getGraphics());
try {
Thread.sleep(1000L);
}catch(InterruptedException e) {
e.printStackTrace();
}
str[0] = "Done.";
jTextArea1.setText(str[0]);
這樣卻是實(shí)現(xiàn)了更新,但是還存在著以下的問題。雖然從感覺上,按鈕已經(jīng)彈起來了,但是在Done.出現(xiàn)之前,我們卻無法按下這個(gè)按鈕。可以說按鈕還是定住了,只不過定在了彈起的狀態(tài)。調(diào)用重繪方法無法從根本上解決問題,因此我們需要尋求其他的方法。
使用多線程
有效的解決方法是使用多線程。首先看一看一個(gè)更好的解決方案,這一方案是在參考《Rethinking Swing Threading》[3]的一個(gè)程序片段完成的:
final String[] str = new String[1];
this.jTextArea1.setText("Please wait...");
this.repaint();
new Thread() {
public void run() {
try {
Thread.sleep(1000L);
}catch(InterruptedException e) {
e.printStackTrace();
}
str[0] = "Done.";
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
jTextArea1.setText(str[0]);
}
});
}
}.start();
在這個(gè)程序中,要花費(fèi)大量時(shí)間的操作被放到另一個(gè)線程當(dāng)中,從而使事件響應(yīng)方法能快速返回,event-dispatching thread就可以更新UI和響應(yīng)其它事件了。注意到這個(gè)程序使用了invokeLater()方法。invokeLater()方法的作用是讓event-dispatching thread去運(yùn)行制定的代碼。當(dāng)然也可以不使用invokeLater()方法,但是這樣就違背了單一線程原則,同時(shí)帶來了一定程度的相對多線程的不安全性。到現(xiàn)在,解決方案似乎是完美的了,但是我們看一看在原來的程序添加下面的代碼,盡管我們通常不這樣做。
public void paint(java.awt.Graphics g) {
super.paint(g);
g.drawRect(1, 1, 100, 100);
}
我們會發(fā)現(xiàn)以前畫的矩形被覆蓋了一部分,原因是由于我們沒用重畫這一個(gè)矩形,因此在結(jié)尾加上對repaint()方法的調(diào)用。
final String[] str = new String[1];
this.jTextArea1.setText("Please wait...");
this.repaint();
new Thread() {
public void run() {
try {
Thread.sleep(1000L);
}catch(InterruptedException e) {
e.printStackTrace();
}
str[0] = "Done.";
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
jTextArea1.setText(str[0]);
repaint();
}
});
}
}.start();
如果你認(rèn)為這段代碼過于缺乏可讀性,通過在《Java Tutorial》[1]里面介紹的SwingWorker來簡化編程的方法。可以通過實(shí)現(xiàn)一個(gè)construct()方法來實(shí)現(xiàn)花費(fèi)大量時(shí)間的操作和重寫finished()方法來完成組件更新的工作。
this.jTextArea1.setText("Please wait...");
final SwingWorker worker = new SwingWorker() {
public Object construct() {
try {
Thread.sleep(1000L);
}catch(InterruptedException e) {
e.printStackTrace();
}
return "Done.";
}
public void finished() {
jTextArea1.setText(getValue().toString());
repaint();
}
};
worker.start();
在《Rethinking Swing Threading》[3],作者將以上的編程方式稱為同步方式。另外作者提出了一個(gè)通過消息機(jī)制來實(shí)現(xiàn)相同功能的更清晰,但是需要編寫更多代碼的"異步"的方法。
結(jié)論
總之,我們在編寫使用Swing組件的程序是要記住以下幾點(diǎn):
1、不要過多地占用event-dispatching thread;
2、與更新組件相關(guān)的代碼要使用event-dispatching thread去執(zhí)行;
3、要更新組件。
編寫反應(yīng)靈敏的圖形用戶界面還需要考慮很多問題,以上只是最基本的一部分。歡迎有興趣的讀者來信進(jìn)行討論。
posted @
2008-03-13 17:53 jht 閱讀(574) |
評論 (0) |
編輯 收藏
打開注冊表編輯器,進(jìn)入主鍵[HKEY_CURRENT_USER\Software\Microsoft\Command Processor],將“CompletionChar”鍵值設(shè)置為9。
posted @
2008-01-30 16:40 jht 閱讀(708) |
評論 (0) |
編輯 收藏
在Struts中我們用html:errors標(biāo)簽在JSP頁面上輸出驗(yàn)證過程中產(chǎn)生的錯(cuò)誤信息,錯(cuò)誤信息一般來自于消息資源文件(xxx.properties文件,一般位于classes目錄下,文本文件),當(dāng)然錯(cuò)誤信息也可以是不是資源文件中的文本消息,而是自定義的文本。接下來將詳細(xì)講述。
先來看一個(gè)簡單例子
1、資源文件錯(cuò)誤信息來源(其格式為 key = value )
???
?? error.test = this is a test error.
2、JSP頁面中用于顯示錯(cuò)誤信息標(biāo)簽
??
?? <html:errors property="testerror"/>
3、ActionFormBean的validate()方法中產(chǎn)生錯(cuò)誤信息
?? ActionErrors error = new ActionErrors();
?? error.add("testerror",new ActionMessage("error.test"))
??
?? return error;
?
這個(gè)例子的功能就是在ActionForm Bean的validate()方法中產(chǎn)生一條名為:testerror的錯(cuò)誤信息,錯(cuò)誤信息息是資源文件中key為error.test的值。然后在頁面上用html:errors標(biāo)簽輸出testerror這條錯(cuò)誤信息。
這是最常用的一種功能,所有的錯(cuò)誤信息都在資源文件里面。
有人會問,錯(cuò)誤信息只能存放在資源文件中嗎,其實(shí)不是這樣。不需要資源文件也可以產(chǎn)生錯(cuò)誤信息。
我們再來看一下ActionMessage的另一種構(gòu)造方法:
ActionMessage(String key,boolean isresource)
如果isresource值為true,則表示key是資源文件中的key,產(chǎn)生的消息就是與key相對應(yīng)的消息
如果isresource值為false,則表示key為一條普通的消息。
如果上面的error.add改為error.add("testerror",new ActonMessage("這是一條自定義消息",false",));那么頁面上顯示的將是:這是一條自定義消息.
另外還可以用ActionMessage產(chǎn)生復(fù)合消息,比如我們要輸出:xxx不能用作用戶名,其中xxx是一個(gè)變量。
首先我們在資源文件中加一個(gè)條復(fù)合消息
testmsg = {0}不能用作用戶名。這里{0}是要被替換的參數(shù)。
我們再來看一下ActionMessage的另一中構(gòu)造方法
ActionMessage(String key,Object value0);
也就是說用value0的值來替換{0}
我們修改error.add為error.add("testerror",new ActonMessage("testmsg","毛澤東"))
那么JSP頁面上將顯示:毛澤東不能用作用戶名。
當(dāng)然在一條復(fù)合消息中也可帶多個(gè)參數(shù),參數(shù)依次為{0},{1},{2}或更多
例如:loginUser = 用戶名:{0} 姓名:{1} 登錄次數(shù):{2}.....
那么在產(chǎn)生錯(cuò)誤消息時(shí)就用new ActionMessage(String key,Object value0,Object value1,Object? value2.....)或者使用對象數(shù)組new ActionMessage(String key,Object[] values)
String[] detail = {"Admin","王晶","12"};
error.add("testerror",new ActionMessage("loginUser",detail))
Note:
Cannot find message resources under key org.apache.struts.action.MESSAGE? 錯(cuò)誤的原因是沒有配置資源文件
解決辦法: 在struts-config.xml 中加入如下的一段
<message-resources parameter="application" null="false"></message-resources>
posted @
2008-01-14 22:20 jht 閱讀(1150) |
評論 (1) |
編輯 收藏
備忘:
>?sqlplus?(
<
username
>
[/
<
password
>
][@
<
connect_identifier
>
]?|?/)?[AS?SYSDBA?|?AS?SYSOPER]?|?/NOLOG
?SQL?
>
???
desc
??user_source;
?Name???????????????????????????????????????
Null
??????Type
??
--
?---------------------------------------?--------?----------------------------?
??NAME????????????????????????????????????????????????
VARCHAR2
?(?
30
?)
?TYPE????????????????????????????????????????????????
VARCHAR2
?(?
12
?)
?LINE????????????????????????????????????????????????
NUMBER
?
??
TEXT
?????????????????????????????????????????????????
VARCHAR2
?(?
4000
?)

SQL?
>
???
select
???
TEXT
???
from
??user_source??
where
??TYPE?
=
?
'
?PROCEDURE?
'
???
and
??NAME?
=
?
'
?Your_Procedure_name?
'
?;

no?rows?selected

SQL?
>
??
var
?out_var?
number
exec
?Your_Procedure_name?(
''
,
''
,
''
,:out_var)
print
?out_var
posted @
2007-11-28 14:00 jht 閱讀(2739) |
評論 (0) |
編輯 收藏
ct protect -r -chmod 775 directory-or-file-name #Set directory/file/element protection.
posted @
2007-11-06 12:07 jht 閱讀(563) |
評論 (0) |
編輯 收藏
問題,向腳步傳遞參數(shù)的時(shí)候如何取得一個(gè)一個(gè)的option
辦法一: 就是一個(gè)一個(gè)讀 用$#取得變量個(gè)數(shù),然后讀$1 $2 $3,不是很方便
查了一下命令手冊:發(fā)現(xiàn)用getopts命令更方便,man page不是很好懂
直接看 Example.sh:
#
!/
bin
/
sh

while
?getopts?'a:b:c'?myoption
????
do
????
case
?$myoption?
in
????????a)?ls?
-
al
????????;;????
????????b)?ls?
-
l?$OPTARG????
????????;;
????????c)?ls?
-
l????
????esac
????done
用法和效果:
Example.sh -a stringa
就會執(zhí)行 ls -al 這個(gè)命令, stringa 其實(shí)不起左右,但是這個(gè)參數(shù)還是要的
Example.sh -b -lrt
那就會執(zhí)行 ls -l -lrt 傳進(jìn)去的參數(shù)起作用了
當(dāng)然也可以這樣
Example.sh -a 123 -b -lrt z, 這個(gè)作用就是兩個(gè)命令都執(zhí)行了
可以用變量保存這些OPTARG參數(shù),在while循環(huán)外面接著使用
posted @
2007-10-30 14:46 jht 閱讀(2195) |
評論 (0) |
編輯 收藏
Hibernate 提供了一個(gè)hibernate.properties的模板,稍加修改就能得到自己想要的配置效果
下面這一段XML配置文件中關(guān)于數(shù)據(jù)庫連接方式的配置,可以在hibernate.properties中完成
<?xml?version="1.0"?encoding="UTF-8"?>
<!DOCTYPE?hibernate-configuration?PUBLIC
????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"
????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
????<session-factory?name="sf">
????<!--?
????????<property?name="hibernate.connection.driver_class">
????????????org.hsqldb.jdbcDriver
????????</property>
????????<property?name="hibernate.connection.url">
????????????jdbc:hsqldb:hsql://localhost/HibernateMapping
????????</property>
????????<property?name="hibernate.connection.username">sa</property>
????????<property?name="hibernate.dialect">
????????????org.hibernate.dialect.HSQLDialect
????????</property>
?????-->
????????<mapping?package="cn.heapstack.models"?/>
????????<mapping?class="cn.heapstack.models.User"?/>
????????<mapping?class="cn.heapstack.models.UserInfo"?/>
????</session-factory>

????
</hibernate-configuration>

##?HypersonicSQL
#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
hibernate.dialect?org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class?org.hsqldb.jdbcDriver
hibernate.connection.username?sa
hibernate.connection.password
hibernate.connection.url?jdbc:hsqldb:hsql://localhost/HibernateMapping
#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


代碼示例:
Configuration?cfg?=?new?AnnotationConfiguration().configure("./hibernate.cfg.xml");
SessionFactory?sf?=?cfg.buildSessionFactory();
Session?session?=?sf.openSession();
org.hibernate.Transaction?tx=?session.beginTransaction();
tx.commit();
session.close();

posted @
2007-10-26 14:40 jht 閱讀(296) |
評論 (1) |
編輯 收藏
AnyEdit??是一個(gè)挺好用的工具,在eclipse工具欄上加了幾個(gè)常用的工具按鈕,比如全部保存。
Work Set導(dǎo)入導(dǎo)出的功能也挺有用。
AnyEdit還有自動刪除行末空格的功能,支持tab和空格的相互轉(zhuǎn)換,支持在文本編輯狀態(tài)下高亮顯示空格。
除此之外打開光標(biāo)下所在類定義或者是文件的功能也非常實(shí)用。
順便說一下,這個(gè)插件的作者還開發(fā)了不少有用的插件,可以從下面的鏈接里找到更詳細(xì)的信息
地址:?http://andrei.gmxhome.de/eclipse.html
posted @
2007-09-29 10:20 jht 閱讀(2190) |
評論 (1) |
編輯 收藏
首先看這一段簡單的log4j配置
log4j.logger.cn=debug,stdout
log4j.logger.cn.heapstack=debug,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d?[%t]?%-5p?%c?line.%L:?%m%n這個(gè)配置導(dǎo)致日志文件中輸出兩行相同的結(jié)果
原因是這樣的,第二行的logger繼承自第一行的logger,兩個(gè)logger的apperder都是指向stdout
Appender的輸出是獨(dú)立的,所以導(dǎo)致了我們使用如下代碼獲得logger的時(shí)候會輸出兩行
public static Logger logger = Logger.getLogger(cn.heapstack.demopkg.Main.class);
知道這個(gè)原因之后解決辦法也就簡單了,即我們不需要定義重復(fù)的appder,
可以把第二行最后的stdout去掉,或者注釋掉第二行,如果輸出級別相同的話
posted @
2007-09-28 09:57 jht 閱讀(1312) |
評論 (0) |
編輯 收藏
Download and some env configure
?1. download gwt version gwt-windows-1.4.60 from http://code.google.com/webtoolkit
?2. unzip gwt-windows-1.4.60.zip file
?3. set system env variable GWT_HOME to the path where you hold your gwt files
?4. add %GWT_HOME% to your env path
Google Code Home > Google Web Toolkit > Getting Started Guide , it's a good place to get start.
You could follow this guide and get a first impression of what GWT can do and how convenient it is.
Usage
projectCreator -eclipse MyProject
ApplicationCreator [-eclipse projectName] [-out dir] [-overwrite] [-ignore] className
?
Eclipse plugin
cypal.studio.for.gwt
?1. download from http://code.google.com/p/cypal-studio/ version: cypal.studio.for.gwt-RC2.zip
?2. install this eclipse plugin (install it by new local site or just copy files, it's up on you )
?
GWT Designer?

?1. download from http://www.instantiations.com/gwtdesigner/index.html
?2. during install you need to choose Eclipse base location and GWT_HOME location
?
?Study how to use this plugin,
Webdemos
http://www.instantiations.com/gwtdesigner/demos.html
GWT desinger document homePage
http://downloads.instantiations.com/DesignerDoc/integration/latest/docs/html/gwt/index.html
Tutorial: Creating a Login application
http://downloads.instantiations.com/DesignerDoc/integration/latest/docs/html/gwt/tutorial/tutorial_login.html
?
posted @
2007-09-25 15:09 jht 閱讀(462) |
評論 (1) |
編輯 收藏
Groovy Eclipse Plugin 允許你編輯編譯允許groovy腳本和類。

注意該插件正在不斷開發(fā)中,你可以查看該插件開發(fā)的最近進(jìn)展:
issues and bugs- 在Eclipse菜單里選擇: Help -> Software Updates -> Find and Install -> Search For New Features
- 點(diǎn)擊?New Remote Site
- 在?Name 字段里填名稱 (例如: Groovy)
- 將上面的URL拷貝到?URL 字段里,然后點(diǎn)擊 OK
- 選中新建Groovy站點(diǎn)然后確定
- 在?Select the Features to Install 下選中Groovy 的選項(xiàng)(確保你選擇了最新的版本)點(diǎn)擊 Next
- 接受,點(diǎn)擊?Next
- 如何默認(rèn)安裝位置可以的話,點(diǎn)擊 Finish (然后eclipse開始下載Plugin)
- 如果你看到plugin為簽名的對話框彈出來了,點(diǎn)擊 Install or Install All
這將下載并安裝Eclipse的Groovy插件.? 它需要重啟Eclipse來保證插件加載完成。
如果你想嘗試最近的開發(fā)中的版本,??可以用這個(gè)站點(diǎn): http://dist.codehaus.org/groovy/distributions/updateDev/
創(chuàng)建一個(gè) Groovy 工程
按照如下步驟創(chuàng)建一個(gè)基本的Groovy工程:
- 打開: File -> New -> Project
- 選擇 Java Project?然后點(diǎn) Next
- 在 Project Name?字段填上你工程的名字
- 在 Project Layout 下選擇 Create separate source and output folders?然后點(diǎn)擊 Finish
- 在?Package Explorer 下找到剛剛新建的工程,右擊,?選擇 Groovy -> Add Groovy Nature
到目前為止你有了一個(gè)src目錄,一個(gè)bin-groovy目錄,還有幾個(gè)庫文件。還有一個(gè)由Eclipse創(chuàng)建的bin目錄,但是因?yàn)檫^濾隱藏了。下面的幾步是為了讓bin-groovy目錄成為默認(rèn)的輸出文件夾,并且將它和src文件夾關(guān)聯(lián),使得調(diào)試工具知道從哪找關(guān)聯(lián)的源代碼和類。
- 在 Package Explorer,?右擊 "GroovyJava" 工程, 選擇: Build Path -> Configure Build Path
- 使用?Browse?按鈕,將 Default Output Folder 從bin?改為 bin-groovy
- 點(diǎn)擊?OK, OK
posted @
2007-09-23 11:19 jht 閱讀(4101) |
評論 (2) |
編輯 收藏
摘要: 使用DWR做一個(gè)demo的時(shí)候,總是報(bào)出 JS Alert: Max depth exceeded when dereferencing ...
function
?update()?
{?
//
...
閱讀全文
posted @
2007-08-12 17:54 jht 閱讀(4217) |
評論 (5) |
編輯 收藏
這個(gè)問題出現(xiàn)發(fā)生的代碼如下:

????public?String?execute()?throws?Exception?
{
????????//?String?path?=?getText("struts.multipart.saveDir");

????????try?
{
????????????int?i?=?getMyDoc().length;


????????????for?(int?j?=?0;?j?<?i;?j++)?
{
????????????????File?save?=?new?File("C:/upload/"?+?getMyDocFileName()[j]);
????????????????FileUtils.copyFile(getMyDoc()[j],?save);
????????????}

????????}?catch?(Exception?e)?
{
????????????return?ActionSupport.ERROR;
????????}
????????return?ActionSupport.SUCCESS;

????}
這是用Struts2上傳多個(gè)文件時(shí)候的一段代碼,錯(cuò)誤處理是遇到異常時(shí)return 一個(gè)ERROR,結(jié)果調(diào)用這個(gè)這個(gè)UploadAction報(bào)錯(cuò) No result defined for action .....
應(yīng)該修改成這樣,捕獲到異常時(shí)return ActionSupport.INPUT ,這樣當(dāng)頁面第一次被載入時(shí)就不會報(bào)錯(cuò)了
posted @
2007-07-26 17:29 jht 閱讀(3563) |
評論 (1) |
編輯 收藏
這個(gè)問題是在使用Struts2想做一個(gè)上傳文件的頁面時(shí)候Tomcat報(bào)出來的錯(cuò)誤,詳細(xì)信息如下:
2007-7-19 21:34:09 org.apache.catalina.core.StandardWrapperValve invoke
嚴(yán)重: Servlet.service() for servlet jsp threw exception
java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
??? at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:136)
??? at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:476)
??? at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:486)
??? at com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:517)
??? at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:542)
??? at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:515)
??? at org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:697)
??? at org.apache.struts2.dispatcher.FilterDispatcher.prepareDispatcherAndWrapRequest(FilterDispatcher.java:330)
??? at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:390)
??? at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
??? at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
??? at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
??? at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
??? at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
??? at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
??? at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
??? at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
??? at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
??? at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
??? at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
??? at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
??? at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
??? at java.lang.Thread.run(Thread.java:595)
Caused by: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
??? at org.apache.struts2.config.BeanSelectionProvider$ObjectFactoryDelegateFactory.create(BeanSelectionProvider.java:246)
??? at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:134)
??? ... 22 more
最后Google了不少文章,找到了原因:(缺少了必要的jar包)Struts2使用開源項(xiàng)目Apache Jakarta Commons FileUpload和內(nèi)建的FileUploadInterceptor攔截器實(shí)現(xiàn)文件上傳,所需的jar包如下:
commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.6.jar
xwork-2.0.1.jar
commons-io-1.3.1.jar
commons-fileupload-1.2.jar
參考資料:
在Struts 2中實(shí)現(xiàn)文件上傳
posted @
2007-07-19 21:57 jht 閱讀(17168) |
評論 (11) |
編輯 收藏
摘要: 原文地址:? http://java.sun.com/docs/books/tutorial/rmi/index.html?譯者:jht 歡迎大家對翻譯中存在的問題批判指正,謝謝大家!從Word粘帖過來之后格式有點(diǎn)問題,所以把word文檔傳上來了,點(diǎn)擊下載
RMI
?
...
閱讀全文
posted @
2007-05-09 16:59 jht 閱讀(2065) |
評論 (0) |
編輯 收藏
摘要: 一、一些概念
????WebService技術(shù)現(xiàn)在幾乎無處不在,以前玩.NET的時(shí)候最開始接觸這個(gè)概念,C#語言對WebService近似原生性的支持使我們用C#可以非常迅速的開發(fā)出一個(gè)WebService,沒有任何復(fù)雜煩擾的步驟。????后來沒有機(jī)會再在.Net Framework上面開發(fā),轉(zhuǎn)投了Java的懷抱,想要開發(fā)出一個(gè)WebService感覺比較,搞一堆命令生成一堆...
閱讀全文
posted @
2007-03-31 21:27 jht 閱讀(3687) |
評論 (3) |
編輯 收藏
摘要: 今天稍微花了點(diǎn)時(shí)間實(shí)現(xiàn)了一個(gè)java的屏幕截圖程序,功能簡單,支持全屏截圖和選擇截圖用JSmooth做了個(gè).exe程序,直接運(yùn)行就可以了,附:程序下載 http://m.tkk7.com/Files/jht/MyScreenSnap.zipJRE1.4版本的可執(zhí)行程序 http://m.tkk7.com/Files/jht/MyScreenSnap_jre1.4.zip關(guān)鍵...
閱讀全文
posted @
2007-03-29 19:19 jht 閱讀(1684) |
評論 (5) |
編輯 收藏
這個(gè)技巧比較Cool也比較基礎(chǔ)常用,關(guān)鍵技術(shù)是使用圖像重新繪制組件
看下面demo的代碼
import?java.awt.Insets;
import?javax.swing.ImageIcon;
import?javax.swing.JButton;


public?class?ImageButton?extends?JButton?
{

????private?static?final?long?serialVersionUID?=?7760427126786950870L;


????public?ImageButton(ImageIcon?icon)?
{
????????setSize(icon.getImage().getWidth(null),icon.getImage().getHeight(null));
????????setIcon(icon);
????????setMargin(new?Insets(0,0,0,0));
????????setIconTextGap(0);
????????setBorderPainted(false);
????????setBorder(null);
????????setText(null);

????}
}

稍微要解釋一下的是講button的邊框都設(shè)置成為0,還有邊框的重繪設(shè)置false,我們可以用不同的貼圖表示按鈕被選中等的狀態(tài)
使用這個(gè)組件的demoCode
????????ImageButton?button?=?new?ImageButton("images/*.png");
????????button.setPressedIcon(new?ImageIcon("images/*.png"));
????????button.setRolloverIcon(new?ImageIcon("images/*.png"));
????????button.setSelectedIcon(new?ImageIcon("images/*.png"));
????????button.setRolloverSelectedIcon(new?ImageIcon("images/*.png"));
????????button.setDisabledIcon(new?ImageIcon("images/*.png"));
????????button.setDisabledSelectedIcon(new?ImageIcon("images/*.png"));這個(gè)Hack要顯示效果好,關(guān)鍵就在于貼圖了,可見美工很重要。
我準(zhǔn)備每天Hack一篇
更多內(nèi)容,可以看Swing Hacks
參考資料:
?"
Swing Hacks by Joshua Marinacci and Chris Adamson. Copyright 2005 O'Reilly Media, Inc., 0-596-00907-0."
posted @
2007-03-28 23:57 jht 閱讀(516) |
評論 (0) |
編輯 收藏
It's easy to create a frame without title bar.Just use this method setUndecorated(true)
JFrame?frame?=?new?JFrame();
frame.setUndecorated(true);
frame.setSize(500,?200);
frame.show();
posted @
2007-03-28 13:24 jht 閱讀(410) |
評論 (0) |
編輯 收藏
Step1:創(chuàng)建帶有Native方法描述的ProcessHandler.java文件
Step2:javac 編譯該文件,生成ProcessHandler.class文件
Step3:javah ProcessHandler.class 生成pkg_ProcessHandler.h Native方法頭文件,注意包名字為pkg,所以生成的方法以pkg_開頭
Step4:使用Eclipse建立Managed Make C++ Project,在第二步選擇Shared Library,然后把剛剛生成和的pkg_ProcessHandler.h 加入工程
Step5:實(shí)現(xiàn)Native方法,從頭文件里面Copy出這個(gè)方法,完成具體實(shí)現(xiàn),編譯工程,生成dll
Step6:完成后Jni調(diào)用,注意dll庫需要在系統(tǒng)Path里,否則會出現(xiàn)java.lang.UnsatisfiedLinkError: no *** in java.library.path
?
?
除了上面的路徑問題,還有可能不能成功調(diào)用該
dll
,原因上
g++/gcc
編譯出來的東西和
java
預(yù)期的不匹配,詳細(xì)描述參考
http://m.tkk7.com/lixf/archive/2005/12/23/25177.html
〔
win32
下使用
gcc
編譯供
java
調(diào)用的
dll
須知
(jni)
,
我也是遇到問題
Google
到這篇文章的,
Solution
當(dāng)然也在該文章里面
?
參考資料:
例解 VC++ 6.0 實(shí)現(xiàn) JNI
(非爛文)
posted @
2007-01-16 15:33 jht 閱讀(341) |
評論 (0) |
編輯 收藏
摘要: 國內(nèi)Nokia手機(jī)主要參數(shù)列表 型號???所屬系列?最大Jar SizeMIDP版本?CLDC版本屏幕尺寸3105S40164KB11128x1283200S40164KB11128x1283300S40164KB11128x1283510S40164KB11128x1283530S40164KB11128x1283650S601動態(tài)分配11176x2086220S40164KB11128x128...
閱讀全文
posted @
2007-01-01 17:10 jht 閱讀(474) |
評論 (0) |
編輯 收藏
Sun Microsystems 將 J2ME 定義為“一種以廣泛的消費(fèi)性產(chǎn)品為目標(biāo)的的高度優(yōu)化的 Java 運(yùn)行時(shí)環(huán)境,包括尋呼機(jī)、移動電話、可視電話、數(shù)字機(jī)頂盒和汽車導(dǎo)航系統(tǒng)。”
J2ME最早在1999 年 6 月的JavaOne大會上被正式提出之后,J2ME 為小型設(shè)備帶來了 Java 語言的跨平臺功能,允許移動無線設(shè)備共享應(yīng)用程序。有了 J2ME,Sun 已經(jīng)使 Java 平臺能夠適應(yīng)集成了或基于小型計(jì)算設(shè)備的用戶產(chǎn)品。
J2ME實(shí)際上是一系列規(guī)范的集合,由JCP(Java Community Process)制定并發(fā)布相關(guān)的JSR(Java Specification Request),各個(gè)廠商按照規(guī)范在自己的產(chǎn)品上進(jìn)行實(shí)現(xiàn),但是必須要通過TCK(Technical Compatible Kit,兼容性測試)測試來保證兼容性。
J2ME定義了一種靈活的層次規(guī)范結(jié)構(gòu)來規(guī)范眾多的移動設(shè)備,不同層次的規(guī)范互相協(xié)作提供一個(gè)完整的移動Java平臺。
J2ME體系結(jié)構(gòu)和配置
(1)J2ME體系結(jié)構(gòu)
J2ME體系結(jié)構(gòu)基于設(shè)備的系列和類別,一個(gè)類別定義了一個(gè)特定種類的設(shè)備。移動電話、尋呼機(jī)和個(gè)人電腦記事本都是單獨(dú)的類別。對存儲器和處理能力有相近需求的若干類別的設(shè)備構(gòu)成設(shè)備的一個(gè)系列。移動電話、尋呼機(jī)和個(gè)人電腦記事本一起就是占用資源很小的設(shè)備的一個(gè)系列。
Java 虛擬機(jī)層(Java Virtual Machine Layer):是Java虛擬機(jī)的一個(gè)實(shí)現(xiàn),它是為特定設(shè)備的主機(jī)操作系統(tǒng)定制的,而且支持特定的J2ME配置(Configuration)。
配置層(Configuration Layer):配置層定義了Java虛擬機(jī)功能上和特定類別設(shè)備上可用的Java類庫的最小集。從某種程度上說,一個(gè)配置定義了Java平臺功能部分和庫的共同性,開發(fā)者可以假設(shè)這些功能部件和庫在屬于某一特定類別的所有設(shè)備上都是可用的。
框架層(Profile Layer):框架層定義了特定系列設(shè)備上可用的應(yīng)用程序編程接口(API)的最小集。框架在一個(gè)特定的配置上實(shí)現(xiàn)。應(yīng)用程序是針對特定框架編寫的,因此可以移植到支持該框架的任何設(shè)備上。一個(gè)設(shè)備可以支持多個(gè)框架。用戶和應(yīng)用程序供應(yīng)商看到最多的就是這一層。
MIDP(Mobile Information Device Profile)層:移動信息設(shè)備框架。是Java API集合,它處理諸如用戶界面、持久存儲和聯(lián)網(wǎng)等問題。
(2)J2ME配置Configuration
由上可知,J2ME組件都圍繞一個(gè)中心,這些中心被稱為“配置”(Configuration)。它們用于消費(fèi)電子和嵌入設(shè)備的特別的類。目前J2ME定義2個(gè)“配置”,這2種“配置”由于其處理運(yùn)算的能力不同而支持不同的設(shè)備對象。
Connected Limited Device Configuration(CLDC,有限連接設(shè)備配置):該“配置”定義Java應(yīng)用程序接口以及支持手持設(shè)備的技術(shù)。如手機(jī)、掌上電腦等。
Connected Device Configuration(CDC,連接設(shè)備配置):該“配置”支持“插入墻”式設(shè)備的應(yīng)用程序接口,如機(jī)頂盒等。
上述兩種“配置”,其區(qū)別在于它們應(yīng)用于的設(shè)備的能力:
CLDC設(shè)備的處理器能力有限(與臺式機(jī)比較),且存儲器大小一般只在128KB到512KB之間,而CDC系統(tǒng)則不同,它可能有32位或64位處理器,以及有限的存儲容量,不過它的下限也超過512KB。它們共同所遵循的原則是,每個(gè)不同功能的硬件設(shè)備都將被不同的虛擬機(jī)支持。
3.J2ME的簡表Profile
雖然,“配置”為一組通用設(shè)備提供了最小的Java平臺,但是開發(fā)者感興趣的是為個(gè)別設(shè)備設(shè)計(jì)應(yīng)用程序,當(dāng)他們只使用“配置”進(jìn)行開發(fā),那么所編寫的應(yīng)用程序肯定會有所欠缺。“配置”必須滿足所有設(shè)備的最小要求,而用戶界面、輸入機(jī)制和數(shù)據(jù)持久性都具有高度的設(shè)備具體性,每一種設(shè)備都有自己的方法,這些往往不在“配置”所能滿足的最小要求范圍之內(nèi)。
現(xiàn)在,5個(gè)已知簡表已經(jīng)有了規(guī)范。而每個(gè)簡表的責(zé)任都是為了完善配置的不足。
(1)MIDP簡表
MIDP(Mobile Information Device Profile,移動信息設(shè)備簡表)是第一個(gè)實(shí)現(xiàn)的簡表,它補(bǔ)充了CLDC配置,并且提供應(yīng)用程序語義和控件、用戶界面、持久存儲器、網(wǎng)絡(luò)和用于移動電話的計(jì)時(shí)器、雙通道呼叫器和其他無線電設(shè)備。
(2)PDA簡表
Palm公司是開發(fā)PDA簡表規(guī)范的領(lǐng)頭人,該簡表完善了CLDC配置,在相當(dāng)長的時(shí)間內(nèi),它都將是KJava類程序包的替代品。Java規(guī)范建議該簡表至少應(yīng)當(dāng)提供2個(gè)核心功能片段,即用戶界面顯示工具包,適合于“有限的尺寸和深度顯示”,另一個(gè)則是持久數(shù)據(jù)存儲器機(jī)制。顯示工具包應(yīng)該是抽象窗口工具包的一個(gè)子集,而持久機(jī)制將為應(yīng)用程序、數(shù)據(jù)、配置/環(huán)境信息提供簡單的數(shù)據(jù)存儲。
(3)Foundation簡表
Foundation簡表的任務(wù)是擔(dān)任一個(gè)基礎(chǔ)簡表,便于以后開發(fā)出來的提供圖形用戶接口、 網(wǎng)絡(luò)等功能的簡表附著在它之上。除了用于基礎(chǔ)簡表,F(xiàn)oundation簡表還提供完整網(wǎng)絡(luò)的支持,不管有沒有使用圖形用戶接口。
(4)Personal簡表
在當(dāng)前規(guī)范的需求下, Personal簡表提供下一代Personal Java環(huán)境。該簡表允諾,提供互聯(lián)網(wǎng)連接性和Web保真度以及一個(gè)能夠運(yùn)行Java Applets的GUI。
(5)RMI簡表
我們知道CDC配置為共享的、固定網(wǎng)絡(luò)連接信息設(shè)備提供最小的Java環(huán)境。該簡表將通過提供Java到Java的RMI來協(xié)助提供更好的網(wǎng)絡(luò)連接性。
參考資料:
J2ME無線通信編程入門?
http://www.vchelp.net/wyy/j2me/j2me_arc.asp
名詞:
Configuration
Profile
CDC
CLDC
MDIP
posted @
2007-01-01 15:22 jht 閱讀(530) |
評論 (0) |
編輯 收藏
使用OSGI還是J2ME還沒有定下來
????????針對SmartPhone 的?OSGI framework有一個(gè)來自ProSyst的Commercial版本的實(shí)現(xiàn),可以通過注冊獲得試用版的軟件,已經(jīng)注冊了,但是還沒有通過審批獲得下載權(quán)限。所以暫時(shí)OSGI的方案擱淺,下手不是那么方便,資料也少,雖然很想搞出這個(gè)玩意。
????????于是想著建個(gè)J2ME的環(huán)境試試看,發(fā)現(xiàn)Nokia Developer Suite 3.0?已經(jīng)不是新的版本,雖然網(wǎng)上搜到很多文章都是介紹3.0套件的,現(xiàn)在Nokia推薦的是
Carbide.j 1.5,明天搭環(huán)境吧準(zhǔn)備
Eclipse 3.2 + EclipseMe?+ Carbide.j 1.5 + Sun WTK 2.2
posted @
2007-01-01 00:32 jht 閱讀(567) |
評論 (1) |
編輯 收藏
摘要: 用各種網(wǎng)絡(luò)下載工具下文件的時(shí)候,大多數(shù)下載軟件支持添加批量下載任務(wù)的功能,閑暇之余coding了一個(gè)簡單的程序,實(shí)現(xiàn)批量下載.分了三個(gè)類RegFiles.java主要實(shí)現(xiàn)通配符文件地址的構(gòu)造,提供了一些輔助方法,方便的添加需要下載的URLURLFileSaver.java 實(shí)現(xiàn)將URL指向的文件保存到本地的功能FileDownLoader.java 創(chuàng)建多個(gè)線程下載大家看code,歡迎提出重構(gòu)意見...
閱讀全文
posted @
2006-12-31 15:58 jht 閱讀(1179) |
評論 (0) |
編輯 收藏
???????? 最近準(zhǔn)備畢業(yè)設(shè)計(jì)的開題報(bào)告,原來設(shè)想手機(jī)控制端使用J2ME,但是mentor給我思路說可以考慮使用OSGI,一番開導(dǎo),完全打亂了我原來的想法,思路當(dāng)然也開闊不少,我決定研究一下OSGI的可行性。
???????? 先介紹一下OSGI,如很多人一樣,對OSGI這個(gè)名詞的了解關(guān)注適于Eclipse,常見的解釋“OSGi 聯(lián)盟建立于 1999 年,是一個(gè)非贏利機(jī)構(gòu),旨在建立一個(gè)開放的服務(wù)規(guī)范。OSGi 規(guī)范為網(wǎng)絡(luò)服務(wù)定義了一個(gè)標(biāo)準(zhǔn)的、面向組件的計(jì)算環(huán)境,它最初的目的就是為各種嵌入式設(shè)備提供通用的軟件運(yùn)行平臺,屏蔽設(shè)備操作系統(tǒng)與硬件區(qū)別的中間件平臺,通過這個(gè)平臺,可以對不同軟件商提供的應(yīng)用(OSGi 中稱為 Bundle)進(jìn)行組件的生命周期管理的能力,如應(yīng)用組件可以從運(yùn)行中被安裝、升級或者移除而不需要中斷設(shè)備的操作,應(yīng)用組件可以動態(tài)的發(fā)現(xiàn)和使用其他庫或者應(yīng)用程序。由于 OSGi 技術(shù)具有服務(wù)組件模塊化、動態(tài)加載應(yīng)用等優(yōu)點(diǎn),正被越來越多的領(lǐng)域關(guān)注,如嵌入設(shè)備制造業(yè)、汽車制造業(yè)、企業(yè)應(yīng)用等。目前,OSGi 聯(lián)盟發(fā)布的最新的 OSGi 服務(wù)規(guī)范為 4.0。”
?????????? 看了OSGI的WhitePaper說OSGI應(yīng)用于多種領(lǐng)域,見下圖
??????? 我就想在我的Nokia6670手機(jī)里使用OSGI,照理來講肯定是可以搞定的,因?yàn)閃hitePaper說了不少嘛,但是目前對OSGI的了解僅限于使用Eclipse開發(fā)幾個(gè)Bundle的簡單協(xié)作,自己想想直接把這個(gè)部署到手機(jī)里貌似不太可能,然后又Google的N多資料,終于發(fā)現(xiàn)一個(gè)CLDC設(shè)備上OSGI的實(shí)現(xiàn),來自ProSyst的mBedded Server CLDC Edition,貌似有個(gè)評估版可以下載,我發(fā)現(xiàn)可以在我的Nokia機(jī)器上使用OSGI framework的希望了。還有Google到的信息是Knopflerfish的一個(gè)OSGI platform實(shí)現(xiàn)貌似是可以在SonyEricsson P900機(jī)器上跑起來了的。
??????? 郁悶的臺灣南海的地震把什么海底光纜搞掛了,這幾天國外網(wǎng)站都上不了,osgi,Knopflerfish,ProSyst都上不去,所以不能獲取進(jìn)一步深入學(xué)習(xí)資料,網(wǎng)頁都打不開非常郁悶啊!
????????不知道有沒有人部署過這樣的OSGI在手機(jī)里的應(yīng)用,總覺得這個(gè)OSGI的WhitePaper說的都是抽象層面上的,我想學(xué)習(xí)的是怎么樣把這個(gè)用起來。說OSGI規(guī)范化***,但是不知道如何用起來啊。。。希望有研究OSGI的人和我交流交流。
?????? 
???????? J2ME + WebService是個(gè)簡單的架構(gòu),J2ME開發(fā)手機(jī)上的Application,WebService提供手機(jī)和Server的信息交互。考慮過用.NET實(shí)現(xiàn)WebService,J2ME調(diào)用。這個(gè)系統(tǒng)結(jié)構(gòu)相對容易被更多人了解且容易實(shí)現(xiàn)。
???????? 兩種實(shí)現(xiàn),相對來說更想嘗試OSGI,但是OSGI卻相對來說陌生一點(diǎn),現(xiàn)在很多關(guān)于OSGI的資料也訪問不了,矛盾啊。。。
posted @
2006-12-29 22:47 jht 閱讀(1041) |
評論 (3) |
編輯 收藏
?????????到公司實(shí)習(xí)近五個(gè)月了,主要從事C++開發(fā),困擾于復(fù)雜的專家系統(tǒng)的陳舊代碼,不能說代碼寫的不好,肯定比我寫出來的C++代碼好,但是卻很難讓人讀懂,邏輯復(fù)雜,而且又缺乏Code的維護(hù),文檔也沒有,所有系統(tǒng)特性完全由前人口傳聲授,搞得很頭大。。。
?????????
?????????當(dāng)然也學(xué)習(xí)到不少東西,比如如何分析復(fù)雜的代碼,經(jīng)歷種種挫敗打擊之后,我總結(jié)出如下規(guī)律,面對一個(gè)復(fù)雜的系統(tǒng),你完全不知道它是干什么的,首先從大的角度把握系統(tǒng)的業(yè)務(wù)特性,主要完成后哪些操作,企業(yè)級別應(yīng)用不外乎數(shù)據(jù)庫的CRUD,非要區(qū)分出不同之處個(gè)人認(rèn)為就是各種應(yīng)用如何把著簡單的四種操作弄得更復(fù)雜啦!具體方法無非轉(zhuǎn)圈再轉(zhuǎn)圈!
?????????然后拆解出系統(tǒng)層次架構(gòu)的模型,在紙上畫出層次實(shí)現(xiàn)框圖有助于快速把握系統(tǒng)的層次模型。
?????????分解出層次模型之后的下一步就是關(guān)注BusinessLogic層?xùn)|西,如何系統(tǒng)層析模型不好,例如BL和DAO混雜,首先要做的是想辦法如何重構(gòu)這樣的模型,因?yàn)椴恢貥?gòu)這樣的系統(tǒng)很快你就會感覺這個(gè)項(xiàng)目沒有盡頭了,在痛苦中煎熬啊。在寫Code之前,一定要理解BL的東西,Code誰都會寫,但是要高效完成Coding工作,理解你要寫什么是前提,我自己在這個(gè)方面吃虧不少,寫出來Code,自己也不知道是干什么的,項(xiàng)目結(jié)束了,現(xiàn)在強(qiáng)烈鄙視自己了
?????????
?????????重新開始BLOG生涯了,原因:鞏固自己學(xué)習(xí)到的知識,并且將自己學(xué)習(xí)的體會于大家分享,也許我的些許經(jīng)驗(yàn)?zāi)芙o迷茫當(dāng)中的人帶來幫助,不吝嗇自己的只言片語,哪怕是不夠成熟的。另一方面,表達(dá)出自己的理解和思想,或許會獲得大家不同的評價(jià),你有一個(gè)思想我有一個(gè)思想,交換,我們就有兩個(gè)思想了!當(dāng)然,自己錯(cuò)誤的理解馬上能得到大家的糾正,這對自己知識的構(gòu)建是非常好有幫助的!
?????????下一階段學(xué)習(xí)計(jì)劃 Spring,Hibernate,有空也玩玩AJAX
?????????
posted @
2006-12-16 20:34 jht 閱讀(270) |
評論 (0) |
編輯 收藏
這篇文章在網(wǎng)上已經(jīng)被轉(zhuǎn)了無數(shù)次了,轉(zhuǎn)貼負(fù)責(zé)的有圖,不負(fù)責(zé)的圖也丟了……
再轉(zhuǎn)一次吧,我想也不為多,全當(dāng)成自己的學(xué)習(xí)資料收集了
以下內(nèi)容轉(zhuǎn)貼,因?yàn)檗D(zhuǎn)爛了,所以作者已經(jīng)不詳了……
最近我作了數(shù)據(jù)庫JSP的頻繁連接,在此給出數(shù)據(jù)庫連接池的必要性,對于JSP來說一個(gè)很好的J2EE服務(wù)器是很必要的,JBOOS,WebLogic都是很好的解決方案。
一般情況下,在使用開發(fā)基于數(shù)據(jù)庫的WEB程序時(shí),傳統(tǒng)的模式基本是按以下步驟:
1. 在主程序(如Servlet、Beans)中建立數(shù)據(jù)庫連接。
2. 進(jìn)行SQL操作,取出數(shù)據(jù)。
3. 斷開數(shù)據(jù)庫連接。
使用這種模式開發(fā),存在很多問題。首先,我們要為每一次WEB請求(例如察看某一篇文章的內(nèi)容)建立一次數(shù)據(jù)庫連接,對于一次或幾次操作來講,或許你覺察不到系統(tǒng)的開銷,但是,對于WEB程序來講,即使在某一較短的時(shí)間段內(nèi),其操作請求數(shù)也遠(yuǎn)遠(yuǎn)不是一兩次,而是數(shù)十上百次(想想全世界的網(wǎng)友都有可能在您的網(wǎng)頁上查找資料),在這種情況下,系統(tǒng)開銷是相當(dāng)大的。事實(shí)上,在一個(gè)基于數(shù)據(jù)庫的WEB系統(tǒng)中,建立數(shù)據(jù)庫連接的操作將是系統(tǒng)中代價(jià)最大的操作之一。很多時(shí)候,可能您的網(wǎng)站速度瓶頸就在于此。
其次,使用傳統(tǒng)的模式,你必須去管理每一個(gè)連接,確保他們能被正確關(guān)閉,如果出現(xiàn)程序異常而導(dǎo)致某些連接未能關(guān)閉,將導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄露,最終我們將不得不重啟數(shù)據(jù)庫。
針對以上問題,我們首先想到可以采用一個(gè)全局的Connection對象,創(chuàng)建后就不關(guān)閉,以后程序一直使用它,這樣就不存在每次創(chuàng)建、關(guān)閉連接的問題了。但是,同一個(gè)連接使用次數(shù)過多,將會導(dǎo)致連接的不穩(wěn)定,進(jìn)而會導(dǎo)致WEB SERVER的頻頻重啟。故而,這種方法也不可取。實(shí)際上,我們可以使用連接池技術(shù)來解決上述問題。首先,介紹一下連接池技術(shù)的基本原理。顧名思義,連接池最基本的思想就是預(yù)先建立一些連接放置于內(nèi)存對象中以備使用:
如圖所示,當(dāng)程序中需要建立數(shù)據(jù)庫連接時(shí),只須從內(nèi)存中取一個(gè)來用而不用新建。同樣,使用完畢后,只需放回內(nèi)存即可。而連接的建立、斷開都有連接池自身來管理。同時(shí),我們還可以通過設(shè)置連接池的參數(shù)來控制連接池中的連接數(shù)、每個(gè)連接的最大使用次數(shù)等等。通過使用連接池,將大大提高程序效率,同時(shí),我們可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。下面我們以一個(gè)名為ConnectionPool的連接池為例來看看連接池的實(shí)現(xiàn)。先看看ConnectionPool的基本屬性:
m_ConnectionPoolSize:連接池中連接數(shù)量下限
m_ConnectionPoolMax:連接池中連接數(shù)量上限
m_ConnectionUseCount:一個(gè)連接的最大使用次數(shù)
m_ConnectionTimeout:一個(gè)連接的最長空閑時(shí)間
m_MaxConnections = -1:同一時(shí)間的最大連接數(shù)
m_timer:定時(shí)器
這些屬性定義了連接池與其中的每個(gè)連接的有效狀態(tài)值。連接池的自我管理,實(shí)際上就是通過定時(shí)的對每個(gè)連接的狀態(tài)、連接的數(shù)量進(jìn)行判斷而進(jìn)行相應(yīng)操作。其管理流程如下:

通過上圖,我們可以定義出ConnectionPool要完成管理所需要的基本接口:
public class ConnectionPool implements TimerListener{
public boolean initialize() //連接池初始化
public void destroy() //連接池的銷毀
public synchronized java.sql.Connection getConnection() //取一個(gè)連接
public synchronized void close() //關(guān)閉一個(gè)連接
private synchronized void removeFromPool() //把一個(gè)連接從連接池中刪除
private synchronized void fillPool() //維護(hù)連接池大小
public synchronized void TimerEvent() //定時(shí)器事件處理函數(shù)
}
通過這幾個(gè)接口,已經(jīng)可以完成連接池的基本管理。在TimeEvent()函數(shù)中完成連接池的狀態(tài)檢驗(yàn)工作,fillPool()時(shí)連接池至少保持最小連接數(shù)。因?yàn)槲覀円4婷恳粋€(gè)連接的狀態(tài),所以還需要一個(gè)數(shù)據(jù)庫連接對象:
class ConnectionObject{
public java.sql.Connection con; public boolean inUse; //是否被使用標(biāo)志
public long lastAccess; //最近一次開始使用時(shí)間
public int useCount; //被使用次數(shù)
}
加入了ConnectionObject對象后,在ConnectionPool中操作的應(yīng)該只是ConnectionObject,而其他進(jìn)程需要的只是ConnectionObject的con屬性,因此我們再加入一個(gè)類,作為其他進(jìn)程獲得與返回連接的接口: CLASS Conn{
GetConnection(); //從連接池中取出一個(gè)有效連接
CloseConnection(); //返回連接,此時(shí)并沒有關(guān)閉連接,只是放回了連接池
DestroyPool(); //銷毀連接池
}
最后我們的整個(gè)系統(tǒng)總的架構(gòu)如下:

通過上面的介紹,我們可以看出,連接池技術(shù)的關(guān)鍵就是其自身的管理機(jī)制,以上的管理流程只是本人一點(diǎn)見解,關(guān)鍵是想向大家介紹一種思路,在此基礎(chǔ)上,您可以進(jìn)一步完善連接池技術(shù)為您所用。
posted @
2006-03-14 14:36 jht 閱讀(295) |
評論 (0) |
編輯 收藏
Adapter模式
使用Adapter模式的目的:把一個(gè)類的接口轉(zhuǎn)換成客戶端需要的接口。
適用場合:
當(dāng)你想使用一個(gè)現(xiàn)有類的功能,但是它的接口不能滿足你的需要
當(dāng)你想創(chuàng)建一個(gè)循環(huán)使用的類,用于使一些沒有相互聯(lián)系的類,或者是未知的將來會引進(jìn)的類之間協(xié)調(diào)合作完成某些功能。也就是說,這些類不必要具備一致的接口
當(dāng)你要使用數(shù)個(gè)現(xiàn)有的的子類,但是要對每一個(gè)子類進(jìn)行接口的改寫變得很不切實(shí)際。
具體的例子
變壓器(Adapter),變壓器把一種電壓變換成另一種電壓。美國的生活用電電壓是110V,而中國的電壓是220V。如果要在中國使用美國電器,就必須有一個(gè)能把220V電壓轉(zhuǎn)換成110V電壓的變壓器。這個(gè)變壓器就是一個(gè)Adapter。
客戶買回了美國的電器Machine,工作電壓110V,電器插頭為3相(陰、陽、地級),所以需要一個(gè)電壓和相級的轉(zhuǎn)換器或者說是適配器來使這個(gè)Machine能在中國使用。
一、類的Adapter模式
package Adapter;

interface 電器需要使用


{
public void 兩相插口();
public void 電壓_110V();
}

class 中國_供電


{
protected int v;
public 中國_供電()

{
v=220;
System.out.println("中國供電提供的電壓是:" +v+"V");
}
//返回中國電壓的值
public int voltage()

{
return v;
}
}
class 變壓器_相位轉(zhuǎn)換器 extends 中國_供電 implements 電器需要使用


{


public void 兩相插口()
{
System.out.println("變壓器_相位轉(zhuǎn)換器——提供三相到兩相轉(zhuǎn)換操作,返回兩相插口");
}


public void 電壓_110V()
{
v = this.voltage()/2;
System.out.println("變壓器_相位轉(zhuǎn)換器——轉(zhuǎn)換后提供電壓為:"+v+"V");
}
}


public class ClassAdapter
{


public static void main(String[] args)
{
變壓器_相位轉(zhuǎn)換器 device = new 變壓器_相位轉(zhuǎn)換器();
device.電壓_110V();
device.兩相插口();
System.out.println("經(jīng)過變壓器_相位轉(zhuǎn)換器的包裝(Warpper),在美國買來的電器能夠使用啦!^0^");

}

}

二、對象的Adapter模式
package Adapter;

interface 電器需要使用_a


{
public void 兩相插口();
public void 電壓_110V();
}

class 中國_供電_a


{
protected int v;
public 中國_供電_a()

{
v=220;
System.out.println("中國供電提供的電壓是:" +v+"V");
}
//返回中國電壓的值
public int voltage()

{
return v;
}
}
class 變壓器_相位轉(zhuǎn)換器_a implements 電器需要使用_a


{
中國_供電_a supply = new 中國_供電_a();


public void 兩相插口()
{
System.out.println("變壓器_相位轉(zhuǎn)換器——提供三相到兩相轉(zhuǎn)換操作,返回兩相插口");
}


public void 電壓_110V()
{
supply.v = supply.voltage()/2;
System.out.println("變壓器_相位轉(zhuǎn)換器——轉(zhuǎn)換后提供電壓為:"+supply.v+"V");
}
}


public class ObjectAdapter
{


public static void main(String[] args)
{
變壓器_相位轉(zhuǎn)換器_a device = new 變壓器_相位轉(zhuǎn)換器_a();
device.電壓_110V();
device.兩相插口();
System.out.println("經(jīng)過變壓器_相位轉(zhuǎn)換器的包裝(Warpper),在美國買來的電器能夠使用啦!^0^");

}

}

posted @
2006-02-24 21:13 jht 閱讀(1008) |
評論 (0) |
編輯 收藏