Your First Cup: An Introduction To The Java EE Platform
Your First Cup: An Introduction To The Java EE Platform
Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product that is described in this document. In particular, and without
limitation, these intellectual property rights may include one or more U.S. patents or pending patent applications in the U.S. and in other countries.
U.S. Government Rights – Commercial software. Government users are subject to the Sun Microsystems, Inc. standard license agreement and applicable provisions
of the FAR and its supplements.
This distribution may include materials developed by third parties.
Parts of the product may be derived from Berkeley BSD systems, licensed from the University of California. UNIX is a registered trademark in the U.S. and other
countries, exclusively licensed through X/Open Company, Ltd.
Sun, Sun Microsystems, the Sun logo, the Solaris logo, the Java Coffee Cup logo, docs.sun.com, Enterprise JavaBeans, EJB, GlassFish, J2EE, J2SE, Java Naming and
Directory Interface, JavaBeans, Javadoc, JDBC, JDK, JavaScript, JavaServer, JavaServer Pages, JMX, JRE, JSP, JVM, MySQL, NetBeans, OpenSolaris, SunSolve, Sun
GlassFish, Java, and Solaris are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks are used under
license and are trademarks or registered trademarks of SPARC International, Inc. in the U.S. and other countries. Products bearing SPARC trademarks are based
upon an architecture developed by Sun Microsystems, Inc.
The OPEN LOOK and SunTM Graphical User Interface was developed by Sun Microsystems, Inc. for its users and licensees. Sun acknowledges the pioneering efforts
of Xerox in researching and developing the concept of visual or graphical user interfaces for the computer industry. Sun holds a non-exclusive license from Xerox to
the Xerox Graphical User Interface, which license also covers Sun's licensees who implement OPEN LOOK GUIs and otherwise comply with Sun's written license
agreements.
Products covered by and information contained in this publication are controlled by U.S. Export Control laws and may be subject to the export or import laws in
other countries. Nuclear, missile, chemical or biological weapons or nuclear maritime end uses or end users, whether direct or indirect, are strictly prohibited. Export
or reexport to countries subject to U.S. embargo or to entities identified on U.S. export exclusion lists, including, but not limited to, the denied persons and specially
designated nationals lists is strictly prohibited.
DOCUMENTATION IS PROVIDED “AS IS” AND ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
Copyright 2009 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Tous droits réservés.
Sun Microsystems, Inc. détient les droits de propriété intellectuelle relatifs à la technologie incorporée dans le produit qui est décrit dans ce document. En particulier,
et ce sans limitation, ces droits de propriété intellectuelle peuvent inclure un ou plusieurs brevets américains ou des applications de brevet en attente aux Etats-Unis
et dans d'autres pays.
Cette distribution peut comprendre des composants développés par des tierces personnes.
Certaines composants de ce produit peuvent être dérivées du logiciel Berkeley BSD, licenciés par l'Université de Californie. UNIX est une marque déposée aux
Etats-Unis et dans d'autres pays; elle est licenciée exclusivement par X/Open Company, Ltd.
Sun, Sun Microsystems, le logo Sun, le logo Solaris, le logo Java Coffee Cup, docs.sun.com, Enterprise JavaBeans, EJB, GlassFish, J2EE, J2SE, Java Naming and
Directory Interface, JavaBeans, Javadoc, JDBC, JDK, JavaScript, JavaServer, JavaServer Pages, JMX, JRE, JSP, JVM, MySQL, NetBeans, OpenSolaris, SunSolve, Sun
GlassFish, Java et Solaris sont des marques de fabrique ou des marques déposées de Sun Microsystems, Inc. aux Etats-Unis et dans d'autres pays. Toutes les marques
SPARC sont utilisées sous licence et sont des marques de fabrique ou des marques déposées de SPARC International, Inc. aux Etats-Unis et dans d'autres pays. Les
produits portant les marques SPARC sont basés sur une architecture développée par Sun Microsystems, Inc.
L'interface d'utilisation graphique OPEN LOOK et Sun a été développée par Sun Microsystems, Inc. pour ses utilisateurs et licenciés. Sun reconnaît les efforts de
pionniers de Xerox pour la recherche et le développement du concept des interfaces d'utilisation visuelle ou graphique pour l'industrie de l'informatique. Sun détient
une licence non exclusive de Xerox sur l'interface d'utilisation graphique Xerox, cette licence couvrant également les licenciés de Sun qui mettent en place l'interface
d'utilisation graphique OPEN LOOK et qui, en outre, se conforment aux licences écrites de Sun.
Les produits qui font l'objet de cette publication et les informations qu'il contient sont régis par la legislation américaine en matière de contrôle des exportations et
peuvent être soumis au droit d'autres pays dans le domaine des exportations et importations. Les utilisations finales, ou utilisateurs finaux, pour des armes nucléaires,
des missiles, des armes chimiques ou biologiques ou pour le nucléaire maritime, directement ou indirectement, sont strictement interdites. Les exportations ou
réexportations vers des pays sous embargo des Etats-Unis, ou vers des entités figurant sur les listes d'exclusion d'exportation américaines, y compris, mais de manière
non exclusive, la liste de personnes qui font objet d'un ordre de ne pas participer, d'une façon directe ou indirecte, aux exportations des produits ou des services qui
sont régis par la legislation américaine en matière de contrôle des exportations et la liste de ressortissants spécifiquement designés, sont rigoureusement interdites.
LA DOCUMENTATION EST FOURNIE "EN L'ETAT" ET TOUTES AUTRES CONDITIONS, DECLARATIONS ET GARANTIES EXPRESSES OU TACITES
SONT FORMELLEMENT EXCLUES, DANS LA MESURE AUTORISEE PAR LA LOI APPLICABLE, Y COMPRIS NOTAMMENT TOUTE GARANTIE
IMPLICITE RELATIVE A LA QUALITE MARCHANDE, A L'APTITUDE A UNE UTILISATION PARTICULIERE OU A L'ABSENCE DE CONTREFACON.
091020@22749
Contents
Preface .....................................................................................................................................................5
1 Introduction ...........................................................................................................................................7
Goals of This Tutorial ............................................................................................................................7
Requirements for This Tutorial ............................................................................................................7
Getting the Java EE 6 SDK ..............................................................................................................7
Getting NetBeans IDE ....................................................................................................................8
Configuring Your Environment ...................................................................................................8
Getting the Latest Updates to the Tutorial ...................................................................................9
3
Contents
4 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Preface
This is Your First Cup: An Introduction to Java Platform, Enterprise Edition, a short tutorial for
beginning Java EE programmers. This tutorial is designed to give you a hands-on lesson on
developing an enterprise application from initial coding to deployment.
5
Preface
Note – Sun is not responsible for the availability of third-party web sites mentioned in this
document. Sun does not endorse and is not responsible or liable for any content, advertising,
products, or other materials that are available on or through such sites or resources. Sun will not
be responsible or liable for any actual or alleged damage or loss caused or alleged to be caused by
or in connection with use of or reliance on any such content, goods, or services that are available
on or through such sites or resources.
Typographic Conventions
The following table describes the typographic changes that are used in this book.
AaBbCc123 The names of commands, files, and Edit your .login file.
directories, and onscreen computer
Use ls -a to list all files.
output
machine_name% you have mail.
AaBbCc123 A placeholder to be replaced with a real The command to remove a file is rm filename.
name or value
AaBbCc123 Book titles, new terms, and terms to be Read Chapter 6 in the User's Guide.
emphasized (note that some emphasized
A cache is a copy that is stored locally.
items appear bold online)
Do not save the file.
6 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
1
C H A P T E R
Introduction
1
An introduction to this tutorial. This chapter outlines the goals and the prerequisites for
completing this tutorial.
For up-to-the-minute information on which versions of the required software are compatible
with this tutorial see the First Cup 2.0 compatibility page (http://wiki.glassfish.java.net/
Wiki.jsp?page=FirstCup2Compatibility).
7
Requirements for This Tutorial
2 In the Available Plugins tab select GlassFish v3 Enabler and click Install.
3 Click Next.
Before You Begin Enable Enterprise Server v3 support as described in “Enabling Enterprise Server v3 Support in
NetBeans IDE” on page 8.
4 Under Platform Location, browse to or enter the location of your Enterprise Server v3
installation.
5 Click Next.
8 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Requirements for This Tutorial
6 Under Domain, use the drop-down list to select an existing domain, type in the path to the
domain directly in the field, or type the name of a new domain to create.
7 Click Finish.
2 Right-click the GlassFish v3 instance and select View Update Center to display the Update Tool.
4 Look for updates to the First Cup 2. 0 for Java EE 6 (javaee-firstcup-tutorial) package.
5 If there is an updated version of First Cup 2.0, select First Cup 2. 0 for Java EE 6
(javaee-firstcup-tutorial) and click Install.
Chapter 1 • Introduction 9
10
2
C H A P T E R 2
This chapter outlines the features of JavaTM Platform, Enterprise Edition (Java EE), how it differs
from Java Platform, Standard Edition (Java SE) and Java Platform, Micro Edition (Java ME),
and the basic concepts behind enterprise application development.
There are several Java platforms. Many developers, even long-time Java programming language
developers, do not understand how the different platforms relate to each other.
All Java platforms consist of a Java Virtual Machine (VM) and an application programming
interface (API). The Java Virtual Machine is a program, for a particular hardware and software
platform, that runs Java applications. An API is a collection of software components that you
can use to create other software components or applications. Each Java platform provides a
virtual machine and an API, and this allows applications written for that platform to run on any
compatible system with all the advantages of the Java programming language:
platform-independence, power, stability, ease-of-development, and security.
11
Overview of Enterprise Applications
Java SE
When most people think of the Java programming language, they think of the Java SE API. Java
SE's API provides the core functionality of the Java programming language. It defines
everything from the basic types and objects of the Java programming language to high-level
classes that are used for networking, security, database access, graphical user interface (GUI)
development, and XML parsing.
In addition to the core API, the Java SE platform consists of a virtual machine, development
tools, deployment technologies, and other class libraries and toolkits commonly used in Java
applications.
Java EE
The Java EE platform is built on top of the Java SE platform. The Java EE platform provides an
API and runtime environment for developing and running large-scale, multi-tiered, scalable,
reliable, and secure network applications.
Java ME
The Java ME platform provides an API and a small-footprint virtual machine for running Java
programming language applications on small devices, like mobile phones. The API is a subset of
the Java SE API, along with special class libraries useful for small device application
development. Java ME applications are often clients of Java EE application services.
As stated above, the Java EE platform is designed to help developers create large-scale,
multi-tiered, scalable, reliable, and secure network applications. A shorthand name for such
applications is “enterprise applications,” so called because these applications are designed to
solve the problems encountered by large enterprises. Enterprise applications are not only useful
for large corporations, agencies, and governments, however. The benefits of an enterprise
application are helpful, even essential, for individual developers and small organizations in an
increasingly networked world.
The features that make enterprise applications powerful, like security and reliability, often make
these applications complex. The Java EE platform is designed to reduce the complexity of
enterprise application development by providing a development model, API, and runtime
environment that allows developers to concentrate on functionality.
12 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Overview of Enterprise Applications
Tiered Applications
In a multi-tiered application, the functionality of the application is separated into isolated
functional areas, called tiers. Typically, multi-tiered applications have a client tier, a middle tier,
and a data tier (often called the enterprise information systems tier). The client tier consists of a
client program that makes requests to the middle tier. The middle tier's business functions
handle client requests and process application data, storing it in a permanent datastore in the
data tier.
Java EE application development concentrates on the middle tier to make enterprise application
management easier, more robust, and more secure.
Technology Purpose
JavaServer Faces Facelets technology Facelets applications are a type of JavaServer Faces
applications that use XHTML pages rather than JSP
pages.
Expression Language A set of standard tags used in JSP and Facelets pages to
refer to Java EE components.
JavaServer Pages (JSP) Text-based documents that are compiled into servlets
and define how dynamic content can be added to
static pages, such as HTML pages.
JavaServer Pages Standard Tag Library A tag library that encapsulates core functionality
common to JSP pages
JavaBeans Components Objects that act as temporary data stores for the pages
of an application
14 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Java EE Servers
Java EE Servers
A Java EE server is a server application that the implements the Java EE platform APIs and
provides the standard Java EE services. Java EE servers are sometimes called application servers,
because they allow you to serve application data to clients, much like web servers serve web
pages to web browsers.
Java EE servers host several application component types that correspond to the tiers in a
multi-tiered application. The Java EE server provides services to these components in the form
of a container.
Java EE Containers
Java EE containers are the interface between the component and the lower-level functionality
provided by the Java EE platform to support that component. The functionality of the container
is defined by the Java EE platform, and is different for each component type. Nonetheless, the
Java EE server allows the different component types to work together to provide functionality in
an enterprise application.
16 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
3
C H A P T E R 3
This chapter gives an overview of the example application and step-by-step instructions on
coding the example application.
17
Architecture of the Example Application
Java EE Server
dukes-age firstcup
JSF Application
DukesAgeResource is a JAX-RS resource that calculates the age of Duke, the Java mascot. Duke
was born May 23, 1995, when the first demo of Java technology was publicly released.
DukesBirthdayBean is a local, no-interface view stateless session bean that calculates the
difference between the user's age and Duke's age, and stores the user-submitted data in a Java
Persistence API entity.
FirstcupUser is a Java Persistence API entity that represents a particular user's birthday. It is
stored in a JavaDBTM database table, and managed by DukesBirthdayBean's business methods.
The firstcup web application is a JavaServer Faces Facelets application that accesses
DukesAgeResource to display Duke's age, reads in a date provided by the user, accesses
DukesBirthdayBean to calculate who is older, and then displays the difference in years between
the user and Duke and the average age difference of all users.
18 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
■ DukesBDay.java: A JavaServer Faces managed bean that defines properties to hold the user's
birth date, get Duke's current age from the DukesAgeResource web service, and get the age
difference between the user and Duke from the enterprise bean.
■ web.xml: The web application's deployment descriptor, which is used to configure certain
aspects of a web application when it is installed. In this case, it is used to provide a mapping
to the application's FacesServlet instance, which accepts incoming requests, passes them
to the life cycle for processing, and initializes resources.
■ WebMessages.properties and WebMessages_es.properties: Java programming language
properties files that contain the localized strings used in greeting.xhtml and
response.xhtml. By default, the English language strings in WebMessages.properties are
used, but Spanish language strings are also provided in WebMessages_es.properties.
■ DukesBirthdayBean.java: as described above, the enterprise bean packaged within the
firstcup application. DukesBirthdayBean that calculates the difference between the user's
birthday and Duke's birthday.
Getting Started
Before you start coding the example, you need to perform some configuration tasks:
1. Register the server with your NetBeans IDE as described in “Configuring Your
Environment” on page 8.
2. Create a directory for the example you will build.
● Create another directory at the same level as the tut-install/example directory, where tut-install
is the location of the firstcup tutorial installation, and call it myexample. You'll create the
applications described in this tutorial in this directory.
RESTful web services are often contrasted to SOAP web services (for example web services
created with the JAX-WS API that is part of Java EE 6). Compared to SOAP web services,
RESTful web services are simpler, as they use HTTP directly rather than as a transport
mechanism for an underlying XML document format, and typically offer better performance.
Web services are designed to be independent of their clients. Typically RESTful web services are
publicly available to a wide variety of clients, and the clients are located throughout the internet.
This is called “loose coupling,” as the clients and servers are connected only by the standard
HTTP-based requests and responses, and do not need to know each other's implementation
details. For this reason, DukesAge will be developed in its own application module, and
deployed separately from the DukesBirthdayBean enterprise bean and firstcup web client.
DukesAge could be deployed on a completely different machine without affecting the
functionality of the firstcup web client.
JAX-RS Resources
DukesAgeResource is a JAX-RS resource class that responds to HTTP GET requests and returns
a String representing the age of Duke at the time of the request.
20 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
To create DukesAgeResource, use the wizard provided by the JAX-RS plug-in for NetBeans IDE
to generate the resource class. This class is annotated with the javax.ws.rs.Path annotation,
which specifies the URL suffix to which the resource will respond. DukesAgeResource has a
single method, getText, annotated with the javax.ws.rs.GET and javax.ws.rs.Produces
annotations. @GET marks the method as a responder to HTTP GET requests, and @Produces
specifies the MIME-type of the response sent back from getText to clients. In this case, the
MIME-type is text/plain.
2 Select Java Web in the Categories pane, then Web Application, and click Next.
8 Click Finish.
You should now see the module you created in the Projects pane.
9 From the Projects pane, right-click on the index.jsp file and select Delete. Click Yes in the
dialog.
3 Select Web Services in the Categories pane, RESTful Web Services From Patterns under File
Types, and click Next.
4 Under Select Pattern select Simple Root Resource and click Next.
9 Click Finish.
You should now see the DukesAgeResource.java file inside the firstcup.webservice package
in the Projects pane. The DukesAgeResource.java file should also be open in the editor pane.
The default URL that is brought up in a web browser when you run dukes-age can also be
configured in NetBeans IDE.
2 Click Libraries.
4 Click Run.
6 Click OK.
● Highlight the following generated Javadoc and method definition and delete it.
/**
* PUT method for updating or creating an instance of DukesAgeResource
* @param content representation for the resource
* @return an HTTP response with content of the updated or created resource.
22 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
*/
@PUT
@Consumes("text/plain")
public void putText(String content) {
}
1 Highlight the current code in getText and replace it with the following code:
// Create a new Calendar for Duke’s birthday
Calendar dukesBirthday = new GregorianCalendar(1995, Calendar.MAY, 23);
// Create a new Calendar for today
Calendar now = GregorianCalendar.getInstance();
// If today’s date is before May 23, subtract a year from Duke’s age
if (now.before(dukesBirthday)) {
dukesAge--;
}
// Return a String representation of Duke’s age
return new String("" + dukesAge);
14
2 Under Categories select Java Web, then under Projects select Web Application, and click Next.
4 Set the Project Location to tut-install/myexample, where tut-install is the location of the
firstcup tutorial installation.
5 Click Next.
10 Click the Configuration Tab, then under Servlet URL Pattern enter /firstcupWeb/* and click
Finish.
24 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
1 With the firstcup project selected in the Projects pane, select File → New File.
2 Under Categories select Persistence, then under File Types select Entity Class, and click Next.
4 Click Create Persistence Unit, select jdbc/__default under Data Source, and click Create.
5 Click Finish.
1 Right-click the editor window, select Insert Code, then Add Property.
2 In the Add Property dialog, enter birthday under Name, java.util.Calendar under Type, and
click OK.
3 Click the error glyph next to the new birthday field and select Add @Temporal Annotation.
1 Right-click in the editor window, select Insert Code, then Constructor, and click Generate.
This constructor initializes the birthday property to the date passed in as a parameter.
These query use JPQL's MAX and MIN aggregate functions to return the youngest and oldest
users, respectively.
26 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
To create DukesBirthdayBean create one Java class: DukesBirthdayBean, the enterprise bean
class. DukesBirthdayBean is a local enterprise bean that uses a no-interface view, meaning two
things. First, a local enterprise bean is only visible within the application in which it is deployed.
Second, enterprise beans with a no-interface view do not need a separate business interface that
the enterprise bean class implements. The enterprise bean class is the only coding artifact
needed to create a local, no-interface enterprise bean.
DukesBirthdayBean will be packaged within the same WAR file as the Facelets web front-end.
4 Select Session Bean in the File Types pane and click Next.
8 Click Finish.
2 Below the class definition, add a @PersistenceContext annotation and field of type
EntityManager:
@PersistenceContext
private EntityManager em;
3 Right-click in the editor window and select Insert Code, then Add Business Method.
5 Under Parameters click Add, set the Name to date and the Type to java.util.Date, then click
OK.
6 Replace the body of the getAgeDifference method with the following code:
int ageDifference;
28 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
return ageDifference;
This method creates the Calendar objects used to calculate the difference in age between the
user and Duke and performs the actual calculation of the difference in age.
Similar to the DukesAgeResource.getText code, getAgeDifference subtracts Duke's birthday
year from the user's birthday year to get a raw age difference. If Duke's birthday falls before the
users, and the raw difference is more than 0, subtract one year from the age difference.
A new FirstcupUser entity is created with the user's birthday and age difference, then stored in
the JavaDB database by calling the EntityManager's persist method.
The final age difference is returned as an int.
8 Right-click in the editor window and select Fix Imports, choose the
java.util.logging.Logger fully-qualified name for the Logger class, and click OK.
1 Right-click in the Editor window, select Insert Code, then Add Business Method.
2 In the Add Business Method dialog, enter getOldestUserBirthday under Name, set the Return
Type to java.util.Calendar, and click OK.
3 Replace the body of the newly created getOldestUserBirthday method with the following
code:
public Calendar getOldestUserBirthday() {
Date date = (Date) em.createNamedQuery("findOldestFirstcupUser")
.getSingleResult();
Calendar cal = new GregorianCalendar();
cal.setTime(date);
return cal;
}
The named query in FirstcupUser is called by using the EntityManager's createNamedQuery
method. Because this query returns a single Date, the getSingleResult method is called on the
returned Query object. The query returns a Calendar, so the Date object returned by the query
is used to modify a Calendar object, and then returned.
4 Add another business method named getYoungestUserBirthday with the following code:
public Calendar getYoungestUserBirthday() {
Date date = (Date) em.createNamedQuery("findYoungestFirstcupUser")
.getSingleResult();
Calendar cal = new GregorianCalendar();
cal.setTime(date);
return cal;
}
This method is similar to getOldestUserBirthday, but calls the findYoungestFirstcupUser
named query.
3 Select the Other category, then Properties File from the New File dialog and click Next.
4 In the New Properties File dialog, enter WebMessages in the File Name field.
30 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
6 Click Finish.
7 After NetBeans IDE creates the properties file, enter the following messages or copy them from
here to the file:
Welcome=Hi. My name is Duke. Let us find out who is older -- You or me.
DukeIs=Duke is
YearsOldToday=years old today.
Instructions=Enter your birthday and click submit.
YourBD=Your birthday
Pattern=MM/dd/yyyy
DateError=Please enter the date in the form MM/dd/yyyy.
YouAre=You are
Year=year
Years=years
Older=older than Duke!
Younger=younger than Duke!
SameAge= the same age as Duke!
Submit=Submit
Back=Back
YoungestUser=The youngest user was born
OldestUser=The oldest user was born
These messages will be referenced from the XHTML pages.
9 To add the Spanish translations of the messages, copy the properties file
WebMessages_es.properties from
tut-install/firstcup/example/firstcup/src/java/com/sun/firstcup/web to
tut-install/firstcup/myexample/firstcup/src/java/firstcup/web.
Create multiple properties files, each with a set of messages for a different locale. By storing
localized static text and messages in resource bundles, the application doesn't need a separate
set of XHTML pages for each locale.
1 Select firstcup in the Projects Pane and select File → New File.
2 In the New File dialog, select JavaServer Faces under Categories, new JavaServer Face
Configuration under File Types, click Next, then Finish.
This section describes how to create the DukesBDay class. To create the class you need to do the
following:
■ Create the managed bean class.
■ Add a property that stores Duke's current age from the JAX-RS web service.
32 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
3 Select JavaServer Faces under Categories, then JSF Managed Bean under File Types.
7 Click Finish.
2 In the Call Enterprise Bean dialog expand the firstcup application, select DukesBirthdayBean,
and click OK. The following field will be added:
@EJB
private DukesBirthdayBean dukesBirthdayBean;
1 Right-click in the Editor window, select Insert Code, then Add Property.
2 Enter age under Name, and set the Type to int, click OK.
3 Repeat the above steps to create the following properties: yourBD of type java.util.Date,
ageDiff of type int, absAgeDiff of type int, oldestUserBirthday of type
java.util.Calendar, youngestUserBirthday of type java.util.Calendar, and timeZone of
type java.util.TimeZone.
4 After the newly created property fields, add the following Logger instance:
private static Logger logger = Logger.getLogger("firstcup.web.DukesBDay");
Use the java.net and java.io classes to create an HTTP connection to the Duke's Age web
service and read in the result.
34 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
BufferedReader rd = null;
StringBuilder sb = null;
String line = null;
URL serverAddress = null;
try {
serverAddress = new URL(
"http://localhost:8080/DukesAgeService/resources/dukesAge");
connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);
return age;
}
4 Click OK.
This method calls the getAgeDifference method of DukesBirthdayBean to get the age
difference and store it in the ageDiff property, sets the absolute age difference stored in the
absAgeDiff property, and returns a status code of success. This status code will be used by the
JavaServer Faces runtime to forward the user to the appropriate page.
36 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
resources/resource identifier
META-INF/resources/resource identifier
Resource identifiers are unique strings that conform to the following format:
[localePrefix/][libraryName/][libraryVersion/]resource name[/resourceVersion]
Elements of the resource identifier in brackets ([]) are optional. A resource name, identifying a
particular resource (a file or a graphic, for example), is required. In firstcup, a resource library
with the name components is packaged in the web application root, and this library contains
one resource, a file called inputDate.xhtml. The resource identifier for this resource is
therefore components/inputDate.xhtml, and it is located in the web application root at
resources/components/inputDate.xhtml.
The interface definition is specified with the <composite:interface> tag to define which
attributes are exposed to pages that use the composite component. Attributes are identified with
the <composite:attribute> tag.
The inputDate.xhtml interface definition is as follows. It defines a single attribute, date, that
must be specified in pages that use the inputDate composite component.
<composite:interface>
<composite:attribute name="date" required="true" />
</composite:interface>
<composite:implementation>
<h:inputText value="#{cc.attrs.date}">
<f:convertDateTime pattern="MM/dd/yyyy" timeZone="#{DukesBDay.timeZone}" />
</h:inputText>
</composite:implementation>
2 Select JavaServer Faces under Categories, JSF Composite Component under File Types, and click
Next.
3 In the New JSF Composite Component dialog, enter inputDate under File Name,
resources/components under Folder, and click Finish.
4 Add the composite component interface definition between the <body> and </body> tags in
inputDate.xhtml:
<composite:interface>
<composite:attribute name="date" required="true" />
</composite:interface>
38 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
The greeting.xhtml contains several pieces of the firstcup application detailed previously. It
uses the localized strings contained in WebMessages.properties and
WebMessages_es.properties. It uses the DukesBDay managed bean to call both the
DukesAgeResource JAX-RS web service and the DukesBirthdayBean enterprise bean. It uses
the inputDate composite component to create the input for the user to enter her birthday.
<p/>
<h:outputText value="#{bundle.YourBD} "/>
<fc:inputDate id="userBirthday" date="#{DukesBDay.yourBD}" />
<h:outputText value=" #{bundle.Pattern}"/>
<p/>
<h:commandButton value="#{bundle.Submit}" action="#{DukesBDay.processBirthday}"/>
<p/>
<h:message for="userBirthday" style="color:red"/>
</h:form>
</body>
</html>
The greeting.xhtml file uses the JSF Core, HTML Render Kit, and the components resource
library tag libraries. The components tag library has a prefix of fc, and is used to specify the
inputDate composite component in the form below. The <fc:inputDate id="userBirthday"
date="#{DukesBDay.yourBD}" /> tag has the required date attribute, and stores the value in
the yourBD property in the DukesBDay managed bean by using the EL expression
#{DukesBDay.yourBD}.
The localized strings are referred to by using the EL expressions #{bundle.property name}. For
example, the <h:outputText value="#{bundle.Welcome}"/> tag will display the following
string in English locales:
Hi. I’m Duke. Let’s find out who’s older -- You or me.
If the form submission is unsuccessful, a warning message is displayed. This is done with the
<h:message for="userBirthday" style="color:red"/> tag, which is connected to the
inputDate composite component with the id userBirthday. That is, if there's an error with the
input of the inputDate component, a warning message is displayed.
The response.xhtml displays the age difference between the user and Duke. Different strings
are displayed based on whether the user is the same age, younger, or older than duke. The text
can be displayed or not based on the conditions specified by the rendered attribute of the
<h:outputText> tag. The conditions used in the rendered attribute are EL language
alternatives to the Java programming language conditional operators to allow XML parsing of
the XHTML file.
40 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
EQUALS == ==
<p/>
<h:outputText value="#{bundle.OldestUser}: " />
<h:outputText value="#{DukesBDay.oldestUserBirthday.getTime()}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText>
<p/>
<h:commandButton id="back" value="#{bundle.Back}" action="greeting"/>
</h:form>
</body>
</html>
For example, the #{bundle.SameAge} string is displayed if the user and Duke have the same
birthday as specified by the condition #{DukesBDay.ageDiff == 0} in the rendered attribute.
That is, display the following string if the ageDiff property of DukesBDay equals 0:
The oldest and youngest user's birthdays are displayed, using the <f:convertDateTime> tag to
render the date returned from the oldestUserBirthday and youngestUserBirthday
properties of DukesBDay.
The form also contains a <h:commandButton> tag that creates a back button that will direct the
user back to the greeting.xhtml page, as specified in the action attribute.
1 In the firstcup project select Web Pages in the left pane in NetBeans IDE.
3 Select Java Server Faces under Categories, New JSF Page under File Types, and click Next.
5 Repeat the previous steps to create a new Facelets Simple File named response.
2 Click Pages.
42 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
3 Click Browse under Welcome Files, expand Web Pages, select greeting.xhtml, and click Select
File.
1 In the firstcup project open greeting.xhtml by double-clicking the file name under Web
Pages in the left pane.
1 In the firstcup project in greeting.xhtml add the following tags between the <body> and
</body> tags.
<h:form>
<h2>
<h:outputText value="#{bundle.Welcome}"/>
</h2>
<h:outputText value="#{bundle.DukeIs} "/>
<h:outputText value="#{DukesBDay.age} #{bundle.YearsOldToday}"/>
<p/>
<h:outputText value="#{bundle.Instructions}"/>
<p/>
<h:outputText value="#{bundle.YourBD} "/>
<fc:inputDate id="userBirthday" date="#{DukesBDay.yourBD}" />
<h:outputText value=" #{bundle.Pattern}"/>
<p/>
<h:commandButton value="#{bundle.Submit}" action="#{DukesBDay.processBirthday}"/>
<p/>
<h:message for="userBirthday" style="color:red"/>
</h:form>
1 In the firstcup project in response.xhtml add the following tags between the <body> and
</body> tags.
<h:form>
<h:outputText value="#{bundle.YouAre} "/>
<h:outputText value="#{bundle.SameAge}"
rendered="#{DukesBDay.ageDiff == 0}"/>
<h:outputText value="#{DukesBDay.absAgeDiff}"
rendered="#{DukesBDay.ageDiff lt 0}"/>
<h:outputText value=" #{bundle.Year} "
rendered="#{DukesBDay.ageDiff == -1}"/>
<h:outputText value=" #{bundle.Years} "
rendered="#{DukesBDay.ageDiff lt -1}"/>
<h:outputText value="#{bundle.Younger}"
rendered="#{DukesBDay.ageDiff lt 0}"/>
<h:outputText value="#{DukesBDay.absAgeDiff}"
rendered="#{DukesBDay.ageDiff gt 0}"/>
<h:outputText value=" #{bundle.Year} "
rendered="#{DukesBDay.ageDiff == 1}"/>
<h:outputText value=" #{bundle.Years} "
rendered="#{DukesBDay.ageDiff gt 1}"/>
<h:outputText value="#{bundle.Older}" rendered="#{DukesBDay.ageDiff gt 0}"/>
<p/>
<h:outputText value="#{bundle.YoungestUser}: " />
44 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
Coding the Example Application
<h:outputText value="#{DukesBDay.youngestUserBirthday.getTime()}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText>
<p/>
<h:outputText value="#{bundle.OldestUser}: " />
<h:outputText value="#{DukesBDay.oldestUserBirthday.getTime()}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText>
<p/>
<h:commandButton id="back" value="#{bundle.Back}" action="greeting"/>
</h:form>
1 With the firstcup project selected in the Projects pane, expand Configuration File and
double-click faces-config.xml.
2 Click PageFlow in the top left corner of the editor pane to display the visual navigation editor.
3 Select greeting.xhtml click and hold the navigation arrow box on the far right, and drag a
navigation arrow to the response.xhtml file.
4 Double-click the default case1 outcome associated with the navigation arrow and change it to
success.
3 Enter your birth date in the Your birthday text field. Make sure you use the date pattern
specified on the page: MM/dd/yyyy.
4 Click Submit.
5 After the response.xhtml page is displayed, click Back to return to the greeting.xhtml page.
46 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009
4
C H A P T E R
Next Steps
4
This chapter points the user at additional resources for learning more about enterprise
application architecture, the Java EE platform, and Sun GlassFish Enterprise Server v3.
Java EE Implementations
Java EE servers are application servers that implement the Java EE platform technologies.
47
Java EE Implementations
GlassFish Server
The GlassFish (https://glassfish.dev.java.net) project is the open-source basis for
Enterprise Server v3.
48 Your First Cup: An Introduction to the Java EE Platform • October 20, 2009