前言 :
小弟在 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 既有的成果.
This is a blog to track what I had learned and share knowledge with all who can take advantage of them
標籤
- [ 英文學習 ]
- [ 計算機概論 ]
- [ 深入雲計算 ]
- [ 雜七雜八 ]
- [ Algorithm in Java ]
- [ Data Structures with Java ]
- [ IR Class ]
- [ Java 文章收集 ]
- [ Java 代碼範本 ]
- [ Java 套件 ]
- [ JVM 應用 ]
- [ LFD Note ]
- [ MangoDB ]
- [ Math CC ]
- [ MongoDB ]
- [ MySQL 小學堂 ]
- [ Python 考題 ]
- [ Python 常見問題 ]
- [ Python 範例代碼 ]
- [心得扎記]
- [網路教學]
- [C 常見考題]
- [C 範例代碼]
- [C/C++ 範例代碼]
- [Intro Alg]
- [Java 代碼範本]
- [Java 套件]
- [Linux 小技巧]
- [Linux 小學堂]
- [Linux 命令]
- [ML In Action]
- [ML]
- [MLP]
- [Postgres]
- [Python 學習筆記]
- [Quick Python]
- [Software Engineering]
- [The python tutorial]
- 工具收集
- 設計模式
- 資料結構
- ActiveMQ In Action
- AI
- Algorithm
- Android
- Ansible
- AWS
- Big Data 研究
- C/C++
- C++
- CCDH
- CI/CD
- Coursera
- Database
- DB
- Design Pattern
- Device Driver Programming
- Docker
- Docker 工具
- Docker Practice
- Eclipse
- English Writing
- ExtJS 3.x
- FP
- Fraud Prevention
- FreeBSD
- GCC
- Git
- Git Pro
- GNU
- Golang
- Gradle
- Groovy
- Hadoop
- Hadoop. Hadoop Ecosystem
- Java
- Java Framework
- Java UI
- JavaIDE
- JavaScript
- Jenkins
- JFreeChart
- Kaggle
- Kali/Metasploit
- Keras
- KVM
- Learn Spark
- LeetCode
- Linux
- Lucene
- Math
- ML
- ML Udemy
- Mockito
- MPI
- Nachos
- Network
- NLP
- node js
- OO
- OpenCL
- OpenMP
- OSC
- OSGi
- Pandas
- Perl
- PostgreSQL
- Py DS
- Python
- Python 自製工具
- Python Std Library
- Python tools
- QEMU
- R
- Real Python
- RIA
- RTC
- Ruby
- Ruby Packages
- Scala
- ScalaIA
- SQLAlchemy
- TensorFlow
- Tools
- UML
- Unix
- Verilog
- Vmware
- Windows 技巧
- wxPython
訂閱:
張貼留言 (Atom)
[Git 常見問題] error: The following untracked working tree files would be overwritten by merge
Source From Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 # git clean -d -fx 方案2: 今天在服务器上 gi...
-
前言 : 為什麼程序管理這麼重要呢?這是因為: * 首先,本章一開始就談到的,我們在操作系統時的各項工作其實都是經過某個 PID 來達成的 (包括你的 bash 環境), 因此,能不能進行某項工作,就與該程序的權限有關了。 * 再來,如果您的 Linux 系統是個...
-
屬性 : 系統相關 - 檔案與目錄 語法 : du [參數] [檔案] 參數 | 功能 -a | 顯示目錄中個別檔案的大小 -b | 以bytes為單位顯示 -c | 顯示個別檔案大小與總和 -D | 顯示符號鏈結的來源檔大小 -h | Hum...
-
來源自 這裡 說明 : split 是 Perl 中非常有用的函式之一,它可以將一個字串分割並將之置於陣列中。若無特別的指定,該函式亦使用 RE 與 $_ 變數 語法 : * split /PATTERN/,EXPR,LIMIT * split /...
沒有留言:
張貼留言