| [//]: # " Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved. " |
| [//]: # " " |
| [//]: # " Redistribution and use in source and binary forms, with or without " |
| [//]: # " modification, are permitted provided that the following conditions are met: " |
| [//]: # " " |
| [//]: # " 1. Redistributions of source code must retain the above copyright notice, this " |
| [//]: # " list of conditions and the following disclaimer. " |
| [//]: # " 2. Redistributions in binary form must reproduce the above copyright notice, " |
| [//]: # " this list of conditions and the following disclaimer in the documentation " |
| [//]: # " and/or other materials provided with the distribution. " |
| [//]: # " " |
| [//]: # " THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND " |
| [//]: # " ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED " |
| [//]: # " WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE " |
| [//]: # " DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR " |
| [//]: # " ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES " |
| [//]: # " (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; " |
| [//]: # " LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND " |
| [//]: # " ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT " |
| [//]: # " (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS " |
| [//]: # " SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. " |
| [//]: # " " |
| [//]: # " SPDX-License-Identifier: BSD-2-Clause " |
| |
| Bookstore |
| ========= |
| |
| This example demonstrates how to connect JSP pages to resources. The |
| example is copied from the |
| [Bookstore](http://stapler.kohsuke.org/getting-started.html) example |
| presented by the [Stapler](http://stapler.kohsuke.org/) project that |
| provides a way to staple URIs to Java classes to build RESTful Web |
| applications such as [Hudson](http://java.net/projects/hudson/). |
| |
| A bookstore Web application is presented that is capable of presenting |
| books, CDs and tracks of CDs. |
| |
| Contents |
| -------- |
| |
| The example consists of four web resources implemented by the following: |
| |
| `org.glassfish.jersey.examples.bookstore.webapp.resource.Bookstore` |
| |
| The bookstore resource that returns a list of items, either CDs |
| or Books. The resource dynamically references a Book or CD resource |
| using the getItem method that is annotated with Path. The Book and |
| CD resource both inherit from the Item class and thus the resources |
| can be managed polymorphically. |
| |
| `org.glassfish.jersey.examples.bookstore.webapp.resource.Book` |
| |
| The book resource that has a title and an author. |
| |
| `org.glassfish.jersey.examples.bookstore.webapp.resource.CD` |
| |
| The CD resource that has a title, author and a list of tracks. The |
| resource dynamically references the Track resource using the |
| getTrack method that is annotated with Path. |
| |
| `org.glassfish.jersey.examples.bookstore.webapp.resource.Track` |
| |
| The Tracks resource that has a name and the length of the track. |
| |
| The mapping of the URI path space is presented in the following table: |
| |
| |
| URI path | Resource class | HTTP methods | Notes |
| ----------------------------------- | ---------------- | -------------- | ------------------------------------------------------------------------------ |
| **_/_** | Bookstore | GET | webapp/resource/Bookstore/index.jsp |
| **_/count_** | Bookstore | GET | webapp/resource/Bookstore/count.jsp |
| **_/time_** | Bookstore | GET | webapp/resource/Bookstore/time.jsp |
| **_/items/{itemid}_** | Book, CD | GET | webapp/resource/Book/index.jsp, webapp/resource/CD/index.jsp |
| **_/items/{itemid}/tracks/{num}_** | Track | GET | webapp/resource/Track/index.jsp |
| |
| Running the Example |
| ------------------- |
| |
| Bookstore example runs on Glassfish 4.0 application server |
| ([https://javaee.github.io/glassfish/](https://javaee.github.io/glassfish/)), which can be |
| run as an embedded container or Jetty. |
| |
| If you are working with Jersey GlassFish update center module installed |
| into your existing GlassFish instance, you will need to follow |
| instructions at [the module README file](../../README.html) in order to |
| deploy the example. |
| |
| Otherwise, you can run the example using embedded GlassFish as follows: |
| |
| Build and deploy the project by executing the following command from the |
| project directory |
| |
| > mvn clean package embedded-glassfish:run (TODO does not work at the moment) |
| |
| or you can run the example using Jetty as follows: |
| |
| > mvn clean package jetty:run |
| |
| Go to the URL: |
| |
| <http://localhost:8080/bookstore-webapp/> |
| |
| #### Test Client Running |
| |
| > mvn test -Djersey.config.test.container.factory=org.glassfish.jersey.test.external.ExternalTestContainerFactory -Djersey.config.test.logging.enable=true -Djersey.config.test.logging.dumpEntity=true -Djersey.config.test.container.port=8080 -Dmaven.test.skip=false |
| |
| or |
| |
| > mvn test -Prun-external-tests |
| |
| How it works |
| ------------ |
| |
| This example shows how to support polymorphism of resources and JSP |
| pages. Hence it is possible to add another resource, such as a DVD |
| resource with associated JSP pages, which extends Item without having to |
| change the logic of Bookstore or the existing JSP pages. |
| |
| JSP pages are associated with resource classes. Such JSP pages are |
| resolved by converting the fully qualified class name of the resource |
| class into a path and appending last path segment of the request URI |
| path to that path. For example, when a GET is performed on the URI path |
| "/" then the path to the JSP page is |
| "/org/glassfish/jersey/examples/bookstore/webapp/resource/Bookstore/", |
| and in this case since the last path segment is empty "index.jsp" is |
| appended to the path. Then the request us forwarded to the JSP page at |
| that path. Similarly when a GET is performed on the URI path "/count" |
| then the path to the JSP page is |
| "//org/glassfish/jersey/examples/bookstore/webapp/resource/Bookstore/count.jsp". |
| |
| The JSP variable "it" is set to the instance of Bookstore so that the |
| index.jsp, or count.jsp, has access to the Bookstore instance as a Java |
| bean. |
| |
| If a resource class inherits from another resource class then it will |
| automatically inherit the JSPs from the super class. |
| |
| A JSP page may also include JSPs using the inheritance mechanism, for |
| example the index.jsp page associated with the Book resource class |
| includes a footer.jsp page whose location is specified by the super |
| class, Item. |