| [//]: # " 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 6.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.md) 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. |