57.2 The Duke's Bookstore Interface
This section provides additional detail regarding the components of the Duke's Bookstore example and how they interact.
57.2.1 The Book Java Persistence API Entity
The Book entity, located in the dukesbookstore.entity package, encapsulates the book data stored by Duke's Bookstore.
The Book entity defines attributes used in the example:
-
A book ID
-
The author's first name
-
The author's surname
-
The title
-
The price
-
Whether the book is on sale
-
The publication year
-
A description of the book
-
The number of copies in the inventory
The Book entity also defines a simple named query, findBooks.
57.2.2 Enterprise Beans Used in Duke's Bookstore
Two enterprise beans located in the dukesbookstore.ejb package provide the business logic for Duke's Bookstore.
-
BookRequestBeanis a stateful session bean that contains the business methods for the application. The methods create, retrieve, and purchase books, and update the inventory for a book. To retrieve the books, thegetBooksmethod calls thefindBooksnamed query defined in theBookentity. -
ConfigBeanis a singleton session bean used to create the books in the catalog when the application is initially deployed. It calls thecreateBookmethod defined inBookRequestBean.
57.2.3 Facelets Pages and Managed Beans Used in Duke's Bookstore
The Duke's Bookstore application uses Facelets and its templating features to display the user interface. The Facelets pages interact with a set of CDI managed beans that act as backing beans, providing the underlying properties and methods for the user interface. The front page also interacts with the custom components used by the application.
The application uses the following Facelets pages, which are located in the tut-install/examples/case-studies/dukes-bookstore/src/main/webapp/ directory.
-
bookstoreTemplate.xhtml: The template file, which specifies a header used on every page as well as the style sheet used by all the pages. The template also retrieves the language set in the web browser.Uses the
LocaleBeanmanaged bean. -
index.xhtml: Landing page, which lays out the custom map and area components using managed beans configured in thefaces-config.xmlfile and allows the user to select a book and advance to thebookstore.xhtmlpage. -
bookstore.xhtml: Page that allows the user to obtain details on the selected book or the featured book, to add either book to the shopping cart, and to advance to thebookcatalog.xhtmlpage.Uses the
BookstoreBeanmanaged bean. -
bookdetails.xhtml: Page that shows details on a book selected frombookstore.xhtmlor other pages and allows the user to add the book to the cart and/or advance to thebookcatalog.xhtmlpage.Uses the
BookDetailsBeanmanaged bean. -
bookcatalog.xhtml: Page that displays the books in the catalog and allows the user to add books to the shopping cart, view the details for any book, view the shopping cart, empty the shopping cart, or purchase the books in the shopping cart.Uses the
BookstoreBean,CatalogBean, andShoppingCartmanaged beans. -
bookshowcart.xhtml: Page that displays the contents of the shopping cart and allows the user to remove items, view the details for an item, empty the shopping cart, purchase the books in the shopping cart, or return to the catalog.Uses the
ShowCartBeanandShoppingCartmanaged beans. -
bookcashier.xhtml: Page that allows the user to purchase books, specify a shipping option, subscribe to newsletters, or join the Duke Fan Club with a purchase over a certain amount.Uses the
CashierBeanandShoppingCartmanaged beans. -
bookreceipt.xhtml: Page that confirms the user's purchase and allows the user to return to the catalog page to continue shopping.Uses the
CashierBeanmanaged bean. -
bookordererror.xhtml: Page rendered byCashierBeanif the bookstore has no more copies of a book that was ordered.
The application uses the following managed beans, which are located in the tut-install/examples/case-studies/dukes-bookstore/src/main/java/javaeetutorial/dukesbookstore/web/managedbeans/ directory.
-
AbstractBean: Contains utility methods called by other managed beans. -
BookDetailsBean: Backing bean for thebookdetails.xhtmlpage. Specifies the namedetails. -
BookstoreBean: Backing bean for thebookstore.xhtmlpage. Specifies the namestore. -
CashierBean: Backing bean for thebookcashier.xhtmlandbookreceipt.xhtmlpages. -
CatalogBean: Backing bean for thebookcatalog.xhtmlpage. Specifies the namecatalog. -
LocaleBean: Managed bean that retrieves the current locale; used on each page. -
ShoppingCart: Backing bean used by thebookcashier.xhtml,bookcatalog.xhtml, andbookshowcart.xhtmlpages. Specifies the namecart. -
ShoppingCartItem: Contains methods called byShoppingCart,CatalogBean, andShowCartBean. -
ShowCartBean: Backing bean for thebookshowcart.xhtmlpage. Specifies the nameshowcart.
57.2.4 Custom Components and Other Custom Objects Used in Duke's Bookstore
The map and area custom components for Duke's Bookstore, along with associated renderer, listener, and model classes, are defined in the following packages in the tut-install/examples/case-studies/dukes-bookstore/src/main/java/javaeetutorial/dukesbookstore/ directory.
-
components: Contains theMapComponentandAreaComponentclasses. See Creating Custom Component Classes. -
listeners: Contains theAreaSelectedEventclass, along with other listener classes. See Handling Events for Custom Components. -
model: Contains theImageAreaclass. See Configuring Model Data for more information. -
renderers: Contains theMapRendererandAreaRendererclasses. See Delegating Rendering to a Renderer.
The tut-install/examples/case-studies/dukes-bookstore/src/java/dukesbookstore/ directory also contains a custom converter and other custom listeners not specifically tied to the custom components.
-
converters: Contains theCreditCardConverterclass. See Creating and Using a Custom Converter. -
listeners: Contains theLinkBookChangeListener,MapBookChangeListener, andNameChangedclasses. See Implementing an Event Listener.
57.2.5 Properties Files Used in Duke's Bookstore
The strings used in the Duke's Bookstore application are encapsulated into resource bundles to allow the display of localized strings in multiple locales. The properties files, located in the tut-install/examples/case-studies/dukes-bookstore/src/main/java/javaeetutorial/dukesbookstore/web/messages/ directory, consist of a default file containing English strings and three additional files for other locales. The files are as follows:
-
Messages.properties: Default file, containing English strings -
Messages_de.properties: File containing German strings -
Messages_es.properties: File containing Spanish strings -
Messages_fr.properties: File containing French strings
The language setting in the user's web browser determines which locale is used. The html tag in bookstoreTemplate.xhtml retrieves the language setting from the language property of LocaleBean:
<html lang="#{localeBean.language}"
...
For more information about resource bundles, see Chapter 20, "Internationalizing and Localizing Web Applications."
The resource bundle is configured as follows in the faces-config.xml file:
<application>
<resource-bundle>
<base-name>
javaeetutorial.dukesbookstore.web.messages.Messages
</base-name>
<var>bundle</var>
</resource-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>de</supported-locale>
<supported-locale>es</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
</application>
This configuration means that in the Facelets pages, messages are retrieved using the prefix bundle with the key found in the Messages_locale.properties file, as in the following example from the index.xhtml page:
<h:outputText style="font-weight:bold"
value="#{bundle.ChooseBook}" />
In Messages.properties, the key string is defined as follows:
ChooseBook=Choose a Book from our Catalog
57.2.6 Deployment Descriptors Used in Duke's Bookstore
The following deployment descriptors are used in Duke's Bookstore:
-
src/main/resources/META-INF/persistence.xml: The Java Persistence API configuration file -
src/main/webapp/WEB-INF/bookstore.taglib.xml: The tag library descriptor file for the custom components -
src/main/webapp/WEB-INF/faces-config.xml: The JavaServer Faces configuration file, which configures the managed beans for the map component as well as the resource bundles for the application -
src/main/webapp/WEB-INF/web.xml: The web application configuration file
