Getting Started Guide
Getting Started Guide
Copyright
The content in this guide is protected under copyright law even if it is not distributed with software that includes an end user license
agreement.
The content of this guide is furnished for informational use only, is subject to change without notice, and should not be construed as
a commitment by ICEsoft Technologies, Inc.
ICEsoft Technologies, Inc. assumes no responsibility or liability for any errors or inaccuracies that may appear in the informational
content contained in this guide.
Sun, Sun Microsystems, the Sun logo, Solaris and Java are trademarks or registered trademarks of Sun Microsystems, Inc. in the United
States and in other countries.
All other trademarks mentioned herein are the property of their respective owners.
ICEfaces 1.5
November 2006
About this Guide
The ICEfaces Getting Started Guide is a guide that will help you quickly get started building ICEfaces
applications. This guide is applicable to both the ICEfaces open source project and the ICEfaces Enterprise
Production Suite (ICEfaces EPS). By reading through this guide, you will:
• Gain a basic understanding of what ICEfaces is and what it can do for you.
• Install ICEfaces and run the sample applications on your local application server.
• Work through a basic ICEfaces tutorial that transforms a standard JSF application into a rich web
application powered by ICEfaces.
• Understand how to integrate ICEfaces with various J2EE application servers and development
environments.
For more information about ICEfaces, visit the ICEfaces Web site at:
http://www.icefaces.org
In this guide...
We have organized this guide into these chapters to help you get started using ICEfaces quickly:
• Chapter 1: Introduction to ICEfaces — Provides an overview of ICEfaces and its key features and
capabilities.
• Chapter 2: Configuring Your Environment for ICEfaces — Describes how to set up the ICEfaces
environment on your local Tomcat server to run the sample applications and tutorial included with the
installation.
• Chapter 3: Running the ICEfaces Sample Applications — Highlights, through several sample
applications, the features and capabilities that ICEfaces technology provides.
• Chapter 4: ICEfaces Tutorial: The TimeZone Application — Demonstrates how to transform a
standard JSF application into a rich interactive ICEfaces application through a series of tutorial
exercises. Each exercise in the tutorial illustrates a key capability of ICEfaces.
• Chapter 5: Configuring Other Environments for ICEfaces — Provides details for setting up other
development environments to use ICEfaces.
iii
Prerequisites
ICEfaces applications are JSF applications, and as such, the only prerequisite to working with ICEfaces is
that you must be familiar with JSF application development. A J2EE™ 1.4 Tutorial, which includes several
chapters describing JSF technology and application development, is available at:
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/
ICEfaces Documentation
You can find the following additional ICEfaces documentation at the ICEfaces Web site
(http://documentation.icefaces.org):
• ICEfaces Developer’s Guide — Includes materials targeted for ICEfaces application developers and
includes an in-depth discussion of the ICEfaces architecture and key concepts, as well as reference
material related to markup, APIs, components, and configuration.
• ICEfaces Release Notes — Read the ICEfaces Release Notes to learn about the new features included
in this ICEfaces CE release.
For additional information about enterprise-scale ICEfaces development, visit the ICEsoft Web site
(http://www.icesoft.com/products/icefaces.html) and refer to this document:
• ICEfaces EPS Developer’s Guide — ICEfaces EPS is an extension to ICEfaces. The ICEfaces EPS
Developer’s Guide describes additional features related to large-scale production deployments of
ICEfaces applications. This guide is available only with ICEfaces EPS.
iv
Contents
Implementing Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Building and Deploying timezone5 . . . . . . . . . . . . . . . . . . . 37
Step 6 – Integrating Facelets . . . . . . . . . . . . . . . . . . . . . . .. . . . 37
Facelets Dependencies . . . . . . . . . . . . . . . . . . . . . . .. . . . 37
Configuring for Facelets . . . . . . . . . . . . . . . . . . . . . .. . . . 38
Change Web Files from JSP Document to Facelets . . . .. . . . 39
Building and Deploying timezone6 . . . . . . . . . . . . . . .. . . . 39
Step 7 – Capitalize on Facelets . . . . . . . . . . . . . . . . . . . . . . . . . 39
Putting the TimeZoneBean in Charge . . . . . . . . . . . . . . . . . 39
Adding New Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Updating TimeZoneBean.java . . . . . . . . . . . . . . . . . . . . . . 41
Building and Deploying timezone7 . . . . . . . . . . . . . . . . . . . 42
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
vi
Chapter 1 Introduction to ICEfaces
ICEfaces™ is the industry's first standards-compliant AJAX-based solution for rapidly creating
pure-Java, rich web applications that are easily maintained, extended, and scaled, at very low cost.
ICEfaces provides a rich web presentation environment for JavaServer Faces (JSF) applications that
enhances the standard JSF framework and lifecycle with AJAX-based interactive features. ICEfaces
replaces the standard HTML-based JSF renderers with Direct-to-DOM (D2D) renderers, and introduces
a lightweight AJAX bridge to deliver presentation changes to the client browser and to communicate
user interaction events back to the server-resident JSF application. Additionally, ICEfaces provides an
extensive AJAX-enabled component suite that facilitates rapid development of rich interactive web-
based applications. The basic architecture of an ICEfaces-enabled application is shown in Figure 1
below.
The rich web presentation environment enabled with ICEfaces provides the following features:
• Smooth, incremental page updates that do not require a full page refresh to achieve presentation
changes in the application. Only elements of the presentation that have changed are updated
during the render phase.
• User context preservation during page update, including scroll position and input focus.
Presentation updates do not interfere with the user’s ongoing interaction with the application.
1
Introduction to ICEfaces
These enhanced presentation features of ICEfaces are completely transparent from the application
development perspective. Any JSF application that is ICEfaces-enabled will benefit.
Beyond these transparent presentation features, ICEfaces introduces additional rich presentation
features that the JSF developer can leverage to further enhance the user experience. Specifically, the
developer can incorporate these features:
• Intelligent form processing through a technique called Partial Submit. Partial Submit
automatically submits a form for processing based on some user-initiated event, such as tabbing
between fields in a form. The automatic submission limits form processing to the single control that
has been altered, but allows the application lifecycle to execute in response to that change. This
means that the application developer can introduce intelligent form processing logic that reacts
instantaneously to user interactions with the form.
• Server-initiated asynchronous presentation data push. Standard JSF applications can only
deliver presentation changes in response to a user-initiated event, typically some type of form
submit. ICEfaces introduces a server-initiated rendering that enables the server-resident application
logic to push presentation changes to the client browser in response to changes in the application
state. This enables application developers to design systems that deliver data to the user in a near-
real-time asynchronous fashion.
2
Chapter 2 Configuring Your
Environment for
ICEfaces
This chapter contains instructions to help you get up and running quickly with ICEfaces technology. We
start by outlining the prerequisites for a standard configuration using a Java 2 Standard Edition (J2SE)
Platform, Tomcat, and Ant to help build and deploy the ICEfaces sample applications and tutorials.
If you would like to run the sample applications or the tutorial in your chosen development environment,
or with a different application server, refer to Chapter 5, Configuring Other Environments for
ICEfaces, on page 43.
Prerequisites
This guide is intended to be used by Java developers with some level of enterprise experience and a
basic understanding of JavaServer Faces (JSF). If you haven't already done so, we recommend that you
review the Sun JSF Tutorial found at:
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSFIntro.html
To run the sample ICEfaces applications, you will need to download and install the following:
• Java 2 Platform, Standard Edition
• Ant
• Tomcat
• ICEfaces
• Web browser (if you don’t already have one installed)
The following sections provide detailed instructions for downloading the software to set up an
environment where you can run the ICEfaces sample applications and tutorial.
To run the ICEfaces sample applications with Tomcat, you will need to install a version of the Java 2
Standard Edition (J2SE) Platform, version 1.4.2 or higher.
If you already have Java installed on your system, verify your version by typing the following on the
command line:
java -version
To upgrade or install the latest release of the J2SE, visit the Sun web site:
http://java.sun.com/downloads/index.html
3
Configuring Your Environment for ICEfaces
Installers and instructions are provided for the various systems that Sun supports. The demo
applications can be run on any version of Windows, Linux, and Mac OS X capable of running J2SE
version 1.4.2 or higher.
Ant
The ICEfaces tutorial relies on Ant to build and deploy the various stages of the tutorial application. You
will need Ant version 1.6.3 or higher for the build files provided in this ICEfaces release.
If you already have a version of Ant installed, you can verify that you have a recommended version by
typing the following on a command line:
ant -version
To upgrade your current version or install a new version of Ant, visit the following location:
http://ant.apache.org/
If you are not familiar with Ant, detailed instructions for downloading and installing Ant for your
environment are available in the online manual at:
http://ant.apache.org/manual/index.html
Tomcat
Java web applications require an appropriate J2EE runtime environment. ICEfaces applications require
support for servlets and JavaServer Pages (JSP). Tomcat is a popular choice for this type of development
because the ICEfaces code has been extensively tested on Tomcat.
Tomcat is available from the Apache Jakarta Project at:
http://jakarta.apache.org/tomcat/
Download and install Tomcat 5.x according to the instructions provided with the software. Although it
is possible to run ICEfaces applications in other standard J2EE containers, all the instructions provided
in this guide refer to Tomcat. You should be able to use any 5.x version of Tomcat (either 5.0.x or 5.5.x).
Once Tomcat is successfully installed, follow the instructions to start the server. This will differ
depending on what platform you are using.
Web Browser
Web applications use a web browser as the client. This ICEfaces distribution has been verified with the
following browsers:
4
Configuring Your Environment for ICEfaces
ICEfaces
If you are reading this document, you may have already downloaded and installed ICEfaces. If you
haven't, you can get the latest version of ICEfaces from:
http://www.icefaces.org
A binary and source code distribution of ICEfaces are available. With either distribution, begin unzipping
ICEfaces to your preferred location. If you downloaded the sorce code distribution, the resulting
directory structure should look similar to the structure shown in Figure 2. If you downloaded the binary
distribution, the sorce code directories bridge component and core will not be present.
5
Configuring Your Environment for ICEfaces
The following lists the ICEfaces dependencies on the JAR files when required.
6
Configuring Your Environment for ICEfaces
7
Chapter 3 Running the ICEfaces
Sample Applications
ICEfaces is bundled with three sample applications: Auction Monitor, Address Form, and Component
Showcase.
If you have downloaded the binary distribution of ICEfaces, these applications are available in prebuilt
WARs located at:
[install_dir]/ICEfaces-1.5-bin/icefaces/samples/
If you downloaded the source code distribution of ICEfaces, it is necessary to build the samples. This
is accomplished by running ant from the [install_dir]/ICEfaces-1.5-src/icefaces/
directory. This will build all of the sample bundles and place them in the distribution directory at:
[install_dir]/ICEfaces-1.5-src/icefaces/dist/samples/
The WARs can be deployed to any supported Java Application Servers. If you are working with Tomcat,
the quickest and easiest way to deploy a WAR file is to copy the file into the webapps directory of the
Tomcat installation. By default, Tomcat periodically checks this directory for updates and, if it finds a
new WAR file, it automatically deploys the application. Once you've copied the WAR file into webapps
and Tomcat has deployed the application, you can view and interact with it by opening a web browser
and typing in the appropriate URL for the application that you want to browse.
The sample applications highlight the various features and capabilities that ICEfaces technology
provides.
8
Running the ICEfaces Sample Applications
AuctionMonitor
ICEfaces AuctionMonitor (auctionMonitor.war) simulates the tracking of live auctions with ticking
countdown timers and interactive bidding. It also includes a simple integrated chat and some demo
notes on how to interact with the AuctionMonitor.
The application uses a number of standard JSF components: dataTable, commandButton, and
panelGrid. ICEfaces and Direct-to-DOM rendering provides for asynchronous and dynamic updates of
these components without a full page refresh. This is illustrated by the ticking clocks, real-time bid
updates, the dynamically rendered buttons, the ability to hide and show table rows on demand, and the
integrated chat session. For more information on these ICEfaces features, refer to the ICEfaces
Developer’s Guide.
Open the AuctionMonitor in two browser windows to fully appreciate the interactive features of this
application.
9
Running the ICEfaces Sample Applications
AddressForm
ICEfaces AddressForm (address.war) shows how a prototypical address form can be validated and
updated on the fly using partial submits and without fully refreshing the page.
Typically, this type of form would require a user to fill in all the fields and submit it for server-side
validation. That, or a raft of JavaScript code to do client-side validation. However, using JavaServer
Faces components and ICEfaces, you can do a partial submit with each field entry and only offer the
submit button when the form is completely validated. As each field is entered, a partial form submission
is sent to the server and only those components that require updates are changed. It's rich, interactive,
efficient, and lightweight. Most importantly, it doesn't require any JavaScript programming.
10
Running the ICEfaces Sample Applications
Component Showcase
The Component Showcase (component-showcase.war) demo shows how the current ICEfaces
custom components and extended components can be used together to build a rich web application.
The full source to this demonstration is available in the src directory. The Component Showcase also
provides a short description of what each component does, a demonstration of the component working,
the demonstrations source and the component TLD.
The application also lets a user switch between the two available CSS Themes. Use the Component
Showcase to quickly see how each custom component is used, and as a detailed reference to each
component’s properties.
11
Chapter 4 ICEfaces Tutorial: The
TimeZone Application
This tutorial guides you through a series of exercises that takes a basic JavaServer Faces application
and transforms it, using ICEfaces, into a much more dynamic application with an enriched user
experience. The tutorial begins with a simple web application called TimeZone and demonstrates how
to build the ICEfaces-enriched application shown in Figure 6.
This tutorial consists of seven steps with increasing levels of richness, each designed to demonstrate
ICEfaces capabilities:
12
ICEfaces Tutorial: The TimeZone Application
Step 1 – Basic JSF TimeZone Application shows a basic JSF application built entirely from basic
JSF HTML components in JSP.
Step 2 – Integrating ICEfaces uses the same basic JSF application, converted to JSP Document,
running with ICEfaces.
Step 3 – Dynamic Updating—Make the Clocks Tick modifies the application to add ticking
clocks and to support separate but concurrent instances of the TimeZone application from
multiple web browser windows or tabs.
Step 4 – Dynamic Table Rendering adds a dynamic data table, which can be manipulated by
checkboxes, to make the TimeZone application more interactive.
Step 5 – Applying Styles demonstrates how to add CSS formatting and styles to enhance the
appearance of the TimeZone application.
Step 6 – Integrating Facelets uses the same JSF application, converted to XHTML, running with
ICEfaces and Facelets together.
Step 7 – Capitalize on Facelets uses Facelets functionality to do header inclusion and
dynamically generate content from the Java bean.
The seven exercises are organized in the directory structure shown in Figure 7. Prior to starting this
tutorial, we recommend that you read Chapter 2, Configuring Your Environment for ICEfaces,
on page 3 to ensure that your environment is configured properly to deploy and execute ICEfaces
applications on your J2EE application server.
13
ICEfaces Tutorial: The TimeZone Application
Our first iteration of the TimeZone application (see Figure 8 below) has a panelGrid component at the
top to hold the two separate time displays:
• the application's host server time, and
• the time for the zone selected from the map.
A second panelGrid below holds six time zone map images, implemented as commandButton
components. When a region of the map is clicked, the display at the top right updates to display the
selected region’s time and time zone.
14
ICEfaces Tutorial: The TimeZone Application
15
ICEfaces Tutorial: The TimeZone Application
Note: Throughout this tutorial, we use boldface text to highlight code we want to bring
to your attention. ICEfaces does not require any code to be typed in bold.
The commandButton components also use JSF expression language bindings in the actionListener
attribute as shown below.
<h:commandButton id="GMTminus10" image="images/hawaii.jpg"
actionListener="#{timeZoneBean.listen}"/>
The id attribute of a commandButton component is used to pass information into the bean identifying
which button was pressed.
<h:commandButton id="GMTminus10" image="images/hawaii.jpg"
actionListener="#{timeZoneBean.listen}"/>
The com.icesoft.faces.tutorial.TimeZoneBean class is the backing bean for the timezone.jsp page.
The bean stores the current state of the selections and all the time zone information.
The code for the TimeZoneBean.java class is as follows:
package com.icesoft.tutorial;
import javax.faces.context.FacesContext;
import javax.faces.component.UIComponent;
import javax.faces.event.ActionEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;
/**
* Bean backing the Time Zone application.
* Also controls time zone information during the session.
*/
/**
* {@link DateFormat} used to display the server time.
*/
private DateFormat serverFormat;
/**
* Active {@link TimeZone} displayed at top of UI.
* Changes when a time zone is selected by pressing one of six
* commandButtons in UI map.
*/
private TimeZone selectedTimeZone;
/**
* {@link DateFormat} used to display the selected time.
*/
private DateFormat selectedFormat;
/**
* List of all possible {@link TimeZoneWrapper} objects,
* which must mirror the map UI.
*/
private ArrayList allTimeZoneList;
/**
* Constructor initializes time zones.
*/
public TimeZoneBean(){
init();
}
/**
* Initializes this TimeZoneBean's properties.
*/
private void init() {
serverTimeZone = TimeZone.getDefault();
serverFormat = buildDateFormatForTimeZone( serverTimeZone );
selectedTimeZone = TimeZone.getTimeZone("Etc/GMT+0");
// selected time zone set to UTC as default
selectedFormat = buildDateFormatForTimeZone( selectedTimeZone );
17
ICEfaces Tutorial: The TimeZone Application
/**
* Gets server time.
*
* @return Server time.
*/
public String getServerTime() {
return formatCurrentTime( serverFormat );
}
/**
* Gets server time zone display name.
*
* @return Server time zone display name.
*/
public String getServerTimeZoneName() {
return displayNameTokenizer( serverTimeZone.getDisplayName() );
}
/**
* Gets selected time zone time.
* This is the time zone selected by one of six commandButtons from the map
* in the UI.
*
* @return selectedTimeZone time.
*/
public String getSelectedTime() {
return formatCurrentTime( selectedFormat );
}
/**
* Gets selected time zone display name.
*
* @return selectedTimeZone display name.
*/
public String getSelectedTimeZoneName() {
return displayNameTokenizer( selectedTimeZone.getDisplayName() );
}
/**
* Extracts the first word from a TimeZone displayName.
*
* @param displayName A TimeZone displayName.
* @return String The first word from the TimeZone displayName.
*/
public static String displayNameTokenizer(String displayName) {
if( displayName == null ) {
displayName = "";
}
else {
int firstSpace = displayName.indexOf(' ');
if (firstSpace != -1) {
displayName = displayName.substring(0, firstSpace);
}
}
return displayName;
}
/**
* Each TimeZoneWrapper has an id of a component in the UI
* that corresponds to its time zone. By this, if an event comes
* from a component in the web page, then this will return the
* relevant TimeZoneWrapper.
*
* @param componentId Id of component in UI
* @return TimeZoneWrapper
*/
private TimeZoneWrapper getTimeZoneWrapperByComponentId(String componentId)
{
for(int i = 0; i < allTimeZoneList.size(); i++) {
TimeZoneWrapper tzw = (TimeZoneWrapper) allTimeZoneList.get( i );
if( tzw.isRelevantComponentId(componentId) )
return tzw;
}
return null;
}
//
// Implicit interfaces as defined by the callbacks in the web files
//
/**
* Listens to client input from commandButtons in the UI map and sets the
* selected time zone.
*
* @param event ActionEvent.
*/
public void listen(ActionEvent event) {
UIComponent comp = event.getComponent();
FacesContext context = FacesContext.getCurrentInstance();
String componentId = comp.getClientId(context);
TimeZoneWrapper tzw = getTimeZoneWrapperByComponentId( componentId );
if( tzw != null ) {
selectedTimeZone = TimeZone.getTimeZone( tzw.getId() );
selectedFormat = buildDateFormatForTimeZone( selectedTimeZone );
}
}
} // End of TimeZoneBean class
TimeZoneBean stores the current state and time zone information, and also handles the actions
generated by clicking the commandButtons. The listen(ActionEvent event) method in the bean
takes the ID of the commandButton clicked, and uses the helper TimeZoneWrapper objects to
determine which TimeZone ID should be used to instantiate the selectedTimeZone object. For clarity,
19
ICEfaces Tutorial: The TimeZone Application
the commandButton IDs represent the offset from Greenwich Mean Time (GMT) of their respective
TimeZone objects. The IDs can be arbitrary, as long as they are all unique in the web application, and
match between the web file and the Java event handler.
JSF uses an XML file called faces-config.xml to manage the configuration of beans so that the beans'
methods are available to components in the page.
The code for the faces-config.xml file is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
<managed-bean>
<managed-bean-name>timeZoneBean</managed-bean-name>
<managed-bean-class>com.icesoft.tutorial.TimeZoneBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
The entry bean is given a name by which it can be referred to in the JSP page and the name is also
associated with a Java class so that it can be instantiated as required. The bean is also given a scope
to indicate how the bean can be accessed.
At the heart of it, the TimeZone application is a standard J2EE web application that requires a
deployment descriptor. This means we need to create a web.xml file.
The code for the web.xml file is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<description>
ICEfaces Tutorial: Timezone Part 1
</description>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
20
ICEfaces Tutorial: The TimeZone Application
<param-name>javax.faces.application.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
</web-app>
This is a fairly typical descriptor for a JSF application. The Faces Servlet is declared and configured to
load on startup. The .faces extension is mapped to the Faces Servlet.
In TimeZone 1, the deployment descriptor file for running under MyFaces, web_myfaces.xml, is exactly
the same as web.xml. It has been included for consistency with the later TimeZone steps, where the
deployment descriptor files differ.
For the tutorial applications, we rely on Ant as a build tool and Tomcat as the container to run the
application. A build.xml file has been provided that can build and deploy the application to Tomcat for
you. The build file relies on build.properties for system specific information that it needs to successfully
build and deploy the application.
21
ICEfaces Tutorial: The TimeZone Application
compile.debug = false
lib.dir = ../../lib
icefaces.jar = ../../lib/icefaces.jar
components.jar = ../../lib/icefaces-comps.jar
icefaces-facelets.jar = ../../lib/icefaces-facelets.jar
1. Edit the build.properties file to suit your environment. You will also need to modify the username
and password to correspond to some existing username and password in the Tomcat tomcat-
users.xml file or add a user with the manager role to the file if one is not already present.
Note: For security, the default Tomcat configuration does NOT include a username with
the manager role. If you have just downloaded and installed Tomcat, you will need
to add a manager role in order to deploy to Tomcat using the ant install task. An
example tomcat-users.xml file is included in the tutorial directory as a reference.
You can also refer to the documentation for Tomcat for more information.
2. To deploy the application using the build file, ensure that you have an account that will let you
deploy using the remote deployment mechanism.
3. Ensure that Tomcat is running.
4. When your environment is ready, navigate to the following directory:
<icefaces-install-dir>/tutorial/timezone1
5. To compile the source code, generate a WAR file with all the required resources and deploy it to the
running Tomcat server. From the command line, type:
ant install
By default, the WAR file created includes Sun's JSF reference implementation. If you would like to
build a WAR file using MyFaces, type the following instead:
ant -f build_myfaces.xml install
This tells ant to use the build_myfaces.xml file instead of the default build.xml. The generated WAR
file contains the appropriate MyFaces libraries and deployment descriptor (web.xml) file.
6. To interact with the application, point your web browser at the following URL, making adjustments
for your environment as required. For example, port 8080 is the default port that Tomcat uses, but
if you have changed this in your installation, alter the URL accordingly.
http://localhost:8080/timezone1
If all goes well, you should see the first incarnation of the TimeZone application running in your browser.
Clicking a different time zone on the map updates the time and time zone information in the top right
of the table.
22
ICEfaces Tutorial: The TimeZone Application
JSP pages (unlike the more recent JSP Document specification) are not required to be well-formed XML
documents. ICEfaces requires well-formed XML documents, so we need to make some modifications to
our JSP page to align it with the JSP Document specification.
1. Change the file extension of the timezone.jsp file from .jsp to .jspx. This is the first step in
converting the web page to a JSP Document (XML-compatible JSP). The .jspx extension identifies
the file as an XML-compliant JSP page and allows us a bit of flexibility with our servlet mappings.
2. Remove the JSP taglib directives and declare them using xml namespaces in the JSF <f:view>
element:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
becomes:
<f:view xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
If the page consists of well-formed JSF and XHTML tags, this is the only change necessary to convert
the page to JSP Document.
As an extension to JSF, ICEfaces provides its own version of the FacesServlet (PersistentFacesServlet)
as well as an additional Servlet (BlockingServlet) for handling asynchronous updates. We register these
Servlets in the deployment descriptor file (web.xml) by adding the following entries:
<servlet>
<servlet-name>Persistent Faces Servlet</servlet-name>
<servlet-class>
com.icesoft.faces.webapp.xmlhttp.PersistentFacesServlet
</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet>
<servlet-name>Blocking Servlet</servlet-name>
<servlet-class>com.icesoft.faces.webapp.xmlhttp.BlockingServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
We also need to add a new Servlet mapping of PersistentFacesServlet to .iface.
<servlet-mapping>
<servlet-name>Persistent Faces Servlet</servlet-name>
<url-pattern>*.iface</url-pattern>
</servlet-mapping>
23
ICEfaces Tutorial: The TimeZone Application
<servlet-mapping>
<servlet-name>Blocking Servlet</servlet-name>
<url-pattern>/block/*</url-pattern>
</servlet-mapping>
To support ICEfaces running under MyFaces, we need to add an additional context parameter to tell
MyFaces to use .iface as the default suffix so that requests are properly directed to ICEfaces'
PersistentFacesServlet.
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.iface</param-value>
</context-param>
If you got timezone1 to run, then your environment has been set up and is running correctly. From the
command line, navigate to the <icefaces-install-dir>/tutorial/timezone2 directory and type:
ant install
or, to run using MyFaces, type:
ant -f build_myfaces.xml install
This should compile the source code, generate a WAR file with all the required resources, and deploy it
to a running Tomcat server. To interact with the application, point your web browser at the following
URL, making adjustments for your environment as required.
http://localhost:8080/timezone2
This version of TimeZone looks identical to timezone1 and has no functional difference. However, with
little effort, we've integrated ICEfaces into our JSF application. The components are now being rendered
by the ICEfaces Direct-to-DOM (D2D) RenderKit and we are now ready to enrich this application with
some dynamic, asynchronous updates.
24
ICEfaces Tutorial: The TimeZone Application
Now that we have integrated ICEfaces, the work to show the clocks tick is done in the bean. No actual
work is done to make the clocks tick because the system time updates automatically for us. Rather, at
some interval, the components that display the clock times must be rendered, and those updates must
be sent to the web browser. For this, we will use the ICEfaces specific RenderManager facilities to
manage a JSF render pass. For timezone3, the following changes are made to the TimeZoneBean.java
file.
1. First we add some imports to support the new ICEfaces features:
import com.icesoft.faces.webapp.xmlhttp.*;
import com.icesoft.faces.async.render.*;
2. Then we make the bean implement com.icesoft.faces.async.render.Renderable, so we can
use it with the RenderManager facilities:
public class TimeZoneBean implements Renderable {
3. A rendering interval is added as a bean property:
private final int renderInterval = 1000;
4. Add helper objects for maintaining the rendering state and managing the threading issues:
private PersistentFacesState state;
private IntervalRenderer clock;
5. Initialize the rendering state:
private void init() {
...
state = PersistentFacesState.getInstance();
}
6. Provide a callback method to use the RenderManager to set up the interval rendering:
public void setRenderManager(RenderManager renderManager) {
clock = renderManager.getIntervalRenderer("clock");
clock.setInterval(renderInterval);
clock.add(this);
clock.requestRender();
}
25
ICEfaces Tutorial: The TimeZone Application
ICEfaces supports the concept of concurrent DOM viewing, which allows multiple windows or tabs of
the same browser to view distinct instances of the same application. Without concurrent DOM viewing,
pointing two different browser windows at the same application leads to unpredictable behavior since
the server-side DOM would be shared between the two views. You can see what happens by opening
26
ICEfaces Tutorial: The TimeZone Application
two browser windows (of the same browser) and direct both windows to the timezone2 demo. Clicking
on various time zones will update one view or the other but not both reliably.
Concurrent DOM viewing ensures each view has its own separate DOM and that backing beans are
appropriately scoped for their responsibilities. To configure TimeZone to support concurrent DOM
viewing, we need to modify both the deployment descriptor (web.xml or web_myfaces.xml) and the
JavaServer Faces configuration file (faces-config.xml).
1. Add a context parameter to the deployment descriptor file (web.xml or web_myfaces.xml) so that
ICEfaces is properly configured to support concurrent DOM views:
<context-param>
<param-name>com.icesoft.faces.concurrentDOMViews</param-name>
<param-value>true</param-value>
</context-param>
2. In faces-config.xml, change the scope of the TimeZoneBean from session to request:
<managed-bean>
<managed-bean-name>timeZoneBean</managed-bean-name>
<managed-bean-class>com.icesoft.tutorial.TimeZoneBean</managed-bean-
class>
<managed-bean-scope>request</managed-bean-scope>
...
</managed-bean>
This version of TimeZone looks identical to timezone1 and timezone2, but now, you should see the
clocks ticking as the page is dynamically updated with each render pass initiated by the bean. With
concurrent DOM viewing configured, we can now open timezone3 in two separate browser windows
and operate them as if they were two distinct clients with updates and changes being accurately
rendered.
27
ICEfaces Tutorial: The TimeZone Application
Modifying timezone.jspx
28
ICEfaces Tutorial: The TimeZone Application
2. The standard JSF form component is replaced with the ICEfaces form component, enabling partial
submission:
<ice:form partialSubmit="true">
...
</ice:form>
3. In the panelGrid holding the map, add a row of six selectBooleanCheckbox components, under the
six commandButton components.
<ice:selectBooleanCheckbox id="Cminus10" required="false" immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus10']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus9" required="false" immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus9']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus8" required="false" immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus8']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus7" required="false" immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus7']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus6" required="false" immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus6']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus5" required="false" immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus5']}"
autocomplete="off"/>
4. A dataTable is added below the panelGrid component in the UI. This dataTable will display
information on all the selected time zones, getting its data from timeZoneBean's
checkedTimeZoneList property, which is a list of TimeZoneWrapper objects. The properties of each
object in the list are then displayed through JSF expression language bindings in outputText
components in each row of the dataTable.
<h:dataTable frame="box" value="#{timeZoneBean.checkedTimeZoneList}"
var="checkedTimeZone">
<f:facet name="header"><h:outputText value="Checked Time
Zones"/></f:facet>
<h:column>
<f:facet name="header"><h:outputText value="Time Zone"/></f:facet>
<h:outputText value="#{checkedTimeZone.displayName}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="Location"/></f:facet>
<h:outputText value="#{checkedTimeZone.location}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="Uses DST"/></f:facet>
<h:outputText value="#{checkedTimeZone.useDaylightTime}"/>
</h:column>
<h:column>
29
ICEfaces Tutorial: The TimeZone Application
Modifying TimeZoneBean.java
4. Initialize the list for storing the time zones that the user has checked, and wishes to display in the
dataTable.
checkedTimeZoneList = new ArrayList();
Modifying TimeZoneWrapper.java
Each row in the dataTable is populated by a TimeZoneWrapper bean. Each cell in the dataTable is then
populated by properties of the TimeZoneWrapper beans. So, we have to modify TimeZoneWrapper to
add the requisite properties and accessor methods.
1. Add imports for the utility classes we use for calculating times with.
import java.util.TimeZone;
import java.util.Calendar;
import java.text.DateFormat;
5. Add getter accessor methods for the displayName, time, useDaylightTime, inDaylightTime, location
properties.
31
ICEfaces Tutorial: The TimeZone Application
6. Modify isRelevantComponentId(String) to add support for our new checkbox component ID.
public boolean isRelevantComponentId(String componentId) {
boolean relevant = ( componentId.endsWith(mapCommandButtonId) ||
componentId.endsWith(checkboxId) );
return relevant;
}
32
ICEfaces Tutorial: The TimeZone Application
This version of TimeZone should now have checkboxes. As you click the checkboxes, the rows in the
table should show and hide themselves accordingly. The interface is now richer and more dynamic
thanks to ICEfaces and Direct-to-DOM rendering.
A Cascading Style Sheet is added to the web folder of timezone.jspx. This file is accessed by the
application through the following line, added to timezone.jspx under the <head> tag:
<link rel="stylesheet" type="text/css" href="./timezone_style.css"/>
Any images used by the style sheet should be dropped into the images subfolder of the application web
folder.
Implementing Styles
Tutorial example timezone5 uses only styles from the style sheet, as shown in timezone.jspx, below:
<f:view xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ice="http://www.icesoft.com/icefaces/component">
<html>
<head><title>ICEfaces: TimeZone Sample Application</title></head>
<link rel="stylesheet" type="text/css" href="./timezone_style.css"/>
<body bgcolor="white">
<div id="headerDiv">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td valign="top">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td background="images/demo-page-bkgnd.gif">
<img src="images/demo-page-left.gif"/>
</td>
33
ICEfaces Tutorial: The TimeZone Application
</tr>
<tr>
<td height="45" valign="bottom">
<img src="images/timezone_logo.gif"/>
</td>
</tr>
</table>
</td>
<td valign="top" align="right" width="119">
<img src="images/demo-page-right.gif"/>
</td>
</tr>
</table>
</div>
<div id="timeZonePanel">
<ice:form partialSubmit="true">
<h:panelGrid columns="2"
rowClasses="floatingDialogHeader, , " width="100%">
<h:outputText value="Server Time Zone"/>
<h:outputText value="Time Zone Selected from Map"/>
<h:outputText styleClass="formLabel"
value="#{timeZoneBean.serverTimeZoneName}"/>
<h:outputText styleClass="formLabel"
value="#{timeZoneBean.selectedTimeZoneName}"/>
<h:outputText value="#{timeZoneBean.serverTime}"/>
<h:outputText value="#{timeZoneBean.selectedTime}"/>
</h:panelGrid>
<h:panelGrid columns="6" width="100%" cellpadding="0" cellspacing="0">
<h:commandButton id="GMTminus10" image="images/hawaii.jpg"
actionListener="#{timeZoneBean.listen}" style="border: 0px;"/>
<h:commandButton id="GMTminus9" image="images/alaska.jpg"
actionListener="#{timeZoneBean.listen}" style="border: 0px;"/>
<h:commandButton id="GMTminus8" image="images/pacific.jpg"
actionListener="#{timeZoneBean.listen}" style="border: 0px;"/>
<h:commandButton id="GMTminus7" image="images/mountain.jpg"
actionListener="#{timeZoneBean.listen}" style="border: 0px;"/>
<h:commandButton id="GMTminus6" image="images/central.jpg"
actionListener="#{timeZoneBean.listen}" style="border: 0px;"/>
<h:commandButton id="GMTminus5" image="images/eastern.jpg"
actionListener="#{timeZoneBean.listen}" style="border: 0px;"/>
<ice:selectBooleanCheckbox id="Cminus10" required="false"
immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus10']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus9" required="false"
immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus9']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus8" required="false"
immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus8']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus7" required="false"
immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
34
ICEfaces Tutorial: The TimeZone Application
value="#{timeZoneBean.checkboxStates['Cminus7']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus6" required="false"
immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus6']}"
autocomplete="off"/>
<ice:selectBooleanCheckbox id="Cminus5" required="false"
immediate="true"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"
value="#{timeZoneBean.checkboxStates['Cminus5']}"
autocomplete="off"/>
</h:panelGrid>
<h:dataTable id="timezoneDataTable"
value="#{timeZoneBean.checkedTimeZoneList}"
var="checkedTimeZone" headerClass="tableHeader" width="100%"
columnClasses="checkedDisplayName,checkedLocation,checkedUseDay
lightTime,checkedInDaylightTime,checkedTime">
<f:facet name="header"><h:outputText styleClass="tableHeaderTitle"
value="Checked Time Zones"/>
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Time Zone"/>
</f:facet>
<h:outputText value="#{checkedTimeZone.displayName}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Location"/>
</f:facet>
<h:outputText value="#{checkedTimeZone.location}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Uses DST"/>
</f:facet>
<h:outputText value="#{checkedTimeZone.useDaylightTime}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="In DST"/>
</f:facet>
<h:outputText value="#{checkedTimeZone.inDaylightTime}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Time"/>
</f:facet>
<h:outputText styleClass="formLabel"
value=" #{checkedTimeZone.time} "/>
</h:column>
</h:dataTable>
</ice:form>
</div>
<!-- DEMO_SURVEY_JAVASCRIPT BEGIN -->
<div style="position:absolute; top:650px;left:15%;width:500px;
text-align: right;" >
<f:verbatim>
35
ICEfaces Tutorial: The TimeZone Application
<script language="JavaScript">
survey0 = new Image(259,39);
survey0.src = "images/survey-button_n.gif";
survey1 = new Image(259,39);
survey1.src = "images/survey-button_r.gif";
function switchimage (imgname, target) {
document.images[imgname].src = target.src;
}
</script>
</f:verbatim>
<a href="http://demo.icesoft.com/survey/demoFeedback.iface?appId=4"
target="_blank"
onMouseOver="switchimage('survey',survey1);"
onMouseOut="switchimage('survey',survey0);">
<img src="images/survey-button_n.gif" width="259" height="39"
name="survey"
border="0"
alt="Demo Feedback" />
</a>
</div>
<!-- DEMO_SURVEY_JAVASCRIPT END -->
</body>
</html>
</f:view>
There are two <div> elements applied to the page. The first helps create a page heading:
<div id="headerDiv">
The styleClass attribute is used to apply styles from the style sheet to JSF elements:
<h:outputText styleClass="formLabel" value="#{timeZoneBean.serverTimeZoneName}"/>
The JSF panelGrid component has a rowClasses attribute that applies styles from the style sheet to
the rows of the table it creates. In this example, the floatingDialogHeader class is applied to the first
row and the second and third rows are left blank, meaning no style is applied.
<h:panelGrid columns="2" rowClasses="floatingDialogHeader, , " width="100%">
The JSF dataTable component has a headerClass attribute that applies styles to all the headers in the
table. It also has a columnClasses attribute that applies styles to all of the columns in the table:
<h:dataTable id="timezoneDataTable" var="checkedTimeZone"
value="#{timeZoneBean.checkedTimeZoneList}"
headerClass="tableHeader" width="100%"
columnClasses="checkedDisplayName,
checkedLocation,checkedUseDaylightTime,
checkedInDaylightTime,checkedTime">
36
ICEfaces Tutorial: The TimeZone Application
This should compile the source code, generate a WAR file with all the required resources, and deploy it
to a running Tomcat server. To interact with the application, point your web browser at the following
URL, making adjustments for your environment as required.
http://localhost:8080/timezone5
This version of TimeZone has the same functionality as timezone4, but should look completely different.
Styles have been applied to the application through the style sheet, which use images located in the
web/images folder. With the finishing touches applied, the application is now ready to be presented to
the world.
Note: This step is related to Facelets and will be of interest only if you intend to use
Facelets.
Facelets Dependencies
There are three new JAR files, distributed with ICEfaces, which must be included with any ICEfaces
Facelets application:
• icefaces-facelets.jar
• el-api.jar
• el-ri.jar
37
ICEfaces Tutorial: The TimeZone Application
To configure TimeZone to support Facelets, we need to modify both the deployment descriptor
(web.xml or web_myfaces.xml) and the JavaServer Faces configuration file (faces-config.xml).
1. Add a context parameter to the deployment descriptor file (web.xml or web_myfaces.xml), to
inform the application server that the default file extension for Facelets is .xhtml, since some
application servers assume .jsp or .jspx extensions.
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
2. For development purposes, add a context parameter to the deployment descriptor file, to enable
Facelets debug logging.
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
3. Enable some strict verifications in JSF, by adding these context parameters to the deployment
descriptor file.
<context-param>
<param-name>com.sun.faces.validateXml</param-name>
<param-value>true</param-value>
<description>
Set this flag to true, if you want the JavaServer Faces Reference
Implementation to validate the XML in your faces-config.xml
resources
against the DTD. Default value is false.
</description>
</context-param>
<context-param>
<param-name>com.sun.faces.verifyObjects</param-name>
<param-value>true</param-value>
<description>
Set this flag to true, if you want the JavaServer Faces Reference
Implementation to verify that all of the application objects you
have
configured (components, converters, renderers, and validators) can
be
successfully created. Default value is false.
</description>
</context-param>
4. Set the application view handler in the JavaServer Faces configuration file (faces-config.xml).
<application>
<view-handler>
com.icesoft.faces.facelets.D2DFaceletViewHandler
</view-handler>
</application>
38
ICEfaces Tutorial: The TimeZone Application
Rename timezone.jspx to timezone.xhtml. No JSP Document specific features were used in previous
steps that are not already supported by Facelets, so no change to the contents of timezone.xhtml is
necessary.
This should compile the source code, generate a WAR file with all the required resources, and deploy it
to a running Tomcat server. To interact with the application, point your web browser at the following
URL, making adjustments for your environment as required.
http://localhost:8080/timezone6
The main focus of this step is to use Facelets to make our application more dynamic.
Note: This step is related to Facelets and will be of interest only if you intend to use
Facelets.
In previous steps of the tutorial, TimeZoneBean.java and timezone.xhtml (or timezone.jspx) were
codependent. Components in the UI would generate events from user interactions, requiring hard-
coded constants in the bean to interpret the source and relevancy of the events. Changes to component
IDs, or addition or removal of components would necessitate lock-step changes in both the bean and
the web file. This step of the tutorial puts the bean in charge of generating content for the web file.
With a few changes to one section of code in TimeZoneBean.java, any number of arbitrary time zones
could be displayed with timezone.xhtml.
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ice="http://www.icesoft.com/icefaces/component"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions">
2. Pull out the headerDiv section, and put it into header.xhtml to demonstrate parameterized inclusion:
<ui:include src="/header.xhtml">
<ui:param name="sectionName" value="header"/>
</ui:include>
3. Replace the six commandButtons and selectBooleanCheckboxes with JSTL forEach sections, that
are populated by bean properties using JSF expression language bindings.
Notice how even the IDs for the commandButtons and selectBooleanCheckboxes components come
from the bean so there are no duplicate definitions to keep in sync. One important thing to
remember is that JSTL forEach sections are evaluated at component build time once, and not for
every render. So, with this example, one cannot change the map or number of check boxes with
every clock tick, as one can with the table below it.
<h:panelGrid columns="#{fn:length(timeZoneBean.allTimeZoneList)}"
width="100%" cellpadding="0" cellspacing="0">
<c:forEach var="allTimeZone" items="#{timeZoneBean.allTimeZoneList}">
<h:commandButton id="#{allTimeZone.mapCommandButtonId}"
image="#{allTimeZone.imagePath}"
actionListener="#{timeZoneBean.listen}"
style="border: 0px;"/>
</c:forEach>
<c:forEach var="allTimeZone" items="#{timeZoneBean.allTimeZoneList}">
<ice:selectBooleanCheckbox id="#{allTimeZone.checkboxId}"
required="false" immediate="true"
value="#{allTimeZone.currentlyShowing}"
valueChangeListener="#{timeZoneBean.timeZoneChanged}"/>
</c:forEach>
</h:panelGrid>
Each section in the map, and each check box, and each row in the bottom table, are populated by
properties from a TimeZoneWrapper object. We will change TimeZoneWrapper.java to add the new
properties that timezone.xhtml uses JSF expression language bindings to access:
1. Add new property to hold the relative file path to the map image for the time zone being
represented by this TimeZoneWrapper:
private String imagePath;
2. Add another property for managing both the current state of the check box for this time zone, and
the visibility of the corresponding row in the bottom table:
private boolean currentlyShowing;
3. Initialize the new properties:
/**
* @param id id used to identify the time zone.
* @param imgPath Path to the image to represent this time zone.
40
ICEfaces Tutorial: The TimeZone Application
Updating TimeZoneBean.java
Finally, update TimeZoneBean.java to initialize and access the newer more dynamic data structures.
1. Create the master list of all time zones in the application, along with their images, and the
component IDs:
private void init() {
...
// Entries in this list determine what will be generated in
// the timezone web file, so should be modifiable,
// but all ids must be unique to each other
allTimeZoneList = new ArrayList(6);
allTimeZoneList.add(new TimeZoneWrapper(
"Pacific/Honolulu", "images/hawaii.jpg", "GMTminus10",
"Cminus10"));
allTimeZoneList.add(new TimeZoneWrapper(
"America/Anchorage", "images/alaska.jpg", "GMTminus9",
"Cminus9"));
allTimeZoneList.add(new TimeZoneWrapper(
"America/Los_Angeles", "images/pacific.jpg", "GMTminus8",
"Cminus8"));
allTimeZoneList.add(new TimeZoneWrapper(
"America/Phoenix", "images/mountain.jpg", "GMTminus7",
"Cminus7"));
allTimeZoneList.add(new TimeZoneWrapper(
"America/Chicago", "images/central.jpg", "GMTminus6", "Cminus6"));
allTimeZoneList.add(new TimeZoneWrapper(
41
ICEfaces Tutorial: The TimeZone Application
This should compile the source code, generate a WAR file with all the required resources, and deploy it
to a running Tomcat server. To interact with the application, point your web browser at the following
URL, making adjustments for your environment as required.
http://localhost:8080/timezone7
For more information on this tutorial or other ICEsoft products, visit our Technical Support page at:
http://www.icesoft.com/support/index.html
42
Chapter 5 Configuring Other
Environments for
ICEfaces
ICEfaces is a J2EE-compliant technology, and as such is portable to a number of commercial and open
source J2EE application server environments. Additionally, ICEfaces can be easily integrated into your
favorite J2EE Integrated Development Environment (IDE). This chapter covers both of these topics.
43
Index
A E
AddressForm demo 10 Eclipse 43
AJAX bridge 1 environment, integrated 43
Ant, installing 4
applying styles 33
architecture 1 F
asynchronous updates 2, 9
AuctionMonitor demo 9 Facelets 37, 39
features 2
form processing 2, 10
B
backing JavaBean 16 H
binding the Bean 20
browsers supported 4 HTML tags 14
C I
configuring your environment 3 IBM Rational Application Developer 43
creating a JSP page 14 Integrated Development Environment 43
integrating ICEfaces 23
D
J
D2D. See Direct-to-DOM.
demo J2EE Application Servers 43
AddressForm 10 JavaServer Faces. See JSF.
AuctionMonitor 9 JDeveloper 43
dependencies JSF 1, 14
facelets 37 JSP 23
directory structure
ICEfaces 5
TimeZone 13 O
Direct-to-DOM 1, 9, 24, 33
dynamic table rendering 28 Oracle 43
dynamic updating 24
44
P S
partial submit 2 sample applications 8
prerequisites 3 style sheets 33
Sun Studio Creator 43
R
T
registering servlets 23
rich web application 1 TimeZone tutorial 12–42
TimeZoneBean.java 41
Tomcat, installing 4
45