程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java EE應用程序入門

Java EE應用程序入門

編輯:關於JAVA

本文將詳細介紹使用 EJB 3.0 技術開發企業應用程序的基礎知識,而 EJB 3.0 是 Java EE 5 平台的組成部分。本文還將闡述如何通過 EJB 3.0 技術簡化開發企業應用程序的流程。本文使用的是 NetBeans IDE 6.0 發行版。

先決條件

本文假定您在以下方面擁有基本知識和編程經驗:

Java 編程

NetBeans IDE

教程所需軟件

對於本教程,您需要在計算機上安裝以下軟件:

"Web & Java EE" 或 "All" 下載版本的 NetBeans IDE 6.0 (下載)

Java 標准開發工具箱 (JDK) 版本 5.0 或 6.0 (下載)

GlassFish V2 Application Server (綁定完整的 IDE 下載)或 Sun Java System Application Server 平台版本 9 (下載)

對於本教程,您需要注冊 GlassFish/Sun Java System Application Server 及其 IDE 的本地實例。

建立企業應用程序項目

此次練習的目標是創建 NewsApp 企業應用程序項目,其中包含一個 EJB 模塊和一個 web 模塊。NewsApp 應用程序使用一個消息驅動的 bean 接收和處理 servlet 發送到隊列的消息。該應用程序使用 servlets 發送消息給消息驅動的 bean ,以便顯示消息。

創建企業應用程序

從主菜單中選擇 File> New Project (Ctrl-Shift-N)。

從 Enterprise 類別中選擇 Enterprise Application ,然後單擊 Next 按鈕。

將項目命名為 NewsApp,並將服務器設定為 Sun Java System Application Server。

將 Java EE 版本設為 Java EE 5,然後選擇 Create EJB Module 和 Create Web Application Module (如果未選中)。

單擊 Finish 按鈕。

小結

在本練習中,我們創建了一個 Java EE 5 企業應用程序,其中包含一個 EJB 模塊和一個 web 模塊。

編寫 EJB 模塊

在本練習中,我們將在 EJB 模塊中創建對象。我們將創建一個實體類,一個消息驅動 bean 和一個會話外觀(Session Facade)。我們還將創建一個持久性單元,以便為容器提供管理實體,和消息驅動 bean 將使用的 Java 消息服務(Java Message Service ,JMS)資源所需的信息。

創建持久性單元

首先,我們需要創建一個持久性單元,用於定義應用程序中所使用的數據源和實體管理器。

右擊 EJB 模塊,然後選擇 New > File/Folder 。

從 Persistence 類別中,選擇 Persistence Unit ,然後單擊 Next 按鈕。

保持默認的 Persistence Unit 名稱。

對於 Persistence Provider ,選擇 TopLink(默認)。

對於Data Source,選擇默認數據源 jdbc/sample。

檢查持久性單元使用了 Java Transaction API,而且 Table Generation Strategy 被設定為 Create ,這樣部署應用程序時就能基於我們的實體類創建表。

單擊 Finish 按鈕。

單擊 Finish 時,IDE 將會創建 persistence.xml,並在源代碼編輯器中以設計視圖打開它。關閉 persistence.xml。

創建 NewsEntity 實體類

在本練習中,我們將創建 NewsEntity 實體類。實體類就是一個簡單的 Java 類。創建實體類時,IDE 會添加 @Entity 注釋用於將類定義為實體類。創建類之後,我們將在類中創建字段,以表示要在表中保存的數據。

每個實體類都必須有一個主鍵。創建實體類時,IDE 會添加 @Id 注釋用於聲明使用哪個字段作為主鍵。IDE 還會添加 @GeneratedValue 注釋,用於指定主 Id 的主要生成策略。

創建 NewsEntity 類的步驟如下:

在 Project 窗口在單擊鼠標右鍵 EJB 模塊,然後選擇 New > File/Folder ,以便打開 New File 向導。

從 Persistence 類別中,選擇 Entity Class ,然後單擊 Next 按鈕。

鍵入 NewsEntity 作為類名,鍵入 ejb 作為包名,讓 Primary Key Type 保持為 Long。單擊 Finish 按鈕。

單擊 Finish 時,實體類 NewsEntity.java 就會在源代碼編輯器中打開。在源代碼編輯器中,完成以下步驟:

給類添加以下字段聲明:

private String title;
private String body;

在源代碼編輯器中單擊鼠標右鍵,然後選擇 Insert Code ,同時選擇 Getter and Setter 為每個字段生成 getter 和 setter 程序。

在 Generate Getters and Setters 對話框中,選擇 body 和 title 字段,然後單擊 Generate 按鈕。

保存修改。

在下一步中,我們將創建 NewMessage 消息驅動 bean。

創建 NewMessage 消息驅動 Bean

現在,我們將在我們的 EJB 模塊中創建 NewMessage 消息驅動。我們將使用 New Message-Driven Bean 向導來創建 bean 和必要的 JMS 資源。

創建 NewMessage 消息驅動 bean 的步驟如下:

在 Projects 窗口在單擊鼠標右鍵 EJB 模塊,然後選擇 New > File/Folder ,可以打開 New File 向導。

從 Enterprise 類別中,選擇 Message-Driven Beans ,然後單擊 Next 按鈕。

鍵入 NewMessage 作為類名。

從 Package 下拉列表中選擇 ejb。

單擊 Add 打開 Add Message Destination 對話框。

在 Add Message Destination 對話框中,鍵入 jms/NewMessage,然後 選擇 Queue 作為目標類型。單擊 OK 。

確保項目目的地正確,然後單擊 Finish 按鈕。

單擊 Finish 時,新的消息驅動 bean 類 NewMessage.java 就會在源代碼編輯器中打開。您可以看到 @MessageDriven 注釋和配置屬性已經添加到類中。

@MessageDriven(mappedName = "jms/NewMessage", activationConfig = {
     @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue =
"Auto-acknowledge"),
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue =
"javax.jms.Queue")
   })

這段注釋告訴容器,組件是消息驅動 bean 和 bean 使用的 JMS 資源。當 IDE 生成類時,資源的 Mapped Name (jms/NewMessage) 來自類名 (NewMessage.java)。JMS 資源被映射為 bean 接收消息所在目的地的 JNDI 名稱。 New Message-Driven Bean 向導已經把 JMS 資源的信息添加到了 sun-resources.xml中。EJB 3.0 API 支持在 bean 類的 JNDI 命名空間中查找對象,這樣我們就不需要配置部署描述符就可以指定 JMS 資源。

EJB 3.0 規范允許我們使用注釋直接在一個類中引入資源。現在,我們將使用注釋將 MessageDrivenContext 資源引入到我們的類中,然後注入 將被 EntityManager API 使用的 PersistenceContext 資源,以便管理持久性實體實例。我們將在 源代碼編輯器中給類添加注釋。

將 MessageDrivenContext 資源注入到類中,方法是添加以下帶注釋的字段(以黑體表示)到類中:public class NewMessage implements MessageListener {
@Resource
private MessageDrivenContext mdc;

在類中引入實體管理器,方法是在代碼在單擊鼠標右鍵,然後從彈出式菜單中選擇 Persistence > Use Entity Manager 。這將在源代碼中添加如下注釋:@PersistenceContext
private EntityManager em;
並在代碼中生成如下方法:public void persist(Object object) {
   em.persist(object);
}

修改 persist 方法,將名稱 save。方法應該像如下所示:public void
save(Object object) {
   em.persist(object);
}

修改 onMessage 方法,方法是在方法體中加入如下內容:ObjectMessage msg = null;
   try {
     if (message instanceof ObjectMessage) {
       msg = (ObjectMessage) message;
       NewsEntity e = (NewsEntity) msg.getObject();
       save(e);
     }
   } catch (JMSException e) {
     e.printStackTrace();
     mdc.setRollbackOnly();
   } catch (Throwable te) {
     te.printStackTrace();
   }

按下 Alt-Shift-F 組合鍵,生成所有必需的導入語句。 注意: 生成導入語句時,我們需要 確保導入 jms 和 javax.annotation.Resource 庫。

保存文件。

創建會話 Bean

接下來,我們將為 NewsEntity 實體類創建會話外觀。創建會話外觀的步驟如下:

右擊 EJB 模塊,然後選擇 New > File/Folder 。

從 Persistence 類別中,選擇 Session Beans for Entity Classes ,然後單擊 Next 按鈕。

從可用實體類的列表中,選擇 ejb.NewsEntity 並單擊 Add ,然後單擊 Next 按鈕。

確定將 Package 設置為 ejb 並且已創建本地接口。

單擊 Finish 按鈕。

單擊 Finish 按鈕後,IDE 將會創建會話外觀類 NewsEntityFacade.java,而且該類會在源代碼編輯器中打開。IDE 還會創建本地接口 NewsEntityFacadeLocal.java。

EJB 3.0 技術簡化了會話 bean 的創建過程,因為它減少了所需代碼的數量。您可以看到,注釋 @Stateless 用於把類聲明為無狀態的會話 bean,而類不再需要一條語句來實現 javax.ejb.SessionBean。代碼也要清晰很多,因為借助 EJB 3.0 技術,業務方法不再需要代碼來聲明它們拋出了未經檢查的異常。

您可以看到,創建會話外觀時, PersistenceContext 資源被直接注入了會話 bean 組件中。

小結

在本練習中,我們為 EJB 模塊中的一個實體類和一個消息驅動編寫了代碼。我們還創建了我們的應用程序將會使用的 JMS 資源。

編寫 Web 模塊

現在,我們將在 web 模塊中創建 servlets ListNews 和 PostMessage。這些 servlets 將用於讀取和添加消息。

創建 ListNews Servlet

在本練習中,我們將創建一個用於顯示數據的簡單 servlet。我們將使用注釋從我們的 servlet 中調用實體。

右擊 web 模塊項目,然後選擇 New > Servlet 。

鍵入 ListNews 作為類名。

輸入 web 作為包名,然後單擊 Finish 按鈕。

單擊 Finish 按鈕後,類 ListNews.java 就會在源代碼編輯器中打開。在源代碼編輯器中,執行以下步驟:

在源代碼在單擊鼠標右鍵,然後選擇 Enterprise Resources > Call Enterprise Bean 。

在 Call Enterprise Bean 對話框中,選擇 NewsEntityFacade 然後單擊 OK 按鈕。單擊 OK 按鈕後,實體 bean 源代碼就會通過使用 @EJB 注釋注入到 servlet 中。

在 processRequest 方法中,去掉代碼的注釋,並在方法體中添加以下用黑體表示的行:out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>");
List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
   NewsEntity elem = (NewsEntity) it.next();
   out.println(" <b>"+elem.getTitle()+" </b><br />");
   out.println(elem.getBody()+"<br /> ");
}
out.println("<a href='PostMessage'>Add new message</a>");
out.println("</body>");

按下 Alt-Shift-F 組合鍵,便可為類生成所有必需的導入語句。生成導入語句時,我們需要 導入 java.util 庫。

保存對文件所做的修改。

創建 PostMessage Servlet

在本練習中,我們將創建用於發布消息的 PostMessage servlet。我們將使用注釋把我們創建的 JMS 資源直接注入到 servlet中,用於指定變量名和它映射到的名稱。接著,我們將添加用於發送 JMS 消息的代碼,以及用於添加消息的 HTML 窗體的代碼。

右擊 web 模塊項目,然後選擇 New > Servlet 。

鍵入 PostMessage 作為類名。

輸入 web 作為包名,然後單擊 Finish 按鈕。

單擊 Finish 按鈕後,類 PostMessage.java 就會在源代碼編輯器中打開。在源代碼編輯器中,完成以下步驟:

使用注釋把 ConnectionFactory 和 Queue 資源注入,方法是添加如下字段聲明(以黑體表示):public class PostMessage extends HttpServlet {
  
@Resource(mappedName="jms/NewMessageFactory")
   private ConnectionFactory connectionFactory;
   @Resource(mappedName="jms/NewMessage")
   private Queue queue;

現在,我們添加用於發送 JMS 消息的代碼,方法是在 processRequest 方法中添加以下用黑體表示的代碼:response.setContentType("text/html;charset=UTF-8");
// Add the following code to send the JMS message
String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) && (body!=null)) {
   try {
     Connection connection = connectionFactory.createConnection();
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     MessageProducer messageProducer = session.createProducer(queue);
     ObjectMessage message = session.createObjectMessage();
     // here we create NewsEntity, that will be sent in JMS message
     NewsEntity e = new NewsEntity();
     e.setTitle(title);
     e.setBody(body);
     message.setObject(e);
     messageProducer.send(message);
     messageProducer.close();
     connection.close();
     response.sendRedirect("ListNews");
   } catch (JMSException ex) {
     ex.printStackTrace();
   }
}
PrintWriter out = response.getWriter();

現在,對於用於打印 HTML 和添加消息 web 窗體的代碼,我們去掉其注釋。在 processRequest 方法中添加如下以黑體表示的代碼行:

out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");
// Add the following code to add the form to the web page
out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");
out.println("</body>");

按下 Alt-Shift-F 可以為類生成所有必需的導入語句。 注意:為 Connection、 ConnectionFactory、 Session 和 Queue 選擇要導入的庫時, 確保已經導入了 java.jms 庫。

保存對文件所做的修改。

運行項目

現在,我們可以運行剛才創建的項目。運行項目時,我們想讓浏覽器打開帶有 ListNews servlet 的頁面。為此,我們需要在 Enterprise Application 的 Properties 對話框中指定 URL。此 URL 相對於我們應用程序的上下文路徑。輸入相對 URL 之後,我們就可以從 Projects 窗口中編譯、部署和運行我們的應用程序了。

設定相對 URL 和運行我們的應用程序的步驟如下:

在 Projects 窗口中,右擊 NewsApp enterprise application 節點,然後在彈出菜單中選擇 Properties 。

在 Categories 窗格中選擇 Run 。

在 Relative URL 文本框中,鍵入 /ListNews。

單擊 OK 按鈕。

在 Projects 窗口中,右擊 NewsApp enterprise application 節點,然後選擇 Run Project 。

運行項目時, ListNews servlet 就會在浏覽器中打開,並顯示數據庫中消息的一個列表。首次運行項目時,數據庫是空的,但您可以單擊 Add Message 添加一條消息。

使用 PostMessage servlet 添加一條消息時,該消息將被發送給消息驅動 bean,以便寫入持久性存儲器,而 ListNews servlet 將被調用以顯示數據庫中的消息。 ListNews 從數據庫中獲得的消息列表通常還沒有包含新消息,因為我們的消息服務是異步的。

故障排除

創建項目時可能會遇到以下一些問題。

JMS 資源的問題

使用向導創建 JMS 資源時,您可能會在輸出窗口中看到如下服務器錯誤消息:

[com.sun.enterprise.connectors.ConnectorRuntimeException:
           JMS resource not created : jms/Queue]

這條消息大概是指出,JMS 資源沒有創建或沒有注冊到應用服務器。您可以使用 Sun Java System Application Server 的管理控制台來檢查、創建和編輯 JMS 資源。< /p>

打開管理控制台的步驟如下:

在 IDE 的運行時中展開 Servers 節點,確定 Sun Java System Application Server 正在運行。位於 Sun Java System Application Server 節點旁邊的一個小小的綠色箭頭指示服務器正在運行中。

右擊 Sun Java System Application Server 節點,然後選擇 View Admin Console ,可以在浏覽器中打開登陸窗口。

登陸到 Sun Java System Application Server 中。默認的用戶名和密碼是 admin 和 adminadmin。

在浏覽器的管理控制台中,展開畫面左側的 Resources 節點 和 JMS Resources 節點。

單擊畫面左側的 Connection Factories 和 Destination Resources 鏈接,檢查資源是否已經注冊到服務器,如果有必要可以修改資源。如果資源不存在,您可以在管理控制台中創建它們。

您需要確保 PostMessage servlet 中的 JMS 連接工廠資源被映射為了已注冊到 Sun Java System Application Server 的 JMS 連接工廠資源的正確 JNDI 名稱。

以下資源應該注冊到 Sun Java System Application Server 中:

擁有 JNDI 名稱 jms/NewMessage 和類型 javax.jms.Queue 的一個目的地資源。

擁有 JNDI 名稱 jms/NewMessageFactory 和類型 javax.jms.QueueConnectionFactory 的一個連接工廠資源。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved