TOTD #93: Getting Started with Java EE 6 using NetBeans 6.8 M1 & GlassFish v3 - A simple Servlet 3.0 + JPA 2.0 app


NetBeans 6.8 M1 introduces support for creating Java EE 6 applications ... cool!

This Tip Of The Day (TOTD) shows how to create a simple web application using JPA 2.0 and Servlet 3.0 and deploy on GlassFish v3 latest promoted build (58 as of this writing). If you can work with the one week older build then NetBeans 6.8 M1 comes pre-bundled with 57. The example below should work fine on that as well.
  1. Create the database, table, and populate some data into it as shown below:

    ~/tools/glassfish/v3/58/glassfishv3/bin >sudo mysql --user root
    Password:
    Welcome to the MySQL monitor.  Commands end with ; or \\g.
    Your MySQL connection id is 1592
    Server version: 5.1.30 MySQL Community Server (GPL)

    Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.

    mysql> create database states;
    Query OK, 1 row affected (0.02 sec)

    mysql> CREATE USER duke IDENTIFIED by 'glassfish';
    Query OK, 0 rows affected (0.00 sec)

    mysql> GRANT ALL on states.\* TO duke;
    Query OK, 0 rows affected (0.24 sec)

    mysql> use states;
    Database changed

    mysql> CREATE TABLE STATES (
        ->       id INT,
        ->       abbrev VARCHAR(2),
        ->       name VARCHAR(50),
        ->       PRIMARY KEY (id)
        -> );
    Query OK, 0 rows affected (0.16 sec)

    mysql> INSERT INTO STATES VALUES (1, "AL", "Alabama");
    INSERT INTO STATES VALUES (2, "AK", "Alaska");

    . . .

    mysql> INSERT INTO STATES VALUES (49, "WI", "Wisconsin");
    Query OK, 1 row affected (0.00 sec)

    mysql> INSERT INTO STATES VALUES (50, "WY", "Wyoming");
    Query OK, 1 row affected (0.00 sec)

    The complete INSERT statement is available in TOTD #38. Most of this step can be executed from within the IDE as well as explained in TOTD #38.
  2. Download and unzip GlassFish v3 build 58. Copy the latest MySQL Connector/J jar in "domains/domain1/lib" directory of GlassFish and start the application server as:

    ~/tools/glassfish/v3/58/glassfishv3/bin >asadmin start-domain
  3. Create JDBC connection pool and JNDI resource as shown below:

    ~/tools/glassfish/v3/58/glassfishv3/bin >./asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource --restype javax.sql.DataSource --property "User=duke:Password=glassfish:URL=jdbc\\:mysql\\://localhost/states" jdbc/states

    Command create-jdbc-connection-pool executed successfully.
    ~/tools/glassfish/v3/58/glassfishv3/bin >./asadmin ping-connection-pool jdbc/states

    Command ping-connection-pool executed successfully.
    ~/tools/glassfish/v3/58/glassfishv3/bin >./asadmin create-jdbc-resource --connectionpoolid jdbc/states jdbc/jndi_states

    Command create-jdbc-resource executed successfully.

  4. Download NetBeans 6.8 M1 and install "All" version. Expand "Servers" node and add the recently installed GlassFish server.
  5. Create a new Web project and name it "HelloEclipseLink". Make sure to choose "GlassFish v3" as the server and "Java EE 6 Web" as the Java EE version as shown below:



    Take defaults elsewhere.
  6. Create the Persistence Unit
    1. Right-click on the newly created project and select "New", "Entity Classes from Database ...". Choose the earlier created data source "jdbc/jndi_states" as shown below:

    2. Select "STATES" table in "Available Tables:" and click on "Add >" and then "Next >".
    3. Click on "Create Persistence Unit ...", take all the defaults and click on "Create". "EclipseLink" is the Reference Implementation for JPA 2.0 is the default choosen Persistence Provider as shown below:

    4. Enter the package name as "server" and click on "Finish".
  7. Create a Servlet to retrieve and display all the information from the database
    1. Right click on the project, "New", "Servlet ...".
    2. Give the Servlet name "ShowStates" and package "server".
    3. Even though you can take all the defaults and click on "Finish" but instead click on "Next >" and the following screen is shown:



      Notice "Add information to deployment descriptor (web.xml)" checkbox. Servlet 3.0 makes "web.xml" optional in most of the common cases by providing corresponding annotations and NetBeans 6.8 leverages that functionality. As a result, no "web.xml" will be bundled in our WAR file. Click on "Finish" now.

      The generated servlet code looks like:



      Notice @WebServlet annotation, this makes "web.xml" optional. TOTD #82 provide another example on how to use Servlet 3.0 with EJB 3.1.
    4. Inject the Persistence Unit as:

          @PersistenceUnit
          EntityManagerFactory emf;

      right above "processRequest" method.
    5. Change the "try" block of "processRequest" method to:

                  List<States> list = emf.createEntityManager().createNamedQuery("States.findAll").getResultList();
                  out.println("<table border=\\"1\\">");
                  for (States state : list) {
                      out.println("<tr><td>" + state.getAbbrev() +
                              "</td><td>" + state.getName() +
                              "</td></tr>");
                  }
                  out.println("</table>");

      This uses a predefined query to retrieve all rows from the table and then display them in a simple formatted HTML table.
  8. Run the project
    1. Right click on the project, select "Properties" and change the "Relative URL" to "/ShowStates". This is the exact URL that you specified earlier.

    2. Right-click on the project and select "Run" to see the following output:



So we created a simple web application that uses Servlet 3.0, JPA 2.0, EclipseLink and deployed on GlassFish v3 using NetBeans 6.8 M1. NetBeans provides reasonable defaults making you a lazy programmer. Believe this is more evident when you start playing with Java EE support in other IDEs ;-)

Finally, lets look at the structure of the generated WAR file:



It's very clean - no "web.xml", only the relevant classes and "persistence.xml".

Also refer to other Java EE 6 blog entries. A future blog entry will show how to use JSF 2.0 instead of Servlet for displaying the results.

Please leave suggestions on other TOTD that you'd like to see. A complete archive of all the tips is available here.

Technorati: totd glassfish v3 mysql javaee6 servlet3 jpa2 netbeans
Comments:

Thanks Arun, this is extremely useful. I was a bit stuck with the connection between servlet and JPA since I used "Persistence -> Use EntityManager" from NB.
Your code (using EntityManagerFactory.createEntityManager()) did the job for me.

Thanks a lot!

- Johan

Posted by Johan Vos on August 12, 2009 at 10:32 PM PDT #

[Trackback] TOTD #93 showed how to get started with Java EE 6 using NetBeans 6.8 M1 and GlassFish v3 by building a simple Servlet 3.0 + JPA 2.0 web application. JPA 2.0 + Eclipselink was used for the database connectivity...

Posted by Arun Gupta's Blog on August 14, 2009 at 01:41 AM PDT #

[Trackback] TOTD #93 showed how to get started with Java EE 6 using NetBeans 6.8 M1 and GlassFish v3 by building a simple Servlet 3.0 + JPA 2.0 web application. TOTD #94 built upon it by using Java Server Faces...

Posted by Arun Gupta's Blog on August 17, 2009 at 01:36 AM PDT #

Hello.

I'm trying to use a Telnet client (using the libraries from Apache Commons-Net) in a Stateless Bean but I have trouble doing and I think it is because these beans can not have this type of elements. My application must read requests from a database and as execute various commands such through an existing Telnet connection which I think is a good idea to open the connection in a Singleton Bean for another Stateless Bean (programmed with a schedule @Schedule) use this connection, so my question is. How do I make a Bean Stateless use the POJOs (in this case the Telnet connection) of a Singleton Bean?.

Thank you very much for your help.

Posted by Pepo on August 27, 2009 at 12:06 AM PDT #

Pepo, You've already asked the question at users@glassfish.dev.java.net and that is the right venue for such queries.

Posted by Arun Gupta on August 27, 2009 at 03:23 AM PDT #

Arun -

Enjoy site. I am a newbie and am pulling hair out (i.e., what's left). Environemnt working in is netbeans 6.8, Oracle 11g. Wrote servlet that leverages database Connection pool. Getting error

SEVERE: javax.naming.NamingException: Lookup failed for 'java:/comp/env/jdbc/crcrms' in SerialContext [Root exception is javax.naming.NameNotFoundException: No object bound to name java:/comp/env/jdbc/crcrms]

Not sure why?

Please let me know if more information would help.

Thanks.

HJM

Posted by HJM on April 07, 2010 at 05:35 AM PDT #

HJM,

I assume your app is deployed on GlassFish :-)

Did you try asadmin ping-connection-pool to see if the pool is setup correctly ?

Posted by Arun Gupta on April 07, 2010 at 02:13 PM PDT #

I'm getting an error on step 7, specifically, on the 4th 'sub-step'. I add the following lines above the processRequest method declaration

@PersistenceUnit
EntityManagerFactory emf;

and the error message I see when I hover above each line is

cannot find symbol

Any ideas as to how to resolve this?

Posted by Vance on August 23, 2010 at 12:38 PM PDT #

Ok, turns out I just needed to import the necessary classes from the javax.persistence package to fix my earlier bug.

But for some reason I'm unable to successfully deploy the created WAR file from within NetBeans 6.9. However, I was able to do so manually using the Admin application. Go figure.

Posted by Vance on August 23, 2010 at 12:49 PM PDT #

Hai arun, iam getting NullpointerException while injecting EAO class into my ejb using @Inject annotation please help me.

Thanks in advance

Posted by deviprasad on September 30, 2010 at 12:03 AM PDT #

deviprasad,

GlassFish and NetBeans version ?

Posted by Arun Gupta on October 05, 2010 at 12:08 AM PDT #

Post a Comment:
Comments are closed for this entry.
About

profile image
Arun Gupta is a technology enthusiast, a passionate runner, author, and a community guy who works for Oracle Corp.


Java EE 7 Samples

Stay Connected

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today