blob: 1a03374981a67ec795cb5a037a3e750deb623149 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, 2011 Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>Creating an Enterprise Application with EJB 3.1</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta name="description" content="A tutorial on how to use NetBeans IDE to develop an enterprise application using EJB 3.1 technology.">
<link rel="stylesheet" href="../../../netbeans.css">
<meta name="author" content="ken ganfield">
</head>
<body>
<h1>Creating an Enterprise Application with EJB 3.1</h1>
<p>This tutorial takes you through the basics of developing a Java EE 6 enterprise application and
demonstrates some of the EJB 3.1 technology features that were introduced as part of the Java EE 6 specification.
In this tutorial you will create an enterprise application that enables a user to post to and retrieve messages from a database.</p>
<p>The application contains an EJB module and a web module.
The EJB module contains an entity class, a session facade for the entity class
and a message-driven bean. The web module contains servlets for displaying and posting messages
and a singleton session bean that counts the number of users in the session.</p>
<p>Before starting this tutorial you may want to familiarize yourself with
the following document.</p>
<ul>
<li><a href="javaee-gettingstarted.html">Getting Started with Java EE Applications</a></li>
</ul>
<p><b>Tutorial Exercises</b></p>
<img src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" class="stamp" alt="Content on this page applies to NetBeans IDE 7.2, 7.3, 7.4 and 8.0" title="Content on this page applies to the NetBeans IDE 7.2, 7.3, 7.4 and 8.0" >
<ul>
<li><a href="#intro">About the NewsApp Enterprise Application</a></li>
<li><a href="#Exercise_1">Creating the Enterprise Application Project</a></li>
<li><a href="#Exercise_2">Coding the EJB Module</a>
<ul>
<li><a href="#Exercise_2a">Creating the Entity Class</a></li>
<li><a href="#Exercise_2b">Creating the Message-Driven Bean</a></li>
<li><a href="#Exercise_2c">Creating the Session Facade</a></li>
</ul>
</li>
<li><a href="#Exercise_3">Coding the Web Module</a>
<ul>
<li><a href="#Exercise_3a">Creating the Singleton Session Bean</a></li>
<li><a href="#Exercise_3b">Creating the ListNews Servlet</a></li>
<li><a href="#Exercise_3c">Creating the PostMessage Servlet</a></li>
</ul>
</li>
<li><a href="#Exercise_4">Running the Project</a></li>
<li><a href="#Exercise_5">Downloading the Solution Project</a></li>
<li><a href="#Exercise_6">Troubleshooting</a></li>
</ul>
<p><b>To follow this tutorial, you need the following software and resources.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.2, 7.3, 7.4, 8.0, Java EE version</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">version 7 or 8</td>
</tr>
<tr>
<td class="tbltd1">GlassFish Server Open Source Edition</td>
<td class="tbltd1">3.x, 4.x</td>
</tr>
</tbody>
</table>
<p><b>Prerequisites</b></p>
<p>This document assumes you have some basic knowledge of, or programming experience with, the following technologies:</p>
<ul>
<li>Java Programming</li>
<li>NetBeans IDE</li>
</ul>
<p class="tips">You can download <a href="https://netbeans.org/projects/samples/downloads/download/Samples/JavaEE/NewsAppEE6.zip">a zip archive of the finished project</a>.</p>
<!-- ===================================================================================== -->
<a name="intro"></a>
<!--Exercise 1: -->
<h2>About the NewsApp Enterprise Application</h2>
<p>In this tutorial you will create a simple example of a multi-tiered, Java EE 6 enterprise application named NewsApp.
The NewsApp application uses some of the features introduced in the Java EE 6 specification.</p>
<p>The structure of the NewsApp application generally corresponds to the following tiers.</p>
<ul>
<li><strong>Web Tier.</strong> The Web Tier contains the presentation logic of the application and runs on a Java EE server.
In the NewsApp application, the Web Tier is represented by the web module and
contains servlets that access the business logic in the EJB module.</li>
<li><strong>Business Tier.</strong> Business Tier applications also run on Java EE servers and contain
the business logic of the application.
In the NewsApp application, the Business Tier is represented by the EJB module.
The EJB module contains the code that handles requests from the Web Tier clients and
manages transactions and how objects are persisted to the database.</li>
<li><strong>EIS Tier.</strong> The EIS Tier is the persistent storage layer of the application.
In the NewsApp application, this tier is represented by the database where the messages are stored.</li>
</ul>
<p>When you build an enterprise application in the IDE, the EJB and web application modules are packaged in an EAR archive
that is then deployed to the server. The application is then typically accessed from the <strong>Client Tier.</strong>
The Client Tier is the environment where the client is run and is often a web browser on a user's local system.</p>
<p class="notes"><strong>Note.</strong> In the example in this tutorial you will use a
single machine to host the Java EE server, the database and view the web pages.
In large enterprise applications, the different tiers are often distributed across multiple machines.
The Web Tier and Business Tier applications are often deployed to Java EE servers that are hosted on different machines.</p>
<p class="tips">For more details about the structure of Java EE enterprise applications,
see the chapter on <a href="http://download.oracle.com/javaee/6/tutorial/doc/bnaay.html">Distributed Multitiered Applications</a>
in the <a href="http://download.oracle.com/javaee/6/tutorial/doc/">Java EE 6 Tutorial, Part I</a>.</p>
<a name="Exercise_1"></a>
<!--Exercise 1: -->
<h2>Creating the Enterprise Application Project</h2>
<p>The goal of this exercise is to create the NewsApp enterprise application project.
You will use the New Project wizard to create an enterprise application that contains an EJB module and a web module.</p>
<ol>
<li>Choose File &gt; New Project (Ctrl-Shift-N; &#8984;-Shift-N on Mac) from the main menu.</li>
<li>Select Enterprise Application from the Java EE category and click Next. </li>
<li>Name the project <b>NewsApp</b> and set the project location.</li>
<li>Deselect the Use Dedicated Folder option, if selected.<br />
(For this tutorial there is little reason to copy project libraries to a dedicated folder because
you will not need to share libraries with other users or projects.)<br />
Click Next.</li>
<li>Set the server to GlassFish Server and set the Java EE Version to Java EE 6 or Java EE 7.</li>
<li>Select Create EJB Module and Create Web Application Module. Click Finish.</li>
</ol>
<img src="../../../images_www/articles/72/javaee/ejbentapp/new-entapp-wizard.png" alt="New Project wizard" title="New Project wizard" class="margin-around b-all" />
<p>When you click Finish, the IDE creates three projects: NewsApp, NewsApp-ejb and NewsApp-war.
If you expand the NewsApp node in the Projects window, you can see that the enterprise application project does not contain any sources.
All the sources will be contained in the two modules that the wizard created and which are listed under the Java EE Modules node.</p>
<p>The enterprise application project only contains configuration and packaging details about the application.
When you build and run an enterprise application the IDE creates an EAR archive and deploys the EAR to the server.
In some cases, the enterprise application project will contain deployment descriptor files with additional information, but
deployment descriptor files are not required when you create a Java EE enterprise application that is deployed to GlassFish Server.
</p>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-projectswindow.png" alt="Projects window showing structure of the application" title="Projects window showing structure of the application" class="margin-around b-all" />
<a name="Exercise_2"></a>
<h2>Coding the EJB Module</h2>
<p>In this exercise you will create an entity class, a message-driven bean and a session facade in the EJB module.
You also will also create a persistence unit to provide the container with information about the data source and
how the entities are managed, and Java Message Service (JMS) resources that are used by the message-driven bean.</p>
<div class="indent">
<a name="Exercise_2a"></a>
<h3>Creating the Entity Class</h3>
<p>In this exercise you will create the <tt>NewsEntity</tt> entity class.
An entity class is a simple Java class that generally represents a table in a database.
When you create the entity class, the IDE adds the <tt>@Entity</tt> annotation to define the class as an entity class.
After you create the class, you will create fields in the class to represent the data that you want in your table.</p>
<p>Each entity class must have a primary key.
When you create the entity class, the IDE adds the <tt>@Id</tt> annotation to declare which field to use as the primary key.
The IDE also adds the <tt>@GeneratedValue</tt> annotation and specifies the key generation strategy for the primary Id.</p>
<p>To create the <tt>NewsEntity</tt> class, perform the following steps.</p>
<ol>
<li>Right-click the EJB module in the Projects window and choose New &gt; Other to open the New File wizard.</li>
<li>From the Persistence category, select Entity Class and click Next.</li>
<li>Type <strong>NewsEntity</strong> for the Class Name.</li>
<li>Type <strong>ejb</strong> for the Package.</li>
<li>Leave the Primary Key Type as <tt>Long</tt> in the New Entity Class wizard.</li>
<li>Select Create Persistence Unit. Click Next.</li>
<li>Keep the default Persistence Unit Name.</li>
<li>For the Persistence Provider, choose <tt>EclipseLink (JPA2.0)(default)</tt>.</li>
<li>For the Data Source, choose a data source (for example, select <tt>jdbc/sample</tt> if you want to use JavaDB).</li>
<li>Confirm that the persistence unit is using the Java Transaction API
and that the Table Generation Strategy is set to Create
so that the tables based on your entity classes are created when the application is deployed.<br/>
<img src="../../../images_www/articles/72/javaee/ejbentapp/new-pu-wizard.png" alt="screenshot of Provider and Database panel" title="Provider and Database panel" class="margin-around b-all" />
</li>
<li>Click Finish.</li>
</ol>
<p>When you click Finish, the IDE creates <tt>persistence.xml</tt> and the entity class <tt>NewsEntity.java</tt>.
The IDE opens <tt>NewsEntity.java</tt> in the Source Editor.</p>
<p>In the Source Editor, perform the following steps.</p>
<ol>
<li>Add the following field declarations to the class:
<pre class="examplecode">
private String title;
private String body;</pre>
</li>
<li>Right-click in the Source Editor and choose Insert Code (Alt-Insert; Ctrl-I on Mac) and
select Getter and Setter to open the Generate Getters and Setters dialog box.</li>
<li>Select the <tt>body</tt> and <tt>title</tt> fields in the dialog box. Click Generate.<br/>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-gettersetter.png" alt="Generate Getters and Setters dialog box" title="Generate Getters and Setters dialog box" class="margin-around b-all" />
<p>When you click Generate, the IDE adds getter and setter methods for the fields.</p>
</li>
<li>Save the changes to <tt>NewsEntity.java</tt>.</li>
</ol>
<p>You can close <tt>NewsEntity.java</tt>.</p>
<p class="tips">For more details about entity classes,
see the chapter <a href="http://java.sun.com/javaee/6/docs/tutorial/doc/bnbpz.html">Introduction to the Java Persistence API</a>
in the <a href="http://download.oracle.com/javaee/6/tutorial/doc/">Java EE 6 Tutorial, Part I</a>.</p>
<a name="Exercise_2b"></a>
<h3>Creating the Message-Driven Bean</h3>
<p>In this exercise you will use a wizard to create the NewMessage message-driven bean in the EJB module.
The wizard will also help you to create the necessary JMS resources.
The message-driven bean receives and processes messages sent to the queue by a servlet
in the web module.</p>
<p>To create the message-driven bean, perform the following steps:</p>
<ol>
<li>Right-click the EJB module in the Projects window and choose New &gt; Other to open the New File wizard.</li>
<li>From the Enterprise JavaBeans category, select the Message-Driven Bean file type. Click Next.</li>
<li>Type <strong>NewMessage</strong> for the EJB Name.</li>
<li>Select <tt>ejb</tt> from the Package drop-down list.</li>
<li>Click the Add button next to the Project Destination field to open the Add Message Destination dialog box.</li>
<li>In the Add Message Destination dialog box, type <b>jms/NewMessage</b> and
select Queue for the destination type. Click OK.</li>
<li>Confirm that the project destination is correct. Click Finish.</li>
</ol>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-newmessage.png" alt="New Message-Driven Bean Wizard" title="New Message-Driven Bean Wizard" class="margin-around b-all" />
<p>When you click Finish, the bean class <tt>NewMessage.java</tt> opens in the Source Editor.
You can see that the IDE added the <tt>@MessageDriven</tt> annotation and configuration properties to the class.</p>
<pre class="examplecode">
@MessageDriven(mappedName = &quot;jms/NewMessage&quot;, activationConfig = {
@ActivationConfigProperty(propertyName = &quot;acknowledgeMode&quot;, propertyValue = &quot;Auto-acknowledge&quot;),
@ActivationConfigProperty(propertyName = &quot;destinationType&quot;, propertyValue = &quot;javax.jms.Queue&quot;)
})
public class NewMessage implements MessageListener {</pre>
<p>The <tt>@MessageDriven</tt> annotation tells the container that the component is a message-driven bean and specifies the JMS resource used by the bean.
When the IDE generates the class, the Mapped Name of the resource (<tt>jms/NewMessage</tt>) is derived from the name of the class (<tt>NewMessage.java</tt>).
The JMS resource is mapped to the JNDI name of the destination from which the bean receives messages.
The New Message-Driven Bean wizard also adds the information for the JMS resources to <tt>glassfish-resources.xml</tt>.
You do not need to configure deployment descriptors to specify the JMS resources.
If you use the Run action in the IDE to deploy the application to GlassFish, the JMS resources are created on the server on deployment.</p>
<p>The EJB specifications allow you to use annotations to introduce resources directly into a class.
You will now use annotations to introduce the <tt>MessageDrivenContext</tt> resource into your class, and then inject
the <tt>PersistenceContext</tt> resource which will be used by the EntityManager API to manage the persistent entity instances.
You will add the annotations to the class in the Source Editor.</p>
<ol>
<li>Inject the <tt>MessageDrivenContext</tt> resource into the class by adding the following
annotated field (in bold) to the class:
<pre class="examplecode">
public class NewMessage implements MessageListener {
<b>@Resource
private MessageDrivenContext mdc;</b></pre>
</li>
<li>Introduce the entity manager into the class by right-clicking in the code and choosing Insert Code (Alt-Insert; Ctrl-I on Mac) and
choosing Use Entity Manager from the pop-up menu.
The IDE adds the following <tt>@PersistenceContext</tt> annotation to your source code.
<pre class="examplecode">
@PersistenceContext(unitName = "NewsApp-ejbPU")
private EntityManager em;</pre>
The IDE also generates the following <tt>persist</tt> method.
<pre class="examplecode">
public void persist(Object object) {
em.persist(object);
}</pre>
</li>
<li>Modify the <tt>persist</tt> method to change the name to <tt>save</tt>.
The method should look like the following:
<pre class="examplecode">
public void <b>save</b>(Object object) {
em.persist(object);
}</pre>
</li>
<li>Modify the <tt>onMessage</tt> method by adding the following code (in bold) to the body of the method.
<pre class="examplecode">public void onMessage(Message message) {
<strong>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();
}</strong>
}</pre>
</li>
<li>Right-click in the editor and choose Fix Imports (Alt-Shift-I; &#8984;-Shift-I on Mac) to generate any necessary import statements. Save your changes.</li>
</ol>
<p class="notes"><strong>Note.</strong> When generating the import statements, you want to <strong>make sure to import the <tt>javax.jms</tt> and <tt>javax.annotation.Resource</tt> libraries</strong>.</p>
<p class="tips">For more details about message-driven beans,
see the chapter <a href="http://java.sun.com/javaee/6/docs/tutorial/doc/gipko.html">What is a Message-Driven Bean?</a>
in the <a href="http://download.oracle.com/javaee/6/tutorial/doc/">Java EE 6 Tutorial, Part I</a>.</p>
<a name="Exercise_2c"></a>
<h3>Creating the Session Facade</h3>
<p>In this exercise you will create a session facade for the NewsEntity entity class.
The EJB 3.0 specification simplified the creation of session beans by reducing the amount of required code
and allowing the use of annotations to declare a class as a session bean.
The EJB 3.1 specification further simplifies the requirements for session beans by making business interfaces optional.
Sessions beans can be accessed by local clients either by a local interface or a no-interface view.
In this tutorial you will not create an interface for the bean.
The servlets in the web application will access the bean through a no-interface view.</p>
<p>To create the session facade, perform the following steps:</p>
<ol>
<li>Right-click the EJB module and choose New &gt; Other.</li>
<li>From the Persistence category, select Session Beans for Entity Classes. Click Next.</li>
<li>Select <tt>ejb.NewsEntity</tt> from the list of available entity classes and click Add to move the class to the Selected Entity
Classes pane. Click Next.</li>
<li>Check that the Package is set to <tt>ejb</tt>. Click Finish.</li>
</ol>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-sessionforentity.png" alt="New Message-Driven Bean Wizard" title="New Message-Driven Bean Wizard" class="margin-around b-all" />
<p>When you click Finish, the IDE generates the session facade class <tt>NewsEntityFacade.java</tt> and
<tt>AbstractFacade.java</tt> and opens the files in the editor.
As you can see in the generated code, the annotation <tt>@Stateless</tt> is used to
declare <tt>NewsEntityFacade.java</tt> as a stateless session bean component.
The IDE also adds the <tt>PersistenceContext</tt> annotation to inject the resource directly into the session bean component.
<tt>NewsEntityFacade.java</tt> extends <tt>AbstractFacade.java</tt>, which
contains the business logic and manages the transaction.</p>
<p class="notes"><strong>Note.</strong> Remote interfaces are still required if the beans will
be accessed by remote clients.</p>
<p class="tips">For more information about session beans,
see the chapter <a href="http://java.sun.com/javaee/6/docs/tutorial/doc/gipjg.html">What is a Session Bean?</a>
in the <a href="http://download.oracle.com/javaee/6/tutorial/doc/">Java EE 6 Tutorial, Part I</a>.</p>
</div>
<!-- ===================================================================================== -->
<a name="Exercise_3"></a>
<h2>Coding the Web Module</h2>
<p>In this section you will create two servlets in the web module.
The ListNews servlet retrieves messages from the database through the entity facade in the EJB module.
The PostMessage servlet is used to send JMS messages.</p>
<p>In this section you will also create a singleton session bean in the web module that will count the number of
users that are currently in the session.
The EJB 3.1 specification enables you to create enterprise beans in web applications.
Prior to EJB 3.1, all enterprise beans had to be in EJB modules.</p>
<div class="indent">
<a name="Exercise_3a"></a>
<h3>Creating the Singleton Session Bean</h3>
<p>The EJB 3.1 specification introduces <tt>@Singleton</tt> annotation that enables you to easily create singleton session beans.
EJB 3.1 also defines additional annotations for configuring properties of singleton session beans such as when the bean is instantiated.
</p>
<p>After the singleton session bean is instantiated it exists for the lifecycle of the application.
As its name implies, there can only be a single instance of a singleton session bean in the application.
Like stateless session beans, singleton session beans can have multiple clients.</p>
<p>To create the singleton session bean, perform the following steps. </p>
<ol>
<li>Right-click the Web module and choose New &gt; Other to open the New File wizard.</li>
<li>Select Session Bean in the Enterprise JavaBeans category. Click Next.</li>
<li>Type <strong>SessionManagerBean</strong> for the EJB Name.</li>
<li>Type <strong>ejb</strong> for the Package name.</li>
<li>Select Singleton. Click Finish.</li>
</ol>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-newsingleton.png" alt="Creating a singleton session bean in the New Session Bean wizard" title="Creating a singleton session bean in the New Session Bean wizard" class="margin-around b-all" />
<p>When you click Finish, the IDE creates the singleton session bean class and opens the class in the editor.
You can see that the IDE added the annotation <tt>@Singleton</tt> to the class to declare a singleton session bean.
The wizard also annotated the class with <tt>@LocalBean</tt>.</p>
<pre class="examplecode">@Singleton
@LocalBean
public class SessionManagerBean {
}</pre>
<ol>
<li>Annotate the class with <tt>@WebListener</tt> and implement <tt>HttpSessionListener</tt>.
<pre class="examplecode">@Singleton
@LocalBean
<strong>@WebListener</strong>
public class SessionManagerBean <strong>implements HttpSessionListener</strong>{
}</pre>
<p>The <tt>@WebListener</tt> annotation is part of the Servlet 3.0 API and enables you to
implement a listener directly in your code.</p>
<p>When you implement <tt>HttpSessionListener</tt>, the IDE displays a warning
in the margin.</p>
</li>
<li>Click the warning badge in the left margin and choose "Implement all abstract methods".<br/>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-implementabstract.png" alt="Editor hint to implement abstract methods" title="Editor hint to implement abstract methods" class="margin-around b-all" />
<p>The IDE adds the <tt>sessionCreated</tt> and <tt>sessionDestroyed</tt> methods.</p></li>
<li>Add the static field <tt>counter</tt> and set the initial value to <tt>0</tt>.
<pre class="examplecode">@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener{
<strong>private static int counter = 0;</strong></pre>
</li>
<li>Modify the generated bodies of the <tt>sessionCreated</tt> and <tt>sessionDestroyed</tt> methods to increase
the value of a field when a new session starts and to decrease the value when a session finishes.
The value will be stored in the field <tt>counter</tt>.
<pre class="examplecode">public void sessionCreated(HttpSessionEvent se) {
<strong>counter++;</strong>
}
public void sessionDestroyed(HttpSessionEvent se) {
<strong>counter--;</strong>
}</pre>
</li>
<li>Add the following method that returns the current value of <tt>counter</tt>.
<pre class="examplecode">public int getActiveSessionsCount() {
return counter;
}</pre>
<p>You will call this method from a servlet to display the current number of users/open sessions.</p>
</li>
<li>Save your changes.</li>
</ol>
<p>The code for the session bean should now look like the following.</p>
<pre class="examplecode">@Singleton
@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener {
private static int counter = 0;
public void sessionCreated(HttpSessionEvent se) {
counter++;
}
public void sessionDestroyed(HttpSessionEvent se) {
counter--;
}
public int getActiveSessionsCount() {
return counter;
}
}</pre>
<p class="tips">For more details about singleton session beans,
see the chapter <a href="http://java.sun.com/javaee/6/docs/tutorial/doc/gipjg.html">What is a Session Bean?</a>
in the <a href="http://download.oracle.com/javaee/6/tutorial/doc/">Java EE 6 Tutorial, Part I</a>.</p>
<a name="Exercise_3b"></a>
<h3>Creating the <tt>ListNews</tt> Servlet</h3>
<p>In this exercise you will create a simple servlet for displaying the stored messages.
You will use annotations to call the enterprise bean NewsEntityFacade from the servlet.</p>
<ol>
<li>Right-click the web module project and choose New &gt; Servlet.</li>
<li>Type <strong>ListNews</strong> for the Class Name.</li>
<li>Enter <strong>web</strong> for the Package name. Click Finish.</li>
</ol>
<p>When you click Finish, the class <tt>ListNews.java</tt> opens in the Source Editor.
In the source editor, perform the following steps.</p>
<ol>
<li>Right-click in the source editor and choose Insert Code (Alt-Insert; Ctrl-I on Mac) and select Call Enterprise Bean.</li>
<li>In the Call Enterprise Bean dialog box, expand the NewsApp-ejb node and select NewsEntityFacade. Click OK.
<p>The IDE adds the <tt>@EJB</tt> annotation to inject the enterprise bean.</p>
</li>
<li>Use the Call Enterprise Bean dialog box again to inject the SessionManagerBean under the NewsApp-war node.
<p>In your code you will see the following annotations that inject the two enterprise beans.</p>
<pre class="examplecode">@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})
public class ListNews extends HttpServlet {
@EJB
private SessionManagerBean sessionManagerBean;
@EJB
private NewsEntityFacade newsEntityFacade;
</pre>
<p>You can also see that the <tt>@WebServlet</tt> annotation is used to declare the class a servlet
and to specify the servlet name. The <tt>@WebServlet</tt> annotation is part of the Servlet 3.0 API introduced
in the Java EE 6 specification. You can identify servlets using the annotation instead of in
the <tt>web.xml</tt> deployment descriptor. The NewsApp application does not contain <tt>web.xml</tt>.</p>
</li>
<li>In the <tt>processRequest</tt> method, add the following code (in bold) to return the current session or create a new one.
<pre class="examplecode">protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
<strong>request.getSession(true);</strong>
response.setContentType("text/html;charset=UTF-8");</pre>
<li>Add the following code (in bold) to the <tt>processRequest</tt> method
to print the messages and add a link to the PostMessage servlet. (Uncomment the code in the method if necessary.)
<pre class="examplecode">
out.println(&quot;&lt;h1&gt;Servlet ListNews at &quot; + request.getContextPath () + &quot;&lt;/h1&gt;&quot;);
<strong>List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
NewsEntity elem = (NewsEntity) it.next();
out.println(&quot; &lt;b&gt;&quot;+elem.getTitle()+&quot; &lt;/b&gt;&lt;br /&gt;&quot;);
out.println(elem.getBody()+&quot;&lt;br /&gt; &quot;);
}
out.println(&quot;&lt;a href='PostMessage'&gt;Add new message&lt;/a&gt;&quot;);</strong>
out.println(&quot;&lt;/body&gt;&quot;);
</pre>
</li>
<li>Add the following code (in bold) to retrieve and print the number of users/open sessions.
<pre class="examplecode">out.println(&quot;&lt;a href='PostMessage'&gt;Add new message&lt;/a&gt;&quot;);
<strong>out.println(&quot;&lt;br&gt;&lt;br&gt;&quot;);
out.println(sessionManagerBean.getActiveSessionsCount() + " user(s) reading the news.");</strong>
out.println(&quot;&lt;/body&gt;&quot;);
</pre>
</li>
<li>Press Ctrl-Shift-I to generate any necessary import statements for the class.
When generating the import statements, you want to <b>import the <tt>java.util</tt> libraries</b>.</li>
<li>Save the changes to the file.</li>
</ol>
<a name="Exercise_3c"></a>
<h3>Creating the <tt>PostMessage</tt> Servlet</h3>
<p>In this exercise you will create the <tt>PostMessage</tt> servlet that will be used to post messages.
You will use annotations to inject the JMS resources you created directly into the servlet,
specifying the variable name and the name to which it is mapped.
You will then add the code to send the JMS message and the code for the
HTML form for adding a message.</p>
<ol>
<li>Right-click the web module project and choose New &gt; Servlet.</li>
<li>Type <tt>PostMessage</tt> for the Class Name.</li>
<li>Enter <tt>web</tt> for the Package name and click Finish.</li>
</ol>
<p>When you click Finish, the class <tt>PostMessage.java</tt> opens in the source editor.
In the source editor, perform the following steps.</p>
<ol>
<li>Use annotations to inject the <tt>ConnectionFactory</tt> and <tt>Queue</tt> resources by adding the following field declarations (in bold):
<pre class="examplecode">@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})
public class PostMessage extends HttpServlet {
<b>@Resource(mappedName=&quot;jms/NewMessageFactory&quot;)
private ConnectionFactory connectionFactory;
@Resource(mappedName=&quot;jms/NewMessage&quot;)
private Queue queue;</b></pre>
</li>
<li>You now add the code to send the JMS messages by adding the following code in bold to the <tt>processRequest</tt> method:
<pre class="examplecode">
response.setContentType(&quot;text/html;charset=UTF-8&quot;);
// Add the following code to send the JMS message
<b>String title=request.getParameter(&quot;title&quot;);
String body=request.getParameter(&quot;body&quot;);
if ((title!=null) &amp;&amp; (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(&quot;ListNews&quot;);
} catch (JMSException ex) {
ex.printStackTrace();
}
}</b>
PrintWriter out = response.getWriter();
</pre>
</li>
<li>Add the following lines (in bold) to the <tt>processRequest</tt> method to add the web form for adding a message.
(Uncomment the code to print the HTML if necessary.)
<pre class="examplecode">
out.println(&quot;Servlet PostMessage at &quot; + request.getContextPath() + &quot;&lt;/h1&gt;&quot;);
// The following code adds the form to the web page
<b>out.println(&quot;&lt;form&gt;&quot;);
out.println(&quot;Title: &lt;input type='text' name='title'&gt;&lt;br/&gt;&quot;);
out.println(&quot;Message: &lt;textarea name='body'&gt;&lt;/textarea&gt;&lt;br/&gt;&quot;);
out.println(&quot;&lt;input type='submit'&gt;&lt;br/&gt;&quot;);
out.println(&quot;&lt;/form&gt;&quot;);</b>
out.println(&quot;&lt;/body&gt;&quot;);
</pre>
<li>Press Ctrl-Shift-I to generate any necessary import statements for the class.
<p class="notes"><b>Note:</b> When selecting the libraries to import for <tt>Connection</tt>, <tt>ConnectionFactory</tt>, <tt>Session</tt> and
<tt>Queue</tt>, <b>confirm that you import the <tt>javax.jms</tt> libraries</b>. </p>
<img src="../../../images_www/articles/72/javaee/ejbentapp/import-jms.png" alt="screenshot of Fix All Imports dialog" title="Select the JMS libraries in the Fix All Imports dialog" class="margin-around b-all" />
</li>
<li>Save your changes to the file.</li>
</ol>
</div>
<h2><a name="Exercise_4"></a> Running the Project</h2>
<p>You can now run the project.
When you run the project, you want the browser to open to the page with the <tt>ListNews</tt> servlet.
You do this by specifying the URL in the Properties dialog box for the enterprise application.
The URL is relative to the context path for the application.
After you enter the relative URL, you can build, deploy and run the application from the Projects window.</p>
<p>To set the relative URL and run the application, do the following:</p>
<ol>
<li>In the Projects window, right-click the NewsApp enterprise application node and select Properties in the pop-up menu.</li>
<li>Select Run in the Categories pane.</li>
<li>In the Relative URL textfield, type <strong>/ListNews</strong>.</li>
<li>Click OK.</li>
<li>In the Projects window, right-click the NewsApp enterprise application node and choose Run.</li>
</ol>
<p>When you run the project, the <tt>ListNews</tt> servlet opens in your browser and displays a list of the messages in the database.
When you first run the project, the database is empty, but you can click Add Message to add a message.</p>
<img src="../../../images_www/articles/72/javaee/ejbentapp/ejb-browser1.png" alt="The ListNews Servlet page" title="The ListNews Servlet page" class="margin-around b-all" />
<p>When you add a message with the <tt>PostMessage</tt> servlet, the message is sent to the
message-driven bean for writing to persistent storage, and the <tt>ListNews</tt> servlet is called to display the messages in the database.
The list of messages in the database retrieved by <tt>ListNews</tt> often does not yet contain the new message because our message service is asynchronous.
</p>
<a name="Exercise_5"></a>
<h2>Downloading the Solution Project</h2>
<p>You can download the solution to this tutorial as a project in the following ways.</p>
<ul>
<li>Download <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FNewsAppEE6.zip">a zip archive of the finished project</a>.</li>
<li>Checkout the project sources from the NetBeans Samples by performing the following steps:
<ol>
<li>Choose Team &gt; Subversion &gt; Checkout from the main menu.</li>
<li>In the Checkout dialog box, enter the following Repository URL:<br/>
<tt>https://svn.netbeans.org/svn/samples~samples-source-code</tt><br/>
Click Next.</li>
<li>Click Browse to open the Browse Repository Folders dialog box.</li>
<li>Expand the root node and select <strong>samples/javaee/NewsAppEE6</strong>. Click OK.</li>
<li>Specify the Local Folder for the sources (the local folder must be empty).</li>
<li>Click Finish.
<p>When you click Finish, the IDE initializes the local folder as a Subversion repository
and checks out the project sources.</p>
</li>
<li>Click Open Project in the dialog that appears when checkout is complete.</li>
</ol>
<p class="notes"><strong>Notes.</strong></p>
<ul>
<li>You need a Subversion client to checkout the sources.
For more about installing Subversion, see the section on <a href="../ide/subversion.html#settingUp">Setting up Subversion</a> in the <a href="../ide/subversion.html">Guide to Subversion in NetBeans IDE</a>.</li>
</ul>
</li>
</ul>
<a name="Exercise_6"></a>
<h2>Troubleshooting</h2>
<p>The following are some of the problems you may encounter when creating your project.</p>
<div class="indent">
<h3 class="tutorial">Problem with JMS Resources</h3>
<p>When using the wizard to create JMS resources,
you may see the following server error message in the output window:</p>
<pre>[com.sun.enterprise.connectors.ConnectorRuntimeException:
JMS resource not created : jms/Queue]
</pre>
<p>This message could indicate that the JMS resource was not created or was not registered with the application server.
You can use the Admin Console of the application server to check, create and edit JMS resources.</p>
<p>To open the Admin Console, do the following:</p>
<ol>
<li>Confirm that the application server is running by expanding the Servers node in the Services window of the IDE.
A small green arrow next to the application server node indicates the server is running.</li>
<li>Right-click the application server node and choose View Admin Console to open the login window in your browser.</li>
<li>Log in to the server. The default user name and password are <tt>admin</tt> and <tt>adminadmin</tt>.</li>
<li>In the Admin Console in your browser, expand the Resources node and JMS Resources node in the left frame.</li>
<li>Click on the Connection Factories and Destination Resources links in the left frame to check if the resources are
registered with the server and if necessary modify the resources. If the resources do not exist, you can create them
in the Admin Console.</li>
</ol>
<p>You need to make sure that the JMS connection factory resource
in the PostMessage servlet is mapped to the correct JNDI name of the JMS connection factory resource
registered with the GlassFish server.</p>
<p>The following resources should be registered with the GlassFish server:</p>
<ul>
<li>a Destination resource with the JNDI name <tt>jms/NewMessage</tt> and type <tt>javax.jms.Queue</tt></li>
<li>a Connection Factory resource with the JNDI name <tt>jms/NewMessageFactory</tt> and type <tt>
javax.jms.QueueConnectionFactory</tt></li>
</ul>
</div>
<br>
<div class="feedback-box" ><a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Creating%20an%20Enterprise%20Application%20with%20EJB%203.1">Send Feedback on This Tutorial</a></div>
<br style="clear:both;" />
<!-- ======================================================================================= -->
<h2><a name="nextsteps"></a>See Also</h2>
<p>For more information about using NetBeans IDE to develop Java EE applications, see the following resources:
</p>
<ul>
<li><a href="javaee-intro.html">Introduction to Java EE Technology</a></li>
<li><a href="javaee-gettingstarted.html">Getting Started with Java EE Applications</a></li>
<li><a href="../web/quickstart-webapps.html">Introduction to Developing Web Applications</a></li>
<li><a href="../../trails/java-ee.html">Java EE &amp; Java Web Learning Trail</a></li>
</ul>
<p>You can find more information about using enterprise beans in the
<a href="http://docs.oracle.com/javaee/7/tutorial/doc/ejb-intro.htm">Java EE 7 Tutorial</a>.</p>
<p>To send comments and suggestions, get support, and keep informed on the latest
developments on the NetBeans IDE Java EE development features, <a href="../../../community/lists/top.html">join
the nbj2ee mailing list</a>.</p>
</body>
</html>