先決條件
本文假定您已具備了以下技術的一些基本知識或編程經驗:
◆Java編程
◆NetBeans IDE
本教程所需的軟件
在學習之前,您需要在計算機中安裝以下軟件:
◆NetBeans IDE 5.5(下載)
◆Java Standard Development Kit (JDK) 版本 5.0 或版本 6.0(下載)
◆Sun Java System Application Server Platform Edition 9(下載)
教程練習
為IDE配置應用服務器
建立Web應用程序項目
對Web應用程序進行編碼
運行項目
為IDE配置應用服務器
在學習本教程之前,必須在IDE中注冊SunJava System Application Server Platform Edition 9的實例。在本練習中,我們將在IDE中注冊Sun Java System Application Server。
1、從主菜單中,選擇“工具”>“服務器管理器”。
2、單擊“添加服務器”。選擇“Sun Java System Application Server”,並為此實例指定一個名稱,然後,單擊“下一步”。
3、指定應用服務器的安裝目錄(例如,C:SunAPPServer)。
4、將“注冊本地缺省域”單選按鈕保留為選中狀態,然後選擇一個域。
5、(可選)單擊“下一步”,輸入管理員用戶名和口令。如果不希望在IDE用戶目錄中存儲用戶名和口令,可以將這些字段保留為空。IDE將在每次需要此信息時提示您輸入。
注意:缺省管理員口令是adminadmin。
6、單擊“完成”。IDE將注冊該服務器,並在“運行環境”窗口的“服務器”節點下面列出該服務器。
建立Web應用程序項目
在NetBeans IDE 5.0快速入門中,我們創建了一個具有EJB模塊和Web模塊的完整企業應用程序。之所以這樣做是因為:在J2EE 1.4平台中進行開發時,必須將實體Bean和會話Bean放置在EJB模塊中。要從Web模塊訪問實體Bean,我們必須添加查詢代碼。
而在Java EE 5平台上開發的示例中,不需要開發完整的企業應用程序,因為我們不需要EJB模塊或會話Bean。只需創建一個簡單的Web應用程序,然後將實體類直接放置在該Web應用程序中即可。
◆選擇“文件”>“新建項目”(Ctrl-Shift-N)。從“Web”類別中,選擇“Web應用程序”。
◆將項目命名為CustomerBook,將服務器設置為Sun Java System Application Server,將Java EE版本設置為Java EE 5,然後單擊“完成”。
小結
在本練習中,我們創建了一個包含實體類的Java EE 5 Web應用程序。
對Web應用程序進行編碼
與在J2EE 1.4平台中創建Web應用程序相比,在Java EE 5平台中進行Web應用程序編碼要更快、更容易。但是我們仍然需要進行一些基本的設置,如建立數據庫連接,但是在創建連接池和數據源後,開發工作會變得更容易,這是因為在JavaEE 5平台中進行開發時,容器可以完成更多的工作。
由於容器具有持久性管理功能,因此,我們不需要編輯用來配置CMP映射或指定finder方法的部署描述符。實際上,我們在本示例中根本不需要任何部署描述符。在Java EE 5平台中,持久性不再局限於EJB組件。Java EE 5引入了Java持久性API,非EJB組件(如Web應用程序)也可以使用它。
此外,使用Java EE 5技術時,您不再需要J2EE 1.4開發中所需的許多樣板代碼。由於簡化了EJB開發,因此只需很少的接口,查詢也變得更為簡單了,並且通過標注方式,組件定義和資源注入變得簡單而清晰。
管理持久性
在NetBeans IDE 5.0快速入門中,我們創建了CMP實體Bean並在ejb-jar.XML中定義了部署描述符,用來管理持久性和對象關系映射。在Java EE 5平台中進行開發時,我們不再需要使用部署描述符為容器提供管理持久性的信息,只需創建持久性單元,指定要使用的數據源和實體管理器,然後讓容器完成管理實體和持久性的工作即可。容器會在運行時發現實體Bean。
持久性單元的創建可以通過在persistence.xml中定義來完成。如果項目或模塊中不存在persistence.xml,則需要創建該文件。可以通過“新建持久性單元”向導將持久性單元添加到項目中,該向導將有助於我們創建persistence.XML並定義持久性單元的屬性。注意:也可以在“新建-實體類”向導中創建持久性單元。創建實體類時,如果不存在持久性單元,該向導將提示我們進行創建。
1、選擇“新建文件”(Ctrl-N)打開“新建文件”向導。
2、從“持久性”類別中,選擇“持久性單元”,然後單擊“下一步”。
3、保留向導建議的持久性單元的缺省名稱。
4、使用“持久性提供程序”下拉列表中列出的TopLink(缺省)。
缺省提供程序是TopLink Essential.jar。TopLink Essential.jar包含了Java持久性的庫。並且實體管理器位於TopLink Essential.jar中。
5、使用“數據源”下拉列表中列出的缺省jdbc/sample數據源。
缺省數據源jdbc/sample用於連接到與Sun Java System Application Server捆綁在一起的Java DB數據庫。
6、單擊“完成”。
單擊“完成”後,將為項目創建persistence.xml,並在源代碼編輯器中將其打開。通過單擊源代碼編輯器工具欄中的“XML”,可以查看persistence.xml的XML視圖。此文件包含了Java EE 5容器管理應用程序的實體和持久性所需的所有信息。
創建實體類
在J2EE 1.4平台中進行開發時,創建實體Bean後會將它們放置在EJB模塊中,即使應用程序是簡單的Web應用程序也是如此。每個實體Bean需要若干個接口,而且您必須在ejb-jar.XML中配置部署描述符以定義實體Bean以及每個實體Bean的接口、持久性和finder查詢。
在Java EE 5中,我們可以使用簡單的實體類,而且可以將實體類放置在Java EE 5應用程序中的任意位置,而不是創建實體Bean並將它們放置在EJB模塊中。同時,為Java EE 5應用程序編寫類要比在J2EE 1.4平台中編寫類更容易,因為您可以使用標注來定義組件和注入資源。
現在我們將使用“新建-通過數據庫生成實體類”向導來基於關系數據庫創建實體類。
1、啟動Java DB數據庫,方法是:從主菜單中選擇“工具”>“Java DB數據庫”>“啟動Java DB服務器”。
2、選擇“新建文件”(Ctrl-N)打開“新建文件”向導。從“持久性”類別中,選擇“通過數據庫生成實體類”,然後單擊“下一步”。
3、在“新建-通過數據庫生成實體類”向導中,從“數據源”下拉列表中為數據庫選擇jdbc/sample數據源,並提供口令(如有必要),口令應為“app”。選擇數據源後,將在“可用表”窗格中顯示可用表的列表。
4、從“可用表”中選擇CUSTOMER表,然後單擊“添加”。
單擊“添加”後,還將添加與選定表關聯的任何表。此外,在本示例中,我們還需添加DISCOUNT_CODE表。DISCOUNT_CODE表以灰色顯示,這是因為CUSTOMER表引用了該表,而且必須生成它的實體類,這樣才能生成Customer實體類。通過在“選定的表”窗格中將鼠標懸停在表名上,可以查看灰色顯示的表是如何與選定表關聯的。
5、單擊“下一步”。
向導將顯示選定表及其任何關聯表,以及將基於選定表創建的實體類。如果要修改將生成的類的名稱,則可以在“類名”字段中鍵入名稱。
6、指定ejb,將其作為生成類的包,然後單擊“完成”。
圖1
單擊“完成”後,IDE將為CUSTOMER表和與CUSTOMER表關聯的表生成實體類。如果在“項目”窗口中展開ejb源包,則可以看到IDE在Web應用程序項目的ejb包中創建了Java類Customer.java和DiscountCode.Java。
您可以看到IDE只創建了兩個類(為每個數據庫表創建了一個類)。在“使用NetBeans IDE 5.0開發J2EE應用程序的快速入門指南”中使用“通過數據庫生成CMP實體Bean”時,IDE會為每個表創建四個類。
如果您在源代碼編輯器中查看Customer.Java,則會注意到已使用了@Entity標注將類聲明為實體類。其他標注還提供了附加信息,如實體類及其屬性映射的數據庫表和列。
您還會注意到,通常在實體Bean中找到的大部分樣板代碼都不見了。這是因為在Java EE 5中,實體類不再需要諸如ejbRemove、setMessage、setSessionContext、ejbActivate和ejbPassivate之類的方法。
對Servlet進行編碼
現在我們需要將Servlet添加到Web應用程序中。在Java EE 5中,我們不必將資源創建和查詢代碼添加到Servlet中,而是可以使用資源注入將這些工作交給容器來執行。可以使用標注將資源直接注入到Servlet中,並由容器來管理請求資源的創建和查詢。在這種情況下,我們希望使用在持久性單元中指定的實體管理器。
1、在“項目”窗口中右鍵單擊項目節點,然後選擇“新建”>“Servlet”。
2、在“新建Servlet”向導中,將Servlet命名為CustomerDetails,並將Servlet放入名為web的包中。單擊“完成”。單擊“完成”後,將在源代碼編輯器中打開CustomerDetails.Java。
3、在源代碼編輯器中打開的CustomerDetails.Java上,單擊鼠標右鍵,然後選擇“持久性”>“使用實體管理器”,將PersistenceContext注入類中。IDE將添加以下標注,該標注用於指定Servlet使用的持久性單元。請在類聲明之上添加此標注。
@PersistenceContext(name = "persistence/LogicalName", unitName = "CustomerBookPU")
IDE還將添加以下標注,用於注入管理事務邊界的資源:
@Resource
private UserTransaction utx;
IDE將在Servlet中添加以下缺省代碼:
public void persist(Object object) {
try {
Context ctx = (Context) new InitialContext().lookup("Java:comp/env");
EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName");
utx.begin();
// TODO:
// em.persist(object); utx.commit();
} catch(Exception e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);
throw new RuntimeException(e);
}
}
此代碼用於查詢@PersistenceContext定義的持久性單元和實體管理器的實例。
4、在CustomerDetails.Java中,將上面所顯示的生成的查詢代碼修改為引用實體對象。完成後,經過修改的代碼應如下所示(以粗體顯示的代碼表示已更改的行):
public Customer findByID(Integer customerNr) {
Customer customer = null;
try {
Context ctx = (Context) new InitialContext().lookup("Java:comp/env");
EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName");
utx.begin();
customer = em.find(Customer.class, customerNr);
utx.commit();
} catch(Exception e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);
throw new RuntimeException(e);
}
return customer;
}
5、取消注釋processRequest方法中的代碼並添加下面以粗體顯示的代碼:
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/Html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<Html>");
out.println("<head>");
out.println("<title>Servlet CustomerDetails</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Search Customer Information</h1>");
String customerNr = request.getParameter("customer_nr");
if((customerNr != null) && !(customerNr.equals(""))) {
Customer customer = findByID(new Integer(customerNr));
if(customer != null){
out.println("Customer's info for nr. " + customerNr + ": "
+ customer.getName());
}else{
out.println("Customer not found.");
}
}
out.println("<form>");
out.println("Customer number: <input type='text' name='customer_nr' />");
out.println("<input type=submit value=Select />");
out.println("</form>");
out.println("</body>");
out.println("</Html>");
out.close();
}
6、按Alt-Shift-F組合鍵生成所有缺少的import語句。
運行項目
1、在“項目”窗口中,右鍵單擊“CustomerBook”項目節點,然後選擇“屬性”。在“項目屬性”對話框的“運行”窗格中,在“相對URL”字段中鍵入/CustomerDetails,然後單擊“確定”。
2、右鍵單擊項目節點,然後選擇“運行項目”。IDE將啟動應用服務器、生成項目,並在浏覽器中打開CustomerDetails頁。
3、在“客戶號碼”字段中輸入ID號(例如“1”),然後單擊“提交”。Servlet將顯示具有該ID號的客戶名稱。
小結
在本練習中,您使用了Java EE 5技術來生成CustomerBook應用程序,然後部署了該項目並對Web應用程序進行了測試。