Developing Rich Web Applications With Prime Faces in Java EE7
Developing Rich Web Applications With Prime Faces in Java EE7
Summary: Ever since the appearance of HTML5 several years ago, the area of web
applications has seen an increasing presence of JavaScript libraries, as well as other
technologies and standards that make it possible to build dynamic web pages, portals, and ERP
environments. Some of these standards are implemented by Java EE, which is being developed
by Oracle, industry experts, and open source organizations. JavaServer Faces in combination
with PrimeFaces makes it possible to create dynamic web applications. We have illustrated the
use of JavaServer Faces, PrimeFaces, and other Java EE standards with a practical example of
creating online lumber auctions. This article presents the technologies used in the application.
1. INTRODUCTION
In recent years, we have witnessed numerous changes and innovations in web application development. This
has affected languages (HTML5, CSS3, JavaScript closures), technologies (REST web services,
WebSockets), and conventions in web application development (HTML5 applications calling web services,
server-side JavaScript, etc.). Furthermore, it has almost become a necessity to provide a mobile web
application along with the usual web interface. All of this quickly leads us to the question: "What kind of
approach should be taken in order to follow technological progress, to stay market-competitive, to ensure a
good foundation for further development, to maintain the application with as little funds as possible, to
achieve the expected performance level, and to justify the expenses?" The answer differs from one case to
another. It depends on a number of factors: the development group’s knowledge, the infrastructure, possible
target customers, the expected performance level of the application, the type of the application, and so on.
Since we are developing an application for online lumber auctions, we looked for a reliable platform based
on standards and good practice; a platform which makes it possible for us to immediately focus on
developing the application’s functionality with ready-made components. We wanted to find an open source
platform with the capacity for further extensibility (e.g. a mobile interface, integration of additional libraries,
etc.).
Image 2: The managed bean for the dobrodosli.xhtml (English: welcome.xhtml) file
1
XHTML (Extensible HyperText Markup Language): a markup language for building HTML pages.
2
CSS (Cascading Style Sheets): a style sheet language used for describing the look and formatting of a document (mostly web pages)
written in a markup language.
3
JavaScript: a script language for building dynamic and interactive web pages.
A simple page (presented in images 1 and 2) is generated in a browser as an input form with one input field.
Whenever a user clicks on the button Send, an exclamation mark is attached to the end of the string which is
sent, and the page is refreshed.
• If we created a JSF page with a large number of JSF components (e.g. 250 and more), the page rendering
time increased significantly [3]. It was confirmed that the problem lay with Mojarra [20]. In version
2.1.22 the problem was resolved, as confirmed by repeated tests [2];
• A problem occurred when using JSF ViewScoped managed beans: some JSF tags (e.g. <f:convertNumber
/>) did not function properly [23] – the so-called “chicken-egg” bug, officially managed under the
number 1492. In version 2.1.18 the problem was resolved [6].
4
JSP (Java Server Pages): A technology used to create dynamically generated web pages.
5
CDI (Context and Dependency injection): A collection of services which make it easier for developers to connect enterprise beans
to the JSF technology. (Specification JSR-299)
2.2.2. What is missing in JSF?
Once we were acquainted with the concepts of development in JSF —the scope of managed beans,
implementation of Faces validators, implementation of Faces converters, building XHTML pages, etc.— and
once we looked over JSF components, we learned a few things:
• JSFs allow an application’s presentational and business levels to be clearly separated. The use is simple
when it comes to the i18N standard, server-side validation and conversion of input data, and specifying
for how long data should be kept server-side (achieved with the scope of managed beans). AJAX6 is
supported as well;
• While creating the structure of the page itself, we learned that the framework does not include any layout
manager components, nor does it include any skins, and the set of graphic components is basic at best.
We would like to see, for example, a calendar component; the table component <h:dataTable /> does not
support defining filters, sorting, pagination, displaying graphs, image galleries, and such;
• We noticed some problems in the connection between an XHTML file and a managed bean:
o The JSF framework does not allow direct addressing of constants (unless we define the
getter and setter methods);
o If we want to establish a connection between a managed bean and a component displaying
itself as a drop-down menu (e.g. <h:selectOneMenu />) via a Java object, it is necessary to
implement a data type converter;
o If executing an AJAX request results in a JSF error and no additional functionalities are
implemented, the end user is not even aware of it (the error is visible only in the browser
console).
JSF is fundamentally a standard which seeks to provide an adaptable and extensible framework for
developing web applications. If we take that into account, we can understand why it does not include any
rich components for browser display. The framework would have to include JavaScript libraries as well in
order to display components client-side. The question is whether the market offers any JSF framework
extensions which can solve this problem. The answer is, of course, yes – there are three large projects which
include rich widgets for developing web applications: ICEfaces, RichFaces, and PrimeFaces. Based on
Google Trends statistics [5] and some comparative tests, PrimeFaces is the best choice [14].
2.3. PrimeFaces
• More than a hundred JSF components for displaying graphic interfaces such as image galleries, calendars,
or tables which support sorting, filtering, pagination, an HTML editor, and so on;
• Prepared stubs for data components which enable custom implementation of sorting, filtering, and
pagination. An example of such a component is a table (tag <p:dataTable />);
• Refined support for exporting data from tables to other formats (XML, XLS, PDF, and CSV);
• The supported framework for creating themes, which brings with it more than 35 themes defined in
advance and JSF components for defining page layout;
• Improved and simplified use of AJAX as opposed to basic JSF, and support for the “Push” technology
through the Atmosphere framework;
6
AJAX (Asynchronus JavaScript): a group of techniques used client-side to create asynchronous web applications.
• The included library for developing mobile applications, and the library of rich HTML5 widgets which
are equal to HTML widgets into which JSF components are mapped.
We have mentioned that PrimeFaces is an open source project. However, we need to emphasize the fact that
only the major PrimeFaces releases (e.g. 4.0, 5.0) are open source [8]. Maintenance, bugfix-only releases
(e.g. 4.0.10) are now available exclusively to those who pay for them. There are two types of support
available to us: the first is PrimeFaces ELITE, which provides access to maintenance releases and gives
rights in the PrimeFaces issue voting system; the second is PrimeFaces PRO, which offers full support – e.g.
critical fixes, counseling in development, and so on. We believe that the open source release is good enough
for prototyping and/or learning, whereas for production working we advise you to consider investing in
PrimeFaces ELITE.
Before we compress the theme, we need to change8 the paths to images in the main style sheet (theme.css)
and add a path to it in the web.xml file. The theme's framework consists of two types of style sheets:
• Structural CSS – an external style sheet which defines the framework of all PrimeFaces components, as
well as other skinning features important for website architecture (borders, padding, dimensions, and
positions);
• Skinning CSS – an external style sheet which defines colors, the shape of components, the shape of
borders, the size of the font, etc. It already includes selectors in which we can change the skinning
attributes.
We can assign each component a different style by defining it in the .XHTML file. Above the component we
wish to change, we add a call to the selector by using the command »styleClass« (or »class«), while we enter
the properties of the selector into the style sheet. In doing so, we have to be careful about the already defined
attributes in selectors. If necessary or possible, we override the attributes of individual components via
custom styles. We can also use the command »style«, through which we can use style commands in the
.XHTML file itself.
The PrimeFaces documentation is quite meager when it comes to creating themes, since it only describes the
architecture and adding themes to an application. In our application, we generated a basic theme with the
help of the JQuery ThemeRoller, we predefined selectors in the style sheet, and added custom selectors (e.g.
labelLogin, button, button:hover). We designed other widgets used in the application similarly. A practical
example of predefining the shape of a framework is presented in Image 4.
7
JQuery ThemeRoller: http://jqueryui.com/themeroller/
8
We need to change the path to an image. Example: There is a path to an image in an exported theme –images/ui-bg_highlight-
soft_75_cccccc_1x100.png–, which needs to be changed to: #{resource['primefaces-yourtheme:images/ ui-bg_highlight-
soft_75_cccccc_1x100.png’]}.
Image 4: Editing the shape of a login form
PrimeFaces itself does not support responsive design. This can be solved by including frameworks which
help adjust display across different-sized screens (Bootstrap, Fundation, Skeleton, and others). The
developers of PrimeFaces recommend using the TwitterBootstrap framework.
2.3.3. PrimeFaces and support for filtering, sorting, and lazy loading
We often use tables to present data on web pages. In our opinion, <p:dataTable /> is one of the most
perfected widgets in PrimeFaces since it supports numerous functionalities: editing data within a table,
labeling one or more lines, sorting, filtering, lazy loading, etc. As long as we are working with a small
amount of data (e.g. a few dozen lines) and need only filtering and sorting, we can use the pre-implemented
methods in PrimeFaces. The two methods are executed on application server level as shown in the code
segment below [17].
Image 5: A code segment which shows how sorting, filtering, and pagination are defined
As can be seen in the <p:dataTable /> tag in the image above: we simply add pagination (XML attributes
paginator and rows), define the list in which PrimeFaces stores the filtered values (attribute filteredValue),
and define in each column (tag <p:column />) by which field it is sorted (attribute sortBy) or filtered
(attribute filterBy). For all these functionalities, there needs to be no additional implementation in the
managed bean, apart from defining a temporary variable for storing the filtered list and the variable’s getter
and setter methods. On the other hand, whenever we wish to assume control over the sorting, filtering,
pagination, and/or when we are working with large amounts of data, we can use PrimeFaces’ lazy loading
interface. It is a Java class with a pre-defined method into which PrimeFaces delivers data about pagination,
sorting, and filters. In case of a table, we inherit from the class org.primefaces.model.LazyDataModel and
implement the method loadData, as shown in Image 6[18].
2.4. JPA
Enterprise Java Beans (EJB) are Java classes executed on the Java EE application server to which we add
one or more annotations in accordance with the EJB specification. EJBs can be seen as widgets with which
we can implement a business logic level into a Java EE application. There are two major types of EJBs:
message driven beans and session beans. Message driven beans are mostly used in connection to the Java
Message Service (JMS). Session beans are used for direct communication between a bean and its user (e.g. a
CDI bean and an EJB bean). There are three types of session beans: those having state (stateful session
beans), those who do not have state associated with them (stateless session beans), and those having a global
shared state within a JVM (singleton session beans) [19]. If we want to implement e.g. a shopping cart, we
can use a stateful session bean. On the other hand, if we want to use it as an interface for accessing a
database, a stateless session bean is generally sufficient.
Java Persistence Architecture (JPA) is a Java specification which describes the management of data between
Java objects and a relational database. The specification itself can be divided into four parts: the Java
9
JDBC (Java Database Connectivity): A technology for accessing databases via the Java programming language.
Persistence API (JPA), the Java Persistence Query Language (JPQL, a language similar to SQL on the level
of JPA), the Criteria API (an API for the dynamic building of queries), and metadata for object-relational
mapping. JPA can be used in Java EE as well as Java SE applications. It needs to be emphasized though that
JPA is merely a specification, which is why our web application must include a library implemented by JPA
(e.g. OpenJPA, TopLink, EclipseLink, Hibernate, etc.).
Let us describe in short how we used JPA in our application.
• We defined the persistence.xml configuration file in which we configured the operation of JPA and its
implementation library;
• We implemented JPA entity classes which represent images of tables from the database. JPA entities are
normal (POJO10) Java classes in which the classes and their attributes (or even methods) have annotations
which define the connection with the database (e.g. by using the annotation @Table(name = “Table”) we
state that the Java class represents a table named “Table”);
• We used Java stateless session beans as components which initiate queries. These beans are
recommended when using JPA in Java applications [12].
We have not come across any problems with using EJBs so far. We can only commend the simplicity of their
use, since a single annotation is enough for a Java class to become an EJB. The following is our experience
with using JPA:
• When an entity being queried is associated with other entities, we have to consider whether we require all
the data from these associated entities – e.g. we have an entity named Invoice, which includes the list (of)
Rates. By default, JPA loads all the data, which can increase the execution time of queries returning a
large number of hits, and can unnecessarily increase an application’s memory consumption. We turn on
lazy loading in annotations with which we define associations – e.g. @ManyToOne(fetch =
FetchType.LAZY);
• Whenever an entity (or more associated entities) includes a large number of attributes and we need only a
few, we can use the so-called tupleQuery [12]. This enables us to query only certain attributes in one or
more entities. For example, a schedule of auctions does not require all the arrays which are otherwise
used in an overview of auctions. This, too, is one of the application’s optimization options;
• Some databases do not include operators for specifying which lines of an SQL11 query result we require
(the mySQL database includes two: LIMIT and OFFSET). We do not have to deal with this problem when
using JPA. Let us take as an example Oracle’s database, for which the so-called “N-tier” queries are
recommended when implementing pagination. EclipseLink, which we use in our application, follows this
recommendation;
• Java EE 7 also includes the 2.1 release of JPA, which brings with it the possibility to call stored
procedures via a standardized interface (Oracle, 2013). Oracle’s database enables the implementation of
functions and procedures inside the database. We called the procedure via this interface with no issues.
For a function, though, we could not find a solution; using EclipseLink classes could work because they
support it, however they are not part of the JPA specification [27].
Image 7: An example of protecting a CDI bean method (retrieved from BalusC’s blog)
To add: implemented annotations do not function with managed beans (they were deprecated with the arrival
of Java EE7). Here is some of our experience with using the library:
• The documentation of the project is incomplete, and the home page is not updated. The 1.2.3 version was
released when this article was being written, but we could not yet find the list of differences between this
12
LDAP (Lightweight Directory Access Protocol): a standard for accessing and maintaining distributed directory information
services over an Internet Protocol (IP) network.
version and the previous one (1.2.2). The only good aspect of the documentation is the description of the
architecture and widgets (e.g. the realm) used by the framework;
• The architecture of the framework is understandable and easily extensible. Once we looked over the
documentation, some web sources, and source code comments, we were able to implement certificate
authentication without difficulty;
• There is an absence of tags for using Apache Shiro in JSF’s XHTML files. We solved this issue for the
moment by creating a managed session bean with methods which can be called by JSF pages via EL
expressions. The methods delegate the call to the framework – more specifically the
org.apache.shiro.subject.Subject class;
• In the configuration file, we can specify which roles have access to certain addresses (e.g.
/admin/admin.xhtml); if we specify a number of roles for one address, the framework reads it as if access
to the address requires not just one, but all of those roles. So, what is missing is the support for an “or”
operator in configuration files;
• While testing the library, we learned that the framework has no built-in protection against session cookie
theft – if an attacker manages to intercept a session cookie, he can use the application without logging in
(if, of course, the session for that cookie is still active);
• The framework lacks the option to define multilevel authentication – e.g. the user enters their username
and password, then they receive a one-time password via some other channel (SMS, e-Mail); they enter
the one-time password and the already-prepared components in order to perform certificate
authentication.
• The system memory (RAMJobStore): The advantages of this approach are simple configuration and fast
execution, while the weaknesses are memory consumption (an increased number of jobs and triggers) and
loss of data when an application error occurs or when the system is restarted.
• Or the database via JDBC (JDBCJobStore): Storing is compatible with different databases (Oracle,
PostgreSQL, MySQL, MS SQL Server,...).
The library has proven itself to be very adaptable since the jobs can be run in any sort of time sequence. By
using it we were able to send emails to the users of our application at registration, whenever an auction
started, and whenever they forgot their passwords. We also plan to implement certain jobs with which we
could run security copies of the system daily at night time.
2.7. JodaTime
The date library JodaTime is a quality replacement for the Date and Time API. Its architecture enables us to
create different types of calendars (Gregorian, Julian, Buddhist, Ethiopian, Islamic) while the library itself
remains simple to use. It enables us to use different time zones connected to the tz (Time Zone) database
which is updated several times a year. JodaTime supports time periods and operations between them,
different date formats, and different types of parsing. It uses the Apache License, Version 2.0 which means
that it can be incorporated in applications freely [11].
We, of course, tested both libraries (Date and Time API, and JodaTime) before implementing one into our
project. In test projects of both libraries (as shown in Image 8) we created a million instances of the Date
class and changed the date format into the Slovene one. With these tests we wanted to determine the test
code's run time in each of the two libraries. The first test was executed using a “formatter”
(SimpleDateFormat, DateTimeFormatter) implemented outside the "for" loop; in the second test, we
implemented both inside the "for" loop.
Image 8: A comparison of the Date and Time API library (above) with the JodaTime library (below)
In order to test them, we ran both classes five times and noted the run time. We then calculated the average
execution time (in milliseconds), as seen in Graph 1.
2500
2000
1500
V
for
zanki
(ms)
1000
Izven
for
zanke
(ms)
500
0
Date
in
Time
API
JodaTime
From looking at the graph, we see that the JodaTime library helps achieve much better run times compared
to the Java Date and Time API. The announced update of the Java environment (Java SE 8) will bring with it
a new library for operating with date and time (java.time API); the updated library was developed in
association with the creators of the JodaTime library.
The JodaTime library helped us operate with dates in our application; we used it when implementing a data
type converter; its ability to calculate intervals between periods helped us manage the schedule of auctions.
Because of its simplicity and responsiveness, the library is a good addition to the Java programming
language.
2.8. Google libphonenumber
Validating entered telephone numbers can be a problem, because we need to verify syntactic correctness and
country calling codes in order to do it. For this reason, developers at Google implemented a library which
takes care of parsing, converting, storing, and validation of telephone numbers from around the world
(stationery and mobile ones). It is implemented in all major programming languages (Java, C++, JavaScript,
PHP, Objective-C). The Java version is adapted for use in developing smartphone applications.
The library provides us with the following functionalities:
• Extraction of data about telephone numbers (from the telephone number, the implementation extracts data
about the network operator or the device itself, wherever possible);
• Extraction of data about the user’s phone service provider or country;
• Verification of telephone numbers directly at input;
• Searching for telephone numbers based on partially entered telephone numbers.
We used the library mostly for parsing, converting numbers into international format, and verifying the
authenticity of telephone numbers. When we verify the authenticity of a user, we therefore gain information
about their service provider and regional telephone code [10].
13
WebSocket: a protocol providing full-duplex (in both directions) communications channels over a single TCP (Transmission
Control Protocol) connection. It is used for communcation between the browser and the web page.
Image 9: The structure of an application for lumber auctions
4. CONCLUSION
We chose the Java EE platform and we believe that it meets our requirements. We were mostly convinced by
the standardization on every step of the way (e.g. how to implement validation of input data), the support for
solving common issues (e.g. pagination in JPA), and extensibility (e.g. the option to extend JSF tags for
graphic components). When JSF “ran out of power” we used PrimeFaces, which includes a truly rich
collection of graphic components. We believe PrimeFaces has a future due to its vibrant community, fast
development of the framework, as well as the authors’ decision to create JSF widgets for mobile applications
(PrimeFaces Mobile) and independent libraries of HTML5 widgets, which are identical to those widgets into
which JSF widgets translate (PrimeFaces UI). The same could be said for Java EE, because version 7 brings
with it the support for WebSockets (JSR-356), standardized processing of JSON (JSR-353), and so on. We
only worry about the unclear future of the Apache Shiro library.
5. LITERATURE
[1] Akdogan, H. (2013, August 8). “JSF 2.2: HTML 5 Support.” Retrieved May 18, 2014 from Kodcu.com:
http://en.kodcu.com/2013/08/jsf-2-2-html-5-support/
[2] Asel, T. (2013, May 16). “JSF Performance: Mojarra improves dramatically with latest release.”
Retrieved May 18, 2014 from Techscouting through the java news: http://blog.oio.de/2013/05/16/jsf-
performance-mojarra-improves-dramatically-with-latest-release/
[3] Asel, T. (2013, April 8). “JSF-Comparison: MyFaces vs. Mojarra.” Retrieved May 18, 2014 from
Techscouting through the Java news: https://blog.oio.de/2013/04/08/jsf-comparison-myfaces-vs-
mojarra/
[4] Async-io.org. (2014, April 29). “Introduction.” Retrieved May 16, 2014 from Atmosphere/Atmosphere
Wiki: https://github.com/Atmosphere/atmosphere/wiki
[5] Breitner, D. (2014, January 15). “Comparing Primefaces, ICEFaces and Richfaces with Google Trend.”
Retrieved May 18, 2014 from A blog about Liferay and JSF: http://liferay-
blogging.blogspot.com/2014/01/comparing-primefaces-icefaces-and.html
[6] Burns, E. (2010, August 8). “Component bindings incompatible with View Scope.” Retrieved May 18,
2014 from JIRA: https://java.net/jira/browse/JAVASERVERFACES-1492
[7] Burns, E. (2014, April 10). “JSR-000344 JavaServer Faces 2.2 - Final release.” Retrieved May 17, 2014
from https://www.jcp.org/aboutJava/communityprocess/final/jsr344/index.html
[8] Cavicii, C. (2013, February 5). “New Maintenance Policy.” Retrieved May 17, 2014 from PrimeFaces
Blog: http://blog.primefaces.org/?p=2443
[9] Gibson, A. (2012, February 7). “Comparing JSF Beans, CDI Beans and EJBs.” Retrieved May 18, 2014
from Andy Gibson: Open Source Projects & Technical Writings:
http://www.andygibson.net/blog/article/comparing-jsf-beans-cdi-beans-and-ejbs/
[10] Google. (2013, September 24). “Google's phone number handling library, powering Android and more.”
Retrieved May 15, 2014 from Libphonenumber: https://code.google.com/p/libphonenumber/
[11] Joda.org. (2013, August 3). “Java date and time API.” Retrieved June 17, 2014 from JodaTime:
http://joda-time.sourceforge.net/quickstart.html
[12] Keith, M., & Schincariol, M. (2009). JPA2: Mastering the Java Persistence API. New York: Apress.
[13] Kyte, T. (2007, January 15). “On Top-n and Pagination Queries.” Retrieved May 16, 2014 from Ask
Tom: http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html
[14] Marchioni, F. (2010, April 14). “Java EE 6 training. Part 3: Richfaces.” Retrieved May 18, 2014 from
JBoss Aplication Server Tutorials: http://www.mastertheboss.com/richfaces
[15] Oracle. (2013, October 10). “Applying JPA to Stored Procedures.” Retrieved May 16, 2014 from Java
EE7:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Stored_Proc/StoredProcedures.html
[16] Oracle. (2014, October 4). “The Java EE7 Tutorial: Java Server Faces Technology.” Retrieved May 15,
2014 from Java EE Documentation: http://docs.oracle.com/javaee/7/tutorial/doc/jsf-intro.htm#BNAPH
[17] PrimeTek. (2013, April 10). “Complex datatable.” Retrieved May 16, 2014 from Primefaces Showcase:
http://www.primefaces.org/showcase/ui/datatableComplex.jsf
[18] PrimeTek. (2013, April 10). “Primefaces datatable lazy parsing.” Retrieved May 16, 2014 from
Primefaces showcase: http://www.primefaces.org/showcase/ui/datatableLazy.jsf
[19] Reese, R. M. (2011). EJB 3.1 Cookbook. Birmingham: Packt publishing.
[20] Riem, M. (2012, August 7). “JSF page performance degrades significantly as page size increases.”
Retrieved May 18, 2014 from JIRA: https://java.net/jira/browse/JAVASERVERFACES-2494
[21] Scholtz, B. (2013, January 24). “Apache Shiro, is it ready for Java EE 6? (a JSF2-Shiro Tutorial).”
Retrieved May 16, 2014 from The BalusC Code: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-
ready-for-java-ee-6.html
[22] Scholtz, B. (2012, May 1). “OmniFaces Showcase.” Retrieved May 16, 2014 from OmniFaces
Showcase: http://showcase.omnifaces.org
[23] Scholtz, B. (2010, June 5). “The benefits and pitfalls of @ViewScoped.” Retrieved May 18, 2014 from
The BalusC Code: http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html
[24] Scholtz, B. (2007, August 31). “Welcome.” Retrieved May 16, 2014 from The BalusC Code:
http://balusc.blogspot.com
[25] StackHunter. (2014, May 5). “Ditch Container-Managed Security To Create Portable Web Apps.”
Retrieved May 16, 2014 from StackHunter: http://blog.stackhunter.com/2014/05/05/ditch-container-
managed-security-to-create-portable-web-apps/
[26] Terracotta inc. (2013, August 3). “Quartz Quick Start Guide.” Retrieved May 18, 2014 from Quartz
scheduler: http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start
[27] The Eclipse fundation. (2011, December 19). “EclipseLink/Examples/JPA/PLSQLStoredFunction.”
Retrieved May 17, 2014 from Eclipsepedia:
http://wiki.eclipse.org/EclipseLink/Examples/JPA/PLSQLStoredFunction