Java Spring 簡單範例操作與學習指引〈2〉

*** 第一個階段子目標 ***

  1. 確實在 Eclipse IDE工具內建立可以完整開發 Spring-based 的應用程式。
  2. 新增 middle-tier性質專案(純粹是 java class,沒有 UI),撰寫 {員工薪資管理Control.java} 這個控制物件的程式碼框架 (skeleton),新增一個 Spring Beans 的 XML設定檔 (config file),在設定檔內設定該控制物件的相關屬性。
  3. 利用 JUnit 測試框架 (Test Framework, Eclipse 內建),馬上撰寫該控制物件的功能測試程式碼。

一、新增專案

  1. 選擇 [File]→[New]→[Project…],當出現 [New Project] 的 wizard 對話框時,選擇 [Spring]→「Spring Project」,然後按下【Next】,出現 [New Spring Project] 對話框內,輸入新增的專案名稱: HRDemo,其它選項照預設即可,按下【Finish】完成,並將 eclipse的視界 (perspective)切至 Java EE。

    圖 3、新增 Spring Project 的對話框
    圖 3、新增 Spring Project 的對話框

  2. 在 [Project Explorer] 的專案視窗內,將滑鼠移至專案的根目錄 (HRDemo)下,右鍵點選 [Build Path]→[Configure Build Path …],出現 [Properties for HRDemo]的對話框,然後將標籤切換至 [Libraries],並點擊【Add Libraries…】,當出現 [Add Library] 對話框後,選擇 [User Library] 然後點擊 【Next】。

    繼續閱讀 »

[b2evolution] 安裝 Code Highlight Plugin 模組

有時在 Blog 的內容內,會有含程式碼的範例,若要讓其能正常顯示,一般是設定 html 的〈pre〉標籤。 不過呢,想當然其 format 樣式是不會好看的,若希望能如在 程式碼 IDE 編輯器上所顯示的那般,不同的關鍵字、不同的程式語言,就能顯示不同的顏色。甚至呢,還可以顯示出行號來。

有兩種方法,可以讓網頁的程式碼片段(code snippets)內容,顯示出行號與關鍵字顏色等比較看起來像是真的在看程式碼的內容般。 一種是在 Client 端能解析網頁內程式碼的內容。 最具知名度的應該是這個吧: Syntax highlighter。它是 Javascript 的程式,是伴隨著網頁內容一同下載到 Browser 端,再由其編譯器來解析。 這種方法好處是很方便,不用更改到 server 端的設定,就是只要在網頁的 header 區貼上該段程式碼即可。 而主要的缺點就是要多下載約快 200k 的 javascript 程式,耗費傳輸頻寬,也稍微增加了 Browser 端的解析負擔,還有呢,也會與所使用的 Browser 各種版本所使用的 javascript 編譯器有關,使得解析出來的結果,在各種瀏覽器所看到顯示結果的會不太一樣。

另外一種方式就是在 server 端,也就是在 Blog 平台上,安裝 『code lightlight』 解析器的 plugin。 然後當 blog 文章要輸出時,整個網頁內容會在 server 端這邊作一個完整的解析。這個過程應該是稱之為 『Text Rendering』。 好處就是網頁內容在傳輸輸出前,就已經處理過,並轉為完整 HTML (XHTML) 格式的網頁。 但是缺點就是,必須在 server 端上設定安裝,而這與各個平台版本是否有支援這類的 plugin 機制是有關係的。

我傾向後者的方式,主要的原因是我的 Blog 內容,在每一個頁面(page),並不會常出現程式碼的片段內容; 再則,我總覺得從 server-side 『空降』 一個 javascript 的解析器,有說不出的彆扭感,且每次傳輸要多上近 200K,實在覺得說不過去。

所以,決定後,我的方向就是轉向尋找 b2evolution 有無支援 『code hightlight』 的 plugin 模組。 原來官方版本就有提供一個預設的了,但是蠻陽春的,好像只支援 php 與 html 的程式碼顯示而已。 還好的一點是,在官方網站上有看到其中一位國外網友改寫了這個陽春的模組,將其解析的核心改為 GeSHI。 這太棒了! 這個 GeSHI 解析器(php-based),可以解析的程式語言可是高達上百種,而且還在持續的維護更版中。

這個網友改寫的模組在這裡: b2evolution code highlighter plugin modded to use GeSHi。 安裝超級容易,就是依照該網站的安裝提示,下載該網站所提供的 plugin 模組,以及最新版本的 GeSHI 程式,再一同解壓縮至 『blogroot/plugins/code_highlight_plugin/』 目錄即可,然後在 Blog 個管理平台啟動該模組就可以了。

繼續閱讀 »

【系統升級】b2evolution 失敗的升級 (from 1.10.3 to 2.4.2)

昨晚約 10:00 左右,想說我的部落格系統已有約 10 個月時間沒升級了,再來則是 b2evolution 釋出最新的穩定版本 2.4.2,已經與我現在使用的版本差了一個大版的號碼,功能等應該有增進不少。 依著以往的經驗,升級的時間約兩個小時內應該可以完成的。

參考原先我寫的升級備忘錄: [系統升級] b2evolution from 1.10.2 to 1.10.3,與 【系統升級】b2evolution from 1.8.2 to 1.10-beta

沒想到,整個升級的過程相當不順利。 先是執行 phpmyadmin 所下載回來的資料庫 Dump SQL 檔,全都是亂碼。找了許久,才發現到連線校對系統給我的預設為 utf8-unicode-ci, 我沒看清楚,以為是正確的,結果應該是設定為 utf8-general-ci 才對。 然後,執行升級的程序(script)後,資料庫是可以順利升級沒錯,但是,部落格首頁(以及系統頁面的 Blog設定標籤)總是在最後面會出現錯誤訊息:

An unexpected error has occured!
If this error persits, please report it to the administrator.
Go back to home page
Additional information about this error:
Requested User does not exist!

從官方網站討論區找解答,仍是找不出所以然。 然後又想啟動 DEBUG 模式,結果呢,一啟動 DEBUG 本身也是 Bug,它會出現:

MySQL error!
Variable ’sql_mode’ can’t be set to the value of ‘TRADITIONAL’(Errno=1231)
Your query:
SET sql_mode = 『TRADITIONAL』

又再去查了資料,發現到應該是與 MySQL 版本(只有 v5 以上才支援上述的模式)有關,但是目前我使用的 v4 版本實在不知道如何設定...。

弄到凌晨兩點多,不想再弄了,想說倒回去還原好了。 結果呢,資料庫因為新舊版的 Schema 定義並不一樣,必須砍掉再從我原來的備份檔上傳載入(Import)。使用原來我一直用來很順利的 BigDump.php ,這次竟然不靈,在 Dump 備份檔的過程中,它一直顯示出問題,好像是某一些 INSERT 的資料行有太多的 LF RETURN 符號所致? 只好改用 phpmyadmin,但是又因為備份檔高達 27MB,結果導致 Import 上傳會 Time-out,弄得到後來我只好分批切幾個備份檔,再一一載入,才完成還原的工作。 至於 blog 檔案目錄,就很簡單了,把原先備份在 server 的目錄(已更名),再更名回來就可以了。 弄得灰頭土臉,到今日近 5:00 時才又恢復原來的系統,實在是耗費了一整夜的白工!

這一次最大的教訓就是,應該把原來的資料庫直接給複製到 Server 端另一個資料庫系統就好了,透過 Dump 檔執行還原工作,耗費時間且不是太保險(當然,無論如何還是要 export 備份出來)。 再來就是,應該先在我自己 Local 的 VM(Virtual Machine) 環境內,先預先作過完整的升級過程,待沒有問題的話,再至 Server 端執行升級作業,如此,才能確保升級的順暢,也不致影響部落格平台的運作。

Java Spring 簡單範例操作與學習指引〈1〉

寫在前面

我想藉由一個小小的功能案例,來分享個人在學習所謂 『新的 IT 技術』,尤其是偏向實作面的 『How-to』 ,包括工具的操作,與程式的寫碼等,是如何從所設定的主要完成目標,再分解成數個階段性的子目標,然後一次只克服一小段問題,再往前漸增推進,往下一個階段目標前進。 同時,這也算是一份提供給軟體開發入門的學習操作指引的分享文件。

實作的過程中,所有相關的參考文件,均是透過 Google 的查詢,以及與實作規格相關的線上文件。 當然若工作上的需要,也是可以考慮購買 『How-to』 操作性的參考書籍翻閱。 不過我是覺得好像透過網路上都可以查得到,雖然可能比較零散,但同時可以增進自己如何下關鍵字找 『How-to』 的技能,也是不錯的。

我想提供兩個不同平台的版本,一為本系列案例中的 Java + Spring;另一為 C#.NET + LINQ (會以另外一份操作指引文件分享)。 可以說是把 Spring 與 LINQ 主要實現在 O-R (Object-Relation) Mapping 的實作議題上。

這個功能案例很簡單: 系統提供 『計算員工薪資 By ID』 、 『計算所有員工薪資』 功能 (從使用案例的需求而來)。

案例雖然很簡單,但是它是可以 『成長』 的,而且也具延展性。 最起碼我把它可以區分為兩個階段的上線目標:

  • 第一個階段:快速實現功能需求,但保留了可以具延展性的框架。
  • 第二個階段:找出穩定的共用元素,讓系統更有彈性。

為了能順應這兩個階段的目標,一些軟體設計的最基本原則就會隱含在內,同時這也是這個範例期能達成的標的:

  1. 從系統中間層(middleware),表達服務(service),也就是功能需求的控制物件(control object)開始,撰寫程式碼;而非從展示層(presentation)的 UI 表單開始。 (焦點應該是擺在以服務為中心、置於中間層的控制物件;不要再從 UI 開始來開發系統了,那很容易會是 2-tier 思維。)
  2. 實現企業邏輯於中間層的控制物件,而不會寫在 UI scripts 上,或是資料庫的 stored-procedure。否則系統即喪失了延展性。
  3. 寫完一個個實現系統功能的控制物件後 (本例只完成一個控制物件— {員工薪資管理Control.java}),馬上就撰寫可以測試該控制物件功能的測試程式碼 (Functional Test Code);當控制物件與測試程式碼開發告一段落後,才開始寫 UI 表單來驗證控制物件所提供的功能服務。
  4. 實現 Java Spring Framework 的開發— 以 Spring DAO, O-R Mapping 框架為主。
  5. 確實可以滿足使用者所需要的系統功能後 (確實可以上線使用),下一個階段則是結構的重整,也就是重構 (Refactoring), 而重構的前提就是不能影響到已上線的功能。 本例會採物件導向的委派 (delegate)與多型 (polymorphism)的技巧。

開發環境建置

需要軟件

  • Java JRE (Java runtime environment), JRE 5/6 以上版本。
    下載: http://java.sun.com/javase/downloads/
  • Eclipse IDE for Java EE Developers (目前使用 3.3.2 最新版, 06/25/2008)
    下載: http://www.eclipse.org/downloads/
  • Spring Framework (目前最新為 2.5.5 , 06/25/2008)
    下載: http://www.springframework.org/download
  • Spring IDE (目前使用 2.0.6, 06/25/2008,直接透過 Eclipse 下載安裝)
    安裝參考文件: http://springide.org/project/wiki/SpringideInstall

安裝 Spring Framework

  • 建議從上述網址所下載 Spring Framework 的壓縮檔為 spring-framework-2.X-with-dependencies.zip。 該壓縮檔內除了包括 Spring 所需的 library 外,還包括了諸多在系統開發上,其它經常用到的 Open Source 專案的相關連套件,包括 ant, axis, hibernate, log4j, struts …等。
  • 解壓縮該檔案,並將解壓縮的目錄放置在常用 java 開發的 library 路徑內,例如:
    C:\java\lib\spring-framework-2.X

在 Eclipse (Java EE 版本)上安裝 Spring IDE

  1. 在 Eclipse 的選單 [Help]→[Software Updates], 選擇 [Find and Install…], 當出現 [Features Update] 對話框時, 選擇 [Search for new features to install], 按下【Next】進入 [update site to visit] 對話框。 然後點選 【New Remote Site】, 當出現 [New Update Site] 對話框時, 在 [Name] 欄位輸入:Spring IDE;在 [URL] 欄位輸入:http://springide.org/update 。 輸入完成後按下【Finish】,Eclipse 即會至該網址搜尋並列出最新版本的 Spring IDE 與其相關連的套件列表。

    Spring 簡單範例操作指引 ScreenShot
    圖 1、新增 Update Site 的名字與 URL 位址

  2. 現的對話框內,勾選「Spring IDE」與「AJDT」套件, 其中「Spring IDE」內的「Dependencies」套件不要勾選(該套件是適用在 eclipse 3.2.x 版本)。 勾選完畢後選擇【Next】進入下一 License對話框, 點選同意後再按下【Next】到下個對話框, 最終選擇 【Finish】後,eclipse 即會開始安裝 Spring IDE 等套件。 安裝完後重新啟動 eclipse 即可開發 Spring-based 的專案。

    Spring 簡單範例操作指引 ScreenShot
    圖 2、勾選要安裝的 Spring IDE 與 相關連的套件

蓁妮的國中新生訓練@竹林國中

今天是蓁妮的國中暑期新生訓練。 從今天開始,包括暑期輔導,為期一個月。

就讀「竹林國中」,是我們早已決定的了,雖然蓁妮看來是相當的不願意,原因是「育才國小」的同班同學們並沒有與她就讀這所國中。 但是,「竹林國中」除了離我們家很近以外 (走路才 10 分鐘),可以說是北縣的一所名校。 上下課時載運外地學生的遊覽車,包括各路有永和、板橋、三重、土城,甚至連三峽都有。 能吸引這麼多外縣市的同學來此就讀,必然是有其獨到之處。 而我們家蓁妮只要走路就能到,還比其他同學們每天可以在交通上省上兩個小時,豈不得天獨厚? 另外呢,我常觀察晚上約 9:00~9:30 左右,竹林國、高中(兩個是在一起的)的同學下課時,都相當的有秩序,雖然人潮多,但是卻也不會雜亂與喧嘩等。 看得出來是很有紀律的。

蓁妮的國中新生訓練@竹林國中

蓁妮是早在兩、三個月前就通過該校的英數資優班入學考試。 老實說,我是有些猶疑,既然是名校,當然就是屬於升學性質的,所以必然會是填鴨教育的。 這我一向挺排斥的,我們蓁妮是很 Smart 的,在小學期間,我都是任其依據自己的喜好興趣等,作她喜歡作的事。 我很擔心填鴨教育會把 Smart 的小孩 『教笨』,應該就是那種看來好像很聰明,因為會考高分,但其實頭腦已經僵化,變成所謂的 『聰明的笨蛋』了。 但是,我內心又的確很希望未來蓁妮能考上「北一女」,這是我的期望,但是我也知道不能給小朋友壓力,也要尊重她自己的意願; 還有,本來呢,還想帶小朋友們利用暑假時間,可以好好地玩耍一番。 但是蓁妮的新生訓練,外加暑期輔導,就要延續一個月呢,這… 總覺得,國一開始就要如此辛苦嗎?

先不想那麼多啦,內心真的是五味雜陳...。 反正就先順其自然了,若是蓁妮真的無法接受填鴨的教育,那麼屆時再給她轉到普通班也是可以,一切就看她的意願與性向,然後,看看是否父母能在一旁適時的引導、協助與安慰了。

「竹林國中」,其實是包含國、高中部的,是在「華夏工專」側旁的巷子進去,要走小小一段的山坡路,然後進校門後還要爬坡與好多個階梯。上課大樓是位於山坡地上,看起來相當地乾淨。
繼續閱讀 »

粉難吃的「石X活魚」(2008/07/13)

中午我老婆的弟弟約全家一起去石門水庫附近吃活魚。

我老婆的弟弟才上個月舉家從中和南勢角搬到新店的達觀鎮,其實從我們家過去不遠耶,因為安坑附近有個新闢的快速道路,從新店安坑就可以直達到「達觀鎮」的入口道路,才五公里,又不塞車,真的很方便。 我老婆弟弟住的大廈旁就有個 7-11,大廈前就有公車站牌,的確是方便。 就在等他們下來的時候,我老婆與兩個女兒、姥姥、公公等,就一同坐在公車牌的座椅等著,然後還喝著 7-11 的 StarBuck 的冰咖啡 (那幾乎是我夏天每天必喝的)。 我老婆就是那種傻乎乎的,竟然就在有位上了年紀的老人家、也坐在旁等公車,然後問我,你覺得住這裡好不好?生活機能會好嗎? 這要我怎麼回答,就在住戶旁呢,真是的。 :crazy:

2008/07/13@新店達觀鎮

從達觀鎮那邊,省道就可以直通三峽、大溪、石門等地方。 但是呢,開了約有一個多小時才到石門,大概比從北二高還慢上一半的時間左右呢。 當然啦,因為是慢慢開,也不趕時間,路旁景色也覺不錯,開車是沒啥壓力的。

到哪裡吃,一切都是我老婆他弟弟作主的。 他帶我們到老街最源始的活魚店— 「石X活魚」。嘿,十年前來吃過,印象深刻,真的很棒好吃的店。

喔,一開始拿過來的是燙地瓜葉。奇怪,怎麼沒那麼好吃? 想說應該是青菜並非主菜他們的強項關係吧。 結果呢,陸續送上來的魚片、糖醋魚、魚酥、肉辦魚、味噌魚頭湯等,怎麼沒我以前的印象好吃呢? 想說是否是我太過敏感、太挑剔的關係? 所以也不太好意思當場說難吃,免得我老婆她們全家說不過去。 吃了幾口也就沒吃了,然後就帶著我老婆他弟弟的小女兒,粉可愛的小豆豆,就到門旁附近玩耍去了。 小朋友們呢,嘴巴也是挑剔,也是吃一下就跟著跑出來了。

後來總算全家吃完了,等我們姥姥與公公一上車,吼~ 她們說,怎麼會有那麼難吃的料理啊。 大家全是異口同聲,開著車時,一同在那批評。 我們家的姥姥,對食物可是最不挑剔了,很好養,如果連她都說難吃的話,那就可以知道,是有多麼的難吃了。

奇怪耶,是同一家店沒錯! 十年前,這家老店可以說是石門地區的活魚店數一數二的好吃,但是現在呢,只要遊客吃過一次,我敢肯定,是不可能再來吃的啦! 看起來可能是廚師換人了吧,口味能差到如此地步,連我們姥姥都說,燙個地瓜葉都可以做的這麼難吃,也是不容易的啦。

(本想貼個活魚料理照片,但想想,這麼難吃,還是不貼也罷。)