SlideShare a Scribd company logo
1 of 110
Download to read offline
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

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

RichFaces 4 Webinar - New and Advanced Features
RichFaces 4 Webinar - New and Advanced FeaturesRichFaces 4 Webinar - New and Advanced Features
RichFaces 4 Webinar - New and Advanced FeaturesMax Katz
 
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4Max Katz
 
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJS
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJSAjax Applications with JSF 2 and New RichFaces 4 - TSSJS
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJSMax Katz
 
RichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To KnowRichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To KnowMax Katz
 
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF SummitAjax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF SummitMax Katz
 
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011Max Katz
 
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011Max Katz
 
Hands On With Rich Faces 4 - JavaOne 2010
Hands On With Rich Faces 4 - JavaOne 2010Hands On With Rich Faces 4 - JavaOne 2010
Hands On With Rich Faces 4 - JavaOne 2010Max Katz
 
Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
Ajax Applications with JSF 2 and new RichFaces 4 - HerbstcampusAjax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
Ajax Applications with JSF 2 and new RichFaces 4 - HerbstcampusMax Katz
 
RichFaces: rich:* component library
RichFaces: rich:* component libraryRichFaces: rich:* component library
RichFaces: rich:* component libraryMax Katz
 
Going Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and SeamGoing Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and SeamLincoln III
 
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4balunasj
 
Introduction to RichFaces
Introduction to RichFacesIntroduction to RichFaces
Introduction to RichFacesMax Katz
 
RichFaces 4 Component Deep Dive - JAX/JSFSummit
RichFaces 4 Component Deep Dive - JAX/JSFSummitRichFaces 4 Component Deep Dive - JAX/JSFSummit
RichFaces 4 Component Deep Dive - JAX/JSFSummitbalunasj
 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Arun Gupta
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen LjuSkills Matter
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen LjuSkills Matter
 
Extending eZ Platform v2 with Symfony and React
Extending eZ Platform v2 with Symfony and ReactExtending eZ Platform v2 with Symfony and React
Extending eZ Platform v2 with Symfony and ReacteZ Systems
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces Skills Matter
 
Ajax Applications with RichFaces and JSF 2
Ajax Applications with RichFaces and JSF 2Ajax Applications with RichFaces and JSF 2
Ajax Applications with RichFaces and JSF 2Max Katz
 

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

RichFaces 4 Webinar - New and Advanced Features
RichFaces 4 Webinar - New and Advanced FeaturesRichFaces 4 Webinar - New and Advanced Features
RichFaces 4 Webinar - New and Advanced Features
 
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
RichFaces 4 webinar #2: RichFaces 3 toRichFaces 4
 
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJS
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJSAjax Applications with JSF 2 and New RichFaces 4 - TSSJS
Ajax Applications with JSF 2 and New RichFaces 4 - TSSJS
 
RichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To KnowRichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To Know
 
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF SummitAjax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
Ajax Applications with JSF 2 and New RichFaces 4 - JAX/JSF Summit
 
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
 
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
 
Hands On With Rich Faces 4 - JavaOne 2010
Hands On With Rich Faces 4 - JavaOne 2010Hands On With Rich Faces 4 - JavaOne 2010
Hands On With Rich Faces 4 - JavaOne 2010
 
Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
Ajax Applications with JSF 2 and new RichFaces 4 - HerbstcampusAjax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus
 
RichFaces: rich:* component library
RichFaces: rich:* component libraryRichFaces: rich:* component library
RichFaces: rich:* component library
 
Going Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and SeamGoing Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and Seam
 
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
A Peek At The Future: Going Beyond JavaServer Faces 2.0 With RichFaces 4
 
Introduction to RichFaces
Introduction to RichFacesIntroduction to RichFaces
Introduction to RichFaces
 
RichFaces 4 Component Deep Dive - JAX/JSFSummit
RichFaces 4 Component Deep Dive - JAX/JSFSummitRichFaces 4 Component Deep Dive - JAX/JSFSummit
RichFaces 4 Component Deep Dive - JAX/JSFSummit
 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen Lju
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen Lju
 
Extending eZ Platform v2 with Symfony and React
Extending eZ Platform v2 with Symfony and ReactExtending eZ Platform v2 with Symfony and React
Extending eZ Platform v2 with Symfony and React
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
 
Ajax Applications with RichFaces and JSF 2
Ajax Applications with RichFaces and JSF 2Ajax Applications with RichFaces and JSF 2
Ajax Applications with RichFaces and JSF 2
 

More from Max Katz

Using cloud tools to build enterprise mobile apps with APIs fast
Using cloud tools to build enterprise mobile apps with APIs fast Using cloud tools to build enterprise mobile apps with APIs fast
Using cloud tools to build enterprise mobile apps with APIs fast Max Katz
 
Wolters Kluwer Tech. Conference: Disrupting Mobile Development
Wolters Kluwer Tech. Conference: Disrupting Mobile DevelopmentWolters Kluwer Tech. Conference: Disrupting Mobile Development
Wolters Kluwer Tech. Conference: Disrupting Mobile DevelopmentMax Katz
 
Tiggzi at DC jQuery Meetup
Tiggzi at DC jQuery MeetupTiggzi at DC jQuery Meetup
Tiggzi at DC jQuery MeetupMax Katz
 
Learn How to Build Mobile Apps Using Cloud Services
Learn How to Build Mobile Apps Using Cloud ServicesLearn How to Build Mobile Apps Using Cloud Services
Learn How to Build Mobile Apps Using Cloud ServicesMax Katz
 
Building Mobile Apps With jQuery For Any Device In The Cloud
Building Mobile Apps With jQuery For Any Device In The Cloud Building Mobile Apps With jQuery For Any Device In The Cloud
Building Mobile Apps With jQuery For Any Device In The Cloud Max Katz
 
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011Max Katz
 
Devoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
Devoxx2010 - Mobile Development Choices: Native Apps vs Web AppsDevoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
Devoxx2010 - Mobile Development Choices: Native Apps vs Web AppsMax Katz
 
RichFaces skins
RichFaces skinsRichFaces skins
RichFaces skinsMax Katz
 
RichFaces: more concepts and features
RichFaces: more concepts and featuresRichFaces: more concepts and features
RichFaces: more concepts and featuresMax Katz
 
Rich Enterprise Applications with JavaFX
Rich Enterprise Applications with JavaFXRich Enterprise Applications with JavaFX
Rich Enterprise Applications with JavaFXMax Katz
 
Building RIA Applications with JavaFX
Building RIA Applications with JavaFXBuilding RIA Applications with JavaFX
Building RIA Applications with JavaFXMax Katz
 
Building RIA Applications with RichFaces
Building RIA Applications with RichFacesBuilding RIA Applications with RichFaces
Building RIA Applications with RichFacesMax Katz
 

More from Max Katz (12)

Using cloud tools to build enterprise mobile apps with APIs fast
Using cloud tools to build enterprise mobile apps with APIs fast Using cloud tools to build enterprise mobile apps with APIs fast
Using cloud tools to build enterprise mobile apps with APIs fast
 
Wolters Kluwer Tech. Conference: Disrupting Mobile Development
Wolters Kluwer Tech. Conference: Disrupting Mobile DevelopmentWolters Kluwer Tech. Conference: Disrupting Mobile Development
Wolters Kluwer Tech. Conference: Disrupting Mobile Development
 
Tiggzi at DC jQuery Meetup
Tiggzi at DC jQuery MeetupTiggzi at DC jQuery Meetup
Tiggzi at DC jQuery Meetup
 
Learn How to Build Mobile Apps Using Cloud Services
Learn How to Build Mobile Apps Using Cloud ServicesLearn How to Build Mobile Apps Using Cloud Services
Learn How to Build Mobile Apps Using Cloud Services
 
Building Mobile Apps With jQuery For Any Device In The Cloud
Building Mobile Apps With jQuery For Any Device In The Cloud Building Mobile Apps With jQuery For Any Device In The Cloud
Building Mobile Apps With jQuery For Any Device In The Cloud
 
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
Mobile Development Choices: Native Apps vs. Web Apps at JAX 2011
 
Devoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
Devoxx2010 - Mobile Development Choices: Native Apps vs Web AppsDevoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
Devoxx2010 - Mobile Development Choices: Native Apps vs Web Apps
 
RichFaces skins
RichFaces skinsRichFaces skins
RichFaces skins
 
RichFaces: more concepts and features
RichFaces: more concepts and featuresRichFaces: more concepts and features
RichFaces: more concepts and features
 
Rich Enterprise Applications with JavaFX
Rich Enterprise Applications with JavaFXRich Enterprise Applications with JavaFX
Rich Enterprise Applications with JavaFX
 
Building RIA Applications with JavaFX
Building RIA Applications with JavaFXBuilding RIA Applications with JavaFX
Building RIA Applications with JavaFX
 
Building RIA Applications with RichFaces
Building RIA Applications with RichFacesBuilding RIA Applications with RichFaces
Building RIA Applications with RichFaces
 

Recently uploaded

Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 

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