程式扎記: [ Java Discussion ] Java 2010 認證日分享

標籤

2010年11月11日 星期四

[ Java Discussion ] Java 2010 認證日分享

前言 : 
小弟在 2010/10/01 在得到老闆的面允下去參加了 Java 2010 認證日, 而其實在 2009 Java 認證日我也有參加. 而在Java 認證日這一天通常購買考試卷會特別優惠. 根據我稍微數了一下, 有擺攤位的就有巨匠, 恆逸, 聯成與Oracle 本身的數位學習 (Oracle 也在推 Oracle University =="). 但其實我最有興趣的是今天的會議主題 Servlet 3.0 與 Java SE7 的內容. 當天的會議行程如下 : 
 
底下我就真對每一個主題稍微作一下簡單介紹. 

Servlet 3.0 新功能介紹及實作 : 
講師 : 

黃登揚 中央大學資訊工程系準博士候選人/
甲骨文教育訓練服務部認證講師

在說明 Servlet 之前先來看看 Oracle 在併購 Sun 後對 Servlet 技術作的官方說明 : 
Servlets are the Java platform technology of choice for extending and enhancing Web serversServlets provide a component-based, platform-independent method for building Web-based applications, without the performance limitations of CGI programs. And unlike proprietary server extension mechanisms (such as the Netscape Server API or Apache modules), servlets are server- and platform-independent. This leaves you free to select a "best of breed" strategy for your servers, platforms, and tools.

其實間單的來說Servlet 是Content based 用來動態產生網頁的技術, 而我第一次碰到 Servlet 約在2006年, 那時還在 Servlet 2.1 而我利用了它加上 JSP 開發了一個網展用來產生生產報表與輸入生產數據的平台. 要開始說明 Servlet 3.0 之前一定要知道在 Servlet 3.0 之前使用上的不便之處, 才會知道為什麼會有 Servlet 3.0 新規格與技術的產生. 
在 Servlet 2.1 的時代, 所有你開發的 Servlet (其實就是一個 Java class 繼承 HttpServlet) 都必須透過一個 web.xml 進行發佈後才能夠生效使用. 而這對 Web container 必須在啟動時就必須載入, 也就是說當你啟動 Web container 後, 之後如果你有撰寫了新的 Servlet, 你必須要停止 Web container 後, 在 web.xml 添加新的 Servlet 的 deploy 敘述後再重新啟動 Web container 才能使用. 也就是說在開發 Servlet 無法做到熱插拔. 這對已經在上線使用的系統是相當麻煩與困擾的. 
所以在 Servlet 3.0 提出了 plugin 的概念, 讓你在開發 Servlet 可以使用 Wegfragment 的標籤還有獨立於系統 web.xml 的 xml 描述檔(用於描述你新開發的 Servlet), 透過包裝成 jar 檔後 include 進來主程式, 便可以在不用關閉原有上限系統時, 擴充原有的功能與新增的 features. 而更多的 Servlet 3.0 的介紹可以參考這篇文章 : 
Java EE 5.0 規範的筆墨在EJB3.0與Web Service上,隨著萬眾期待的Struts2.0揭開面紗,Java在Web應用開發上便變得沉悶乏味起來. 在JavaOne2007 上有篇 The Future of the Java Technology Web Tier 宣講了Sun的Servlet 3.0、REST、Comet計劃,在大家漸漸失望的時候,又在前面吊了一個紅蘿蔔 :
Servlet 3.0
Infoq中文站 : Sun向JCP提交了Servlet3.0規範
Infoq英文站 : Sun Submits Servlet 3.0 Specification to JCP
* Annotation標註的servlets,可編程訪問並動態改變的web.xml,使得以往經常需要重啟的web應用配置終於擁有了動態特性,web framework們擁有了熱插拔的能力.
* Async and Comet support。
* RESTul Service。
* 一堆看上去也不錯的特性,如file upload

EJB 3.1 新功能介紹及實作 : 
講師 : 
李易紳 緯德科技 專案經理/甲骨文教育訓練服務部認證講師

這裡一定要打一下廣告, 在這一個 Session 的講師洽好是我上巨匠 SCWCD 時的老師, 個人覺得這位老師上課用心而且講解鉅細靡遺. 是個不錯的老師, 在 Discussion 開始前有到他順便跟他加加油, 之前一直在打聽他哪時要開 SCBCD 的課, 但因為 Oracle 併購了 Sun. 所以遲遲一直沒下文, 今天有跟這位講師提到 SCBCD 課程的問題, 據說在今年尾, 明年初 巨匠就會開始有 SCBCD 相關課程的開授 (其實 恆逸早就有了 =="). 
好了廣告時間過了, 我們來談談EJB 3.1 的新功能, 這裡我並不會琢磨很多 (因為我還沒上手 =="), 主要是透過 Java 的 Annotation 特性, 將原本上手門檻相對高的 Enterprise Bean 開發流程相對簡化與新增了所謂的 Singleton Session Bean, 用來針對Resource 的同時存取產生的議題與確保資源的單一性進行介紹. 
接著還有 Asynchronous Invocation of Session Beans 的引入, 而這是一個相當不錯的 feature, 原本三件互相獨立的工作, 因為在 Coding 的限制, 每件工作都相依於前一件工作, 導致整個工作時間的延長 (工作一(3) -> 工作二(2) -> 工作三(5) = 總共需要時間為 3+2+5=10), 透過 Asynchronous Invocation, 這三件工作其實是可以同時進行的, 再透過所謂的Future Design Pattern 來拿回結果 (所以總共需要花的時間為 max(3,2,5)=5). 有關 EJB 3.1 的新 Feature 可以參考這裡 : 
* No-Interface View
* Singleton Session Bean
* Asynchronous Invocations
* Global JNDI names
* Timer-Service
* EJB Lite

lambda/closure - 從 JavaScript 到 Java SE 7 : 
講師 : 
林信良 良葛格Javaworld@TW 版主、openhome.cc 站長

這個 Session 的講師就不用我多做介紹了, 相信只要寫Java 的 Programmer 可說是無人不知無人不曉. 小弟也是他的文章追隨者. 還記得我還在了解甚麼是 Java (一種咖啡?) 的時候, 看到 Gossip series 的線上教學文件簡直就是我的一盞明燈, 從此便踏上了 Java 這條不歸路. ==" 
回歸正題, 講到 Lambda 與 Closure, 不得不提到何為動態語言/靜態語言. 而Java 其實是一種靜態語言, 因為每次當你需要定義一個變數時, 同時你就必須決定他所屬的型態. 而像 JavaScript/Python/Ruby 等語言是屬於動態語言, 在定義變數時你不需要決定它的型態, 而會在真正與 "=" 右邊的東西產生關聯後所謂的型態才有意義. 這也意謂個說其實你也可以把一個函式當作值傳給變數, 而這個動作在 C/C++ 稱為函數指針 (有興趣可以參考 : [C++ 小學堂] C++ 函數與指針 : 指向函數的指針), 而這個行為在 Java 中簡直是天方夜譚, 聽都沒聽過. 但在 JavaScript/Python/Scala 等動態語言中是常見的操作 (當講師問說 : 在場有人聽過 Lambda/Closure, 整個會場鴉雀無聲, 接著講師補充這是一個有獎徵答喔, 反應快的我二話不說馬上舉起手, 當然很快的被講師看到, 我說 : "沒有"................... 接著會場笑聲此起彼落, 就這樣賺到了一隻小海豚玩偶 ==") 而透過這個神奇的操作我們可以完成 Lambda/Closure 的操作, 首先我們來看看 C# 對 Lambda 的定義 : 
In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements.

很好, 我也是有聽沒有懂, 在這裡我要使用最近最火紅的 Scala 語言進行說明 (不知道Scala 是甚麼可以參考這裡). 接著我將直接以程式碼進行說明 : 
- lambda.scala 代碼 :
  1. def sum(a: Int, b: Int) = a+b // 定義 sum 函式  
  2. def sub(a: Int, b: Int) = a-b  // 定義 sub 函式  
  3.   
  4. // 定義 calc 函式接受參數 int a, int b 與一個函式 傳入 (int,int) 與回傳 int.  
  5. def calc(a: Int, b: Int, func:(Int, Int)=>Int) = {  
  6.         println(func(a, b))  
  7. }  
  8.   
  9. val a = 5  
  10. val b = 3  
  11. print("a + b= ")  
  12. calc(a, b, sum)  
  13. print("a - b= ")  
  14. calc(a, b, sub)  
  15. print("a * b=")  
  16. calc(a, b, (m: Int, n: Int)=>m*n)  

既然函式可以用變數指定, 那是否意味著函數也可以當作參數傳入函式? 雖然有點饒舌, 但是是可以的, 在上面的程式碼中我們定義了一個函式 calc() : 該函式接收三個參數, 前面兩個是 Integer 類型應該不難理解, 但第三個參數是個什麼鬼?? (小牛附身). well, 他是說第三個參數是接收一個函式, 而該函式接收兩個Integer 參數並回傳 Integer 類型. 所以我們可以把 calc() 函式看成一個殼, 真正決定 Algorithm 是我們傳進去的函式參數 func. 執行結果如下 : 
linux-tl0r:~/Scala # scala lambda.scala <執行 lambda.scala>
a + b= 8
a - b= 2
a * b=15

而這個將函數傳進去函數的動作我們就稱之為 lambda. 而 Closure 又是個什麼東東呢? 套講師在 Session 用來幫助我們了解 Closure 的口號就是 "心愛的人跟別人跑了". 這又是個什麼鬼? 這說來話長, 有興趣的可以參考良葛格的 Gossip in Scala 的 函式定義 : 閉包(Closure). 簡單說就是透過"自由變數" 將函式的狀態與生命周期拓展與延伸, 使得某些費時的工作可以先做, 必且保留其結果以待後續操作能夠Take advantage 既有的成果.

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!