JavaEE

Spring 上課筆記 (2)

基本介紹

教學目標

初步了解 J2EE 的基本實作。

重點概念

J2EE 應用程式主要可分為五個階層,分別為客戶端層、呈現層、商業邏輯層、資料存取存和資料層,其中客戶端層主要由瀏覽器、應用程式所組成,伺服器主要由呈現層、商業邏輯層和資料存取層所組成,呈現層中的容器稱之為 Web Container 主要包括 JSP 和 Servlet,商業邏輯層中的容器稱之為 EJB Container 主要包括各種不同功能用途的 Enterprise Java Bean ,資料存取層則以 JDBC 和不同的 Connactor 為主,至於資料層則以關聯式資料庫和傳統應用程式為主,又稱為企業資訊系統。
J2EE Application Layers 圖片來源:https://docs.oracle.com/cd/E19644-01/817-5448/images/comp-J2EE-env.gif
接著我們只要安裝 Netbeans 開發工具就能透過精靈建立符合上述架構的 J2EE 應用程式。首先我們開啟 Netbeans 開發工具新增空白 J2EE 專案,選擇「New Project」→「Java Web」→「Web Appication」,接著在 Project Name 輸入「eBiz」,按下「Next」,選擇預設值再按下「Next」,先不選擇任何 Framework 按下「Finish」建立專案。

接著我們需要建立資料存取層的 Entity 對應資料層中的關聯式資料庫,先在「eBiz」專案上按右鍵選擇「New」→「Other」,接著點選「Persistence」,再選擇「Entity Classes from Database」,按下「Next」,選擇 Data Source 為 jdbc/sample,按下「Add All」,按下「Next」,接著在 Package 輸入「com.company.ebiz.model.entity」,按下「Next」鈕,接著按下「Finish」鈕。

再來我們需要建立商業邏輯層的 Session Beans 針對 Entity 進行 CRUD 新增、讀取、更新和刪除的基本操作,先在「eBiz」專案上按右鍵選擇「New」→「Other」,接著點選「Persistence」,再選擇「Session Beans for Entity Classes」,按下「Next」,按下「Add All」,按下「Next」,接著按下「Finish」鈕。

最後我們需要建立呈現層的 JSP/Servlet 透過 Session Beans 讀取資料層中的資料內容,先在「eBiz」專案上按右鍵選擇「New」→「Other」,接著點選「Web」,再選擇「Sevelet」,按下「Next」,接著在 Class Name 輸入「CustomerController」 和在 Package 輸入「com.company.ebiz.controller」,按下「Next」鈕,在 Servlet Name 中入「CustomerController」,和在「URL Pattern」輸入「/allCustomers」,接著按下「Finish」鈕。

接著在 CustomerController.java 輸入下述程式碼。

1
2
3
4
5
6
7
8
9
10
import com.company.ebiz.model.entity.*;
...
@Inject
private CustomerFacade cf;

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Customer> custs = cf.findAll();
request.setAttribute("custs", custs);
request.getRequestDispatcher("allCustomers.jsp").forward(request, response);
}

接著在 Web Pages按右鍵選擇「New」,選擇「JSP」,接著在 File Name 輸入「allCustomers.jsp」,接著按下「Finish」鈕,接著下來輸入以下程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<table>
<c:forEach var="c" items="${custs}">
<tr>
<td>${c.name}</td>
<td>${c.city}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

當上述步驟完成之後,我們只需在 eBiz 專案按右鍵選擇「Clean & Build」編譯專案,接著在「CustomerController」檔案上按右鍵選擇「Run File」,按下「OK」,就能夠看到資料庫的結果直接呈現至客戶端層網站上。

相關資源

Spring 上課筆記 (1)

基本介紹

教學目標

初步了解 Spring Framework 的基本概念。

重點概念

Spring Framework 之父是 R.Johnson,他在 2002 年出版書籍「J2EE Design and Development」主要以架構描述的方式進行發表,並且在 2003 年再以開放原始碼的形式釋出第一版本。在當時有許多 Java 企業領域的開放原始碼在實務上皆有很不錯的表現,主要可以分為展現層、永續層和商務層,其中展現層以 Structs Framework 為主,永續層主要以 Hibernate 為主,然而卻只有商務層除了 EJB 之外,並沒有適合的開發原始碼,此時 Spring 就能解決此痛點。

首先設計理念主要是透過介面進行系統設計,以傳統 Java 物件為主,非侵入性,可模組化的輕量級服務,以及提供一致性的設定檔格式。接著架構主要有五大重點,分別為 Bean 容器、永續性相關機制支援、Spring AOP、Web 相關技術支援以及 Java EE 相關技術支援。再來理論基礎,主要為控制權倒置 (Inversion of Control,IoC) 和依賴性注入 (Dependency Injection,DI),深入了解理論基礎將有助於我們評估是否需用採用 Spring Framework。

所謂控制權倒置主要是將函式庫的重用方式改為框架的重用方式,其中核心概念有二個,第一個是在父類別中撰寫主流程,稱為 Template Method。第二個是在可變的部份以子類別負責實作的抽象方法為主。在 Template Method 中,我們將主流程封裝在父類別中,則稱為應用程式框架,其中內含主流程的父類別就是框架,透過繼承重用主流程的子類別就是元件,只要置換不同的子類別就能呈現不同的行為。

所謂依賴性主要是指當某一個類別繼承另一個類別、實作另一個介面或叫用到其它類別,我們就說此類別依賴另一個類別。一般來說依賴性感低,程式的可重用性會愈高。此外若我們要透過 Spring Framework 降低依賴性,基本上可透過 POJO 為基礎的程式設計,透過 AOP 來將特定的技術邏輯,也就是非功能方面的需求注入元件中,此外在執行時期 Spring 會做為元件之間的中間人將依賴關係進行注入。一般來說,我們會使用 new 運算子來產生物件,並且使用 setter 方法建立關係,透過 Factory 將物 件產生象化並且進行包裝,再將生成物件的責任委派給 Factory,此時可以設計一種的泛用的 Factory 專門用來產生並且組裝物件,就是所謂「輕量級容器」。接著當我們在使用輕量級容器時,實質上是物件生成的控制權的倒置,又稱 IoC Container 。但是框架重用的 IoC 指的是主流程主控權的倒置,而 IoC Container 中的 IoC 指的是物件生成主控權的倒置,因為容易造成混淆,所以 M.Fowler 建議使用依賴注入 (Dependency Injection,DI) 用於指稱物件生成主控權的倒置,其中依賴注入主要有三種型式,分別為 Setter Injection、Constructor Injection 和 Interface Injection,然而 Interface Injection 具有較強的侵入性,所以 Spring 只採用 Setter Injection 和 Constructor Injection。

總結 Spring 是個全方位的應用程式框架,主要功能為輕量級容器、實作依賴注入和非侵入性的框架、提供 AOP 機制應用於非功能性的需求、提供持久層和交易層的支援、提供 MVC Web 框架的實現… 等應用。

相關連結