JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 文章和新聞 » Java電子報  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:java週報 [Re:worookie]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2003-07-13 00:04 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
worookie wrote:
我後來有去定了 但還是都沒收到任何電子報說
有沒有人可以轉貼上來

this~Smile
========================================================

活動快訊> 2003 JavaTwo 專業技術大會開始起跑

* *活動網址:http://www.javatwo.net/Event/j2/2003/ * *

一年一度的「JavaTwo專業技術大會」, 於2003年8月12、13日在台北
國際會議中心盛大展開。

歷年由Sun舉辦的「JavaTwo專業技術大會」皆吸引來自全台超過千餘位
最頂尖的程式開發菁英共襄盛舉。今年的JavaTwo年度科技盛會,更不
容您錯過!

Java將成為一種統合的力量,為任何與Web相連的設備 (行動手機、醫
學設備、set top box乃至於伺服主機等) 提供更大安全性、生產力、
互通性和更強大的處理能力。Java已在全球掀起極大應用風潮,為開發
者、被授權者、企業乃至於消費者提供高附加價值,並為整個Java社群
帶來源源不絕的商機!

「JavaTwo專業技術大會」活動將涵蓋最新的技術發展趨勢,商業解決
方案,及Java應用科技發展等,兩天時間內完整呈現﹗

************************************************************
92年8月12日至8月13日 每日上午9:00至下午5:30
台北國際會議中心全館
活動網址:http://www.javatwo.net/Event/j2/2003/

電話:(02)2363-9394 白專員
傳真:(02)2363-9479

主辦單位:昇陽電腦股份有限公司

* 搶先報名特惠價:NT$3,500.
(需於7/20前完成報名及繳費)

* 優待價:NT$4,500.

* 學生特惠 - 民國68年次(含)以後出生之學生:

學生搶先優惠價:NT$2,500.
(需於7/20前完成報名及繳費)
學生優惠價  :NT$3,500.

*凡報名學員皆贈送精美JavaTwo紀念背包及限量T-Shirt 一件。
*本活動備有 「JavaTwo接駁專車」,歡迎多加利用。

今年的主講者包括侯捷先生、葉秉哲先生、蕭松瀛先生、蔡學鏞先生、
王建興先生、黃富鴻先生、歐宣修先生、胡岳偉先生、朱仲傑先生、恆
逸資訊技術總監孫三才先生、耿維德先生、東海大學周忠信教授、大同
大學鄭福炯教授、Borland李匡正先生、資策會顧忠信先生、戴玉佩小
姐、意藍科技劉保國協理、昇陽電腦王森先生、洪志鵬先生,以及
Macromedia、Nokia、Oracle、Novell、Veritas等公司的技術專家們。

詳細的各場講座資訊請至活動網站上查詢 http://www.javatwo.net/Event/j2/2003/

大會連絡E-mail:JavaTwo@mindwork.com.tw
大會貼心服務 http://www.javatwo.net/Event/j2/2003/howtogo.html

請閱讀我們的隱私條款(http://www.sun.com/privacy/). 如您不希望
收到我們的電子郵件, 請聯絡我們:JavaTwo@mindwork.com.tw
請儘速報名,並密切期待這場年度盛會的精彩內容。

--------------------------------------------------------------
洪志鵬專欄> SARS保命符

SARS終於告一段落了。它是一場災難,但是即使是再大的災難,也會
有一些人可以從中獲利。就像是戰爭再殘酷,也有軍火販子在發戰爭
財。在這波SARS疫情當中,也有小部分人得到了意想不到的好處。

當然因為SARS的關係,對某些行業來說就是重創,例如說航空業、旅
遊業,再怎麼好的航空公司或是熱門的旅遊路線就是不會有人上門。
但是其他行業,受影響的程度就輕重不一,有的行業還能趁這機會賺
上一筆。賣口罩和乾洗手的就別提了,像是我們公司可以讓員工申請
在家上班,還出錢幫要在家裡上班的人租筆記型電腦、裝設寬頻上網
、還完全補貼手機通話費用。對這些相關的廠商來說,SARS帶來的反
而是一波意外的商機。這種公司還算是好的,至少他們真的是提供了
在這個節骨眼客戶需要的東西。所以各取所需,雙方皆大歡喜。

我家附近整條馬路兩旁都是大大小小的餐廳,平常生意好的餐廳是門
庭若市,生意不好的也會有三三兩兩的客人光顧。SARS一來,馬上就
展開一波無情的生死淘汰。原來生意好得不得了的當然會受到影響,
店面會變得比較冷清;原來就生意清淡的店家,SARS就好像是駱駝背
上最後那一根稻草,客戶人數馬上從三三兩兩變成零。於是這幾家店
先後拉上鐵門,貼上暫停營業的公告。這幾天疫情緩和,政府宣布可
以恢復正常生活,但是這幾家店鐵門依然深鎖。其實這正是一個喘息
的機會,讓這些原本就經營不善的店家靜下來思考一下,這段日子不
要再進貨浪費錢、不要開門營業節省水電瓦斯費,好好地想想是不是
真的地點不好,或是東西真的不好吃,如果真是如此,倒不如就此收
手,免得錢坑越來越大。所以SARS對他們來說不啻是臨門一腳,沒有
希望做好的就趕緊收手,然後可以開始準備面對下一個全新的開始。

所謂化危機為轉機,對一些原本就搖搖欲墜的企業來說,SARS的來襲
,也給了這些人最好的藉口。雖然不太可能會起死回生轉虧為贏,但
是總是給了他們一個喘息的機會;不管是上司或是股東,在這個時候
都很難太去計較業績表現,因為有SARS,做不好好像是正常的。

小時候班上時常有同學沒有寫作業,在課堂上當場就會編出一堆爛理
由,好比說昨天晚上家裡停電,或是隔壁失火之類的,希望這些災難
可以變成自己的保命符。記得以前在公司趕專案寫程式,有時候公司
總電源不穩,三不五時就會啪一下變成一片漆黑,我們桌上的個人電
腦因為沒裝不斷電系統,當然一下子就沒電關機了。在這個時候總會
有人開始大聲嚷嚷:”我寫了一個早上的程式都毀了!”,或是更狠
一點就會大叫”我這個禮拜做的文件全部都不見了!”。每當這個時
候,熟悉內情的人就會在暗地裡偷笑,因為大家都清楚這傢伙平常根
本在打混,出了這種意外,反而可以被他拿來當作交不出東西的藉口
。一般我們在個人電腦上寫程式、準備文件,因為有惡名昭彰的微軟
作業系統,所以早就養成了隨時儲存作備份的習慣,即時碰上這種嚴
重的斷電狀況,損失的頂多是十幾分鐘以內的資料,哪有可能扯到整
個禮拜所做的事。

對有些原本就表現不好的業務人員,現在也可以光明正大地把責任推
給SARS。於是一些以前從來沒聽過的案子都跑出來了,比方說中華電
信原本有一大筆訂單要下,台積電有一個金額多麼龐大的案子要做,
結果都因為SARS只好往後延。所以老子我原本可以輕鬆達到業績的,
現在都是SARS害的,業績做不到非戰之罪。有些經營不善的公司也是
用這一套來應付投資人,這一季表現不好都是SARS害的。反正能拖多
久算多久,多拖一個月就又多領一個月薪水,等到被發現原來是自己
爛的時候再說。

不只是台灣,在這次受SARS影響的地區當中,有些原本就由於這幾年
中國的磁吸效應,或是因為全球市場的變化逐漸失去利基。這些地區
原本業績就一直在下滑,現在出現了SARS,當場也趕快好好來利用這
張保命符。於是SARS也等於是他們的救星,所有表現不佳的責任都被
SARS一肩扛下,自己就又可以苟延殘喘一陣子。

我們每年都有程度不等的天災人禍,所以這些不爭氣的人絕對不缺失
敗的藉口。幾年來我們經歷了大地震、颱風淹水、旱災缺水等等天災
,有時候還會有中共試射飛彈、美國911恐怖攻擊這種人禍,如果老是
要拿外在的環境來當藉口,絕對隨時都可以找到解釋自己為什麼失敗
的理由。

於是我們看到一些廠商,前陣子跟著喊台灣環境有多差景氣多不好,
只有前進大陸才是生存之道;現在SARS一來又倉皇逃回台灣,大嘆何
處是兒家。現在政府對很多行業推出稅捐補助,包括旅館業和客運業
的房屋稅補貼、客運業的牌照稅和燃料稅補貼、航空業的稅費補助、
還有針對營運困難產業的紓困辦法、員工薪資貸款等等,真正受到SARS
影響的企業多少得到一些補貼,原來就經營不善的公司也可以趁此機
會領到一些意外之財,聊勝於無倒也不錯。

在SARS影響下,我們也看到台灣企業的生命力。例如說五星級飯店原
本是受到衝擊最大的行業之一,但是大家看到幾家原本高高在上的飯
店都放下身段,有的推出超低價的住房方案,有的推出豐富多樣而且
高品質的餐飲外送,有的中午推出一百多塊的便當外賣,還有一家飯
店乾脆推出平價的住家清潔打掃服務,直接把原先負責打掃飯店房間
的人力外派到府服務。時機歹歹,這樣員工還是都有事做,老闆也多
少有收入,有的反而營收比平日上揚。

這就是台灣企業的生命力,我們的國家競爭力不是一直都是在逆境中
奮鬥得來的嗎?自從「國民政府轉進台灣」到現在幾十年來,我們有
哪一天是處在無憂無慮的太平日子裡?國語說「打落門牙和血吞」,
台灣話說「打斷手骨顛倒勇」,成功者在逆境中還是會自尋生路存活
下來,沒有競爭力的人只會不斷地尋找失敗的理由。看看現在各行各
業面對SARS所推出的因應方案,我想我們可以很驕傲地說,台灣廠商
還是很厲害的,大家又過五關斬六將通過這次SARS的考驗。沒有辦法
,隔壁有這種惡鄰居,我們只好不斷地吃苦當作吃補,打起精神繼續
前進,努力創造我們光明的未來。

--------------------------------------------------------------
新課快訊> 利用Netbeans/Sun ONE Studio開發Java應用程式
(7月28日到8月1日)(學生半價優惠)

講師簡介
========
講師 : 王森 先生
學歷 : 交通大學 科技管理研究所
專長語言 : C/C++ , Java
專長技術 : J2SE, J2ME, Device Driver,Palm,Windows CE,EPOC
經歷 : 系統架構顧問,技術諮詢顧問
現職 : 專欄作家, Sun教育訓練中心技術顧問及講師

課程簡介
========
NetBeans(http://www.netbeans.org)是一個開放原始碼的標準Java
開發工具。而Sun ONE studio (http://wwws.sun.com/software/sundev/jde/index.html)
則是根植於Netbeans,專注於J2EE應用程式開發的官方標準開發工具。
本課程將使以NetBeans為基礎,教導學員如何開發Java程式,使學員具
有Java基礎程式設計的能力.然後再教導如何使用最新版的Sun ONE
Studio來開發J2EE應用程式。本課程將可以成為其他Sun進階課程的
基礎,本課程會贈送?峰出版社最新出版的新書-"從Visual Basic
到 Java 完全手冊"一本。

學習對象
========
任何想進入Java程式設計領域者.想學習利用Sun官方整合開發環境(IDE)
-NetBeans與Sun ONE Studio來開發Java應用程式者。想學習基礎Java程
式設計,或J2EE程式設計者皆適合此課程。

學習資格
========
*有任何程式語言的基礎即可

學習目標
========

1.Java程式語言基礎
2.學習使用最新的Netbeans 3.5 來開發標準的Java應用程式.
3.使用Sun ONE Studio 5來開發J2EE應用程式,包括Web應用程式、EJB,
以及Java WebServices

相關課程
========
學習前:SL-110 Java初階程式設計
:SL-275 Java程式設計

學習後:SL-351 運用 EJB 技術開發進階商業元件
DTX-310 XML Presentation
DTX-330 Java網路服務程式設計
DTX-340 Java網路服務程式設計進階

時 間 :7月28日到8月1日 每天早上09:30-12:00, 13:00-16:00
費 用 : NT$ 10,000 (含稅、含午餐) (Java週報會員享有九折優惠)

**慶祝在學學生放暑假,特別推出學生半價優惠方案,只要憑 **
** "在學學生證"即可以NT$ 5,000,超低價報名此課程。Java週報會**
**員九折優惠恕不適用 **

報名方式 : 週報會員請先到http://www.javatwo.net/javaweek/
登入會員後,到"課程訊息"裡線上報名,可免去重複填資料的麻煩喔!

--------------------------------------------------------------
爪哇教室> 剖析Java Event-Delegation Model(上)(作者:林錦陽)

***********************************************************
如需圖文並茂PDF版請到以下網址下載:
http://www.javatwo.net/javaweek/history/javaweek20030709.pdf
************************************************************
*前言
=======
會想寫這篇文章,主要是因為最近實驗室有個計劃,必須Porting
Java AWT到一個Embedded Window System,這逼得筆者非得去Trace
JDK的AWT Package,而在Trace的過程中,以前一直覺得不太清楚
的Java Event運作模式,現在終於獲得解決,如果各位有留意過一
些市面上的Java書籍,不管是講Java 1.0的Event Model或是Java
1.1之後的”Event-Delegation” Model(”Source-Listener”
Model),大部分都只會提到Event該怎麼用(Event的用法),而對
於Java Event的來源和底層的原理卻是少有著墨。而本篇文章算
是筆者個人的工作心得,重點在於探討”Event的來源”以及”
Event dispatch的流程”,在此提出來跟大家分享,希望對各位
正在學Java或已經是Java高手的讀者能有所幫助,當然,非常歡
迎各位讀者來信指教,筆者將會很樂意與您一起切磋求進。

*初探Java Event Model
=======================
首先必須跟各位讀者聲明的是,由於本篇的主角乃Java 1.1之後的
Event Delegation Model(事件委派模式),因此舊有的Java 1.0
Event Model在此將不做任何討論(文後若有出現Java Event Model
,都是指Delegation Model)。再者,本篇文章重點在於探討Event
的實際運作方式,不在說明個別Event的使用方法,所以遇到關鍵
處大多只是舉例說明,點到為止,至於個別Event的使用方式,大
部分的Java書籍都會提到,筆者就不再贅述。

本篇文章的讀者必須要有一點Java Event Model的基礎,為了讓不
太清楚的讀者也能夠有繼續一探究竟的基礎,所以筆者將以簡短的
篇幅,概略性地描述Java Event-Delegation Model,當然,如果您
早已經熟悉這套Java Event Model,那麼這個單元您可以跳過不看。

學習Event Delegation Model,基本上要把握住兩個基本觀念:

事件的類別
----------
Event Delegation Model定義了許多新的事件類別(主要被放在
java.awt.event這個package),而事件類別的階層關係如圖1所示。
所有事件類別均為java.util.EventObject這個類別的子類別,而這
個類別中有個重要的成員-source(型態為Object),它代表了發生事
件的元件,在Event Delegation Model中就是靠它來找到發生事件
的來源物件,是不可或缺的成員之一,可由getSource()取得發生事
件的元件。

圖1 (略)

而緊接著繼承下來的是java.awt.AWTEvent,此類別為java.awt.event
package中所有事件類別的超類別。而這個類別中同樣有個相當重要
的成員-id(為整數型態),它代表了Event的Type,如MouseEvent就可
以表示七種不同型態的滑鼠事件如下: MOUSE_PRESSED、MOUSE_RELEASED
、MOUSE_CLICKED、MOUSE_ENTERED、MOUSE_EXITED、MOUSE_MOVED、
MOUSE_DRAGGED。在Event dispatch的過程中,就是由Event的Type來
決定最後的Event-Handler,可由getID()取出該Event的Type。由此
可知,所有java.awt.event package中所定義的事件類別都具有兩個
最基本也是最重要的屬性-source和id。

委派的機制
----------
在說明事件委派機制之前,必須先弄清楚兩個重要的角色分別是
Event-Source跟Event-Listener。Source代表了發生事件的來源物件,
可能是一個Button或是Frame…,而Listener則代表了事件委派者,也
就是被Source委託來處理Event的被委派者。當某個Source有Event發
生時,Source本身會先收到該Event,接著再把Event交給對應的被委
託者(事件委派者)來處理,所以用來處理Event的Event-Handler必須
被實作在事件委派者。

由圖2中可以看出Source跟Listener之間的關係,而且Source是以
Multicast的方式把Event送到各個Listeners手上; 換言之,在Source
發生的Event,可以交由多個事件委派者來處理(這是Event Delegation
Model的特點之一)。

圖2 (略)

再來必須要知道的是,Source跟Listener之間的委託關係是如何建立
的呢?建立的方式很簡單,只要透過Source所提供的addXXXListener
(ListenerClass) (Ex: addActionListener)並傳入對應的ListenerClass
物件[此物件必須實作XXXXListener的介面,否則無法通過編譯],便可
以讓Source和Listener建立委託關係。通常Source會有某些特定可以
處理的Events(例如Button可以處理ActionEvent),只要是Source可以
處理的Event,Source中便會有對應的addXXXListener來提供建立委託
關係的管道,當然相對的removeXXXListener便是解除委託關係的方法
。再次強調,前面所謂的ListenerClass物件,指的就是implements
XXXListener介面的物件,每個java.awt.event package中所定義的
Event都會有對應的Event Listener。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
以下便是一個簡單的例子(處理ActionEvent):
import java.awt.event.
*;public class ButtonHandler implements ActionListener{  
public void actionPerformed(ActionEvent e){ //實作之Event-Handler
    System.out.println(“Action OK!”);
}
}

-----------------------------------------------------------
import java.awt.*
;public class MyButtonTest{
  public static void main(String args[]){
    Frame f = new Frame(“Hello”);
    Button b = new Button(“test”);
    b.addActionListener(new ButtonHandler()); //建立委託關係(註冊)
    f.add(b, BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
  }
}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

最後針對Source以及Listener做個小結論:

Event-Source |負責接收Events,再dispatch到已經註冊過的listener objects。
|所以基本上Event Source必須具備註冊的功能(by addXXXListener)

Event-Listener |負責實作出對應之Event Handlers。必須implements java.awt.event
|package中的Listener interface。

*Event從何而來? 往哪裡去?

聰明的讀者們,相信你們第一次使用Java寫GUI程式時,一定跟筆者
同樣有個疑問,那就是Java的Event究竟從何而來?畢竟,事件驅動是
GUI程式的基本精神之一,然而卻由於Java本身是直譯式(interpret)
語言,大部分Java語言底層的介面都交由Java虛擬機器(Virtual
Machine)這個幕後的大黑手來處理,所以我們從Java的Program(.java)
中,看不到任何像傳統寫Window程式(EX:Win32 SDK)所必須去handle
的Message Loop。當然這對Programmer而言是件好事(因為複雜度減
少),但是追根究底,Java GUI程式的底層,還是會有個Message Loop
,從System Queue或Application Queue中捕捉Message,並一路包裝
到Java這一層來處理。而這就是本篇文章所要探討的主題之一。

我們知道在Win32系統中,當我們執行某個Application(GUI程式),
系統背後會提供這個Application可以使用的System/Application
Queue,程式會不斷到這些Queue來GetMessage(不管是系統或是其他
應用程式送過來的訊息),若發現訊息,就處理之;若沒有訊息,則
把控制權交還給系統。那Java呢? Java的Event Model是不是也有
類似的機制呢?答案是肯定的!

由於java.awt.event 這個package位在java.awt的下一層目錄,所
以我們直接到JDK(必須1.1以上的版本,筆者採用的版本為JDK1.1.6)
所附的Class Library Source中的java/awt這個目錄去瞧瞧,果然
,我們看到了一個叫做EventQueue的類別,從這個類別中我們發現
了兩個Key Points:

1.EventQueue中有個"queue"的私有資料成員,其宣告如下:
  private EventQueueItem queue;

再來我們看看EventQueueItem的類別定義:
  class EventQueueItem {
    AWTEvent event;
      int id;
      EventQueueItem next;
    EventQueueItem(AWTEvent evt) {
    event = evt;
      id = evt.getID();
    }
  }
EventQueueItem中的event跟id不就是Java Event Model中,所有
Event類別 最基本且最必要的資料嗎!而EventQueue中的queue則
是用來存放所有被丟到 Java EventQueue的Events。

2.在EventQueue的建構子當中(如下):
public EventQueue() {
queue = null;
String name = "AWT-EventQueue-" + nextThreadNum();
new EventDispatchThread(name, this).start();
}
我們發現了一個Java Event Model中很重要的角色-"EventDispatchThread"
,原來在EventQueue物件被產生的同時,會有一條名叫EventDispatchThread
的Thread物件被產生,這究竟代表什麼呢?各位讀者們,你們已經想到
為什麼要這麼做了嗎?如果還沒想出來,就繼續往下看囉...^O^.
 
由EventDispatchThread的名稱來看,顧名思義,它應該就是我們要
找尋的訊息分派者,每當系統的EventQueue被產生,一條對應的
EventDispatchThread便會同時被產生,並擔任這個EventQueue的
Dispatcher。我們可由new EventDispatchThread時所傳入的第二個
參數--this(也就是EventQueue本身)看出端倪。

接下來我們就直接到EventDispatchThread.java看個究竟吧。首先我
們發現此EventDispatchThread是繼承自Thread,這在意料之中,不過
既然是Thread物件,那當然就直攻run() method囉! 以下是部分
run() method的code:
 
 public void run() {
while (doDispatch) {
    try {
      AWTEvent event = theQueue.getNextEvent();
      //theQueue就是之前傳進來的EventQueue
  ...
   Object src = event.getSource();
if (src instanceof Component) {
   ((Component)src).dispatchEvent(event);
} else if (src instanceof MenuComponent) {
((MenuComponent)src).dispatchEvent(event);
...
    }
    ...
}
catch(...)
    ...
   }//end while
}

果然,如我們所料,EventDispatchThread會不斷向EventQueue拿Event
(by theQueue.getNextEvent( )Wink,接著再根據抓回的Event,判斷其
Source(也就是發生Event的來源物件),如果Source為Component物件,
則交給Component物件的dispatchEvent(event)來繼續dispatching的工
作;如果是MenuComponent物件,同理,交由MenuComponent的dispatchEvent
(event)來繼續dispatching的工作。簡言之,EventDispatchThread的
角色就相當於Win32的Message Loop,不僅僅負責抓Message,同時也負
責Message Dispatching的工作。說到這裡,各位讀者是否對Java Event
Model有更深一層的了解了呢?還是根本...愈聽愈模糊了呢? ^o^...沒
關係,喘口氣,我再用一張圖(圖3)來說明這整個流程,希望能加深各
位讀者的印象。

圖3 (略)

由圖3,各位應該可以清楚知道,究竟Event從何而來,往哪裡去了吧!
其實說穿了,Java雖然有自己的Event Model,但是一些系統的Message
還是得由底層的Native Window來捕捉(Ex: Mouse/Keyboard),在透過
Java Virtual Machine這一層的包裝後,才將Event送往Java的EventQueue
,以進入Java自己的Event Model。到目前為止,筆者已經解釋過了
Event從何而來? 但是Event往哪裡去了呢?,嚴格說起來,只提了一半
,當EventQueue中的Event被EventDispatchThread  dispatch出去之
後呢?接下來Event會如何被處理呢?其實到了這個階段以後便是Java這
一層的事情了,這部分我們將在文後說明。(PS: postEvent是EventQueue
所提供的method,程式中可以透過此method把Event丟到EventQueue中!)

*EventQueue產生的時機?

以上筆者已經把Java Event Model的核心部分作了說明,但是眼尖的
讀者一定會覺得好奇,EventQueue既然如此重要,那它又是什麼時候
被產生的呢?是在Java這一層被new出來的,還是由Java Virtual Machine
產生的呢?如果以SUN的版本為例,因為筆者在Source中找不到EventQueue
被產生的code,所以在此大膽假設,EventQueue應該是由Java Virtual
Machine所產生,例如:當我們以java.exe classname來執行Java程式
時,Java Virtual Machine會自動判別該Java程式是屬於Console Mode
或是GUI Mode程式,以決定是否要產生系統的EventQueue,當然這只
是我的初步假設,尚未實地去證明它,筆者才疏學淺,如果各位讀者
清楚SUN對這一層的實作情形,請您務必來信指教,3Q3Q..。

筆者雖然對SUN的EventQueue實作不是很清楚,但是若就這樣矇混過去
,實在也是有點……嗯…啊…我也不知道該怎麼講….^o^! 還好Java
Virtual Machine不是只有SUN做得出來,不知道各位有沒有聽過Kaffe
Virtual Machine(註1)這一號人物?這是一套Open Source的Java
Virtual Machine,筆者就以Kaffe對EventQueue的實作情形來彌補一下吧!

在開始談Kaffe的做法前,我們先談一下SUN對AWT的實作方式,基本上,
SUN 的AWT是採用”Peer-based”的機制,雖然在Java這一層可以輕易得
使用一些視窗元件,然而實際上,每個Java AWT所支援的元件(註2),都
會跟底層Native Window所支援的視窗元件做一個Mapping,例如: Java
中可能會new一個Frame,那麼底層就會有個對應的Window被產生。而這
個Mapping的機制,SUN採用了Peer-based的方式,每個正在執行的Java
AWT元件都會有個對應的peer,透過這個peer介面來跟底層Native Window
要求服務(透過Native Method),所以各位可以看到每個Java AWT的元件
都會import一個對應的peer介面,Ex: Button.java中就會有”import
java.awt.peer.ButtonPeer”,筆者不打算對此多做討論,在此只想讓
各位讀者先有個概念,再來我們要談的是Kaffe的做法。

Kaffe對於AWT的實作部分並沒有完全採用SUN的方式,它用的是比較直
接的機制,透過一個Toolkit類別中的Native Methods,直接跟底層
Native Window溝通,相對於SUN的”Peer-based”,Kaffe省去了一層
Peer的介面,效率自然會比較好,至於SUN為何要採用”Peer-based”
的方式,筆者猜測,這應該是為了”移植性”的考量。呼…. 各位一
定覺得,筆者怎麼講了一堆好像跟Event不相干的東西呢? 其實筆者想
表達的只有幾句話,那就是Kaffe的Toolkit類別中,存在了我們的目
標:EventQueue,而在Toolkit的Static Block中做了一些初始化的動
作,EventQueue就在此時會被產生。為什麼呢?為什麼EventQueue要在
Toolkit類別被載入時產生呢? 這個問題筆者也曾經思考過,各位不妨
也思考一下吧! 其實道理蠻簡單的,因為只要是Java程式(不管是不是
GUI程式),都一定得透過Java Virtual Machine來執行,如果執行的是
Console Mode的程式,自然不需要EventQueue,但如果是GUI Mode的程
式,那EventQueue就必須在程式動到GUI之前被產生,而之前提到Toolkit
中定義了所有會呼叫到底層Native Window的Native Methods,換言之
,只要Java程式中要使用跟Window相關的Native Method時,Toolkit類
別就必須先被載入,而Toolkit類別的載入不就代表EventQueue被產生
了嗎! 透過這種方式,EventQueue自然就只有在Java程式為GUI程式時
才會出現。圖4用一個最簡單的例子(show一個Java Frame)來說明
EventQueue被產生的情況:

圖4 (略)

(1)當MyFrame呼叫show() method時,此時Native System必須有一個對
應的Window被產生並且被顯示出來(PS:當執行new MyFrame( )時,
底層的Window並不會立即被產生)。
(2)因為此時必須呼叫Toolkit中所定義的Native Method(createNativeFrame)
,所以Toolkit類別會先被載入,而Toolkit被載入的過程中,EventQueue
就會被產生。
(3)EventQueue被產生時,相對的EventDispatchThread也會被產生。
(4)在Toolkit被載入完成後,開始呼叫createNativeFrame這個Native Method。
(5)最後才呼叫到底層的Native Window System,把對應的Window顯示出來。

講了那麼多有關EventQueue的東西,我們現在就來證明一下,順便瞧瞧在
Console Mode以及GUI Mode下跑的基本Threads有何不同。在此筆者將用
兩個Samples來測試,一個是Console Mode程式,另一個則是GUI Mode程
式,兩個程式會分別執行listAllThreads()這個Method(如下所示),來列
出目前程式中正在執行的Threads。

public static void showThreadGroup(ThreadGroup tg,String tab){
  int threadNumber,groupNumber;
  if(tg==null) return;
  threadNumber=tg.activeCount();
  groupNumber=tg.activeGroupCount();
  Thread[] threads=new Thread[threadNumber];
  ThreadGroup[] tgs=new ThreadGroup[groupNumber];
  tg.enumerate(threads,false);
   tg.enumerate(tgs,false);
   System.out.println(tab+"ThreadGroup:"+tg.getName());

   for(int i=0;i<threadNumber;i++){
   System.out.println(tab+" "+threads[i]);
}
   for(int i=0;i<groupNumber;i++){
   showThreadGroup(tgs[i],tab+" ");
   }
}

public static void listAllThreads(){
   ThreadGroup current,root,parent;  
current=Thread.currentThread().getThreadGroup();  
root=current;parent=root.getParent();
   //find root   while(parent!=null){
   root=parent;
   parent=parent.getParent();
   }

     showThreadGroup(root,"");
}
----------------------------------------------------------------------
執行的結果如下:

Console Mode |  ThreadGroup:system
| Thread[Signal dispatcher,5,system]
| Thread[Reference Handler,10,system]
| Thread[Finalizer,8,system]
| null
| ThreadGroup:main
| Thread[main,5,main]
---------------------------------------------------
GUI Mode |  ThreadGroup:system
| Thread[Signal dispatcher,5,system]
| Thread[Reference Handler,10,system]
| Thread[Finalizer,8,system]
| null
| null
| null
| null
| ThreadGroup:main
| Thread[main,5,main]
| Thread[AWT-EventQueue-0,6,main]
| Thread[SunToolkit.PostEventQueue-0,5,main]
| Thread[AWT-Windows,5,main]
---------------------------------------------------
而此結果可以看出,GUI Mode程式的main ThreadGroup會比Console Mode
多了3個Threads,而Thread[AWT-EventQueue-0,6,main]這條Thread即為
EventDispatchThread,它的Priority會比一般的Thread多1。至於
SunToolKit這條Thread實際上跟sun.awt這個package以及peer-based的
機制有關,在此筆者則不多做討論。有關EventQueue的介紹就到此告一
段落了,接下來將繼續筆者之前只說了一半的主題”Event 往哪裡去了?”
,也就是Java Event在被EventDispatchThread送出後的Dispatch旅程。

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

註1:有關Kaffe Virtual Machine請參考網站 www.kaffe.org。
註2:在此的Java AWT元件是指有使用到peer的元件(Ex: Button ,Label…)
,不包括LightWeight Component (Ex:Swing就是一種LightWeight
Component)。
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
(待續)

--------------------------------------------------------------
課程訊息> 運用 EJB 技術開發進階商業元件 (7月14日到7月18日)

課程簡介
--------
運用 Enterprise JavaBeans 開發分散式商業元件之進階技術課程:本課
程教導學員以 Enterprise JavaBeans (EJB)技術開發完善後端商業邏輯
層相關之知識與技能。

本課程以一個線上拍賣網站為例,教導學員如何利用 entity、session 與
message beans 等伺服器服務 (container managed services),來解決
電子商務應用程式實際運作時所遭遇的問題。

課程重點除了為學員提供實際 EJB 技術撰寫經驗之外,也會涵蓋關於交易
、訊息、安全性及現有資訊系統整合等問題時的規劃與實作。

此外,課程會引導學員了解 EJB 技術元件如何與網路服務進行整合。所撰
寫的程式碼可支援任何廠牌的 J2EE Application Server,藉以提供學員
獨立於特定廠牌產品的學習環境與學習經驗。

學習目標
--------
完成本課程後,您將具備下述能力:

-以 EJB 技術建置商業邏輯層 (business-tier) 機能
-能說明如何用EJB 技術開發商業元件之最佳實作與其它進階技術議題
-於應用程式伺服器上組合與部署以 EJB 技術開發的商業層元件
-運用 Java 訊息傳遞服務 API、Java Connector Architecture (JCA)
以及網路服務,整合以 EJB 技術為基礎的應用程式。

學習對象
--------
本課程適合學習對象為負責以下職務的 EJB 技術商業元件開發者:

-分析、規劃、開發與測試 EJB 技術應用程式
-部署 EJB 技術應用程式
-整合 EJB 技術應用程式以及現有應用程式

學習資格
--------
為確保學習效率,您必須具備下述能力:

-具備 Java 程式語言經驗
-了解 Java 技術中有關分散式運算環境之概念 - 包括 Remote Method
Invocation (RMI)、Java Naming and Directing Interface(JNDI)、
API 應用程式設計介面、Java 介面描述語言 (IDL) 等技術之概念。
-具備基本 EJB 技術知識 (如 EJB 技術之類型、EJB 元件生命週期、
J2EE 技術發展週期等)。
-對於採 J2EE 技術的宣告式程式設計 (declarative programming) 具備基本觀念。
-實際使用 J2EE 技術應用程式伺服器的經驗。

相關課程
--------
學習前:
SL-275:Java 程式設計
SL-301:Java分散式網路應用
FJ-310:開發J2EE相容應用程式
SL-425:J2EE 應用架構與設計
SL-500:J2EE Patterns

時 間 :7月14日到7月18日 早上09:30-12:00, 13:00-16:00
費 用 : NT$ 25,000 (含稅、含午餐) (Java週報會員享有九折優惠)
報名方式 : 週報會員請先到http://www.javatwo.net/javaweek/
登入會員後,到"課程訊息"裡線上報名,可免去重複填資料的麻煩喔!

---------------------------------------------------------------
課程訊息> Java Servlets與JSP程式設計開發 (7月14日到7月18日)

課程簡介:
Java Server Pages (JSP)和Servlets是J2EE(Java 2 Enterprise Edition)
當中所定義之主要Web tier科技。本課程將教導有經驗的Java開發人員快速
取得所需的知識與技術,以便在Tomcat Web server環境利用JSP和Servlet
科技,快速建立Web tier元件。學員將有機會以最有效的方式,練習如何分
析、設計、開發、測試與部署一個使用Java科技的Web應用系統,而實機操
作課程也將為學員提供建構與部署中小型Web應用系統(使用於intranet和
小規模商業設施)的經驗。

學習對象:
Java程式語言開發者,並具備建立Web元件(例如用於組合與產生動態Web
內容的servlet和custom tag元件)之Sun Certified Java Developer的技
術能力。本課程不是為採用HTML、JavaScript或其 他Web展示科技建立網
頁的設計者開設。

學習資格:
建議學員先參加「學習前」相關課程,或應具備下述能力:
•撰寫Java應用程式,展現足夠的程式設計能力
•整合既有Java程式碼
•設計Java應用程式
•從功能面說明n-tier架構的優勢
•使用HTML設計網頁

學習目標:
完成本課程後,您將具備下述能力:
•選擇應用系統最好的Web技術和架構
•設計Java Servlets
•連接Web應用系統到EJB元件與資料庫
•建置應用系統管理技術,例如安全性與執行緒
•設計Java Server Pages (JSP)
•為JSP建立custom tag libraries

相關課程:
相關課程
學習前:
SL-275 Java 程式設計
SL-285:Java程式實務操作
•(選擇性課程)FJ-310:開發J2EE相容應用程式

時 間 :7月14日到7月18日 早上09:30-12:00, 13:00-16:00
費 用 : NT$ 20,000 (含稅、含午餐) (Java週報會員享有九折優惠)
報名方式 : 週報會員請先到http://www.javatwo.net/javaweek/
登入會員後,到"課程訊息"裡線上報名,可免去重複填資料的麻煩喔!

---------------------------------------------------------------
新課快訊> 使用 Macromedia JRUN 建立 J2EE 應用程式
(7月28日到7月30日)

課程內容
*瞭解何種 J2EE API 最能夠解決特定的商業問題
*結合 J2EE API,開發完整的企業應用程式
*使用 JRUN 建立 Java Servlet
*使用 JRUN 建立 Java Database Connectivity(JDBC)資料來源,
並執行 Standard Query Language(SQL)語句
*使用 JRUN 開發 Java Server Pages(JSP)
*將商業邏輯封裝到 JavaBeans 中
*從 JSP 來使用 JavaBeans
*瞭解 Enterprise JavaBeans(EJB)架構
*開發 Entity Beans
*管理 J2EE Transaction
*部署含有 EJB 及 Web 元件的 J2EE 應用程式
*開發 Web 服務
*利用 JRUN 來使用 Flash

學習對象:
希望建立 J2EE 相容 Web 應用程式的 Java 程式設計者,以及希望
瞭解J2EE架構的技術專案經理

學習資格:
-具備 Web 應用程式開發經驗
-對於 Java 程式設計語言方面的知識相當熟悉
-具備關聯資料庫及 SQL 方面的經驗

學習目標:
本課程旨在說明如何利用 JRUN 來設計、開發及部署 J2EE 應用程式。
課程內容分別說明了 Servlet、JSP、JavaBeans 及 EJB,以及如何有
效地結合它們,製作有彈性、可調整及穩定的 J2EE Web 應用程式。學
員將會學到如何建立實行 J2EE 最佳實例的 J2EE 應用程式。

時 間 :7月28日到7月30日 每天早上09:30-12:00, 13:00-16:00
費 用 : NT$ 15,000 (含稅、含午餐) (Java週報會員享有九折優惠)
報名方式 : 週報會員請先到http://www.javatwo.net/javaweek/
登入會員後,到"課程訊息"裡線上報名,可免去重複填資料的麻煩喔!

∼∼∼∼∼∼∼ ∼∼∼∼∼∼∼ ∼∼∼∼∼∼∼ ∼∼∼∼∼∼∼
本電子報內容
http://www.javatwo.net/javaweek/ 提供
∼∼∼∼∼∼∼ ∼∼∼∼∼∼∼ ∼∼∼∼∼∼∼ ∼∼∼∼∼∼∼
如需圖文並茂PDF版請到以下網址下載:
http://www.javatwo.net/javaweek/history/javaweek20030709.pdf


reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
話題樹型展開
人氣 標題 作者 字數 發文時間
11892 java週報 michaeli 249 2003-06-18 21:28
9823 Re:java週報 BestBoy 24 2003-06-19 01:00
9667 Re:java週報 worookie 43 2003-06-29 16:20
9424 Re:java週報 browser 114 2003-06-29 16:40
9605 Re:java週報 nesere 176 2003-06-29 19:15
9421 Re:java週報 sampoosally 81 2003-07-01 17:58
9597 Re:java週報 worookie 132 2003-07-02 01:57
9332 Re:java週報 nesere 17 2003-07-02 02:03
9566 Re:java週報 worookie 33 2003-07-12 23:18
12659 Re:java週報 UndeadJ 22117 2003-07-13 00:04
9909 Re:java週報 nesere 80 2003-07-13 00:22
» JWorld@TW »  Java 文章和新聞 » Java電子報

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8