本研究以人力資源管理系統雛型為例,利用本研究提出的三階段架構,執行系統實 作,框架選擇使用 Java Web 框架 Strusts、Spring 、Hibernate,並搭配 JavaScript 框架 JQuery 達到 AJAX(Asynchronous JavaScript and XML)效果,使前端使用者有速度提升的感覺。
Scrum 為一個成熟的敏捷開發框架,非常適合需求變更快速的環境,整體框架也十分有
45
維護、人員訓練資料維護、人員技能資料維護以及人員聯絡資料維護。
4. 課程管理
對於所開班的課程資料進行維護,由課程管理員負責,子項目則有課程套裝資 料維護、課程基本資料維護、課程開班資料維護以及課程聯絡資料維護。
5. 人力需求管理
人力資源管理員在取得所需人力需求後所進行的資料維護項目。子項目則有人 力需求資料維護、人力需求明細維護、客戶聯絡人資料維護以及人力需求聯絡維護。
6. 上課管理
課程管理員對於人員上課情況所進行之資料維護。子項目則有人員上課資料維 護。
7. 工作管理
此項目為人員自行對工作的簽到簽退資料進行維護,再由上級主管對此項目進 行查核動作。子項目則有人員工作資料維護。
8. 需求建模
本系統的使用者角色可分為五種角色分別為人員、人力資源管理員、課程管理 員、系統管理員以及人員上級主管,各種角色對於系統底下的子系統有不同對應的 互動關係,此時由產品負責人依據使用者角色與系統互動之關係描繪出使用者案例 圖。
46
圖 4-1 系統使用者案例圖
資料來源:本研究整理
9. 產品待辦清單
產品負責人依據使用者案例圖,考慮產生系統應該具備的故事,並製成產品 待辦清單,每個故事包含了幾個項目分別是 ID、故事名稱、發行版本、衝刺、價 值、初始估算、重要性、如何演示以及註解。
• ID:每個故事都有個唯一的識別 ID,提升找尋故事的速度。
• 故事名稱:對於故事一個簡短性的描述名稱,一般由 2~10 個字組成。
• 發行版本:標示此故事是屬於專案中的哪個時期發行版本。
47
• 衝刺:標示此故事是屬於哪個衝刺需要完成的事項。
• 初始估算:團隊的初始估算,最小的單位是故事點(story point),一般相當 於一個理想的人天(man-day)。
• 重要性:由產品負責人評估出此故事的重要性並給予一個數值以表示重要 程度,分數越高越重要。
• 如何演示:簡略的敘述這個故事該如何在衝刺檢視上進行演示。
• 註解:對於故事的相關訊息、解釋說明以及對於其他資料的引用等。
下圖為編輯一項故事的範例:
圖 4-2 系統故事
資料來源:本研究整理
48
所產生之產品待辦清單:
圖 4-3 系統產品待辦清單
資料來源:本研究整理
二、 需求映對
產品負責人透過和過去所做的專案產生元件比對,若有相同或相似之功能則將該功 能自產品待辦清單移除,但由於本研究此次所做之人力資源管理系統雛型,主要為技術 面改版,由於框架版本不同,使用差異大,所以無法對於舊元件採取重用。
49
第二節 系統高階規劃階段
一、 故事建置
產品負責人依據產品待辦清單,產生描述系統主流程的活動圖以及故事描述表。
1. 系統主流程活動圖:
圖 4-4 系統主流程活動圖
資料來源:本研究整理
50
2. 故事描述表:
表 4-1 故事描述表
ID Name Description
1 登入 登入畫面包含讓使用者輸入使用者帳號及密碼,並
且有驗證處理。
2 新增員工資料 登入之後,擁有人力資源管理員權限者可進行員工 資料新增,以 Ajax 方式達成。
資料來源:本研究整理
二、 框架導入 1. Struts 框架
本系統導入 Struts2 框架以快速架構出 MVC 架構分層,Struts2 框架在使用時,
是以 WebWork 為核心,幾乎每個類別都會去訪問 WebWork 的功能,可以說 Struts2 是以 WebWork 延伸而來,下圖為 Struts2 結構圖:
51
圖 4-5 Struts2 流程圖
資料來源:Struts 官方網站,2012,http://struts.apache.org/2.0.6/docs/architecture.html
52
Struts 生命週期:
(1) 過濾器(Filter)
由使用者送出請求開始,會經由容器的配置檔 web.xml 中的過濾器開始過 濾,形成一連串的過濾串,首先是 Struts2 中自帶的 ActionContextCleanUp 過濾 器,主要是用來當前線程(Thread)的 ActionContext 以及 Dispatcher 以防止記憶 體洩漏問題(Memory Leak),配置如下圖:
圖 4-6 Struts2 過濾器
資料來源:本研究整理
接下來是存在於 web.xml 配置檔中其它過濾器進行過濾,例如編碼過濾 器,用來將頁面資料編碼成為 UTF-8 編碼,配置如下圖:
圖 4-7 Struts2 過濾器編碼
資料來源:本研究整理
接著則是 Struts2 充當中央控制器的核心過濾器 FilterDispatcher,是 Struts2 框架的基礎,用來處理框架內部的控制流程和處理機制,Struts2 版 本 2.0.x 至 2.1.2 是以 FilterDispatcher 為核心過濾器,而在版本 2.1.3 以後 則是以 StrutsPrepareAndExecuteFilter 替代。因為過去若將自定義的過濾器 放置到 Struts2 過濾器之後,則會如同虛設,但 StrutsPrepareAndExecuteFilter
53
可以拆分成為 StrutsPrepareFilter 和 StrutsExecuteFilter 如此一來就可以在兩 者間建立自己所定義的過濾器,配置如下圖:
圖 4-8 Struts2 StrutsPrepareAndExecuteFilter
資料來源:本研究整理
(2) Action 映射器(ActionMapper)
FilterDispatcher 會呼叫 Action 映射器用來判斷請求是否需要 Struts2 處理,
以請求參數的後綴字決定,通常是*.action,也可自行定義後綴字,如果 ActionMapper 決定調用某個 Action,則透過 FilterDispatcher 將請求交給 ActionProxy 處理。
(3) Action 代理器(ActionProxy)
假如 Action 映射器發現需要請求需要 Struts2 處理,則 FilterDispatcher 將 控制權委任給 Action 代理器,由 Action 代理器讀取 Struts2 配置檔 struts.xml 找尋真正執行動作的 Action。
(4) 攔截器(Interceptor)
在進入到真正執行的 Action 前,會先經過一連串的攔截器,對請求做處 理,例如例外處理,通常配置於 struts.xml 中,配置如下圖:
54
圖 4-9 Struts2 攔截器
資料來源:本研究整理
所經過的攔截器會以堆疊的方式存放形成攔截器串,配置如下圖:
圖 4-10 Struts2 攔截器串
資料來源:本研究整理
55
接下來進入真正的 Action 做處理,Action 處理完後,依照 Action 所返回 的 Result 會去找對應相關的視圖,例如像是 JSP 頁面,此時若是有用到 Struts2 所提供的標籤庫(tag library)則會先呼叫標籤子系統(Tag Subsystem)。
由於使用框架所提供的標籤,會使得整個專案對於框架相依性大幅提升,
未來若框架版本升級或改版,專案都需要大幅修改,例如 Struts2 版本在 2.1.6 以前所提供的 Ajax 標籤是和 Ajax 框架 Dojo 做綁定,於版本 2.1.6 以後,由於 支持 Dojo 框架文件過少,Struts2 決定把它單獨分出來,造成 Ajax 標籤用法大 幅改變。本研究為了防止這情形出現,所以以 JSP2.0 的標準標籤庫 JSTL(JSP Standard Tag Library)和 EL(Expression Language)來開發系統,如下圖中(c:set 與 c:out 為 JSTL 標籤,${}則代表 EL):
圖 4-11 JSTL 使用方式
資料來源:本研究整理
呼叫視圖結束後,攔截器由於存放於堆疊中,會以反向順序執行並將回應 返回給使用者。
56
2. Spring 框架
Spring 框架主要用於將 Struts 中的 Action 進行實例化以及將依賴注入的工作交 給 Spring 容器統一管理。本研究採用的版本為 Spring2.0.8,依據 Spring 官網所提 供的技術文件(The Spring Framework - Reference Documentation 2012)整理出
Spring2.0.8 框架與過去版本相比做了以下的改進:
(1) bean 作用域
Request
在一次 HTTP 請求下,一個 bean 對應一個實例。即每次 HTTP 請求將會有各自的 bean 實例,它們依據某個 bean 定義創建而 成。該作用域僅在基於 web 的 Spring ApplicationContext 情形 下有效。
Session
在一次 HTTP Session 下,一個 bean 對應一個實例。該作用域 僅在基於 web 的 Spring Application Context 情形下有效。
Global session
在一個全域的 HTTP Session 中,一個 bean 定義對應一個實例。
典型情況下,僅在使用 portlet context 的時候有效。該作用域僅 在基於 web 的 Spring ApplicationContext 情形下有效。
資料來源:本研究彙整
配置如下圖:
圖 4-12 bean 作用域配置
資料來源:本研究整理
57
Spring2.0 引入了一些用於配置的 annotation,要使用註釋標籤必須使用 Java5 或以上的版本,註釋標籤如下表所整理:
表 4-3 Spring2.0 註釋標籤 註釋標籤 描述
@Autowired 自動讓 Spring 通過檢查 BeanFactory 中的內容,來指定 所配置的 bean。
@Resource 功能與 Autowired 類似,可通過 name 屬性進行指定所 配置的 bean,此標籤屬於 J2EE 使用此標籤可以降低與 Spring 框架的耦合。
@PostConstrutct
@PreDestroy
在其生命週期與 Spring 生命週期介面的方法或者顯 示宣告回調方法同一刻上調用。
資料來源:本研究彙整
58
3. Hibernate 框架
Hibernate 框架主要用於 ORM 的實現,實現步驟如下:
(1) Hibernate 配置文件(*.cfg.xml)
配置 JDBC 驅動類別全名、JDBC 所連接的 URL、使用者帳戶及密碼、配 置資料庫方言(例如 MySQL 為 MySQLDialect) 以及註冊 ORM 映射文件。
圖 4-15 Hibernate 配置文件
資料來源:本研究整理
本研究的註冊 ORM 映射文件部分,在整合框架的時候,轉交給 Spring 框 架做處理,故在此配置中不會看到相關處理。
(2) ORM 映射文件(*.xml):
將 Java 中的實體對應到資料庫中的資料表,配置如下圖:
圖 4-16 Hibernate 映射文件
資料來源:本研究整理
59
4. JQuery 框架
JQuery 框架是一個 JavaScript 框架,透過函式庫簡化了 JavaScript,可以讓使用 者更方便的處理 HTML 文件檔、events 事件以及 Ajax 互動,也是目前最廣為使用 的框架。
圖 4-17 JavaScript 框架使用比例
資料來源:World Wide Web Technology Surveys,2012,
http://w3techs.com/technologies/cross/javascript_library/ranking
故本研究採以 JQuery 框架來達到系統之 AJAX 功能,利用前端 JavaScript 去呼 叫 Struts 框架,再利用後端三個框架的整合做資料處理,使前端使用者在等待數據 傳回時,仍可對當前頁面其它部分進行操作,提升使用者體驗。
JQuery 框架透過$當作選擇器,簡化了過去 JavaScript 必須透過 DOM 來擷取節
60
點的冗長程式碼,如下圖所示:
圖 4-18 JQuery 選擇器使用方式
資料來源:本研究整理
使用 JQuery 框架可使 JavaScript 程式碼變得相當簡潔,JQuery 也提供 AJAX 的 應用介面(API)提升開發者開發 AJAX 的速度。
5. 框架整合
(1) Spring 框架與 Struts 框架整合
將 struts.xml 裡的 ObjectFactory 設置為 spring:
圖 4-19 Spring 與 Struts 整合
資料來源:本研究整理
再把 Struts 所配置的 Action,配置到 Spring 的配置文件中,由 Spring 來為 Action 實例化:
圖 4-20 Spring 實例化 Struts Action
資料來源:本研究整理
這樣就可以透過 Spring 來管理 Action 並透過 Spring 來進行依賴注入。
(2) Spring 框架與 Hibernate 框架整合:
將 Hibernate 的 DataSource、SessionFactory 以及 Hibernate Transaction Manager 交給 Spring 管理。
61
資料庫配置:
圖 4-21 Spring 管理 Hibernate 資料庫配置
資料來源:本研究整理
SessionFactory 配置:
圖 4-22 Spring 管理 Hibernate SessionFactory
資料來源:本研究整理