This document provides an overview of JavaServer Faces (JSF) and the RichFaces framework for building enterprise applications with Ajax functionality. It discusses key features of JSF 2 such as Facelets, composite components, and the basic <f:ajax> tag. It then describes RichFaces 4 as a lightweight JSF framework that extends JSF 2 with rich UI components, an Ajax tag library (<a4j:>), and features like client-side validation, polling, and pushing. The document provides examples of how to use various RichFaces tags to send Ajax requests and control partial rendering.
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
Build Cool Apps with JSF and RichFaces
1. What You Need for Building
Cool Enterprise Applications
with JSF
Max Katz
Exadel
Oct. 4, 2011
2. >max@exadel.com
Max Katz >@maxkatz
>mkblog.exadel.com
Senior Systems Engineer
JSF, RichFaces, Java EE consulting,
and training
Developer Relations for Tiggr Mobile
Apps Builder (http://gotiggr.com)
3. Exadel is a global software
engineering company
Founded in 1998, headquarters in
San Francisco Bay Area
7 Development offices in Europe
[Munich, Moscow, Ekaterinburg, Minsk, Homeyl, Kharkov, Donetsk]
400+ employees
4. The Plan Is Simple
1) Ajax features in JSF 2
2) The new RichFaces 4 – or
what you need to build cool
enterprise applications with
JSF
5. JavaServer Faces™ (JSF) is
the standard component-
based user interface (UI)
framework for the
Java EE (5 & 6) platform
JSF 1.2 Java EE 5
JSF 2 Java EE 6
6. JSF 2 is a major upgrade
over JSF 1.x
Many features, ideas taken
from projects such as Seam,
RichFaces, and others
7. JSF 2 new features
● Facelets ● New scopes
● Composite ◦ Flash, View,
components custom
● Implicit ● Configuration
navigation via annotations
● GET ● Bean Validation
support
support
◦ h:link, h:button
● Basic Ajax
● Resource loading
8. JSF 2 <f:ajax>
● Very basic Ajax functionality
● Greatly
inspired by RichFaces 3
<a4j:support> tag
● Ajax in JSF in 3 easy steps:
1. Sending an Ajax request
2.Partial view processing
3.Partial view rendering
11. Attribute Value
Important
Event on which to fire the
<f:ajax> event
Ajax request
attributes @all
@this (default)
@form
execute
@none
id's
EL
@all
@this
@form
render
@none (default)
id's
EL
12. That's good, but that's all you get.
Where do you get rich components
and more?
A rich component framework is
still(?) needed to build real-world
Ajax applications.
13. RichFaces 4 is a lightweight,
open source framework for
JSF 2
14. RichFaces 4 – rich JSF framework
UI components
a4j:* tag library (core)
rich:* tag library (UI)
Components' JavaScript API
Skins
Client-side validation (Bean Validation
based)
CDK – Component Development Kit
15. 100% built on top of JSF2,
just extends functionality in
JSF 2
17. RichFaces 4 is a lot faster, consistent,
and optimized
All components are reviewed for consistency,
usability
Redesigned following semantic HTML
principles
Server-side and client-side performance
optimization
Strict code clean-up and review
25. Easy to start. Zero-configuration,
just drop RichFaces into the
application
26. RichFaces versions
Version JSF 1.1 JSF 1.2 JSF 2
RichFaces 3.1.x •
RichFaces 3.3.3* • •
RichFaces 4 •
* Note: RichFaces 3.3.3 has basic JSF 2 support
27. RichFaces history
2005: started by Alexander Smirnov
2005-2007: Developed by Exadel
Ajax4jsf - open source, free
RichFaces - commercial
2007: JBoss takes over
Exadel team continues to develop
the framework, project is known as
RichFaces
28. Let's see what cool
components, and features
you get with RichFaces...
29. RichFaces <a4j:ajax>
● 100% based on standard <f:ajax>
● Just replace f: with a4j: and get
exactly the same functionality
● But, you get extra features...
<h:commandButton>
<h:commandButton>
<f:ajax execute="@form" render="output"/>
<f:ajax execute="@form" render="output"/>
</h:commandButton>
</h:commandButton>
<h:commandButton>
<h:commandButton>
<a4j:ajax execute="@form" render="output"/>
<a4j:ajax execute="@form" render="output"/>
</h:commandButton>
</h:commandButton>
30. <a4j:ajax> attributes
Feature/Attribute Description
JavaScript to execute before Ajax
onbegin
request
JavaScript to execute after response
onbeforedomupdate
comes back but before DOM update
oncomplete JavaScript to execute after DOM update
Allows to skip JSF phases when
bypassUpdates
validating
limitRender Turns off all auto-rendered panels
status Status to display during Ajax request
Ajax queue Advanced RichFaces client queue
32. <a4j:commandButton/Link> –
button and link with built-in Ajax
behavior
<a4j:commandButton value="Save"
<a4j:commandButton value="Save"
action="#{bean.action}"
action="#{bean.action}"
render="output" />
render="output" />
<a4j:commandLink value="Save"
<a4j:commandLink value="Save"
action="#{bean.action}"
action="#{bean.action}"
render="output" />
render="output" />
33. When using standard JSF button:
<h:form>
<h:form>
<h:inputText>
<h:inputText>
<h:selectOneMenu>
Need to set
<h:selectOneMenu>
<h:commandButton>
<h:commandButton> execute=”@form”
<f:ajax execute="@form"/>
<f:ajax execute="@form"/> (or execute=”id1 id2”)
</h:commandButton>
</h:commandButton>
<h:form>
<h:form>
When using RichFaces button:
<h:form>
<h:form> RichFaces default
<h:inputText>
<h:inputText>
<h:selectOneMenu>
value for
<h:selectOneMenu>
<a4j:commandButton/>
<a4j:commandButton/>
button/link
<h:form>
<h:form> execute=”@form”
35. If you had to pick just one Ajax
control, you would want
<a4j:jsFunction>
<h:commandButton action="#{bean.change}">
<h:commandButton action="#{bean.change}">
<a4j:ajax render="id"/>
<a4j:ajax render="id"/>
</h:commandButton>
</h:commandButton>
Is the same as:
<h:commandButton onclick="sendAjax();"/>
<h:commandButton onclick="sendAjax();"/>
<a4j:jsFunction name="sendAjax"
<a4j:jsFunction name="sendAjax"
action="#{bean.change}" render="id"/>
action="#{bean.change}" render="id"/>
37. <a4j:push>
● Server-side events are pushed to
client using Comet or WebSockets.
● Implemented using Atmosphere
● Providesexcellent integration with
EE containers, and advanced
messaging services
<a4j:push address="topic@chat"
<a4j:push address="topic@chat"
ondataavailable="alert(event.rf.data)" />
ondataavailable="alert(event.rf.data)" />
41. render=”#{bean.renderList}”
JSF RichFaces
1) Ajax request sent 1) Ajax request sent
2) Component id's to be 2) Component id's to
rendered resolved be rendered
3) Component id's are resolved
rendered into the page 3) Component id's
4) 2nd Ajax request is sent. are rendered
In this request the
components (resolved in
step 2 are sent with
request) will be rendered
45. Even more advanced features
and tags
● JavaScript callbacks
● Queue
● <a4j:status>
● <a4j:param>
● <a4j:log>
46. Easily use JavaScript callbacks
during Ajax request
<a4j:commandLink value="Link"
<a4j:commandLink value="Link"
onbegin="ajaxOnBegin()"
onbegin="ajaxOnBegin()"
onbeforedomupdate="ajaxOnBeforeDomUpdate()"
onbeforedomupdate="ajaxOnBeforeDomUpdate()"
oncomplete="ajaxOnComplete()">
oncomplete="ajaxOnComplete()">
</a4j:commandLink>
</a4j:commandLink>
47. JSF 2 queue
● JSF2 has very basic queue
functionality
● Events are queued and fired one at a
time
● Only one request is processed on the
server at a time
48. <a4j:queue> – “combining” events
from the same component
While a request is executing
on the server, all requests
from button A or button
B will be combined
(merged) if the last event in
the queue is of the same
type.
<a4j:queue />
<a4j:queue />
...
...
<a4j:commandButton id="buttonA" value="Button A"/>
<a4j:commandButton id="buttonA" value="Button A"/>
<a4j:commandButton id="buttonB" value="Button B"/>
<a4j:commandButton id="buttonB" value="Button B"/>
49. <a4j:queue> – “combining” events
from different components
While a request is executing
on the server, all requests
from button A or button
B will be combined
(merged).
<a4j:queue />
<a4j:queue />
<a4j:commandButton id="buttonA" value="Button A">
<a4j:commandButton id="buttonA" value="Button A">
<a4j:attachdQueue requestGroupingId="ajaxGroup"/>
<a4j:attachdQueue requestGroupingId="ajaxGroup"/>
</a4j:commandButton>
</a4j:commandButton>
<a4j:commandButton id="buttonB" value="Button B">
<a4j:commandButton id="buttonB" value="Button B">
<a4j:attachdQueue requestGroupingId="ajaxGroup"/>
<a4j:attachdQueue requestGroupingId="ajaxGroup"/>
</a4j:commandButton>
</a4j:commandButton>
50. <a4j:queue> – setting request delay
allows “waiting” for requests from
same component in order to merge
events
<a4j:queue requestDelay="1000"/>
<a4j:queue requestDelay="1000"/>
<a4j:commandButton id="buttonA" value="Button A">
<a4j:commandButton id="buttonA" value="Button A">
<a4j:attachdQueue requestDelay="2000"/>
<a4j:attachdQueue requestDelay="2000"/>
</a4j:commandButton>
</a4j:commandButton>
<a4j:commandButton id="buttonB" value="Button B"/>
<a4j:commandButton id="buttonB" value="Button B"/>
53. <a4j:param> - like <f:param>, but
simpler as it also assigns the value to
a bean property automatically
<a4j:commandButton value="Save">
<a4j:commandButton value="Save">
<a4j:param value="1009" assignTo="#{bean.product}"/>
<a4j:param value="1009" assignTo="#{bean.product}"/>
</a4j:commandButton>
</a4j:commandButton>
public class Bean {
public class Bean {
private String product;
private String product;
public void setProduct (String product) {...}
public void setProduct (String product) {...}
}}
54. Another great feature is that
<a4j:param> value can contain any
JavaScript expression or JavaScript
function, when noEscape="true"
<a4j:param name="width"
<a4j:param name="width"
value="(jQuery(window).width()/2)"
value="(jQuery(window).width()/2)"
assignTo="#{bean.screenWidth}"
assignTo="#{bean.screenWidth}"
noEscape="true" />
noEscape="true" />
59. <rich:popupPanel> can be modal and
non-modal
<rich:popupPanel modal="false">
<f:facet name="header">
Edit User
</f:facet>
...
...
</rich:popupPanel>
64. RichFaces data iteration components
support partial updates
render="@column"
render="@header"
render="@body"
render="@footer"
render="cellId"
To render from outside the table:
render="tableId@header"
render="tableId@body"
render="tableId@footer"
65. Deciding what rows/cell to update in
run-time
render="tableId:rows(bean.rowsSet)"
render="tableId:rows(bean.rowsSet):cellId"
72. Many RichFaces components
provide client-side JavaScript API
<rich:popupPanel> JavaScript API
Method name Description
Return the top co-ordinate for the position of
getTop()
the pop-up panel.
Return the left co-ordinate for the position of
getLeft()
the pop-up panel.
Move the pop-up panel to the co-ordinates
moveTo(top,left)
specified with the top and left parameters.
Resize the pop-up panel to the size specified
resize(width,height)
with the width and height parameters.
show() Show the pop-up panel.
hide() Hide the pop-up panel.
77. RichFaces client functions
Function Description
rich:client(id) Returns component client id
rich:element(id) Returns DOM element
Returns RichFaces client component
rich:component(id)
instance to call JS API method
rich:isUserInRole(role) Returns if the user has specified role
Returns component instance for given
rich:findComponent(id)
short id
78. Standard Java EE security with
#{rich:isUserInRole(role)} function
<rich:panel header="Admin panel"
<rich:panel header="Admin panel"
rendered="#{rich:isUserInRole('admin')}">
rendered="#{rich:isUserInRole('admin')}">
Very sensitive information
Very sensitive information
</rich:panel>
</rich:panel>
<rich:panel header="User panel">
<rich:panel header="User panel">
General information
General information
</rich:panel>
</rich:panel>
● Calls facesContext.getExternalContext.getUserInRole(role)
● What's good is that security roles can be defined anywhere
80. Bean Validation (JSR 303)
JSF 2 has support for Bean Validation
(validation done on server)
Bean:
public class Bean {
public class Bean {
@Pattern(regexp="...")
@Pattern(regexp="...")
private String email;
private String email;
}}
JSF page:
<h:inputText id="email" value="#{bean.email}">
<h:inputText id="email" value="#{bean.email}">
<a4j:ajax event="blur"/>
<a4j:ajax event="blur"/>
</h:inputText>
</h:inputText>
<rich:message for="email"/>
<rich:message for="email"/>
81. Client-Validation Based on Bean
Validation
Validation is performed on the client. If no client
implementation available, validation automatically falls
back to standard, server validation
Bean:
public class Bean {
public class Bean {
@Pattern(regexp="...")
@Pattern(regexp="...")
private String email;
private String email;
}}
JSF page:
<h:inputText id="email" value="#{bean.email}">
<h:inputText id="email" value="#{bean.email}">
<rich:validator />
<rich:validator />
</h:inputText>
</h:inputText>
<rich:message for="email"/>
<rich:message for="email"/>
91. Skins
● Lightweight extension on top of CSS
● Change
look and feel of all rich
component with a few minor changes
● Can
be applied to standard JSF and
HTML tags as well
97. Skinning standard JSF tags and
HTML tags
Apply to each control:
<h:button style="background-color:
<h:button style="background-color:
'#{richSkin.tableBackgroundColor}'"/>
'#{richSkin.tableBackgroundColor}'"/>
98. Skinning standard JSF tags and
HTML tags automatically
Apply to all standard controls (JSF and HTML):
<context-param>
<context-param>
<param-name>
<param-name>
org.richfaces.enableControlSkinning
org.richfaces.enableControlSkinning
</param-name>
</param-name>
<param-value>true</param-value>
<param-value>true</param-value>
</context-param>
</context-param>
99. Skinning standard JSF tags and
HTML tags only when special CSS
class is applied to parent container
<context-param>
<context-param>
<param-name>
<param-name>
org.richfaces.enableControlSkinningClasses
org.richfaces.enableControlSkinningClasses
</param-name>
</param-name>
<param-value>true</param-value>
<param-value>true</param-value>
</context-param>
</context-param>
<div class="rfs-ctn">
<div class="rfs-ctn">
<h:outputText />
<h:outputText />
<h:inputText />
<h:inputText />
<h:commandButton />
<h:commandButton />
</div>
</div>
100. Where can I try the new
RichFaces 4?
http://richfaces.org/showcase
101. RichFaces 4.1 (Late 2011)
Mobile support
New components:
Pick list
Ordering list
Rich text editor
102. How can we help with RichFaces
● Web development
with RichFaces
Training Days
● Version 3 to 4 migration JSF 1.2, 2 1-2
● Performance tune-up RichFaces 3, 4 1-2
JSF and RichFaces 2-3
● Custom component RichFaces 3 to 4 1-2
development
● On-site training