使用 NetBeans IDE 5.0 開發(fā) J2EE 應(yīng)用程序的快速入門指南
樣例項(xiàng)目 |
是否只想試用某些 J2EE 項(xiàng)目?在 IDE 中,選擇“文件”>“新建項(xiàng)目”,然后展開“樣例”文件夾。IDE 中包含 Java BluePrints 解決方案目錄中的樣例。 |
本教程將向您介紹創(chuàng)建具有容器管理持久性(CMP 實(shí)體 Bean)的實(shí)體 Enterprise JavaBeansTM 組件的基本步驟。我們將使用 NetBeansTM IDE 5.0 通過現(xiàn)有的 Apache Derby 數(shù)據(jù)庫生成 CMP 實(shí)體 Bean。然后創(chuàng)建一個(gè)簡單的會(huì)話 Bean 來訪問數(shù)據(jù)庫信息和 Web 模塊客戶端。
本教程是一個(gè)有關(guān) NetBeans IDE 5.0 中的 J2EE 開發(fā)功能的快速指南,而不是如何編寫企業(yè)應(yīng)用程序的說明性指南。盡管您無需了解 J2EE 技術(shù)的一些知識也能完成本教程,但建議初學(xué)者最好還是先從 NetBeans IDE 中的 J2EE 教程開始學(xué)起。
注意:本教程旨在向您介紹如何使用 Sun JavaTM System Application Server 8.2 及其捆綁的數(shù)據(jù)庫服務(wù)器 Apache Derby。早期版本的 Sun Java System Application Server 使用 PointBase 作為捆綁的數(shù)據(jù)庫服務(wù)器。要以 PointBase 為例來完成此教程,請參見使用 NetBeans IDE 4.1 開發(fā) J2EE 應(yīng)用程序的快速入門指南。
本文檔包含以下主題:
對 EJB 模塊進(jìn)行編碼 對 Web 模塊進(jìn)行編碼 生成和部署應(yīng)用程序 后續(xù)步驟 入門指南
在開始之前,必須確保安裝了所需的所有軟件。此外,還必須配置 Derby 數(shù)據(jù)庫,并填充用來生成 CMP 實(shí)體 Bean 的數(shù)據(jù)庫表。
設(shè)置環(huán)境
首先,需要在計(jì)算機(jī)上安裝 Sun Java System Application Server Platform Edition 8.2(下載)。
注意:如果在 JDK 5.0 中運(yùn)行 IDE,則應(yīng)用服務(wù)器還需要使用 JDK 5.0 中的虛擬機(jī)。要設(shè)置 IDE 使用的 JDK,請打開 IDE_INSTALL_DIR/etc/netbeans.conf,并在 netbeans_jdkhome 屬性中輸入 JDK 的路徑。要設(shè)置應(yīng)用服務(wù)器使用的 JDK,請編輯 AS_INSTALL_DIR/config/asenv(.bat) 文件并更改 AS_JAVA 環(huán)境變量。
安裝應(yīng)用服務(wù)器后,需要在 NetBeans IDE 中注冊該服務(wù)器。請注意,如果下載和安裝的 NetBeans IDE 版本與應(yīng)用服務(wù)器捆綁在一起,則不必執(zhí)行此步驟。IDE 知道捆綁的應(yīng)用服務(wù)器的位置。
- 轉(zhuǎn)到 NETBEANS_INSTALL_DIR/bin 目錄并運(yùn)行 netbeans 命令以打開 NetBeans IDE 5.0。如果 java 不在 PATH 變量中,則在命令行中使用 --jdkhome /path/to/jdk 開關(guān)來啟動(dòng) IDE,或?qū)?netbeans_jdkhome="/path/to/jdk" 一行添加到 NETBEANS_INSTALL_DIR/etc/netbeans.conf 文件中。
- 在 IDE 中,從主窗口選擇“工具”>“服務(wù)器管理器”。
- 單擊“添加服務(wù)器”。選擇 "Sun Java System Application Server",并為此實(shí)例指定一個(gè)名稱。然后單擊“下一步”。
- 指定應(yīng)用服務(wù)器的安裝目錄(例如,C:\Sun\Appserver)。
- 將“注冊本地缺省域”單選按鈕保持選中狀態(tài),然后選擇一個(gè)域。
- (可選)單擊“下一步”,輸入管理員用戶名和口令。如果不希望在 IDE 用戶目錄中存儲(chǔ)用戶名和口令,可以將這些字段保留為空。IDE 在每次需要此信息時(shí)會(huì)提示您輸入。
注意:缺省管理員口令是 adminadmin。 - 單擊“完成”。IDE 將注冊該服務(wù)器,并在“運(yùn)行環(huán)境”窗口的“服務(wù)器”節(jié)點(diǎn)下面列出該服務(wù)器。
最后,啟動(dòng)應(yīng)用服務(wù)器:
- 在“運(yùn)行環(huán)境”窗口中,右鍵單擊該應(yīng)用服務(wù)器節(jié)點(diǎn),然后選擇“啟動(dòng)服務(wù)器”。
- 展開應(yīng)用服務(wù)器節(jié)點(diǎn)。該節(jié)點(diǎn)包含在應(yīng)用服務(wù)器的管理控制臺(tái)中看到的所有類別的子節(jié)點(diǎn)。通過右鍵單擊任意一個(gè)節(jié)點(diǎn)并選擇“屬性”,可對應(yīng)用服務(wù)器進(jìn)行配置。
配置 Derby 數(shù)據(jù)庫
在本教程中,您將通過 Derby 數(shù)據(jù)庫服務(wù)器中包含的其中一個(gè)表來生成 CMP Bean。Derby 數(shù)據(jù)庫服務(wù)器包含在 Sun Java System Application Server 8.2 下載文件中。
- 在“運(yùn)行環(huán)境”窗口中,展開“數(shù)據(jù)庫”節(jié)點(diǎn)。您會(huì)看到 jdbc:derby://localhost:1527/sample 數(shù)據(jù)庫的節(jié)點(diǎn)。
- 右鍵單擊 jdbc:derby://localhost:1527/sample 數(shù)據(jù)庫,然后選擇“連接”。如果系統(tǒng)提示您輸入口令,請鍵入 app 作為用戶名和口令,然后單擊“確定”。
- 展開 sample 數(shù)據(jù)庫節(jié)點(diǎn)和“表”節(jié)點(diǎn)。確保其中包含 CUSTOMER 節(jié)點(diǎn),如下所示。
注意:如果修改了 sample 數(shù)據(jù)庫,可使用此 SQL 腳本對其進(jìn)行重寫。
對 EJB 模塊進(jìn)行編碼
對 Enterprise Bean 進(jìn)行編碼非常容易。IDE 會(huì)兼顧所有實(shí)現(xiàn)細(xì)節(jié),因此您可以集中精力對 EJB 模塊的業(yè)務(wù)邏輯進(jìn)行編碼。
創(chuàng)建企業(yè)應(yīng)用程序項(xiàng)目
在本示例中,我們將創(chuàng)建一個(gè)企業(yè)應(yīng)用程序項(xiàng)目作為 Web 模塊和 EJB 模塊的容器。通過使用企業(yè)應(yīng)用程序模板,您可以自動(dòng)為 Web 模塊和 EJB 模塊創(chuàng)建項(xiàng)目。
- 選擇“文件”>“新建項(xiàng)目”(Ctrl-Shift-N),然后從“企業(yè)”類別中選擇“企業(yè)應(yīng)用程序”模板。單擊“下一步”。
- 將應(yīng)用程序命名為 CustomerBook,然后指定項(xiàng)目位置。將其余設(shè)置保持為缺省值,然后單擊“完成”。
生成 CMP 實(shí)體 Bean
現(xiàn)在,我們將生成訪問 sample 數(shù)據(jù)庫的實(shí)體 Bean。對于程序要訪問的每個(gè)表,都需要一個(gè)對應(yīng)的實(shí)體 Bean。
- 在“項(xiàng)目”窗口中,右鍵單擊 EJB 模塊的節(jié)點(diǎn) (CustomerBook-EJBModule),然后選擇“新建”>“通過數(shù)據(jù)庫生成 CMP 實(shí)體 Bean”。
- 選擇“JDBC 連接”作為數(shù)據(jù)庫源,然后從組合框中選擇 jdbc:derby://localhost:1527/sample 連接。
- 鍵入 ejb 作為包名,然后單擊“下一步”。向?qū)@示選定數(shù)據(jù)庫中的所有表。
- 選擇 CUSTOMER 表,單擊“添加”,然后單擊“完成”。
IDE 將為 CUSTOMER 表以及從 CUSTOMER 引用的任何表 (DISCOUNT_CODE) 創(chuàng)建 CMP Bean。IDE 還會(huì)創(chuàng)建一個(gè)新的 JDBC 連接池和數(shù)據(jù)源,在部署項(xiàng)目時(shí),將在應(yīng)用服務(wù)器中注冊該連接池和數(shù)據(jù)源。
對會(huì)話 Bean 進(jìn)行編碼
現(xiàn)在,我們將創(chuàng)建一個(gè)會(huì)話 Bean,用來處理 Web 應(yīng)用程序客戶端對實(shí)體 Bean 中的信息的訪問。我們將創(chuàng)建一個(gè)空會(huì)話 Bean,生成對實(shí)體 Bean 的調(diào)用,然后添加一些 business 方法。
- 在“項(xiàng)目”窗口中,右鍵單擊 CustomerBook-EJBModule 項(xiàng)目節(jié)點(diǎn),然后選擇“新建”>“會(huì)話 Bean”。將該會(huì)話 Bean 命名為 CustomerFacade,并將其放在 ejb 包中。將 Bean 設(shè)置為無態(tài) Bean,并且只有遠(yuǎn)程接口。然后單擊“完成”。IDE 將創(chuàng)建此 Bean,并在源代碼編輯器中打開其 Bean 類。
- 在源代碼編輯器中,在 Bean 類中的任意位置單擊鼠標(biāo)右鍵,選擇“企業(yè)資源”>“調(diào)用 Enterprise Bean”。選擇 CustomerEB Bean,然后單擊“確定”。IDE 將在源文件底部生成 lookupCustomerBean 方法。
- 將以下內(nèi)容添加到 Bean 類起始位置的變量聲明中:
private ejb.CustomerLocalHome custHome;
- 現(xiàn)在,我們將在會(huì)話 Bean 的 create 方法中獲取對實(shí)體 Bean 的 Home 接口的引用。刪除 ejbCreate() 中的注釋并添加以下語句:
custHome = lookupCustomerBean();
- 在 Bean 類主體中的任意位置單擊鼠標(biāo)右鍵,選擇“EJB 方法”>“添加 Business 方法”。指定以下信息:
元素 | 值 |
方法名 | getCustomerInfo |
返回類型 | String |
參數(shù) | int custId |
異常 | javax.ejb.FinderException |
- 在源代碼編輯器中,按如下內(nèi)容編輯 getCustomerInfo business 方法:
public String getCustomerInfo(int custId) throws javax.ejb.FinderException { ejb.CustomerLocal customer = custHome.findByPrimaryKey(new Integer(custId)); return "Name: " + customer.getName() + ", E-mail: " +customer.getEmail(); }
最終的 CustomerFacadeBean.java 文件應(yīng)如此處所示。
對 Web 模塊進(jìn)行編碼
現(xiàn)在,我們需要對 Web 模塊進(jìn)行編碼,該模塊將為實(shí)體 Bean 提供用戶接口。Web 模塊包含一個(gè) Servlet,允許用戶按客戶編號對客戶進(jìn)行搜索。
創(chuàng)建定制服務(wù)定位器
在上一節(jié)中,我們在調(diào)用 Enterprise Bean 時(shí)通過 IDE 生成了內(nèi)聯(lián)查找代碼。在此節(jié)中,我們將創(chuàng)建一個(gè)定制服務(wù)定位器,IDE 將在生成對 Enterprise Bean 的調(diào)用時(shí)用到它。我們的服務(wù)定位器沒有任何特殊功能,但您可以定制企業(yè)應(yīng)用程序查找 Enterprise Bean 的方式。
- 在“項(xiàng)目”窗口中,右鍵單擊 CustomerBook-WebModule 節(jié)點(diǎn),然后選擇“新建”>“文件/文件夾”。在向?qū)е?,?#8220;企業(yè)”類別中選擇服務(wù)定位器模板。單擊“下一步”。
- 鍵入 ServiceLocator 作為類名,鍵入 Web 作為包,然后單擊“完成”。
對 Servlet 進(jìn)行編碼
在最后一步中,我們將向 Web 模塊添加一個(gè) Servlet,通過它可以查找并顯示 CUSTOMER 表中的每個(gè)客戶的信息。
- 在“項(xiàng)目”窗口中,右鍵單擊 CustomerBook-WebModule 節(jié)點(diǎn),然后選擇“新建”> "Servlet"。將 Servlet 命名為 CustomerDetail,然后將其放在 web 包中。然后單擊“完成”。
- 在源代碼編輯器中,在 Servlet 類中的任意位置單擊鼠標(biāo)右鍵,選擇“企業(yè)資源”>“調(diào)用 Enterprise Bean”。選擇 CustomerFacade 會(huì)話 Bean,將 web.ServiceLocator 類設(shè)置為服務(wù)定位器策略,然后單擊“確定”。IDE 將插入該查找方法。
- 按如下所示編輯 processRequest 方法:
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet customerDetail</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Servlet customerDetail at " + request.getContextPath () + "</h1>"); String customerNr = request.getParameter("customer_nr"); if((customerNr != null) && !(customerNr.equals(""))) { try{ ejb.CustomerFacadeRemote custFacade = lookupCustomerFacadeBean(); out.println("Customer‘s info for nr. " + customerNr + ": " + custFacade.getCustomerInfo( Integer.parseInt(customerNr))); }catch(javax.ejb.FinderException ex){ out.println("Customer with nr. " + customerNr +" 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(); }
最終的 CustomerDetail.java Servlet 應(yīng)如此處所示。
生成和部署應(yīng)用程序
現(xiàn)在,就可以將企業(yè)應(yīng)用程序部署到應(yīng)用服務(wù)器中了。不需要再對部署描述符進(jìn)行其他配置。IDE 已經(jīng)配置了部署描述符,并為企業(yè)應(yīng)用程序準(zhǔn)備了新的連接池和數(shù)據(jù)源。
設(shè)置程序的缺省 Web 頁
缺省情況下,Web 應(yīng)用程序在運(yùn)行時(shí)會(huì)顯示其 index.jsp 頁。由于我們的 index.jsp 是空的,因此希望 CustomerBook 項(xiàng)目顯示 CustomerDetail Servlet。
- 在“項(xiàng)目”窗口中,右鍵單擊 CustomerBook 項(xiàng)目,然后選擇“屬性”。接下來在左面板中單擊“運(yùn)行”。
- 在“相對 URL”字段中鍵入 /CustomerDetail。
運(yùn)行應(yīng)用程序
- 右鍵單擊 CustomerBook 項(xiàng)目并選擇“運(yùn)行項(xiàng)目”。IDE 會(huì)執(zhí)行以下所有任務(wù):
- 生成企業(yè)應(yīng)用程序項(xiàng)目及其所有子項(xiàng)目(Web 模塊項(xiàng)目和 EJB 模塊項(xiàng)目)。
- 如果服務(wù)器尚未運(yùn)行,請啟動(dòng)它。
- 如果企業(yè)應(yīng)用程序已部署到應(yīng)用服務(wù)器上,請卸下它。
- 將企業(yè)應(yīng)用程序部署到應(yīng)用服務(wù)器上。
- 打開在指定的相對 URL 中的 Web 模塊。
您應(yīng)在外部瀏覽器中看到以下頁面。在鍵入某一客戶編號并按 Enter 鍵時(shí),頁面中應(yīng)顯示該客戶的信息。
疑難解答
一些常見問題包括:
- 打開 CustomerDetail 時(shí)出現(xiàn) HTTP Status 404 錯(cuò)誤。這意味著,應(yīng)用服務(wù)器找不到 CustomerDetail Servlet。確保上下文根目錄 (/CustomerBook-WebModule) 與為 Web 模塊設(shè)置的根目錄匹配(右鍵單擊 Web 模塊項(xiàng)目節(jié)點(diǎn) >“屬性”>“運(yùn)行”>“上下文路徑”)。
- 在 CustomerDetail 表單中提交客戶編號時(shí)出現(xiàn) javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 錯(cuò)誤。這通常意味著,服務(wù)器無法訪問數(shù)據(jù)庫。如果出現(xiàn)這種情況,請執(zhí)行以下操作:
- 確保 Derby 數(shù)據(jù)庫服務(wù)器正在運(yùn)行。要啟動(dòng) Derby,請選擇“工具”> "Derby" >“啟動(dòng) Derby 服務(wù)器”。
- 確保在應(yīng)用服務(wù)器中正確注冊了資源池和數(shù)據(jù)源。要對其進(jìn)行檢查,可轉(zhuǎn)到“運(yùn)行環(huán)境”窗口并展開應(yīng)用服務(wù)器的 JDBC 節(jié)點(diǎn)。“JDBC 資源”節(jié)點(diǎn)應(yīng)包含 jdbc/derby_net 節(jié)點(diǎn);“連接池”節(jié)點(diǎn)應(yīng)包含 derby_netConnectionPool 節(jié)點(diǎn)。注冊連接池和數(shù)據(jù)源(如果尚未注冊):
- 展開 CustomerBook-EJBModule 項(xiàng)目的“服務(wù)器資源”節(jié)點(diǎn)。
- 右鍵單擊 connection-pool-derby_net.sun-resource 節(jié)點(diǎn),然后選擇“注冊”。
- 對 datasource-jdbc_derby_net.sun-resource 節(jié)點(diǎn)執(zhí)行相同的步驟。
注意:要查看服務(wù)器日志,請轉(zhuǎn)至“運(yùn)行環(huán)境”窗口,右鍵單擊應(yīng)用服務(wù)器節(jié)點(diǎn),然后選擇“查看服務(wù)器日志”。
后續(xù)步驟
有關(guān)使用 NetBeans IDE 5.0 的詳細(xì)信息,請參見以下資源:
NetBeans IDE 5.0 導(dǎo)入指南: NetBeans IDE 支持與文檔頁 要發(fā)送意見和建議、獲得支持以及隨時(shí)了解 NetBeans IDE J2EE 開發(fā)功能的最新開發(fā)情況,請加入 nbj2ee@netbeans.org 郵件列表。