成為 Web 開發人員正當其時。從未有如此多技術選擇:大量優秀的開源 Web 伺服器、資料庫、程式語言和開發框架任您使用。無論您希望使用哪種技術組合,都存在能提升生產力的整合開發環境 (IDE):Eclipse。本教學是三部曲系列「用 Eclipse Europa 進行 Web 開發」的第一部分,介紹如何透過 Eclipse 實現 Java、PHP 和 Ruby Web 開發,著重示範如何使用 Eclipse 最新版本 Europa 快速開發 Java Web 應用程式。我們將使用 Eclipse 版 Java Platform, Enterprise Edition 5 (Java EE) 建構用於追蹤和計算棒球統計資訊的 Web 應用程式。
Eclipse 開發人員致力於讓 Web 開發人員工作更輕鬆。Europa 發行版提供多個經調整的 Eclipse 版本,包含適用於 Web 開發人員的版本。
在「用 Eclipse Europa 進行 Web 開發」系列中,您將發現無論選擇何種語言,Eclipse 都是 Web 開發的理想平台。靈活的外掛系統讓它能輕鬆創建針對 Java、PHP 和 Ruby 量身打造的 Eclipse 版本。您將看到不同外掛如何為各語言提供獨特功能,以及所有 Web 開發人員都能受益的通用功能。本系列將建立一個範例棒球 Web 應用程式,允許輸入球員比賽數據並計算統計資訊。
作為三部曲第一部分,本教學使用 Eclipse Java EE 版本進行 Java Web 開發,示範使用 Eclipse 連接資料庫、建立表格和測試數據、配置 Web 伺服器、使用精靈建立 Web 應用程式、網頁和資料存取程式碼。最後,使用 Eclipse 控制 Web 伺服器、發布應用程式、甚至在應用程式運行時偵錯。
擁有 Java 程式設計背景對發揮本教學最大效果至關重要。熟悉 Eclipse IDE 將十分有幫助,但並非必要。
查看 Eclipse.org 下載區,會看到若干可用發行版。我們使用 Eclipse IDE for Java EE Developers。
Eclipse IDE for Java EE Developers 提供 Java Web 開發所需功能:Java 編譯器和偵錯器;支援 Java 應用伺服器、資料庫客戶端;Web 應用程式、Web 服務和 Enterprise JavaBean (EJB) 精靈等。值得注意的是 HTML 檔案和 Java Server Page (JSP) 的圖形編輯器。附帶大多數功能在 Eclipse 先前版本可找到。Europa 發行前,需下載現稱 Eclipse Classic 版本並安裝額外外掛。Europa 簡化此操作,並針對 Java Web 開發全面調整 Java EE 套件。
Java EE 套件按功能打包,支援所有功能需消耗開發電腦資源。建議編輯 eclipse.ini 增加 Europa 記憶體使用量。此檔案位置因作業系統而異。編輯 -vmargs 增加記憶體。本教學開發期間使用的記憶體設定:
-Xms256m
-Xmx512m
-XX:MaxPermSize=128m
安裝 Europa Java EE 版本,配置資料庫和 Web 伺服器,接著開發 Web 應用程式。
Eclipse 讓 Web 開發更簡單,但仍需基礎設施。需要資料庫保存和檢索數據。Eclipse 提供優秀資料庫工具,只需建立空資料庫或重用現有資料庫。下列 MySQL 指令建立空資料庫:
mysql> create database baseball;
Query OK, 1 row affected (0.04 sec)
完成部分基礎設施。需要 Web 伺服器,可用任意 Java Web 容器,包括 Apache Geronimo 或 IBM WebSphere。保持簡單使用 Apache Tomcat V6.0。無需對 Tomcat 特殊配置。基礎設施就緒,開始用 Eclipse 開發 Web 應用程式。
為演示 Eclipse 強大功能,建構追蹤棒球統計的 Java Web 應用程式。這是簡單應用,允許輸入球員比賽數據並計算統計。首先建立資料庫結構描述。
開啟 Eclipse 時,需開啟 Data Source Explorer 視窗。右鍵點擊 Databases 資料夾選擇 New。

Eclipse 詢問資料庫連線類型。選擇 Generic JDBC Connection。

配置連線。告訴 Eclipse 連接哪個資料庫。範例 2 已建立 baseball 資料庫,使用該資料庫。

點擊 Browse 建立新驅動程式,開啟資料庫類型列表。

向下捲動找到 MySQL V5.1 (或適用您資料庫的類型)。點擊 Add 開啟驅動程式定義對話框。

點擊 Add Jar/Zip 開啟檔案瀏覽器,瀏覽到已下載的 MySQL 驅動程式 JAR 檔案。選中 JDBC JAR 後,驅動程式定義列表會刷新。

選擇剛建立的驅動程式定義點擊 OK。開啟連線屬性,可能需編輯用戶名和密碼。

輸入連線資訊後測試連線,應顯示成功對話框。

若未獲成功訊息需調整設定。連線測試通過後,應能在 Data Source Explorer 啟動資料庫連線。

已建立資料庫連線,接著為儲存數據建立表格。
查看 Data Source Explorer 中表格列表。

目前無表格。右鍵點擊 Tables 資料夾選擇 New Table。

開啟建立選項列表。

開啟新建表對話框。

建立名為 Players 的表格,三欄:Id、First_Name、Last_Name。三欄皆必填,Id 為主鍵。

點擊 Finish。此操作不執行 SQL DDL,而是產生 SQL 語句。

最棒的是可在執行前調整 SQL。將 Id 設為自動遞增,first-name 和 last-name 字元長度限制 50。SQL 如範例 3:
CREATE TABLE Players (
Id INT NOT NULL AUTO_INCREMENT,
First_Name VARCHAR(50) NOT NULL,
Last_Name VARCHAR(50) NOT NULL,
PRIMARY KEY (Id)
);
執行 SQL:高亮選中右鍵選擇 Execute selected Text。

執行後 SQL Results 視窗顯示成功訊息。

可在 Data Source Explorer 檢視 Players 表格。

還需另一張表格儲存比賽數據,同樣方法建立。最後執行 SQL 如範例 4:
CREATE TABLE Games (
Id INT NOT NULL AUTO_INCREMENT,
Player_Id INT DEFAULT '' NOT NULL,
AB INT DEFAULT 0 NOT NULL,
H INT DEFAULT 0 NOT NULL,
2B INT DEFAULT 0 NOT NULL,
3B INT DEFAULT 0 NOT NULL,
HR INT DEFAULT 0 NOT NULL,
BB INT DEFAULT 0 NOT NULL,
R INT DEFAULT 0 NOT NULL,
RBI INT DEFAULT 0 NOT NULL,
PRIMARY KEY (Id)
);
CREATE INDEX Player_Id ON Games (Player_Id ASC);
執行後已建立應用程式所需兩張表格。繼續輸入測試數據。
用 Eclipse 建立表格簡單,管理表格數據更簡單。右鍵點擊 Data Source Explorer 表格名稱選擇 Data > Edit 開始添加數據。

開啟輸入表格數據的圖形介面。

按需添加數據,只需輸入 First_Name 和 Last_Name。完成後右鍵選擇 Save。

SQL Results 視窗顯示實際執行的 SQL 和資料庫回傳訊息。在 Players 視窗右鍵選擇 Refresh 重新查詢數據,看到資料庫產生的 ID。對 Games 表格執行相同操作。完成後配置 Eclipse 使用 Web 伺服器。
先了解 Eclipse 基本概念和透視圖,再設置 Web 伺服器,然後開始編寫應用程式。
Eclipse 重要概念是透視圖。不同透視圖提供適用特定開發類型的視窗和命令。選擇 Window > Open Perspective > Other 選擇 Java EE 切換到 Java EE 透視圖。

選擇 File > New > Other 從列表選擇 Server。

點擊 Next 為服務器定義選擇 Tomcat v6.0 Server。需選擇運行時。

在檔案瀏覽器瀏覽到 Tomcat 安裝目錄。Eclipse 知道 Tomcat 目錄位置後點擊 Finish。基礎設施就緒,開始編寫程式碼。
開始開發 Web 應用程式,這是 Eclipse 發揮實際作用的部分。選擇 File > New > Other 選擇 Dynamic Web Application 建立新 Web 應用程式。

填寫專案名稱 baseball,目標運行時設為剛建立的 Tomcat V6.0 服務器。

點擊 Next 開啟 Project Facets。使用 Java Persistence API 管理資料存取 (下一部分詳述),確保勾選該選項。

點擊 Next 開啟 Web 模組中繼資料。使用預設值,但偏好將 Web 模組目錄命名為 war,一目瞭解構建內容。

點擊 Next 開啟 JPA 配置。使用 Tomcat 無「內建」JPA 實作,如系統需求所述使用 OpenJPA。選擇 Configure default JPA implementation library。

開啟 Default JPA Implementation Library 偏好設定。點擊 Configure user libraries。

選擇 OpenJPA (或其他如 TopLink、Hibernate) JAR 檔案。配置 JPA 實作後返回 JPA 配置畫面,選擇新庫點擊 Finish。

點擊 Finish,Eclipse 建立 Web 應用程式所需目錄結構和許多工件 (如 web.xml 和 persistence.xml)。應用程式建立完成,開始建立領域模型。
了解 Java Persistence API 如何減輕 Java 使用資料庫的痛苦,以及 Java EE for Eclipse 如何在建立應用程式領域模型時支援該模型。
早期 Java 開發人員知曉使用資料庫有多痛苦:通常涉及大量 JDBC 程式碼或手寫冗長 SQL 字串,還要用許多介面建立實體 EJB 並編寫部署描述符。那些日子已過去,歸功於 EJB 3.0 和 JPA。現在 EJB 不僅易用,且無需重量級應用伺服器即可使用。
Java EE for Eclipse 充分支援 JPA,甚至提供 JPA 透視圖。選擇 Window > Open Perspective > Other 選擇 JPA Development 切換。

建立領域模型只需建立簡單 Java 類別。首先為 Players 表建立 org.developerworks.baseball.Player 類別。程式碼如範例 5:
package org.developerworks.baseball;
public class Player {
private int id;
private String firstName;
private String lastName;
}
需要 getter 和 setter。Eclipse 使此簡單:選擇 Source > Generate Getters and Setters。

開啟對話框,點擊 Select All 和 OK。

產生程式碼如範例 6:
package org.developerworks.baseball;
public class Player {
private int id;
private String firstName;
private String lastName;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
}
將類別與資料庫表關聯:在 JPA Structure 視窗點擊 Player 類別。

在 JPA Details 選擇 Map As > Entity。

在 Table 區段選擇結構描述,Name 下拉選單選 Players 表。

程式碼隨即變更。

在 Package Explorer 選擇 persistence.xml,右鍵選擇 JPA Tools > Synchronize Classes。

Eclipse 對資料庫驗證程式碼,發現程式碼無效。

查看 Problems 視窗。

第一個問題:類別未指定主鍵。解決:在 JPA Structure 點擊 Id 屬性,在 JPA Details 選擇 Map As > Id。

因 ID 欄位設為自動遞增,需指定主鍵使用 Identity 鍵產生策略。再執行 JPA 同步,解決一個問題。
其他問題源於 JPA 無法將 firstName 和 lastName 對應到 Players 表欄位。因 Java 欄位未命名為與表欄位完全相同。在 JPA Structure 選擇 firstName 欄位,在 JPA Details 下拉選單選對應欄位。

對 lastName 執行相同操作。再執行 JPA 同步,所有問題解決。Player 類別程式碼更新如範例 7:
package org.developerworks.baseball;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Column;
@Entity
@Table(schema="baseball", name = "Players")
public class Player {
@Id
@GeneratedValue(strategy=IDENTITY)
private int id;
@Column(name="First_Name")
private String firstName;
@Column(name="Last_Name")
private String lastName;
// getter/setter 略
}
同樣過程建立對應 Games 表的 Game 類別。程式碼如範例 8:
package org.developerworks.baseball;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Column;
@Entity
@Table(schema="baseball", name = "Games")
public class Game {
@Id
@GeneratedValue(strategy=IDENTITY)
private int id;
@ManyToOne(optional=false)
@JoinColumn(name="Player_Id", nullable=false, updatable=false)
private Player player;
@Column(name="H") private int hits;
@Column(name="2B") private int doubles;
@Column(name="3B") private int triples;
@Column(name="HR") private int homeRuns;
@Column(name="BB") private int walks;
@Column(name="R") private int runs;
@Column(name="RBI") private int rbis;
@Column(name="AB") private int atBats;
// getter/setter 略
}
所有類別完成對應。最後編輯 persistence.xml,這是 JPA 關鍵中繼資料檔案,包含連線資訊。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="https://java.sun.com/xml/ns/persistence"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/persistence
https://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="baseball">
<class>org.developerworks.baseball.Game</class>
<class>org.developerworks.baseball.Player</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/baseball"/>
<property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="openjpa.ConnectionUserName" value="root"/>
<property name="openjpa.ConnectionPassword" value="password"/>
<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
</properties>
</persistence-unit>
</persistence>
Eclipse 應已將類別放入此檔案,您只需填入資料庫連線資訊。完成 JPA 設定,接著為資料建立 UI。
為存取資料建立 UI,採用 JSP Model 2 架構。先建立處理商務邏輯的 Servlet,再轉發給 JSP 呈現輸出。
回到 Java EE 透視圖,右鍵點擊 baseball 專案選擇 New > Servlet。

開啟 Create Servlet 對話框,填寫 Java package 和 Class name 點擊 Next。

無需編輯,但注意指向 Servlet 的 URL 對應。Eclipse 自動在 web.xml 設定此對應,無需修改該檔案。記住此對應點擊 Finish。

在 Servlet 類別中使用 JPA 獲取所有球員列表並轉發給 JSP。程式碼如範例 10:
package org.developerworks.baseball.web;
import java.io.IOException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.developerworks.baseball.Player;
public class PlayersServlet extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
private EntityManagerFactory factory;
private EntityManager em;
public PlayersServlet() {
super();
factory = Persistence.createEntityManagerFactory("baseball");
em = factory.createEntityManager();
}
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Player> players = em.createQuery("select p from Player p").getResultList();
request.setAttribute("players", players);
request.getRequestDispatcher("/players.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
注意:Servlet 建構子中使用 JPA 建立參考 baseball 持久單元的 EntityManager 實例,此單元來自 persistence.xml (範例 9)。
用 Eclipse 建立 JSP 很輕鬆。右鍵點擊 baseball 專案選擇 New > JSP。

首先列出棒球球員。程式碼如範例 11:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Baseball Players</title>
</head>
<body>
<table>
<thead>
<tr>
<td>First Name</td>
<td>Last Name</td>
</tr>
</thead>
<c:forEach items="${players}" var="player">
<tr>
<td>${player.firstName}</td>
<td>${player.lastName}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
建立基本應用程式,準備測試。可能想用 Ant 或 Perl、Groovy 等腳本語言編寫部署腳本。Eclipse 支援 Ant 和 Maven,但有更簡單方法。
部署應用程式:右鍵點擊 baseball 專案選擇 Run As > Run On Server。

Eclipse 詢問部署到哪台伺服器。選擇先前建立的 Tomcat 實例點擊 Finish。

開啟 Servers 視窗顯示 baseball 應用程式已發布到 Tomcat。

在瀏覽器輸入 https://localhost:9762/baseball/PlayersServlet 開啟應用程式,顯示先前建立的範例數據。

列表應與範例數據相同。若有錯誤,確保連線屬性正確且所有 JAR 已複製到 /WEB-INF/lib 目錄 (如 OpenJPA JAR、JDBC 驅動 JAR、JSTL JAR)。
返回應用程式偵錯。Eclipse 偵錯功能是主要特色之一,能偵錯在 Web 伺服器運行的活動程式碼非常重要。回到 Servlet 類別,在使用 JPA 查詢資料庫處設置斷點。

在 Server 視窗右鍵點擊使用的伺服器選擇 Stop 停止伺服器。重新啟動但選擇 Debug。

重新載入網頁,Eclipse 應切換到 Debug 透視圖。

從偵錯透視圖可逐步執行程式碼、設置監視等。無需對伺服器特殊操作,像偵錯 Java 主方法可執行類一樣偵錯 Web 應用程式。
我們已看到如何使用 Eclipse 設置 Web 開發所需一切。Eclipse 整合資料庫、Web 伺服器及其他所需工具;擁有許多工具助您快速利用 Java EE 技術集。使用 Eclipse 連接資料庫建立表格並填充數據,再利用相同工具建立 JPA 對應簡化資料存取程式碼。使用 Eclipse 建立 JSP 和 Servlet。然後部署 Web 應用程式,甚至直接從 Eclipse 偵錯。現在可添加更多網頁建立球員、比賽並計算統計,詳見系列第二部分。