SlideShare a Scribd company logo
RichFaces 4
Rich Ajax Components For
Your JSF Applications

Max Katz
Exadel

Vienna, Sept. 9, 2011
Max Katz
● Senior   Systems Engineer at Exadel
● JSF,RichFaces, Java EE consulting,
 and training
● Manages exadel.org – Exadel's open
 source projects and community
● Community  manager for gotiggr.com
 prototypes and mobile apps builder
4
Exadel is a global software
engineering company.
● Founded in 1998,


  headquarters in San Francisco
  Bay Area
● 7 development offices in


  Europe
● 350+ employees
Ekaterinburg
                     Moscow

         Minsk

                 Homyel

            5       Kharkov

Munich
                          Donetsk
Open Source with JBoss
Exadel Products

exadel.org                 gotiggr.com
  ◦   Flamingo
  ◦   Fiji
  ◦   jsf4birt
  ◦   JavaFX Plug-in for
      Eclipse
Exadel Services
● Professional services
● Rich enterprise application
 development
● Eclipse development
● Custom rich   component development
● Mobile   development
● Training
The Plan Is Simple


1) Ajax features in JSF 2

2) The new RichFaces 4
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
JSF 2 is a major upgrade
       over JSF 1.x

 Many features, ideas taken
from projects such as Seam,
   RichFaces, and others
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
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
<h:form>
   <h:input value="#{bean.word}"/>
   <h:commandButton>
      <f:ajax event="click" 1
              execute="@form" 2
              listener="#{bean.ajaxListener}"
              render="out1 out2"/> 3
   </h:commandButton>
   <h:input value="#{bean.text}" id="out1"/>
   <h:input value="#{bean.phrase}" id="out2"/>
</h:form>
<h:form>
   <h:input value="#{bean.word}"/>
   <h:selectOneMenu value="#{bean.selected}">
      <f:selectItems value="#{bean.items}"/>
      <f:ajax event="change" 1
              execute="@form"   2
              listener="#{bean.ajaxListener}"
              render="@form"/> 3
   </h:commandButton>
   <h:input value="#{bean.text}" id="out1"/>
   <h:input value="#{bean.phrase}" id="out2"/>
</h:form>
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
That's good, but where do
you get rich components and
            more?

A rich component framework
  is still(?) needed to build
           real-world
       Ajax applications.
Official RichFaces logo



RichFaces 4 is a lightweight,
open source framework for
          JSF 2
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
RichFaces 4


  100% built on top of JSF2,
 just extends functionality in
            JSF 2
RichFaces 4


 JavaScript is now entirely
based on the popular jQuery
          library
RichFaces 4
● 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
RichFaces 4


 New client-side validation
 based on Bean Validation
         (JSR 303)
RichFaces 4


  New, and easy to use CDK
   (Component Development Kit),
 allows quickly to build your
own custom rich components
RichFaces 4


Run on: Tomcat 6/7, Resin,
JBoss AS 6/7, GlassFish 3.x,
             WebLogic
(run on any server when JSF 2 application
            can be deployed)
RichFaces 4


 Run on: Google App Engine
   (GAE), Amazon EC2,
         CloudBees
RichFaces 4


   JSF implementations:
    Mojarra or MyFaces
RichFaces 4


        Any browser
RichFaces 4


  Tooling support through
   JBoss Tools, IntelliJ,
         NetBeans
RichFaces 4


Zero-configuration, just drop
RichFaces into the application
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
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
RichFaces 4


   Let's look at RichFaces
  features in more detail...
RichFaces 4 core – sending
an Ajax request
● <a4j:ajax>
● <a4j:commandButton>
● <a4j:commandLink>
● <a4j:jsFunction>
● <a4j:poll>
● <a4j:push>
RichFaces 4


It's important to say it again,
 RichFaces only extends and
       upgrades JSF 2...
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>
   <f:ajax execute="@form" render="output"/>
</h:commandButton>

<h:commandButton>
   <a4j:ajax execute="@form" render="output"/>
</h:commandButton>
<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
<a4j:commandButton/Link> –
button and link with built-in Ajax
behavior
<a4j:commandButton value="Save"
   action="#{bean.action}"
   render="output" />




<a4j:commandLink value="Save"
   action="#{bean.action}"
   render="output" />
When using standard JSF button:
<h:form>
   <h:inputText>
   <h:selectOneMenu>
                                  Need to set
   <h:commandButton>              execute=”@form”
      <f:ajax execute="@form"/>   (or execute=”id1 id2”)
   </h:commandButton>
<h:form>


When using RichFaces button:
<h:form>                          RichFaces default
   <h:inputText>
   <h:selectOneMenu>
                                  value for
   <a4j:commandButton/>           button/link
<h:form>                          execute=”@form”
<a4j:jsFunction> – fire Ajax request
from any JavaScript function, HTML
event
<table>
   ...
   <td onmouseover="update('yellow')"/>
   ...
</table>

<h:form>
 <a4j:jsFunction name="update"
      action="#{bean.change}" render="...">
   <a4j:param value="param1" assignTo="#{bean.color}"/>
 </a4j:jsFunction>
</h:form>
If you had to pick just one Ajax
control, you would want
<a4j:jsFunction>
<h:commandButton action="#{bean.change}">
   <a4j:ajax render="id"/>
</h:commandButton>


Is the same as:

 <h:commandButton onclick="sendAjax();"/>

 <a4j:jsFunction name="sendAjax"
       action="#{bean.change}" render="id"/>
<a4j:poll> – periodically send an
Ajax request

<a4j:poll interval="1000"
          action="#{bean.count}"
          render="output"
          enabled="#{bean.pollEnabled}" />

<h:panelGrid id="output">
...
</h:panelGrid>
<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"
     ondataavailable="alert(event.rf.data)" />
RichFace 4 core – advanced
rendering features
● <a4j:outputPanel>
● limitRender   attribute
● render=”{bean.renderList}”
<a4j:outputPanel> – auto rendered
panel
<a4j:commandButton value="Save" action="#{bean.save}">
<a4j:commandButton value="Edit" action="#{bean.edit}">

<a4j:outputPanel ajaxRendered="true">
   <h:panelGrid>
      ...
   </h:panelGrid>
</a4j:outputPanel>

<a4j:outputPanel ajaxRendered="true">
   <rich:dataTable>
      ...
   </rich:dataTable>
</a4j:outputPanel>
Turning off auto rendered panels
<a4j:commandButton value="Save" action="#{bean.save}">
<a4j:commandButton value="Edit" action="#{bean.edit}"
     render="edit" limitRender="true">

<a4j:outputPanel ajaxRendered="true">
   <h:panelGrid>
      ...
   </h:panelGrid>
</a4j:outputPanel>
<h:panelGrid id="edit">
   <rich:dataTable>
      ...
   </rich:dataTable>
</h:panelGrid>
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
RichFace 4 core – advanced
execute features
● <a4j:region>
● bypassUpdates   attribute
<a4j:region> – defining execute
region declaratively

<h:form>
   <a4j:region>
      <h:inputText />
      <h:inputText />
      <h:selectOneMenu />
      <a4j:commandButton />
   <a4j:region>
</h:form>
Skipping
phases
when
validating
1.Restore View
2.Apply Request Values
3.Process Validation
4.Update Model
5.Invoke Application
6.Render Response


 <h:inputText id="name" value="#{bean.name}"/>
    <a4j:ajax event="blur" bypassUpdates="true"/>
 </h:inputText>
 <rich:message for="name"/>
JavaScript callbacks during Ajax
request
<a4j:commandLink value="Link"
   onbegin="ajaxOnBegin()"
   onbeforedomupdate="ajaxOnBeforeDomUpdate()"
   oncomplete="ajaxOnComplete()">
</a4j:commandLink>
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
<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:commandButton id="buttonA" value="Button A"/>
<a4j:commandButton id="buttonB" value="Button B"/>
<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:commandButton id="buttonA" value="Button A">
  <a4j:attachdQueue requestGroupingId="ajaxGroup"/>
</a4j:commandButton>
<a4j:commandButton id="buttonB" value="Button B">
   <a4j:attachdQueue requestGroupingId="ajaxGroup"/>
</a4j:commandButton>
<a4j:queue> – setting request delay
allows “waiting” for requests from
same component in order to merge
events
<a4j:queue requestDelay="1000"/>

<a4j:commandButton id="buttonA" value="Button A">
   <a4j:attachdQueue requestDelay="2000"/>
</a4j:commandButton>

<a4j:commandButton id="buttonB" value="Button B"/>
<a4j:queue> – ignoring “stale”
responses
<a4j:queue requestDelay="2000
           ingoreDupResponses="true"/>

<h:inputText value="#{bean.state}">
 <a4j:ajax event="keyup" listener="#{bean.load}"
           render="states"/>
</h:inputText>
RichFace 4 core – more
advanced features
● <a4j:status>
● <a4j:param>
● <a4j:log>
● JavaScript   interactions
<a4j:status> – Ajax request
      status



<a4j:status name="ajaxStatus">
  <f:facet name="start">
    <h:graphicImage value="ajaxStatus.jpg"/>
  </f:facet>
</a4j:status>

<h:form>
   <a4j:commandButton status="ajaxStatus"/>
</h:form>
<a4j:param> - like <f:param>, but
simpler as it also assigns the value to
a bean property automatically

<a4j:commandButton value="Save">
   <a4j:param value="1009" assignTo="#{bean.product}"/>
</a4j:commandButton>

public class Bean {
   private String product;
   public void setProduct (String product) {...}
}
Another great feature is that
<a4j:param> value can contain any
JavaScript expression or JavaScript
function, when noEscape="true"

<a4j:param name="width"
   value="(jQuery(window).width()/2)"
   assignTo="#{bean.screenWidth}"
   noEscape="true" />
<a4j:log> – Ajax request/response
information, logging
RichFaces UI components
● Output, panels
● Input
● Menu
● Data iteration
● Tree
● Drag   and drop
● Client   side validation
● Miscellaneous
rich:tab




rich:accordion




rich:progressBar
More rich output, panels
● rich:panel
● rich:togglePanel
● rich:popupPanel
● rich:collapsiblePanel
● rich:toolTip
<rich:popupPanel> can be modal and
non-modal

<rich:popupPanel modal="false">
  <f:facet name="header">
      Edit User
  </f:facet>
  ...
  ...
</rich:popupPanel>
rich:calendar




rich:inplaceInput


rich:inputNumberSlider


rich:autocomplete
More rich input
● rich:inputNumberSpinner
● rich:inplaceSelect
● rich:select
● rich:fileUpload
rich:panelMenu




rich:toolBar


rich:dropDownMenu
rich:dataTable




rich:dataTable with
rich:collapsibleSubTable



rich:dataScroller
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"
Deciding what rows/cell to update in
 run-time
render="tableId:rows(bean.rowsSet)"




render="tableId:rows(bean.rowsSet):cellId"
New collapsible sub table component
<rich:dataTable> supports column
and row spanning
<rich:extendedDataTable> provides
lazy loading, column resizing, reorder
and more
More rich data iteration
● a4j:repeat
● rich:extendedDataTable
● rich:collapsibleSubTable
● rich:list

  ◦ list | ordered | definition
● rich:dataGrid
● rich:column

  ◦ Column and row spanning
  ◦ Filtering, sorting
rich:tree
Drag and drop
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.
Invoking component JavaScript API
using #{rich:component(id)}
function

<input type="button"
       onclick="#{rich:component('popup')}.show();"
       value="Open" />

<rich:popupPanel id="popup">
   <h:outputLink value="#"
        onclick="#{rich:component('popup')}.hide();
           return false;">
          <h:outputText value="Close"/>
    </h:outputLink>
</rich:popupPanel>
Invoking component JavaScript API
using <rich:componentControl>
component
<h:outputLink value="#">
   <h:outputText value="Open" />
   <rich:componentControl event="click"
         target="popup" operation="show" />
</h:outputLink>

<rich:popupPanel header="RichFaces" id="popup">
   <h:outputLink value="#">
      <h:outputText value="Close" />
         <rich:componentControl event="click"
               target="popup" operation="hide" />
   </h:outputLink>
</rich:popupPanel>
<rich:accordion id="c">
 <rich:accordionItem header="New York" name="nyc">
   <h:outputText value="You selected New York"/>
 </rich:accordionItem>
 <rich:accordionItem header="San Francisco" name="sf">
   <h:outputText value="You selected San Francisco"/>
 </rich:accordionItem>
 ...
</rich:accordion>
<input type="button" value="New York City"
  onclick="#{rich:component('c')}.switchToItem('nyc')"/>
<input type="button" value="San Francisco"
   onclick="#{rich:component('c')}.switchToItem('sf')"/>
<input type="button" value="Los Angeles"
  onclick="#{rich:component('c')}.switchToItem('la')"/>




<input type="button" value="First"
   onclick="#{rich:component('c')}.switchToItem('@first')"/>
<input type="button" value="Next"
   onclick="#{rich:component('c')}.switchToItem('@next')"/>
<input type="button" value="Previous"
  onclick="#{rich:component('c')}.switchToItem('@prev')"/>
<input type="button" value="Last"
  onclick="#{rich:component('c')}.switchToItem('@last')"/>
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
Standard Java EE security with
#{rich:isUserInRole(role)} function
<rich:panel header="Admin panel"
   rendered="#{rich:isUserInRole('admin')}">
  Very sensitive information
</rich:panel>

 <rich:panel header="User panel">
   General information
</rich:panel>

●   Calls facesContext.getExternalContext.getUserInRole(role)
●   What's good is that security roles can be defined anywhere
Client-side validation based
    on Bean Validation
         (JSR 303)

    New in RichFaces 4
Bean Validation (JSR 303)
JSF 2 has support for Bean Validation
(validation done on server)
Bean:
public class Bean {
   @Pattern(regexp="...")
   private String email;
}

JSF page:
<h:inputText id="email" value="#{bean.email}">
    <a4j:ajax event="blur"/>
</h:inputText>
<rich:message for="email"/>
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 {
   @Pattern(regexp="...")
   private String email;
}

JSF page:
<h:inputText id="email" value="#{bean.email}">
    <rich:validator />
</h:inputText>
<rich:message for="email"/>
Cross field validation with
<rich:graphValidator>
@Size(min=5,max=15)
private String password1;
@Size(min=5,max=15)
private String password2;

@AssertTrue(message="Passwords don't match")
public boolean checkPassword() {
   return password1.equals(password1);
}

<rich:graphValidator value="#{bean}" id="crossField">
   <h:inputText value="#{bean.password1}"/>
   <h:inputText value="#{bean.password2}"/>
   <rich:message for="email" for="crossField"/>
</rich:graphValidator>
Rich miscellaneous
● <rich:componentControl>
● <rich:hashParam>
● <rich:jQuery>
<rich:componentControl>
       ● Allows  to call JS API on a component
         in declarative fashion
<h:outputLink id="openLink" value="#">
   <h:outputText value="Open" />
   <rich:componentControl event="click"
                          operation="show"
                          target="popup" />
</h:outputLink>

<rich:popupPanel id="popup">
...
</rich:popupPanel>
<rich:hashParam> - creates
JavaScript hash, can be passed to
another client function.

<h:commandButton value="Show popup">
   <rich:componentControl target="pp" operation="show">
      <rich:hashParam>
         <f:param name="width" value="500" />
         <f:param name="height" value="300" />
         <f:param name="minWidth" value="300" />
         <f:param name="minHeight" value="150" />
      </rich:hashParam>
   </rich:componentControl>
</h:commandButton
Using jQuery with <rich:jQuery>



<input type="button" id=" value="Update panel"/>
<rich:jQuery selector="#changeButton" event="click"
 query="$('#nycInfo .rf-p-hdr').text('New York City');
        $('.rf-p-b').css('color', 'blue');" />
Using jQuery when page rendered to
create zebra-like styling for table
<style>
   .even-row {
      background-color: #FCFFFE;
   }
   .odd-row {
      background-color: #ECF3FE;
   }
</style>

<rich:dataTable id="gamesTable">
   // columns
</rich:dataTable>

<rich:jQuery selector="#gamesTable tr:odd"
   query="addClass('odd-row')" />
<rich:jQuery selector="#gamesTable tr:even"
   query="addClass('even-row')" />
Invoking <rich:jQuery> as a regular
JavaScript function
             with mouse over




<h:graphicImage width="100" value="/images/venice.png"
   onmouseover="larger(this, {})"
   onmouseout="normal(this, {})" />

<rich:jQuery name="larger"
   query="animate({width:'241px'})" />
<rich:jQuery name="normal"
   query="animate({width:'100px'})"/>
Skins
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
Ready-to-use skins
● classic
● wine
● blueSky
● ruby
● emeraldTown
● deepMarine
                <context-param>
● plain           <param-name>org.richfaces.skin</param-name>
                  <param-value>ruby</param-value>
● japanCherry   </context-param>
RichFaces Skin file
#Colors
headerBackgroundColor=#900000
headerGradientColor=#DF5858
headerTextColor=#FFFFFF
headerWeightFont=bold

generalBackgroundColor=#f1f1f1
generalTextColor=#000000
generalSizeFont=11px
generalFamilyFont=Arial, Verdana, sans-serif

controlTextColor=#000000
controlBackgroundColor=#ffffff
additionalBackgroundColor=#F9E4E4
Skins
● Modify   existing or create your own
  <context-param>
    <param-name>org.richfaces.skin</param-name>
    <param-value>myCoolSkin</param-value>
  </context-param>

● Change   skins in runtime
  <context-param>
    <param-name>org.richfaces.skin</param-name>
    <param-value>#{bean.skin}</param-value>
  </context-param>
Overwriting Skin CSS
<style>
.rf-p-hdr {
   color: …
   font-size: …
   font-weight: …
   font-family: …
}
</style>
<rich:panel>...</rich:panel>
Overwriting Skin CSS
<style>
.rf-p-hdr {
   // overwrite skin CSS properties
}
.specialHeader {
  // define custom CSS for specific panel
}
</style>

<rich:panel id="panel1">
...
<rich:panel>
<rich:panel id="panel2" headerClass="specialHeader">
...
<rich:panel>
Skinning standard JSF tags and
HTML tags

Apply to each control:
<h:button style="background-color:
               '#{richSkin.tableBackgroundColor}'"/>
Skinning standard JSF tags and
HTML tags automatically

Apply to all standard controls (JSF and HTML):
<context-param>
   <param-name>
      org.richfaces.enableControlSkinning
   </param-name>
   <param-value>true</param-value>
</context-param>
Skinning standard JSF tags and
HTML tags only when special CSS
class is applied to parent container
<context-param>
   <param-name>
      org.richfaces.enableControlSkinningClasses
   </param-name>
   <param-value>true</param-value>
</context-param>


<div class="rfs-ctn">
   <h:outputText />
   <h:inputText />
   <h:commandButton />
</div>
Where can I try the new
       RichFaces 4?
http://richfaces.org/showcase
RichFaces 4.1 (Fall 2011)

Mobile support

New components:
 Pick list
 Ordering list
 Rich text editor
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
RichFaces
Rich, flexible, robust, and
proven enterprise-level
framework to JSF 2
max@exadel.com

Thank   @maxkatz
 you!
        mkblog.exadel.com

        gotiggr.com

More Related Content

PPT
Fracture healing
PPTX
Knee Arthroplasty Intra-Articular Injection cocktail
PDF
Business Case MSLM RIA @ AstraZeneca
PDF
การผสมข้ามสายพันธุ์
PDF
Management of hysteroscopic complication
PDF
วิถีชีวิตกับพฤติกรรมผู้บริโภค (Self-image & Lifestyle : Ch 10)
PPTX
Fracture healing
Knee Arthroplasty Intra-Articular Injection cocktail
Business Case MSLM RIA @ AstraZeneca
การผสมข้ามสายพันธุ์
Management of hysteroscopic complication
วิถีชีวิตกับพฤติกรรมผู้บริโภค (Self-image & Lifestyle : Ch 10)

What's hot (20)

PPTX
Humerus nailing and removal jagdish
PPTX
Compound fracture sagar
PPTX
Bone and fracture healing
PPTX
Prashanth
PPTX
Bone cement
PPTX
EVOLUTION AND GENERATION OF IMPLANTS_122609 (1)_114536 (002) (1).pptx
PPT
Plates-form and function
PPTX
Principles of internal fixation
PPTX
Managment of open fractures
PPTX
Lecture 11 parekh pilon
PPT
MENISCUS REPAIR I Dr.RAJAT JANGIR JAIPUR
PPTX
Bone cement.pptx 2 its science and cementing technique and safe surgical use
PPTX
Superior Shoulder Suspensory Complex injuries (SSSC)
PDF
Pemberton's Osteotomy for Acetabular Dysplasia
PPTX
Neuro spinal monitoring
PPT
tension band wiring
PPTX
AJM Sheet: 5 Podiatric Emergencies
Humerus nailing and removal jagdish
Compound fracture sagar
Bone and fracture healing
Prashanth
Bone cement
EVOLUTION AND GENERATION OF IMPLANTS_122609 (1)_114536 (002) (1).pptx
Plates-form and function
Principles of internal fixation
Managment of open fractures
Lecture 11 parekh pilon
MENISCUS REPAIR I Dr.RAJAT JANGIR JAIPUR
Bone cement.pptx 2 its science and cementing technique and safe surgical use
Superior Shoulder Suspensory Complex injuries (SSSC)
Pemberton's Osteotomy for Acetabular Dysplasia
Neuro spinal monitoring
tension band wiring
AJM Sheet: 5 Podiatric Emergencies
Ad

Similar to RichFaces 4: Rich Ajax Components For Your JSF Applications (20)

PDF
What You Need To Build Cool Enterprise Applications With JSF
PDF
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJS
PDF
RichFaces 4 webinar #1: Everything You Need To Know
PDF
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
PDF
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
PDF
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
PDF
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
PDF
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
PDF
Going Above JSF 2.0 with RichFaces and Seam
PDF
RichFaces: rich:* component library
PDF
RichFaces 4 Webinar - New and Advanced Features
PDF
Hands On With Rich Faces 4 - JavaOne 2010
PPT
Ajax Applications with RichFaces and JSF 2
PPT
Rich faces
PDF
Introduction to RichFaces
PDF
Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
PPTX
PDF
RichFaces 4 Component Deep Dive - JAX/JSFSummit
PPTX
JSF 2: Myth of panacea? Magic world of user interfaces
PDF
JavaServer Faces 2.0 - JavaOne India 2011
What You Need To Build Cool Enterprise Applications With JSF
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJS
RichFaces 4 webinar #1: Everything You Need To Know
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
Going Above JSF 2.0 with RichFaces and Seam
RichFaces: rich:* component library
RichFaces 4 Webinar - New and Advanced Features
Hands On With Rich Faces 4 - JavaOne 2010
Ajax Applications with RichFaces and JSF 2
Rich faces
Introduction to RichFaces
Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
RichFaces 4 Component Deep Dive - JAX/JSFSummit
JSF 2: Myth of panacea? Magic world of user interfaces
JavaServer Faces 2.0 - JavaOne India 2011
Ad

More from Max Katz (14)

PDF
Using cloud tools to build enterprise mobile apps with APIs fast
PDF
Wolters Kluwer Tech. Conference: Disrupting Mobile Development
PDF
Tiggzi at DC jQuery Meetup
PDF
Learn How to Build Mobile Apps Using Cloud Services
PDF
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
PDF
Tiggr - Web-based IDE for Mobile Web And Native Apps
PDF
Building Mobile Apps With jQuery For Any Device In The Cloud
PDF
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
PDF
Devoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
PDF
RichFaces skins
PDF
RichFaces: more concepts and features
PPT
Rich Enterprise Applications with JavaFX
PDF
Building RIA Applications with JavaFX
PDF
Building RIA Applications with RichFaces
Using cloud tools to build enterprise mobile apps with APIs fast
Wolters Kluwer Tech. Conference: Disrupting Mobile Development
Tiggzi at DC jQuery Meetup
Learn How to Build Mobile Apps Using Cloud Services
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
Tiggr - Web-based IDE for Mobile Web And Native Apps
Building Mobile Apps With jQuery For Any Device In The Cloud
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
Devoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
RichFaces skins
RichFaces: more concepts and features
Rich Enterprise Applications with JavaFX
Building RIA Applications with JavaFX
Building RIA Applications with RichFaces

Recently uploaded (20)

PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Approach and Philosophy of On baking technology
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Modernizing your data center with Dell and AMD
PDF
Encapsulation theory and applications.pdf
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
KodekX | Application Modernization Development
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Building Integrated photovoltaic BIPV_UPV.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Unlocking AI with Model Context Protocol (MCP)
Diabetes mellitus diagnosis method based random forest with bat algorithm
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Approach and Philosophy of On baking technology
The AUB Centre for AI in Media Proposal.docx
Modernizing your data center with Dell and AMD
Encapsulation theory and applications.pdf
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Spectral efficient network and resource selection model in 5G networks
KodekX | Application Modernization Development
The Rise and Fall of 3GPP – Time for a Sabbatical?
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Dropbox Q2 2025 Financial Results & Investor Presentation
Per capita expenditure prediction using model stacking based on satellite ima...
MYSQL Presentation for SQL database connectivity
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...

RichFaces 4: Rich Ajax Components For Your JSF Applications

  • 1. RichFaces 4 Rich Ajax Components For Your JSF Applications Max Katz Exadel Vienna, Sept. 9, 2011
  • 2. Max Katz ● Senior Systems Engineer at Exadel ● JSF,RichFaces, Java EE consulting, and training ● Manages exadel.org – Exadel's open source projects and community ● Community manager for gotiggr.com prototypes and mobile apps builder
  • 3. 4
  • 4. Exadel is a global software engineering company. ● Founded in 1998, headquarters in San Francisco Bay Area ● 7 development offices in Europe ● 350+ employees
  • 5. Ekaterinburg Moscow Minsk Homyel 5 Kharkov Munich Donetsk
  • 7. Exadel Products exadel.org gotiggr.com ◦ Flamingo ◦ Fiji ◦ jsf4birt ◦ JavaFX Plug-in for Eclipse
  • 8. Exadel Services ● Professional services ● Rich enterprise application development ● Eclipse development ● Custom rich component development ● Mobile development ● Training
  • 9. The Plan Is Simple 1) Ajax features in JSF 2 2) The new RichFaces 4
  • 10. 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
  • 11. JSF 2 is a major upgrade over JSF 1.x Many features, ideas taken from projects such as Seam, RichFaces, and others
  • 12. 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
  • 13. 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
  • 14. <h:form> <h:input value="#{bean.word}"/> <h:commandButton> <f:ajax event="click" 1 execute="@form" 2 listener="#{bean.ajaxListener}" render="out1 out2"/> 3 </h:commandButton> <h:input value="#{bean.text}" id="out1"/> <h:input value="#{bean.phrase}" id="out2"/> </h:form>
  • 15. <h:form> <h:input value="#{bean.word}"/> <h:selectOneMenu value="#{bean.selected}"> <f:selectItems value="#{bean.items}"/> <f:ajax event="change" 1 execute="@form" 2 listener="#{bean.ajaxListener}" render="@form"/> 3 </h:commandButton> <h:input value="#{bean.text}" id="out1"/> <h:input value="#{bean.phrase}" id="out2"/> </h:form>
  • 16. 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
  • 17. That's good, but where do you get rich components and more? A rich component framework is still(?) needed to build real-world Ajax applications.
  • 18. Official RichFaces logo RichFaces 4 is a lightweight, open source framework for JSF 2
  • 19. 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
  • 20. RichFaces 4 100% built on top of JSF2, just extends functionality in JSF 2
  • 21. RichFaces 4 JavaScript is now entirely based on the popular jQuery library
  • 22. RichFaces 4 ● 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
  • 23. RichFaces 4 New client-side validation based on Bean Validation (JSR 303)
  • 24. RichFaces 4 New, and easy to use CDK (Component Development Kit), allows quickly to build your own custom rich components
  • 25. RichFaces 4 Run on: Tomcat 6/7, Resin, JBoss AS 6/7, GlassFish 3.x, WebLogic (run on any server when JSF 2 application can be deployed)
  • 26. RichFaces 4 Run on: Google App Engine (GAE), Amazon EC2, CloudBees
  • 27. RichFaces 4 JSF implementations: Mojarra or MyFaces
  • 28. RichFaces 4 Any browser
  • 29. RichFaces 4 Tooling support through JBoss Tools, IntelliJ, NetBeans
  • 30. RichFaces 4 Zero-configuration, just drop RichFaces into the application
  • 31. 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
  • 32. 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
  • 33. RichFaces 4 Let's look at RichFaces features in more detail...
  • 34. RichFaces 4 core – sending an Ajax request ● <a4j:ajax> ● <a4j:commandButton> ● <a4j:commandLink> ● <a4j:jsFunction> ● <a4j:poll> ● <a4j:push>
  • 35. RichFaces 4 It's important to say it again, RichFaces only extends and upgrades JSF 2...
  • 36. 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> <f:ajax execute="@form" render="output"/> </h:commandButton> <h:commandButton> <a4j:ajax execute="@form" render="output"/> </h:commandButton>
  • 37. <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
  • 38. <a4j:commandButton/Link> – button and link with built-in Ajax behavior <a4j:commandButton value="Save" action="#{bean.action}" render="output" /> <a4j:commandLink value="Save" action="#{bean.action}" render="output" />
  • 39. When using standard JSF button: <h:form> <h:inputText> <h:selectOneMenu> Need to set <h:commandButton> execute=”@form” <f:ajax execute="@form"/> (or execute=”id1 id2”) </h:commandButton> <h:form> When using RichFaces button: <h:form> RichFaces default <h:inputText> <h:selectOneMenu> value for <a4j:commandButton/> button/link <h:form> execute=”@form”
  • 40. <a4j:jsFunction> – fire Ajax request from any JavaScript function, HTML event <table> ... <td onmouseover="update('yellow')"/> ... </table> <h:form> <a4j:jsFunction name="update" action="#{bean.change}" render="..."> <a4j:param value="param1" assignTo="#{bean.color}"/> </a4j:jsFunction> </h:form>
  • 41. If you had to pick just one Ajax control, you would want <a4j:jsFunction> <h:commandButton action="#{bean.change}"> <a4j:ajax render="id"/> </h:commandButton> Is the same as: <h:commandButton onclick="sendAjax();"/> <a4j:jsFunction name="sendAjax" action="#{bean.change}" render="id"/>
  • 42. <a4j:poll> – periodically send an Ajax request <a4j:poll interval="1000" action="#{bean.count}" render="output" enabled="#{bean.pollEnabled}" /> <h:panelGrid id="output"> ... </h:panelGrid>
  • 43. <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" ondataavailable="alert(event.rf.data)" />
  • 44. RichFace 4 core – advanced rendering features ● <a4j:outputPanel> ● limitRender attribute ● render=”{bean.renderList}”
  • 45. <a4j:outputPanel> – auto rendered panel <a4j:commandButton value="Save" action="#{bean.save}"> <a4j:commandButton value="Edit" action="#{bean.edit}"> <a4j:outputPanel ajaxRendered="true"> <h:panelGrid> ... </h:panelGrid> </a4j:outputPanel> <a4j:outputPanel ajaxRendered="true"> <rich:dataTable> ... </rich:dataTable> </a4j:outputPanel>
  • 46. Turning off auto rendered panels <a4j:commandButton value="Save" action="#{bean.save}"> <a4j:commandButton value="Edit" action="#{bean.edit}" render="edit" limitRender="true"> <a4j:outputPanel ajaxRendered="true"> <h:panelGrid> ... </h:panelGrid> </a4j:outputPanel> <h:panelGrid id="edit"> <rich:dataTable> ... </rich:dataTable> </h:panelGrid>
  • 47. 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
  • 48. RichFace 4 core – advanced execute features ● <a4j:region> ● bypassUpdates attribute
  • 49. <a4j:region> – defining execute region declaratively <h:form> <a4j:region> <h:inputText /> <h:inputText /> <h:selectOneMenu /> <a4j:commandButton /> <a4j:region> </h:form>
  • 50. Skipping phases when validating 1.Restore View 2.Apply Request Values 3.Process Validation 4.Update Model 5.Invoke Application 6.Render Response <h:inputText id="name" value="#{bean.name}"/> <a4j:ajax event="blur" bypassUpdates="true"/> </h:inputText> <rich:message for="name"/>
  • 51. JavaScript callbacks during Ajax request <a4j:commandLink value="Link" onbegin="ajaxOnBegin()" onbeforedomupdate="ajaxOnBeforeDomUpdate()" oncomplete="ajaxOnComplete()"> </a4j:commandLink>
  • 52. 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
  • 53. <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:commandButton id="buttonA" value="Button A"/> <a4j:commandButton id="buttonB" value="Button B"/>
  • 54. <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:commandButton id="buttonA" value="Button A"> <a4j:attachdQueue requestGroupingId="ajaxGroup"/> </a4j:commandButton> <a4j:commandButton id="buttonB" value="Button B"> <a4j:attachdQueue requestGroupingId="ajaxGroup"/> </a4j:commandButton>
  • 55. <a4j:queue> – setting request delay allows “waiting” for requests from same component in order to merge events <a4j:queue requestDelay="1000"/> <a4j:commandButton id="buttonA" value="Button A"> <a4j:attachdQueue requestDelay="2000"/> </a4j:commandButton> <a4j:commandButton id="buttonB" value="Button B"/>
  • 56. <a4j:queue> – ignoring “stale” responses <a4j:queue requestDelay="2000 ingoreDupResponses="true"/> <h:inputText value="#{bean.state}"> <a4j:ajax event="keyup" listener="#{bean.load}" render="states"/> </h:inputText>
  • 57. RichFace 4 core – more advanced features ● <a4j:status> ● <a4j:param> ● <a4j:log> ● JavaScript interactions
  • 58. <a4j:status> – Ajax request status <a4j:status name="ajaxStatus"> <f:facet name="start"> <h:graphicImage value="ajaxStatus.jpg"/> </f:facet> </a4j:status> <h:form> <a4j:commandButton status="ajaxStatus"/> </h:form>
  • 59. <a4j:param> - like <f:param>, but simpler as it also assigns the value to a bean property automatically <a4j:commandButton value="Save"> <a4j:param value="1009" assignTo="#{bean.product}"/> </a4j:commandButton> public class Bean { private String product; public void setProduct (String product) {...} }
  • 60. Another great feature is that <a4j:param> value can contain any JavaScript expression or JavaScript function, when noEscape="true" <a4j:param name="width" value="(jQuery(window).width()/2)" assignTo="#{bean.screenWidth}" noEscape="true" />
  • 61. <a4j:log> – Ajax request/response information, logging
  • 62. RichFaces UI components ● Output, panels ● Input ● Menu ● Data iteration ● Tree ● Drag and drop ● Client side validation ● Miscellaneous
  • 64. More rich output, panels ● rich:panel ● rich:togglePanel ● rich:popupPanel ● rich:collapsiblePanel ● rich:toolTip
  • 65. <rich:popupPanel> can be modal and non-modal <rich:popupPanel modal="false"> <f:facet name="header"> Edit User </f:facet> ... ... </rich:popupPanel>
  • 67. More rich input ● rich:inputNumberSpinner ● rich:inplaceSelect ● rich:select ● rich:fileUpload
  • 70. 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"
  • 71. Deciding what rows/cell to update in run-time render="tableId:rows(bean.rowsSet)" render="tableId:rows(bean.rowsSet):cellId"
  • 72. New collapsible sub table component
  • 74. <rich:extendedDataTable> provides lazy loading, column resizing, reorder and more
  • 75. More rich data iteration ● a4j:repeat ● rich:extendedDataTable ● rich:collapsibleSubTable ● rich:list ◦ list | ordered | definition ● rich:dataGrid ● rich:column ◦ Column and row spanning ◦ Filtering, sorting
  • 78. 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.
  • 79. Invoking component JavaScript API using #{rich:component(id)} function <input type="button" onclick="#{rich:component('popup')}.show();" value="Open" /> <rich:popupPanel id="popup"> <h:outputLink value="#" onclick="#{rich:component('popup')}.hide(); return false;"> <h:outputText value="Close"/> </h:outputLink> </rich:popupPanel>
  • 80. Invoking component JavaScript API using <rich:componentControl> component <h:outputLink value="#"> <h:outputText value="Open" /> <rich:componentControl event="click" target="popup" operation="show" /> </h:outputLink> <rich:popupPanel header="RichFaces" id="popup"> <h:outputLink value="#"> <h:outputText value="Close" /> <rich:componentControl event="click" target="popup" operation="hide" /> </h:outputLink> </rich:popupPanel>
  • 81. <rich:accordion id="c"> <rich:accordionItem header="New York" name="nyc"> <h:outputText value="You selected New York"/> </rich:accordionItem> <rich:accordionItem header="San Francisco" name="sf"> <h:outputText value="You selected San Francisco"/> </rich:accordionItem> ... </rich:accordion>
  • 82. <input type="button" value="New York City" onclick="#{rich:component('c')}.switchToItem('nyc')"/> <input type="button" value="San Francisco" onclick="#{rich:component('c')}.switchToItem('sf')"/> <input type="button" value="Los Angeles" onclick="#{rich:component('c')}.switchToItem('la')"/> <input type="button" value="First" onclick="#{rich:component('c')}.switchToItem('@first')"/> <input type="button" value="Next" onclick="#{rich:component('c')}.switchToItem('@next')"/> <input type="button" value="Previous" onclick="#{rich:component('c')}.switchToItem('@prev')"/> <input type="button" value="Last" onclick="#{rich:component('c')}.switchToItem('@last')"/>
  • 83. 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
  • 84. Standard Java EE security with #{rich:isUserInRole(role)} function <rich:panel header="Admin panel" rendered="#{rich:isUserInRole('admin')}"> Very sensitive information </rich:panel> <rich:panel header="User panel"> General information </rich:panel> ● Calls facesContext.getExternalContext.getUserInRole(role) ● What's good is that security roles can be defined anywhere
  • 85. Client-side validation based on Bean Validation (JSR 303) New in RichFaces 4
  • 86. Bean Validation (JSR 303) JSF 2 has support for Bean Validation (validation done on server) Bean: public class Bean { @Pattern(regexp="...") private String email; } JSF page: <h:inputText id="email" value="#{bean.email}"> <a4j:ajax event="blur"/> </h:inputText> <rich:message for="email"/>
  • 87. 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 { @Pattern(regexp="...") private String email; } JSF page: <h:inputText id="email" value="#{bean.email}"> <rich:validator /> </h:inputText> <rich:message for="email"/>
  • 88. Cross field validation with <rich:graphValidator> @Size(min=5,max=15) private String password1; @Size(min=5,max=15) private String password2; @AssertTrue(message="Passwords don't match") public boolean checkPassword() { return password1.equals(password1); } <rich:graphValidator value="#{bean}" id="crossField"> <h:inputText value="#{bean.password1}"/> <h:inputText value="#{bean.password2}"/> <rich:message for="email" for="crossField"/> </rich:graphValidator>
  • 89. Rich miscellaneous ● <rich:componentControl> ● <rich:hashParam> ● <rich:jQuery>
  • 90. <rich:componentControl> ● Allows to call JS API on a component in declarative fashion <h:outputLink id="openLink" value="#"> <h:outputText value="Open" /> <rich:componentControl event="click" operation="show" target="popup" /> </h:outputLink> <rich:popupPanel id="popup"> ... </rich:popupPanel>
  • 91. <rich:hashParam> - creates JavaScript hash, can be passed to another client function. <h:commandButton value="Show popup"> <rich:componentControl target="pp" operation="show"> <rich:hashParam> <f:param name="width" value="500" /> <f:param name="height" value="300" /> <f:param name="minWidth" value="300" /> <f:param name="minHeight" value="150" /> </rich:hashParam> </rich:componentControl> </h:commandButton
  • 92. Using jQuery with <rich:jQuery> <input type="button" id=" value="Update panel"/> <rich:jQuery selector="#changeButton" event="click" query="$('#nycInfo .rf-p-hdr').text('New York City'); $('.rf-p-b').css('color', 'blue');" />
  • 93. Using jQuery when page rendered to create zebra-like styling for table
  • 94. <style> .even-row { background-color: #FCFFFE; } .odd-row { background-color: #ECF3FE; } </style> <rich:dataTable id="gamesTable"> // columns </rich:dataTable> <rich:jQuery selector="#gamesTable tr:odd" query="addClass('odd-row')" /> <rich:jQuery selector="#gamesTable tr:even" query="addClass('even-row')" />
  • 95. Invoking <rich:jQuery> as a regular JavaScript function with mouse over <h:graphicImage width="100" value="/images/venice.png" onmouseover="larger(this, {})" onmouseout="normal(this, {})" /> <rich:jQuery name="larger" query="animate({width:'241px'})" /> <rich:jQuery name="normal" query="animate({width:'100px'})"/>
  • 96. Skins
  • 97. 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
  • 98. Ready-to-use skins ● classic ● wine ● blueSky ● ruby ● emeraldTown ● deepMarine <context-param> ● plain <param-name>org.richfaces.skin</param-name> <param-value>ruby</param-value> ● japanCherry </context-param>
  • 100. Skins ● Modify existing or create your own <context-param> <param-name>org.richfaces.skin</param-name> <param-value>myCoolSkin</param-value> </context-param> ● Change skins in runtime <context-param> <param-name>org.richfaces.skin</param-name> <param-value>#{bean.skin}</param-value> </context-param>
  • 101. Overwriting Skin CSS <style> .rf-p-hdr { color: … font-size: … font-weight: … font-family: … } </style> <rich:panel>...</rich:panel>
  • 102. Overwriting Skin CSS <style> .rf-p-hdr { // overwrite skin CSS properties } .specialHeader { // define custom CSS for specific panel } </style> <rich:panel id="panel1"> ... <rich:panel> <rich:panel id="panel2" headerClass="specialHeader"> ... <rich:panel>
  • 103. Skinning standard JSF tags and HTML tags Apply to each control: <h:button style="background-color: '#{richSkin.tableBackgroundColor}'"/>
  • 104. Skinning standard JSF tags and HTML tags automatically Apply to all standard controls (JSF and HTML): <context-param> <param-name> org.richfaces.enableControlSkinning </param-name> <param-value>true</param-value> </context-param>
  • 105. Skinning standard JSF tags and HTML tags only when special CSS class is applied to parent container <context-param> <param-name> org.richfaces.enableControlSkinningClasses </param-name> <param-value>true</param-value> </context-param> <div class="rfs-ctn"> <h:outputText /> <h:inputText /> <h:commandButton /> </div>
  • 106. Where can I try the new RichFaces 4? http://richfaces.org/showcase
  • 107. RichFaces 4.1 (Fall 2011) Mobile support New components: Pick list Ordering list Rich text editor
  • 108. 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
  • 109. RichFaces Rich, flexible, robust, and proven enterprise-level framework to JSF 2
  • 110. max@exadel.com Thank @maxkatz you! mkblog.exadel.com gotiggr.com