使用IBM Rational Application Developer V7.5和WebSphere Application Server V7.0構建Java EE應用程序
引言
本文向您介紹 IBM® Rational® Application Developer for WebSphere Software V7.5,並帶您構建 JPA 實體、session bean,並將它 們部署到 IBM® WebSphere® V7.0 上。
Java™ Platform, Enterprise Edition V5.0(Java™ EE)在創建企業應用程序方面進行了重 大變更,它支持 Java™ Persistence API(JPA),和 Enterprise Java™Beans technology(EJB)V3.0 程序設計模型、標注,和依賴注入。
必備條件
本文假設您至少安裝了 Rational Application Developer V7.5 和 WebSphere V7.0 測試服務器。
示例應用程序
您將要創建的示例應用程序有一個 JPA 實體、調用該 JPA 實體的 Session bean 、調用 Session bean 的 Servlet,以及調用 servlet 的 web 頁面。該應用程 序中使用的數據庫是 RAD 7.5 中帶有的內嵌 Derby 數據庫。以下的圖描述了應 用程序各個組件之間的交互序列。
序列圖
遵照以下這些步驟開發應用程序:
創建 JPA 項目和實體,並指 定映射
創建 EJB V3.0 項目,和使用 JPA 實體的 session bean
創建 Web V2.5 項目和調用 session bean 的 servlet
設置數據源,並在 WebSphere V7.0 上運行 Web 頁面
創建 JPA 項目和實體,並指定映射
在此實例中,您在單獨的歸檔(.jar)中創建 JPA 實體。注意到 Java EE 規范允許您在 Web 或 EJB 項目中打包 JPA 實體。在 Rational Application Developer 中,您可以向 Web 或 EJB 項目添加 JPA 的部分來讓它們支持 JPA 實體。
創建 JPA 項目
在 Java EE 透視圖中,選擇 File > New > Other > JPA Project ,如圖 1 所示。
圖 1. 新建項目
指定 Project 名稱,如圖 2 所示。
圖 2. 新建 JPA 項目
提示您切換到 JPA 透視圖,選擇 No。JPA 透視圖擁有例如 JPA Structure 和 JPA Details 的視圖,由於 Java EE 透視圖中的 Annotations 視圖允許類似 的功能,所以切換到 JPA 透視圖不是必需的。
圖 3. 切換透視圖
注意到 Rational Application Developer 創建了帶有以下這些文件的項目:
persistence.xml
orm.xml
manifest.MF。
持久化單元名稱設置為 EmployeeJPA。
創建 JPA 實體
右鍵單擊項目並選擇 New > Entity,如圖 4 所示。
圖 4. 新建實體
指定包名和類名,如圖 5 所示,然後單擊 Next。
圖 5. JPA Entity 詳情
單擊 以下頁面中的 Add 按鈕,創建實體字段,如圖 6 所示。
圖 6. JPA Entity 屬性
在結果的 Entity Fields 對話框中,從下拉列表中選擇 java.lang.String 作為 Type,如圖 7 所示。
圖 7. Entity Fields
單擊向導的 Finish,您將看到為字段創建了 getter 和 setter 方法的類, 標注 _cnnew1@Entity,和用於主鍵字段的標注 @Id,如清單 1 所示。
清單 1.JPA 實體源代碼
import java.io.Serializable;
import java.lang.String;
import javax.persistence.*;
/**
* Entity implementation class for Entity: Employee
*
*/
@Entity
public class Employee implements Serializable {
@Id
private String EMP_ID;
private String First_Name;
private String Last_Name;
private static final long serialVersionUID = 1L;
public Employee() {
super();
}
public String getEMP_ID() {
return this.EMP_ID;
}
public void setEMP_ID(String EMP_ID) {
this.EMP_ID = EMP_ID;
}
public String getFirst_Name() {
return this.First_Name;
}
public void setFirst_Name(String First_Name) {
this.First_Name = First_Name;
}
public String getLast_Name() {
return this.Last_Name;
}
public void setLast_Name(String Last_Name) {
this.Last_Name = Last_Name;
}
}
映射數據庫
要確保實體類可以適當地和數據庫表通信,就需要二者之間的映射。JPA 提供 兩種映射機制。一個是根據標注,另一個是根據 XML(orm.xml 中指定的)。本 實例使用了標注機制進行映射。
在 Java EE 透視圖中的 Data Source Explorer 視圖中,選擇 Derby Sample Connection > Connect,如圖 8 所示。
圖 8. 數據庫連接
分析 Employee 表,如圖 9 所示。
圖 9. 數據庫方案
由於方案不匹配,所以您需要修改映射。
在 Annotation 視圖中,單擊實體 Employee 的 Table 節點,並指定以下內 容,如圖 10 所示。
Table Name:EMPLOYEE
Schema:SAMP
圖 10. Annotations 視圖
單擊 EMP_ID 下的列節點,並將其映射到 EMPNO 列,如圖 11 所示。
圖 11. ID 字段映射
同樣地,將 First_Name 和 Last_Name 映射到適當的列。
現在,Java 文件將如清單 2 所示。
清單 2. 映射的實體源代碼
@Entity
@Table(schema="SAMP", name = "EMPLOYEE")
public class Employee implements Serializable {
@Id
@Column(name="EMPNO")
private String EMP_ID;
@Column(name="FIRSTNME")
private String First_Name;
@Column(name="LASTNAME")
private String Last_Name;
需要設置 persistence.xml 中的 Java Database Connectivity(JDBC)API 數據源。打開 Enterprise 浏覽器中的文件,如圖 12 所示。
圖 12. Persistence.xml
接下來,指定數據源,如圖 13 所示(需要創建實際的數據源:步驟如最後一 個部分中所示)。
圖 13. 持久性編輯器
創建 EJB V3.0 項目,和使用 JPA 實體的 session bean
在本部分中,您將創建 EJB 項目和 session bean。
創建 EJB 項目
選擇 File > New > EJB Project。
圖 14. 打開新的 EJB 項目
指定 Project name,設置 EJB Module version 為 3.0,並選擇 EAR Project Name,如圖 15 所示。對於本實例,選擇您創建 JPA 項目時創建的 EAR 項目。
圖 15. 新建 EJB 項目
右鍵單擊 EJB 項目,並選擇 Java EE Module Dependencies,然後選擇 EmployeeJPA.jar,如圖 16 所示。這在 EJB 項目中創建了清單實體,並且還讓 JPA 實體類在開發過程中可見。
圖 16. EJB 模塊依賴
創建 session bean
在 Enterprise Explorer 中右鍵單擊 Session Beans 節點,並選擇 New > Session Bean,如圖 17 所示。
圖 17. 創建新的 session bean
指定 Java 包和類名,如圖 18 所示。在此實例中,選擇了 Local 業務接口 。
圖 18. 新建 EJB 3.0 session Bean
單擊 Finish。創建了 EmployeeSession 類和 EmployeeSessionLocal 業務接 口。
調用 JPA 實體
向 seesion bean 類中添加名為 findEmployee 的方法。
清單 3. 添加方法
EntityManager em;
public Employee findEmployee(String empNo){
Employee emp = (Employee) em.find(Employee.class, empNo);
return emp;
}
您需要將持久性單元定義為實體管理器變量。記住,當創建 JPA 項目時,在 persistence.xml 中設置了持久化單元 EmployeeJPA。您可以直接將其標注為: @PersistenceContext(name="EmployeeJPA") ,並且引入 javax.persistence.PersistenceContext,或者您可以在 Annotation 視圖中選 擇 Add annotation。
選擇 bean,如圖 19 所示。
圖 19. 標注視圖中的 Session bean
選擇標注,如圖 20 所示。
圖 20. 向 session bean 中添加標注
將持久性單元命名為 EmployeeJPA,如圖 21 所示。
圖 21. 命名持久性單元
該動作不僅添加標注,還正確地設置導入。
最終的類如清單4 所示。
清單 4. Session bean 源代碼
package com.ibm.ejb;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import com.ibm.entities.Employee;
import javax.persistence.PersistenceContext;
/**
* Session Bean implementation class EmployeeSession
*/
@Stateless
public class EmployeeSession implements EmployeeSessionLocal {
/**
* Default constructor.
*/
public EmployeeSession() {
// TODO Auto-generated constructor stub
}
@PersistenceContext(unitName="EmployeeJPA")
EntityManager em;
public Employee findEmployee(String empNo){
Employee emp = (Employee) em.find(Employee.class, empNo);
return emp;
}
}
session bean 的業務接口需要有您剛添加的方法的簽名。您可以快速地完成 :選擇 outline 視圖中的方法,並且選擇 Java EE > Promote Methods,如 圖 22 所示。
圖 22. session bean outline 視圖
這將打開 Promote Methods 對話框。選擇 findEmployee(string) 方法,如 圖 23 所示。
圖 23. Promote Methods
現在准備好讓客戶端消費 session bean。
創建 Web V2.5 項目和調用 session bean 的 servlet
在此部分中,您將創建 Web 項目和 servlet。
創建 Web 項目
選擇 File > New > Dynamic Web Project,如圖 24 所示。
圖 24. 打開動態的 Web 項目
指定 Web Project name,選擇 Dynamic Web Module version 為 2.5,並選 擇用於 JPA 和 EJB 項目一樣的 EAR Project Name,如圖 25 所示。
圖 25. 新建動態 Web 項目
當提示打開透視圖時,選擇 No,如圖 26 所示,Web 透視圖中擁有在此實例 中我們不需要的高級 web 編輯工具。
圖 26. 將透視圖切換到 Web 項目
右鍵單擊 Web 項目,並在左邊的列表中選擇 Java EE Module Dependencies ,然後選擇 EmployeeEJBClient.jar 和 EmployeeJPA.jar,如圖 27 所示。
圖 27. 對於 Web 項目的 Java EE 模塊依賴性
創建 servlet
在 Enterprise explorer 中,在 Servlets 節點中選擇 New > Servlet, 如圖 28 所示。
圖 28. 在 Web 項目中新建 servlet
對於 servlet 指定 Java 包(com.ibm.servlets)和 Class 名 (EmployeeSearch),如圖 29 所示。
圖 29. 創建 servlet
修改 doGet 方法,如清單 5 所示。該方法從請求對象中獲取 employee id, 並將其傳遞給 session bean 來找到 employee 信息。
清單 5.Servlet 源代碼
@EJB(name="Employee")
private EmployeeSessionLocal employeeSession;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
String empNo = request.getParameter("empid");
Employee emp = employeeSession.findEmployee(empNo);
if(emp != null ){
response.getWriter().println(emp.getFirst_Name() +
" " + emp.getLast_Name());
}else{
response.getWriter().println("Employee with id =" +
empNo + "couldn't be found");
}
}
在 Web 項目中創建 HTML 頁面,該頁面包含 employee id 的輸入框,和提交 按鈕,如清單 6 所示。
清單 6. HTML 源代碼
<body>
<form action="/EmployeeWeb/EmployeeSearch" method = "get">
<p>
<label>
Type Employee ID and press Submit <br/>
<input type = "text" name = "empid"/>
<input type = "submit" name = "Submit"/>
</label>
</p>
</form>
</body>
設置數據源,並在 WebSphere V7.0 上運行 Web 頁面
在此部分中,您將設置數據源並運行 Web 頁面。
設置數據源
右鍵單擊 EAR 項目,EmployeeEAR,並選擇 JavaEE > Open WebSphere Application Server Deployment,如圖 30 所示。
圖 30. WebSphere Deployment 頁面
在 JDBC 提供者部分中,單擊 Add 並選擇 Database type(Derby)和 JDBC provider type(Derby JDBC Provider),如圖 31 所示。
圖 31. Create JDBC Provider 對話框
命名提供者(DerbyDB)並選擇啟動程序和 Class path(IBM\SDP75 \runtimes\base_v7\derby\lib\derby.jar),如圖 32 所示。
圖 32. 提供 JDBC 細節
現在單擊 Add 創建數據源,如圖 33 所示。
圖 33. Data source 部分
選擇 Derby JDBC Provider 和 V5.0 數據源,並單擊 Next 按鈕,如圖 34 所示。
圖 34. Create Data Source 對話框
指定數據源名稱和 JNDI 名稱,如圖 35 所示。記住使用您在 persistence.xml JPA 中同樣的 JNDI 名。
圖 35. Create Data Source 對話框
在工作區中定位示例 Derby 數據庫,並且在數據庫名稱屬性中輸入路徑 (workspace\EmployeeSample\metadata\plugins\com.ibm.datatools.db2.cloud scape.driver\SAMPLE),如圖 36 所示。
圖 36. 數據源屬性
運行 Web 頁面
右鍵單擊 EmployeeSerach.html 並選擇 Run As > Run on Server,如圖 37 所示。
圖 37. 在服務器上運行
EAR 添加到服務器中,如圖 38 所示。
圖 38. 添加到服務器上的 EAR。
輸入 EmployeeID 並按下 Submit,如圖 39 所示。
圖 39. Web 頁面運行
結果顯示在屏幕上
圖 40. Web 頁面結果
您學到的東西
Java EE V5.0 簡化了企業應用程序的開發。本文向您介紹了如何使用 Java Persistence API、EJB V3.0,和 Rational Application Developer V7.5 中提 供的工具來構建這些企業工件。
本文配套源碼