# The Java EE 7 Tutorial

# 29.3 Example Applications for JAX-RS

This section provides an introduction to creating, deploying, and running your own JAX-RS applications. This section demonstrates the steps that are needed to create, build, deploy, and test a very simple web application that uses JAX-RS annotations.

## 29.3.1 Creating a Simple RESTful Web Service

This section explains how to use NetBeans IDE to create a RESTful web service using a Maven archetype. The archetype generates a skeleton for the application, and you simply need to implement the appropriate method.

You can find a version of this application at tut-install`/examples/jaxrs/hello/`.

### 29.3.1.1 To Create a RESTful Web Service Using NetBeans IDE

1. Ensure you have installed the tutorial archetypes as described in Installing the Tutorial Archetypes.

2. In NetBeans IDE, create a simple web application using the `jaxrs-service-archetype` Maven archetype. This archetype creates a very simple "Hello, World" web application.

   1. From the File menu, choose New Project.

   2. From Categories, select Maven. From Projects, select Project From Archetype. Click Next.

   3. Under Search enter `jaxrs-service`, select the `jaxrs-service-archetype`, and click Next.

   4. Under Project Name enter `HelloWorldApplication`, set the Project Location, and set the Package name to `javaeetutorial.hello`, and click Finish.

   The project is created.

3. In `HelloWorld.java`, find the `getHtml()` method. Replace the `//TODO` comment with the following text, so that the finished product resembles the following method:

       @GET
       @Produces("text/html")
       public String getHtml() {
           return "<html lang=\"en\"><body><h1>Hello, World!!</body></h1></html>";
       }

   Note: Because the MIME type produced is HTML, you can use HTML tags in your return statement.

4. Right-click the `HelloWorldApplication` project in the Projects pane and select Run.

   This will build and deploy the application to GlassFish Server.

5. In a browser, open the following URL:

       http://localhost:8080/HelloWorldApplication/HelloWorldApplication

   A browser window opens and displays the return value of `Hello, World!!`

For other sample applications that demonstrate deploying and running JAX-RS applications using NetBeans IDE, see The rsvp Example Application and Your First Cup: An Introduction to the Java EE Platform at `http://docs.oracle.com/javaee/7/firstcup/doc/`. You may also look at the tutorials on the NetBeans IDE tutorial site, such as the one titled "Getting Started with RESTful Web Services" at `https://netbeans.org/kb/docs/websvc/rest.html`. This tutorial includes a section on creating a CRUD application from a database. Create, read, update, and delete (CRUD) are the four basic functions of persistent storage and relational databases.

## 29.3.2 The rsvp Example Application

The `rsvp` example application, located in the tut-install`/examples/jaxrs/rsvp/` directory, allows invitees to an event to indicate whether they will attend. The events, people invited to the event, and the responses to the invite are stored in a Java DB database using the Java Persistence API. The JAX-RS resources in `rsvp` are exposed in a stateless session enterprise bean.

### 29.3.2.1 Components of the rsvp Example Application

The three enterprise beans in the `rsvp` example application are `rsvp.ejb.ConfigBean`, `rsvp.ejb.StatusBean`, and `rsvp.ejb.ResponseBean`.

`ConfigBean` is a singleton session bean that initializes the data in the database.

`StatusBean` exposes a JAX-RS resource for displaying the current status of all invitees to an event. The URI path template is declared first on the class and then on the `getEvent` method:

    @Stateless
    @Named
    @Path("/status")
    public class StatusBean {
        ...
        @GET
        @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        @Path("{eventId}/")
        public Event getEvent(@PathParam("eventId") Long eventId) {
             ...

The combination of the two `@Path` annotations results in the following URI path template:

    @Path("/status/{eventId}/")

The URI path variable `eventId` is a `@PathParam` variable in the `getEvent` method, which responds to HTTP GET requests and has been annotated with `@GET`. The `eventId` variable is used to look up all the current responses in the database for that particular event.

`ResponseBean` exposes a JAX-RS resource for setting an invitee's response to a particular event. The URI path template for `ResponseBean` is declared as follows:

    @Path("/{eventId}/{inviteId}")

Two URI path variables are declared in the path template: `eventId` and `inviteId`. As in `StatusBean`, `eventId` is the unique ID for a particular event. Each invitee to that event has a unique ID for the invitation, and that is the `inviteId`. Both of these path variables are used in two JAX-RS methods in `ResponseBean`: `getResponse` and `putResponse`. The `getResponse` method responds to HTTP GET requests and displays the invitee's current response and a form to change the response.

The `javaeetutorial.rsvp.rest.RsvpApplication` class defines the root application path for the resources by applying the `javax.ws.rs.ApplicationPath` annotation at the class level.

    @ApplicationPath("/webapi")
    public class RsvpApplication extends Application {
    }

An invitee who wants to change his or her response selects the new response and submits the form data, which is processed as an HTTP POST request by the `putResponse` method. The new response is extracted from the HTTP POST request and stored as the `userResponse` string. The `putResponse` method uses `userResponse`, `eventId`, and `inviteId` to update the invitee's response in the database.

The events, people, and responses in `rsvp` are encapsulated in Java Persistence API entities. The `rsvp.entity.Event`, `rsvp.entity.Person`, and `rsvp.entity.Response` entities respectively represent events, invitees, and responses to an event.

The `rsvp.util.ResponseEnum` class declares an enumerated type that represents all the possible response statuses an invitee may have.

The web application also includes two CDI managed beans, `StatusManager` and `EventManager`, which use the JAX-RS Client API to call the resources exposed in `StatusBean` and `ResponseBean`. For information on how the Client API is used in `rsvp`, see "The Client API in the rsvp Example Application".

### 29.3.2.2 Running the rsvp Example Application

Both NetBeans IDE and Maven can be used to deploy and run the `rsvp` example application.

To Run the rsvp Example Application Using NetBeans IDE

1. If the database server is not already running, start it by following the instructions in Starting and Stopping the Java DB Server.

2. Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server).

3. From the File menu, choose Open Project.

4. In the Open Project dialog box, navigate to:

       tut-install/examples/jaxrs

5. Select the `rsvp` folder.

6. Click Open Project.

7. In the Projects tab, right-click the `rsvp` project and select Run.

   The project will be compiled, assembled, and deployed to GlassFish Server. A web browser window will open to the following URL:

       http://localhost:8080/rsvp/index.xhtml

8. In the web browser window, click the Event status link for the Duke's Birthday event.

   You'll see the current invitees and their responses.

9. Click the current response of one of the invitees in the Status column of the table, select a new response, and click Update your status.

   The invitee's new status should now be displayed in the table of invitees and their response statuses.

To Run the rsvp Example Application Using Maven

1. If the database server is not already running, start it by following the instructions in Starting and Stopping the Java DB Server.

2. Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server).

3. In a terminal window, go to:

       tut-install/examples/jaxrs/rsvp/

4. Enter the following command:

       mvn install

   This command builds, assembles, and deploys `rsvp` to GlassFish Server.

5. Open a web browser window to the following URL:

       http://localhost:8080/rsvp/

6. In the web browser window, click the Event status link for the Duke's Birthday event.

   You'll see the current invitees and their responses.

7. Click the current response of one of the invitees in the Status column of the table, select a new response, and click Update your status.

   The invitee's new status should now be displayed in the table of invitees and their response statuses.

## 29.3.3 Real-World Examples

Most blog sites use RESTful web services. These sites involve downloading XML files, in RSS or Atom format, that contain lists of links to other resources. Other websites and web applications that use REST-like developer interfaces to data include Twitter and Amazon S3 (Simple Storage Service). With Amazon S3, buckets and objects can be created, listed, and retrieved using either a REST-style HTTP interface or a SOAP interface. The examples that ship with Jersey include a storage service example with a RESTful interface.