小弟在 2010/10/01 在得到老闆的面允下去參加了 Java 2010 認證日, 而其實在 2009 Java 認證日我也有參加. 而在Java 認證日這一天通常購買考試卷會特別優惠. 根據我稍微數了一下, 有擺攤位的就有巨匠, 恆逸, 聯成與Oracle 本身的數位學習 (Oracle 也在推 Oracle University =="). 但其實我最有興趣的是今天的會議主題 Servlet 3.0 與 Java SE7 的內容. 當天的會議行程如下 :
底下我就真對每一個主題稍微作一下簡單介紹.
Servlet 3.0 新功能介紹及實作 :
講師 :
在說明 Servlet 之前先來看看 Oracle 在併購 Sun 後對 Servlet 技術作的官方說明 :
其實間單的來說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 的介紹可以參考這篇文章 :
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 可以參考這裡 :
lambda/closure - 從 JavaScript 到 Java SE 7 :
講師 :
這個 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 的定義 :
很好, 我也是有聽沒有懂, 在這裡我要使用最近最火紅的 Scala 語言進行說明 (不知道Scala 是甚麼可以參考這裡). 接著我將直接以程式碼進行說明 :
既然函式可以用變數指定, 那是否意味著函數也可以當作參數傳入函式? 雖然有點饒舌, 但是是可以的, 在上面的程式碼中我們定義了一個函式 calc() : 該函式接收三個參數, 前面兩個是 Integer 類型應該不難理解, 但第三個參數是個什麼鬼?? (小牛附身). well, 他是說第三個參數是接收一個函式, 而該函式接收兩個Integer 參數並回傳 Integer 類型. 所以我們可以把 calc() 函式看成一個殼, 真正決定 Algorithm 是我們傳進去的函式參數 func. 執行結果如下 :
而這個將函數傳進去函數的動作我們就稱之為 lambda. 而 Closure 又是個什麼東東呢? 套講師在 Session 用來幫助我們了解 Closure 的口號就是 "心愛的人跟別人跑了". 這又是個什麼鬼? 這說來話長, 有興趣的可以參考良葛格的 Gossip in Scala 的 函式定義 : 閉包(Closure). 簡單說就是透過"自由變數" 將函式的狀態與生命周期拓展與延伸, 使得某些費時的工作可以先做, 必且保留其結果以待後續操作能夠Take advantage 既有的成果.
沒有留言:
張貼留言