2.3 Spring/Hibernate/Wicket 技術介紹
本論文在實作網頁應用程式的時候,廣泛應用了 Spring (http://www.springsource.org/), Hibernate (http://www.hibernate.org/) 和 Wicket (http://wicket.apache.org/) 等幾個 Java 界常見的開放原始碼 (open source) 框架 (framework),在這一章節將會針對各框架進 行概略的介紹。
2.3.1 Spring
Spring 是由 Rod Johnson 開發,一個分層式 (layered) 的 Java/J2EE (Java 2 Platform, Enterprise Edition, http://java.sun.com/j2ee/overview.html) 應 用 程 式 平 台 (application platform),Rod Johnson 會想建立 Spring 的原因是當時要開發 EJB 2.x (Enterprise JavaBeans, http://www.oracle.com/technetwork/java/index-jsp-140203.html) 應用程式不但 繁瑣,而且需要搭配笨重(通常也不便宜)的應用伺服器 (Application Server),像是 Websphere, Weblogic 等,因此 Spring 就是希望能減輕軟體工程師開發企業應用程式 的負擔。Spring 包含了下列功能:
輕量級的容器 (lightweight container): 針對應用程式中的物件提供了集中而且自 動化管理的機制。該容器並不具有擴散性 (non-invasive),能把一群鬆散藕合的 Plain Old Java Object (POJO) [16] 以一致且透明的機制組合,進而構成複雜的企 業應用系統。
交 易 管 理 (transaction management): 允 許 可 以 置 換 交 易 管 理 員 (transaction managers),而且 Spring 的好處是並不會限制必須使用特定 J2EE 環境才能支 援交易管理機制。
JDBC (Java Database Connectivity, http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136101.html) 抽象層:
‧
與 ORM (Object-relational mapping) [17] 整合: Spring 可以和大多數常用的
ORM 解 決 方 案 整 合 , 例 如 Toplink
(http://www.oracle.com/technetwork/middleware/toplink/overview/index.html),
Hibernate, JDO (http://www.oracle.com/technetwork/java/index-jsp-135919.html) 和 MyBatis (http://www.mybatis.org/),不需要擔心用了 Spring 之後不能採用習慣的 ORM 框架。
支援 AOP (Aspect Oriented Programming) 功能: Spring 對 AOP 有完整的支 援 , Spring 的 AOP 會 實 作 AOP Alliance (http://www.sourceforge.net/projects/aopalliance ) 所規範的介面,AOP Alliance 是 由許多團體所組成的聯合計畫 (Joint project),對於 AOP 的實作會要求必須遵 守所制訂的介面規範,目的是希望讓 Java 的 AOP 實作介面標準化,以達到 AOP 實作在不同的 Java 應用程式之間的可移植性 (portability)。
彈性的 MVC (Model–View–Controller) [18] 網頁應用程式框架 (web application framework): Spring 本身提供了一套完整、容易客制化的 (configurable) MVC 網頁應用程式框架,但是 Spring 也支援其他常見的網頁應用程式框架,像是 Struts (http://struts.apache.org/ ), Tapestry (http://tapestry.apache.org/), Wicket 或是 GWT (http://code.google.com/webtoolkit/ )。
‧
2.3.2 Hibernate
Hibernate 是「物件/關聯對應」 (Object-relational mapping, ORM) 的解決方案,簡單的 說 就 是 將 Java 中的物件與物件關係,對應到關聯式資料庫 (Relational Database, RDBMS) [19] 中的資料表 (Table) 與資料表之間的關係,而 Hibernate 提供了自動轉 換的功能。
也就是所謂「物件/關聯式本質不相配」 (Object-Relational Impedance Mismatch) [20] 問 題,造成軟體工程師花許多時間處理物件和資料表之間不同格式的資料轉換。ORM 正
‧
(polymorphism)、組合 (composition) 和 Java Collection Framework,因此軟體工 程師在 Java 中所有物件之間的關係都可以完整跟關聯式資料庫中的資料表相對 應。 透明的永續儲存: Hibernate 並不要求 Java 物件繼承 Base Class 或是實作某些 介 面 (Interface) 才 能 夠 被 對 應 到 資 料 表 , 這 樣 對 只 支 援 單 一 繼 承 (Single Inheritance) 的 Java 來說是比較有彈性的作法。
更好的效能: Hibernate 預設會使用延遲初始 (lazy initialization) 機制,也就是物 件只有在使用到的時候才會載入到記憶體中,這樣可以增進效能以及減少記憶 體的使用。
可靠性和延伸性: Hibernate 的設計就是能在伺服器叢集 (application server cluster) 中使用,因此具備了高度的延伸性。
可擴充性: Hibernate 很容易就能客制化和擴充功能。
完整的查詢語言: Hibernate 總共支援 Hibernate Query Language (HQL), Java Persistence Query Language (JPAQL), Criteria queries, 和原生的 (native) "SQL"
等各種查詢語言。
‧
2.3.3 Wicket
Java 界的網頁應用程式框架有數十個之多,主要分成兩大類,一種是 Request based,
共同的地方是 API 主要以剖析 HTTP Request 和產生 HTTP Response 為主,Struts 和 Spring MVC 是主要的代表;另外一種是 Component based [22],比較普遍的有
JSF (Java Server Faces, http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html), Tapestry 和這
邊要介紹的 Wicket。
Wicket 是 Apache 基 金 會 (http://www.apache.org/) 下 的 一 個 專 案 , 是 個 輕 量 級 的 Component based 網頁應用程式框架,特色是把開發網頁應用程式抽象化,轉變成類 似撰寫 Java Swing (http://download.oracle.com/javase/tutorial/uiswing/) 應用程式,透過 建立元件 (Components) 來構成網頁,Wicket 有下列優點:
徹底的物件導向: 在 Wicket 裡面,所有東西都是物件,頁面 (Page) 是物件,
頁面上的每個元件像是按鈕 (Button)、下拉式選單 (Drop-down choice) 等也都 是物件,好處是程式共用會很方便,只要把重複的程式碼寫在一個元件裡面,
然後根據需求放到不同的頁面上就可以了;此外因為是 Java 程式,所以元件之 間也可以繼承或是實作介面,增加應用程式的彈性。
將表達層 (presentation layer) 分開處理: Wicket 中每一個 HTML 檔案都一定會 有相對應的 Java 類別,而 HTML 裡面只需要寫 <p wicket:id=“componentId”>
contents... </p> 這樣的 tag 來跟 Java 類別中的元件對應,除此之外不會摻雜 Java 程式,因此不會像傳統的 JSP 中同時包含 HTML 語法和 Java 程式,不 但增加修改的困難度,也讓軟體工程師和介面設計者 (UI Designer) 的合作變得 較為困難。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
含有狀態 (stateful): 傳統的 HTTP 是不含狀態的 (stateless) [23],但是 Wicket 將 component 包裝成含有狀態 (stateful) 的,寫企業應用程式的時候非常方便,
我們可以把使用者的帳號和訂單資料都紀錄在 Session 裡,要用的時候直接拿 出來,不需要再去資料庫存取,省了很多工夫。
下 面 是 個 用 Wicket 寫 的 簡 單 網 頁 範 例 , 可 以 看 出 只 要 在 HTML 裡 寫 wicket:id=“message” , 再 到 Java 類 別 裡 加 上 id=“message” 的 Label (http://wicket.apache.org/apidocs/1.4/org/apache/wicket/markup/html/basic/Label.html) 元 件,Wicket 就會把兩者關連起來,在頁面上顯示出 “Hello World” 訊息:
圖 2-3 HelloWorld.html
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
第3章
系統設計與架構
本章節會說明應用剖面技術的系統框架中的設計與架構,解釋如何在現有的醫療資訊 系統中,加入尊重病人隱私權的設計。3.1 小節會說明設計理念以及提議的隱私權框 架,3.2 小節會介紹行動目的管理員 (Action Purpose Manager) 設計。3.3 小節則是病 人偏好管理員 (Patient Preferences Manager),最後 3.4 小節是有關病人隱私剖面 (Aspect) 的設計。