SlideShare une entreprise Scribd logo
1  sur  76
Télécharger pour lire hors ligne
Exadel




Ajax Applications with JSF 2
and New RichFaces 4

Herbstcampus
September 13th, 2010

Max Katz
Exadel
Exadel




Who is this guy?
● Senior Systems     Engineer, RIA strategist at
 Exadel
   ◦ http://mkblog.exadel.com
   ◦ http://twitter.com/maxkatz
● JSF/RichFaces consulting, training
● Leads   a number of projects:
  ◦   Exadel Tiggr
  ◦   Exadel Flamingo
  ◦   Exadel Fiji
  ◦   Exadel JavaFX Plug-in for Eclipse
Exadel




    Author of         Co-author of RichFaces
Practical RichFaces       DZone Refcard
     (Apress)
Exadel




Exadel
● Products        and services company
● Founded in 1998, headquarters in
  Concord, CA
● 350+        employees
           City         Country        Year
 Concord             California, USA   1998
 Moscow                  Russia        1999
 Minsk                  Belarus        2002
 Vitebsk                Belarus        2005
 Donetsk, Kharkov       Ukraine        2006
Exadel




Products
● Open    Source with JBoss
  ◦ RichFaces
  ◦ JBoss Tools/JBoss Developer Studio
● Tiggr   – create and share mockups online
● Flamingo
● Fiji   (JSF – JavaFX/Flex integration)
● jsf4birt   (JSF – BIRT/Actuate integration)
● JavaFX     Plug-in for Eclipse
Exadel




Services
● Rich enterprise application
 development
● Eclipse development
● Custom rich   component development
● Mobile   development
● Training
● Most projects   are done in Eastern
 Europe
Exadel




The Plan
● Ajax features in   JSF 2
● The   new RichFaces 4
Exadel




JSF 2
● JSF   2 is a major upgrade over JSF 1.x
● Many features, ideas taken from
 projects such as Seam and RichFaces,
 and others
Exadel




JSF 2 new features
● Facelets             ● New    scopes
● Composite              ◦ Flash, View,
 components                custom
● Navigation           ● Configuration

● GET   support          ◦ Annotations
                       ● Bean Validation
  ◦ Page parameters
                        support
  ◦ h:link, h:button
                       ● Ajax
● Resource   loading
Exadel




JSF 2 <f:ajax>
● Basic Ajax   functionality
● Greatyinspired by RichFaces 3
 <a4j:support> tag
● Ajax in   JSF in 3 easy steps:
  ◦ How to send an Ajax request
  ◦ Partial view processing
  ◦ Partial view rendering
Exadel

                                                     What to execute on the
Event based on                                       server:
                                                     ● @all
which to fire the                                    ● @this (default)
Ajax request                                         ● @form

                                                     ● @none

                                                     ● Id's

                                                     ● EL


             <h:inputText>
               <f:ajax event="keyup"
                     execute="@form"
                     render="id1 id2"
                     listener="#{bean.ajaxListener}"
                     onevent="someFunction();"/>
             <h:inputText>
                                                          Optional server listener
Partial view rendering:
● @all

● @this

● @form                     Optional name of JavaScript
● @none (default)           function to execute during
● Id's                      Ajax request. Invoked 3 times,
● EL                        at: begin, success, complete steps
Exadel




        Using <f:ajax>
<h:commandButton value="Submit" action="#{bean.action}" >
   <f:ajax event="focus" execute="@form" render="output"/>
</h:commandButton>
<h:panelGrid id="output">
 ...                                             Attaching to button,
                                                 specifying event
</h:panelGrid>


<h:commandButton value="Submit" action="#{bean.action}" >
   <f:ajax execute="@form" render="output output2"/>
</h:commandButton>
<h:panelGrid id="output">
 ...
</h:panelGrid>
<h:panelGrid id="output2">
 ...                                       No event specified,
</h:panelGrid>                             using default event
Exadel




       Using <f:ajax>
                                                  Default event is onchange

<h:inputText value="#{bean.text}" >
   <f:ajax event="keyup" render="text"/>
</h:inputText>
<h:outputText id="text" value="#{bean.text}" />

                                         No event specified so using default

<h:selectOneListbox id="list" value="#{bean.choice}" >
   <f:selectItems value="#{cean.choiceList}" />
   <f:ajax render="info" listener="#{bean.change}"/>
</h:selectOneListbox>

<h:panelGrid id="info">
 ...
</h:panelGrid>
Exadel

<f:ajax>
  <h:panelGrid>               No default event, no Ajax added
    <h:selectBooleanCheckbox>                                       onchange
    <h:inputText>                                      onchange
    <h:commandButton>                                       onclick
  </h:panelGrid>
</f:ajax>

<f:ajax event="click">
  <h:panelGrid>                                       onclick
    <h:selectBooleanCheckbox>                                             onclick
    <h:inputText>                                          onclick
    <h:commandButton>                             onclick and onfocus
     <f:ajax event="focus"/>
    </h:commanButton>
  </h:panelGrid>
</f:ajax>

<f:ajax event="valueChange">
  <h:panelGrid>                                 No Ajax added
    <h:selectBooleanCheckbox>                                           onchange
    <h:inputText>                                     onchange
    <h:commandButton>                                        onfocus
     <f:ajax event="focus"/>
    </h:commanButton>
  </h:panelGrid>
</f:ajax>
Exadel



RichFaces 4 – rich JSF
framework
● JSF   2 based
● Ajax components

  ◦ a4j:* tag library (core)
  ◦ rich:* tag library (UI)
● Skins and themes
● CDK –   Component Development Kit
Exadel




 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 only has basic JSF 2 support
Exadel




What about deployment?
● All servers
● All browsers

  ◦ (Event IE 6.0)
Exadel




RichFaces history
2004: started by Alexander Smirnov
2004-2007: Ajax4jsf – free, open source
           RichFaces – commercial
           Exadel
2007: JBoss takes over
      Exadel team continues to develop
      the framework
Exadel




Just tell me when RichFaces 4
   is going to be released?
Exadel




RichFaces 4

JavaScript in RichFaces is now entirely
 based on the popular jQuery library.
Exadel




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
Exadel




RichFaces 4
● Newand easy to use CDK
 (Component Development Kit)
● Quickly build your   own custom rich
 components
Exadel




Google App Engine
● DeployRichFaces application in
 Google App Engine (GAE)
● Special maven-based   plug-in
 available
Exadel




RichFaces <a4j:ajax>
● 100% based on     standard <f:ajax>
● Just replacef: with a4j: and get
 exactly the same functionality
● But,   you get extra features...
Exadel



  <a4j:ajax> attributes
         Attribute                 Description

onbegin              JavaScript to execute before Ajax request
                     JavaScript to execute after response
onbeforedomupdate
                     comes back but before DOM update
oncomplete           JavaScript to execute after DOM update
                     Skips Update Model and Invoke
bypassUpdates        Application phases, useful for form
                     validation
                     Skips all a4j:outputPanel
limitRender          ajaxRender=”true” areas. Only renders
                     what is set in current render
status               Status to display during Ajax request

                     Sets focus on component after Ajax
focus
                     request
Exadel




RichFaces 4
That's not all, there are more RichFaces
                 goodies...
Exadel




RichFaces 4 core action
● a4j:ajax
● a4j:commandButton
● a4j:commandLink
● a4j:jsFunction
● a4j:poll
● a4j:push
Exadel



      <a4j:commandButton> –
      Ajax button
<h:commandButton value="Save" action="#{bean.action}">
   <f:ajax execute="@form"
           render="output"/>
</h:commandButton>



<a4j:commandButton value="Save"
     execute="@form"
     render="output"
     action="#{bean.action}" />
Exadel


      <a4j:jsFunction> – fire Ajax
      request from any JavaScript
      function
<table>
   ...
   <td onmouseover="update('yellow')"/>
   ...
</table>
<a4j:jsFunction name="update"
                action="#{bean.change}"
                reRender="panel">
  <a4j:param value="param1" assignTo="#{bean.color}"/>
</a4j:jsFunction>
Exadel



      <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>
Exadel




RichFace 4 core
● a4j:outputPanel
● a4j:status
● a4j:region
● a4j:queue
● a4j:repeat
● a4j:log
Exadel



       <a4j:outputPanel> – auto
       rendered panel

<h:selectOneMenu value="#{bean.fruit}">
   <a4j:ajax listener="#{bean.change}"/>
</<h:selectOneMenu>
<a4j:outputPanel ajaxRendered="true">
   <h:panelGrid>
      ...
   </h:panelGrid>
                                 Rendered on every Ajax request
   <h:panelGrid>
      ...
   </h:panelGrid>
</a4j:outputPanel>
Exadel



      <a4j:status> – Ajax request
      status

<a4j:status startText="Loading..."/>

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

<h:form>
   <a4j:commandButton />
   <a4j:commandButton status="ajaxSpecial"/>
</h:form>
Exadel



<a4j:region> – declaratively
define execute region
<h:form>
  <a4j:region>                              Execute options:
                                            @all●

     <h:inputText />                        @this (default)
                                                ●


     <h:inputText />                        @form
                                                ●


     <a4j:commandButton execute="@region"/> @none
                                                ●

                                            Id's●

  <a4j:region>                              EL  ●

</h:form>                                   @region
                                                ●




<h:form>
  <a4j:region>
     <h:inputText />
     <h:inputText />
     <a4j:commandButton />
  <a4j:region>
</h:form>
Exadel



<a4j:log> – Ajax request
information
● Levels:

  ◦ debug, info, warn, error
Exadel




          JavaScript interactions


<a4j:commandLink value="Link"
   onbegin="alert('Link clicked')"
   onbeforedomupdate="alert('Response received')"
   oncomplete="alert('DOM updated')">
</a4j:commandLink>



Easier to use than the standard onevent
Exadel




      Advanced rendering option

<a4j:commandButton render="output"/>
<a4j:commandButton render="output" limitRender="true"/>

<h:panelGrid id="output">
                               Turns off all auto rendered panels,
...
                               only renders what is set in current
</h:panelGrid>                 render

<a4j:outputPanel ajaxRendered="true">
...
</a4j:outputPanel>
Exadel



      Skipping phases when
      validating

<h:inputText id="name" value="#{bean.name}"/>
   <a4j:ajax event="blur" bypassUpdates="true"/>
</h:inputText>
<rich:message for="name"/>


                 1.Restore View
                 2.Apply Request Values
                 3.Process Validation
                 4.Update Model       Skipped
                 5.Invoke Application
                 6.Render Response
Exadel




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
Exadel




RichFaces queue upgrades
● Delay firing   of a request
● Combine requests      from one or more controls
● Cancel DOM       updates if the same request was
 fired
● Define   queue as:
  ◦   Global (all views have queue)
  ◦   View-based
  ◦   Form-based
  ◦   Named (used by particular components only)
Exadel




      RichFaces <a4j:queue>
<a4j:queue requestDelay="2000"/>
...
<a4j:commandButton value="Button1"/>
<a4j:commandButton value="Button2"/>




<a4j:queue requestDelay="2000"/>
...
<a4j:commandButton>
   <a4j:attachQueue requestDelay="1000"/>
</a4j:commmandButton>
<a4j:commandButton />
Exadel



      a4j:queue – “combining”
      events

<a4j:queue requestDelay="2000"/>
...
<a4j:commandButton>
   <a4j:attachQueue requestGroupingId="mainGroup"/>
</a4j:commmandButton>
<a4j:commandButton>
   <a4j:attachQueue requestGroupingId="mainGroup"/>
</a4j:commmandButton>
Exadel



      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>

<h:dataTable id="states">
  <rich:column/>
</h:dataTable>
Exadel




RichFaces UI components
● Data iteration
● Output,   panels
● Input
● Menu
● Trees
● Selects
● Layout
● Client side   validation
● Miscellaneous
Exadel




       Rich data iteration
● a4j:repeat                       ● rich:dataScroller
● rich:dataTable                   ● rich:column
● rich:extendedDataTable           ● Columnand row
● rich:subTable                     spanning
                                   ● Filtering,   sorting
  ◦   rich:subTableToggleControl
● rich:list
● rich:dataGrid
Exadel




       Partial update
                                 Outside the table:
                                 - tableId@header
                                 - tableId@body
                                 - tableId@footer


           @column

                                         @header
@row
                                    @body


                                          @footer




                        cellId
Exadel




   Partial update
● Cell from   within current row:
  render="cellId"

● Row(s)   from outside the table:
  render="tableId:rowKey"
  render="tableId:#{bean.rowKeySet}"

● Cell(s) from   outside the table:
 render="tableId:rowKey:cellId"
 render="tableId:#{bean.rowKeySet}:cellId"
Exadel




Rich output, panels
● rich:panel              ● rich:message(s)
● rich:togglePanel        ● rich:paint2D
● rich:accordion          ● rich:separator
● rich:popupPanel
                          ● rich:toolBar
● rich:tabPanel
                          ● rich:toolTip
● rich:panelBar

● rich:panelMenu

● rich:collapsiblePanel
Exadel




Rich input
● rich:autocomplete
● rich:inputNumberSlider
● rich:inputNumberSpinner
● rich:inplaceInput
● rich:calendar
● rich:colorPicker
● rich:editor
● rich:fileUpload
Exadel




Rich menu
● rich:contextMenu
● rich:dropDownMenu
Exadel




Rich tree
● rich:tree
● rich:treeNode
● Listeners
Exadel




Rich selects
● rich:orderingList
● rich:pickList
● rich:listShuttle
● rich:selectBox
● rich:inplaceSelect
Exadel




Rich layout
● rich:page
● rich:layout

  ◦ rich:layoutPanel
● rich:splitter
Exadel




      Bean Validation (JSR 303)
       ● JSF 2 has support for Bean Validation
         (on the server)
public class Bean {
  @Email
  private String email;
}



<h:inputText id="email" value="#{bean.email}">
   <a4j:ajax event="blur"/>
</h:inputText>
<rich:message for="email"/>
Exadel




      RichFaces client validation

Public class Bean {
  @Email
  private String email;
}


<h:inputText id="email" value="#{bean.email}">
   <rich:clientValidator event="blur"/>
</h:inputText>
<rich:message for="email"/>
Exadel




      RichFaces client validation

<h:form>
   <rich:clientValidator />
   <h:inputText/>
   <h:inputText/>
   <h:inputText>
       <rich:clientValidator event="blur"/>
   </h:inputText>
   <h:inputText>
      <rich:clientValidator disabled="true"/>
   </h:inputText>
</h:form>
Exadel




RichFaces functions
● rich:clientId(id)   - returns component client
 id
● rich:element(id)    - returns DOM element
● rich:component(id)- returns RichFaces
 client component instance to call JS API
 method
● rich:isUserInRole(role)    - returns if the user
 has specified role
● rich:findComponent(id) - returns
 component instance for given short id
Exadel




      rich:component(id) function
       ● Allows   to call JS API on a component

<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>
Exadel




Rich miscellaneous
● rich:componentControl
● rich:jQuery
● rich:hotKey
● rich:gmap
● rich:virtualEarth
Exadel




      <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>
Exadel




      <rich:jQuery>
<input type="button" id="changeButton"
                      value="Change title" />
<rich:jQuery selector="#changeButton"
 query="click(function(){
   $('#panel #panel_header').text('Capital of Russia');
})"/>


<rich:panel header="Moscow" id="panel">
   Moscow is the capital, the most populous ...
</rich:panel>
Exadel




Skins
Exadel




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
Exadel




Ready-to-use skins
● classic
● emeraldTown
● blueSky
● ruby

● wine
● deepMarine
● plain
● japanCherry

● laguna        <context-param>
                  <param-name>org.richfaces.skin</param-name>
● glassX          <param-value>ruby</param-value>
                </context-param>
● darkX
Exadel




      Skin file (properties 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
Exadel




Skins
● Modify   existing or create your own
  <context-param>
    <param-name>org.richfaces.skin</param-name>
    <param-value>myCustomSkin</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>
Exadel




      Overwriting skins
<style>
 .rf-p-hr {
    // your custom style, applied to all panels on
    // on page
  }
 .panelHeader {
    // custom header style
  }
</style>

<rich:panel id="panel1">
...
</rich:panel id="panel2">
<rich:panel headerClass="panelHeader">
...
</rich:panel>
Exadel




Exadel Tiggr
● Create, collaborate and share
 mockups online
● RichFaces    palette
● Upcoming features

  ◦ HTML generation
  ◦ More widgets and controls
● Give   it a try - http://tiggr.exadel.com
Exadel




 Exadel Tiggr – create, share and
collobrate on application mockups

     http://tiggr.exadel.com
Exadel




Exadel Tiggr
Exadel
Exadel

Upload your
own images
as assets
Exadel




http://tiggr.exadel.com
Exadel




Exadel Fiji
● Insert anyFlash/JavaFX widget into
  as JSF component into a JSF page
  ◦ Comes with 7 ready-to-use charts
    (Flash)
   <h:outputText>
   <h:inputText>    JSF page
   <h:dataTable>



    Flash

  <fiji:swf>
Exadel



How can we help with
RichFaces
● Webapplication development with
 RichFaces
● Custom component    development
● Training:
        Training      Days
  JSF 1.2, 2          1-2
  RichFaces 3, 4      1-2
  JSF and RichFaces   2-3
  RichFaces 3 to 4    1-2
Exadel




Thank you!
● max@exadel.com
● http://mkblog.exadel.com
● http://twitter.com/maxkatz
● http://exadel.org

Contenu connexe

Tendances

Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...Codemotion
 
준비하세요 Angular js 2.0
준비하세요 Angular js 2.0준비하세요 Angular js 2.0
준비하세요 Angular js 2.0Jeado Ko
 
Overview of the AngularJS framework
Overview of the AngularJS framework Overview of the AngularJS framework
Overview of the AngularJS framework Yakov Fain
 
AngularJS for Java Developers
AngularJS for Java DevelopersAngularJS for Java Developers
AngularJS for Java DevelopersLoc Nguyen
 
Ultimate Introduction To AngularJS
Ultimate Introduction To AngularJSUltimate Introduction To AngularJS
Ultimate Introduction To AngularJSJacopo Nardiello
 
Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Ivan Chepurnyi
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법Jeado Ko
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular UJoonas Lehtinen
 
Evan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-reduxEvan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-reduxEvan Schultz
 
jQuery and Rails: Best Friends Forever
jQuery and Rails: Best Friends ForeverjQuery and Rails: Best Friends Forever
jQuery and Rails: Best Friends Foreverstephskardal
 
Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJSKrishna Sunuwar
 
Introduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDKIntroduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDKBrendan Lim
 
How Angular2 Can Improve Your AngularJS Apps Today!
How Angular2 Can Improve Your AngularJS Apps Today!How Angular2 Can Improve Your AngularJS Apps Today!
How Angular2 Can Improve Your AngularJS Apps Today!Nir Kaufman
 
Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development Mahmoud Hamed Mahmoud
 
The Road to Native Web Components
The Road to Native Web ComponentsThe Road to Native Web Components
The Road to Native Web ComponentsMike North
 

Tendances (20)

Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
 
AngularJs Crash Course
AngularJs Crash CourseAngularJs Crash Course
AngularJs Crash Course
 
준비하세요 Angular js 2.0
준비하세요 Angular js 2.0준비하세요 Angular js 2.0
준비하세요 Angular js 2.0
 
Overview of the AngularJS framework
Overview of the AngularJS framework Overview of the AngularJS framework
Overview of the AngularJS framework
 
AngularJS for Java Developers
AngularJS for Java DevelopersAngularJS for Java Developers
AngularJS for Java Developers
 
Ultimate Introduction To AngularJS
Ultimate Introduction To AngularJSUltimate Introduction To AngularJS
Ultimate Introduction To AngularJS
 
Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular U
 
Evan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-reduxEvan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-redux
 
jQuery and Rails: Best Friends Forever
jQuery and Rails: Best Friends ForeverjQuery and Rails: Best Friends Forever
jQuery and Rails: Best Friends Forever
 
Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJS
 
Introduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDKIntroduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDK
 
How Angular2 Can Improve Your AngularJS Apps Today!
How Angular2 Can Improve Your AngularJS Apps Today!How Angular2 Can Improve Your AngularJS Apps Today!
How Angular2 Can Improve Your AngularJS Apps Today!
 
Solid angular
Solid angularSolid angular
Solid angular
 
Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development Windows Store app using XAML and C#: Enterprise Product Development
Windows Store app using XAML and C#: Enterprise Product Development
 
AngularJS
AngularJSAngularJS
AngularJS
 
#JavaFX.forReal()
#JavaFX.forReal()#JavaFX.forReal()
#JavaFX.forReal()
 
The Road to Native Web Components
The Road to Native Web ComponentsThe Road to Native Web Components
The Road to Native Web Components
 
AngularJS Basics with Example
AngularJS Basics with ExampleAngularJS Basics with Example
AngularJS Basics with Example
 

En vedette

mozCon 2014 - Shop 'til You Drop: Google Shopping PPC
mozCon 2014 - Shop 'til You Drop: Google Shopping PPC mozCon 2014 - Shop 'til You Drop: Google Shopping PPC
mozCon 2014 - Shop 'til You Drop: Google Shopping PPC Elizabeth Marsten
 
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
 
Introduction to RichFaces
Introduction to RichFacesIntroduction to RichFaces
Introduction to RichFacesMax 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
 
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 #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
 
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
 
What You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSFWhat You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSFMax 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
 
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group MeetupTiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group MeetupMax Katz
 
Tiggzi at DC jQuery Meetup
Tiggzi at DC jQuery MeetupTiggzi at DC jQuery Meetup
Tiggzi at DC jQuery MeetupMax Katz
 
Kaustuv Ghosh Presentation
Kaustuv Ghosh PresentationKaustuv Ghosh Presentation
Kaustuv Ghosh PresentationKaustuv Ghosh.
 
Why Not Do a Startup
Why Not Do a StartupWhy Not Do a Startup
Why Not Do a StartupDave McClure
 

En vedette (15)

mozCon 2014 - Shop 'til You Drop: Google Shopping PPC
mozCon 2014 - Shop 'til You Drop: Google Shopping PPC mozCon 2014 - Shop 'til You Drop: Google Shopping PPC
mozCon 2014 - Shop 'til You Drop: Google Shopping PPC
 
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
 
Introduction to RichFaces
Introduction to RichFacesIntroduction to RichFaces
Introduction to RichFaces
 
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
 
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 #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
 
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
 
What You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSFWhat You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSF
 
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
 
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group MeetupTiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
Tiggr Mobile Apps Builder at Silicon Valley HTML5 Group Meetup
 
Tiggzi at DC jQuery Meetup
Tiggzi at DC jQuery MeetupTiggzi at DC jQuery Meetup
Tiggzi at DC jQuery Meetup
 
Kaustuv Ghosh Presentation
Kaustuv Ghosh PresentationKaustuv Ghosh Presentation
Kaustuv Ghosh Presentation
 
Why Not Do a Startup
Why Not Do a StartupWhy Not Do a Startup
Why Not Do a Startup
 
Storytelling in 2014
Storytelling in 2014Storytelling in 2014
Storytelling in 2014
 

Similaire à Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus

RichFaces 4: Rich Ajax Components For Your JSF Applications
RichFaces 4: Rich Ajax Components For Your JSF ApplicationsRichFaces 4: Rich Ajax Components For Your JSF Applications
RichFaces 4: Rich Ajax Components For Your JSF ApplicationsMax 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
 
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
 
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
 
RichFaces: rich:* component library
RichFaces: rich:* component libraryRichFaces: rich:* component library
RichFaces: rich:* component libraryMax Katz
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen LjuSkills Matter
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen LjuSkills Matter
 
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
 
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
 
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
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Arun Gupta
 
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
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011Arun Gupta
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortalJennifer Bourey
 
vJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemvJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemAndres Almiray
 
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
 
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
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCLFastly
 

Similaire à Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus (20)

RichFaces 4: Rich Ajax Components For Your JSF Applications
RichFaces 4: Rich Ajax Components For Your JSF ApplicationsRichFaces 4: Rich Ajax Components For Your JSF Applications
RichFaces 4: Rich Ajax Components For Your JSF Applications
 
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
 
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
 
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
 
RichFaces: rich:* component library
RichFaces: rich:* component libraryRichFaces: rich:* component library
RichFaces: rich:* component library
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen Lju
 
Primefaces Nextgen Lju
Primefaces Nextgen LjuPrimefaces Nextgen Lju
Primefaces Nextgen Lju
 
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
 
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
 
Jsf Ajax
Jsf AjaxJsf Ajax
Jsf Ajax
 
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
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
 
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
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortal
 
vJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemvJUG - The JavaFX Ecosystem
vJUG - The JavaFX Ecosystem
 
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
 
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
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
Web without framework
Web without frameworkWeb without framework
Web without framework
 

Plus de 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
 
Tiggr - Web-based IDE for Mobile Web And Native Apps
Tiggr - Web-based IDE for Mobile Web And Native AppsTiggr - Web-based IDE for Mobile Web And Native Apps
Tiggr - Web-based IDE for Mobile Web And Native AppsMax 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
 
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
 
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
 

Plus de Max Katz (8)

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
 
Tiggr - Web-based IDE for Mobile Web And Native Apps
Tiggr - Web-based IDE for Mobile Web And Native AppsTiggr - Web-based IDE for Mobile Web And Native Apps
Tiggr - Web-based IDE for Mobile Web And Native Apps
 
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
 
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
 
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
 

Dernier

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfOverkill Security
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 

Dernier (20)

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Ajax Applications with JSF 2 and new RichFaces 4 - Herbstcampus

  • 1. Exadel Ajax Applications with JSF 2 and New RichFaces 4 Herbstcampus September 13th, 2010 Max Katz Exadel
  • 2. Exadel Who is this guy? ● Senior Systems Engineer, RIA strategist at Exadel ◦ http://mkblog.exadel.com ◦ http://twitter.com/maxkatz ● JSF/RichFaces consulting, training ● Leads a number of projects: ◦ Exadel Tiggr ◦ Exadel Flamingo ◦ Exadel Fiji ◦ Exadel JavaFX Plug-in for Eclipse
  • 3. Exadel Author of Co-author of RichFaces Practical RichFaces DZone Refcard (Apress)
  • 4. Exadel Exadel ● Products and services company ● Founded in 1998, headquarters in Concord, CA ● 350+ employees City Country Year Concord California, USA 1998 Moscow Russia 1999 Minsk Belarus 2002 Vitebsk Belarus 2005 Donetsk, Kharkov Ukraine 2006
  • 5. Exadel Products ● Open Source with JBoss ◦ RichFaces ◦ JBoss Tools/JBoss Developer Studio ● Tiggr – create and share mockups online ● Flamingo ● Fiji (JSF – JavaFX/Flex integration) ● jsf4birt (JSF – BIRT/Actuate integration) ● JavaFX Plug-in for Eclipse
  • 6. Exadel Services ● Rich enterprise application development ● Eclipse development ● Custom rich component development ● Mobile development ● Training ● Most projects are done in Eastern Europe
  • 7. Exadel The Plan ● Ajax features in JSF 2 ● The new RichFaces 4
  • 8. Exadel JSF 2 ● JSF 2 is a major upgrade over JSF 1.x ● Many features, ideas taken from projects such as Seam and RichFaces, and others
  • 9. Exadel JSF 2 new features ● Facelets ● New scopes ● Composite ◦ Flash, View, components custom ● Navigation ● Configuration ● GET support ◦ Annotations ● Bean Validation ◦ Page parameters support ◦ h:link, h:button ● Ajax ● Resource loading
  • 10. Exadel JSF 2 <f:ajax> ● Basic Ajax functionality ● Greatyinspired by RichFaces 3 <a4j:support> tag ● Ajax in JSF in 3 easy steps: ◦ How to send an Ajax request ◦ Partial view processing ◦ Partial view rendering
  • 11. Exadel What to execute on the Event based on server: ● @all which to fire the ● @this (default) Ajax request ● @form ● @none ● Id's ● EL <h:inputText> <f:ajax event="keyup" execute="@form" render="id1 id2" listener="#{bean.ajaxListener}" onevent="someFunction();"/> <h:inputText> Optional server listener Partial view rendering: ● @all ● @this ● @form Optional name of JavaScript ● @none (default) function to execute during ● Id's Ajax request. Invoked 3 times, ● EL at: begin, success, complete steps
  • 12. Exadel Using <f:ajax> <h:commandButton value="Submit" action="#{bean.action}" > <f:ajax event="focus" execute="@form" render="output"/> </h:commandButton> <h:panelGrid id="output"> ... Attaching to button, specifying event </h:panelGrid> <h:commandButton value="Submit" action="#{bean.action}" > <f:ajax execute="@form" render="output output2"/> </h:commandButton> <h:panelGrid id="output"> ... </h:panelGrid> <h:panelGrid id="output2"> ... No event specified, </h:panelGrid> using default event
  • 13. Exadel Using <f:ajax> Default event is onchange <h:inputText value="#{bean.text}" > <f:ajax event="keyup" render="text"/> </h:inputText> <h:outputText id="text" value="#{bean.text}" /> No event specified so using default <h:selectOneListbox id="list" value="#{bean.choice}" > <f:selectItems value="#{cean.choiceList}" /> <f:ajax render="info" listener="#{bean.change}"/> </h:selectOneListbox> <h:panelGrid id="info"> ... </h:panelGrid>
  • 14. Exadel <f:ajax> <h:panelGrid> No default event, no Ajax added <h:selectBooleanCheckbox> onchange <h:inputText> onchange <h:commandButton> onclick </h:panelGrid> </f:ajax> <f:ajax event="click"> <h:panelGrid> onclick <h:selectBooleanCheckbox> onclick <h:inputText> onclick <h:commandButton> onclick and onfocus <f:ajax event="focus"/> </h:commanButton> </h:panelGrid> </f:ajax> <f:ajax event="valueChange"> <h:panelGrid> No Ajax added <h:selectBooleanCheckbox> onchange <h:inputText> onchange <h:commandButton> onfocus <f:ajax event="focus"/> </h:commanButton> </h:panelGrid> </f:ajax>
  • 15. Exadel RichFaces 4 – rich JSF framework ● JSF 2 based ● Ajax components ◦ a4j:* tag library (core) ◦ rich:* tag library (UI) ● Skins and themes ● CDK – Component Development Kit
  • 16. Exadel 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 only has basic JSF 2 support
  • 17. Exadel What about deployment? ● All servers ● All browsers ◦ (Event IE 6.0)
  • 18. Exadel RichFaces history 2004: started by Alexander Smirnov 2004-2007: Ajax4jsf – free, open source RichFaces – commercial Exadel 2007: JBoss takes over Exadel team continues to develop the framework
  • 19. Exadel Just tell me when RichFaces 4 is going to be released?
  • 20. Exadel RichFaces 4 JavaScript in RichFaces is now entirely based on the popular jQuery library.
  • 21. Exadel 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
  • 22. Exadel RichFaces 4 ● Newand easy to use CDK (Component Development Kit) ● Quickly build your own custom rich components
  • 23. Exadel Google App Engine ● DeployRichFaces application in Google App Engine (GAE) ● Special maven-based plug-in available
  • 24. Exadel RichFaces <a4j:ajax> ● 100% based on standard <f:ajax> ● Just replacef: with a4j: and get exactly the same functionality ● But, you get extra features...
  • 25. Exadel <a4j:ajax> attributes Attribute Description onbegin JavaScript to execute before Ajax request JavaScript to execute after response onbeforedomupdate comes back but before DOM update oncomplete JavaScript to execute after DOM update Skips Update Model and Invoke bypassUpdates Application phases, useful for form validation Skips all a4j:outputPanel limitRender ajaxRender=”true” areas. Only renders what is set in current render status Status to display during Ajax request Sets focus on component after Ajax focus request
  • 26. Exadel RichFaces 4 That's not all, there are more RichFaces goodies...
  • 27. Exadel RichFaces 4 core action ● a4j:ajax ● a4j:commandButton ● a4j:commandLink ● a4j:jsFunction ● a4j:poll ● a4j:push
  • 28. Exadel <a4j:commandButton> – Ajax button <h:commandButton value="Save" action="#{bean.action}"> <f:ajax execute="@form" render="output"/> </h:commandButton> <a4j:commandButton value="Save" execute="@form" render="output" action="#{bean.action}" />
  • 29. Exadel <a4j:jsFunction> – fire Ajax request from any JavaScript function <table> ... <td onmouseover="update('yellow')"/> ... </table> <a4j:jsFunction name="update" action="#{bean.change}" reRender="panel"> <a4j:param value="param1" assignTo="#{bean.color}"/> </a4j:jsFunction>
  • 30. Exadel <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>
  • 31. Exadel RichFace 4 core ● a4j:outputPanel ● a4j:status ● a4j:region ● a4j:queue ● a4j:repeat ● a4j:log
  • 32. Exadel <a4j:outputPanel> – auto rendered panel <h:selectOneMenu value="#{bean.fruit}"> <a4j:ajax listener="#{bean.change}"/> </<h:selectOneMenu> <a4j:outputPanel ajaxRendered="true"> <h:panelGrid> ... </h:panelGrid> Rendered on every Ajax request <h:panelGrid> ... </h:panelGrid> </a4j:outputPanel>
  • 33. Exadel <a4j:status> – Ajax request status <a4j:status startText="Loading..."/> <a4j:status name="ajaxSpecial"> <f:facet name="start"> <h:graphicImage value="ajaxStatus.jpg"/> </f:facet> </a4j:status> <h:form> <a4j:commandButton /> <a4j:commandButton status="ajaxSpecial"/> </h:form>
  • 34. Exadel <a4j:region> – declaratively define execute region <h:form> <a4j:region> Execute options: @all● <h:inputText /> @this (default) ● <h:inputText /> @form ● <a4j:commandButton execute="@region"/> @none ● Id's● <a4j:region> EL ● </h:form> @region ● <h:form> <a4j:region> <h:inputText /> <h:inputText /> <a4j:commandButton /> <a4j:region> </h:form>
  • 35. Exadel <a4j:log> – Ajax request information ● Levels: ◦ debug, info, warn, error
  • 36. Exadel JavaScript interactions <a4j:commandLink value="Link" onbegin="alert('Link clicked')" onbeforedomupdate="alert('Response received')" oncomplete="alert('DOM updated')"> </a4j:commandLink> Easier to use than the standard onevent
  • 37. Exadel Advanced rendering option <a4j:commandButton render="output"/> <a4j:commandButton render="output" limitRender="true"/> <h:panelGrid id="output"> Turns off all auto rendered panels, ... only renders what is set in current </h:panelGrid> render <a4j:outputPanel ajaxRendered="true"> ... </a4j:outputPanel>
  • 38. Exadel Skipping phases when validating <h:inputText id="name" value="#{bean.name}"/> <a4j:ajax event="blur" bypassUpdates="true"/> </h:inputText> <rich:message for="name"/> 1.Restore View 2.Apply Request Values 3.Process Validation 4.Update Model Skipped 5.Invoke Application 6.Render Response
  • 39. Exadel 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
  • 40. Exadel RichFaces queue upgrades ● Delay firing of a request ● Combine requests from one or more controls ● Cancel DOM updates if the same request was fired ● Define queue as: ◦ Global (all views have queue) ◦ View-based ◦ Form-based ◦ Named (used by particular components only)
  • 41. Exadel RichFaces <a4j:queue> <a4j:queue requestDelay="2000"/> ... <a4j:commandButton value="Button1"/> <a4j:commandButton value="Button2"/> <a4j:queue requestDelay="2000"/> ... <a4j:commandButton> <a4j:attachQueue requestDelay="1000"/> </a4j:commmandButton> <a4j:commandButton />
  • 42. Exadel a4j:queue – “combining” events <a4j:queue requestDelay="2000"/> ... <a4j:commandButton> <a4j:attachQueue requestGroupingId="mainGroup"/> </a4j:commmandButton> <a4j:commandButton> <a4j:attachQueue requestGroupingId="mainGroup"/> </a4j:commmandButton>
  • 43. Exadel 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> <h:dataTable id="states"> <rich:column/> </h:dataTable>
  • 44. Exadel RichFaces UI components ● Data iteration ● Output, panels ● Input ● Menu ● Trees ● Selects ● Layout ● Client side validation ● Miscellaneous
  • 45. Exadel Rich data iteration ● a4j:repeat ● rich:dataScroller ● rich:dataTable ● rich:column ● rich:extendedDataTable ● Columnand row ● rich:subTable spanning ● Filtering, sorting ◦ rich:subTableToggleControl ● rich:list ● rich:dataGrid
  • 46. Exadel Partial update Outside the table: - tableId@header - tableId@body - tableId@footer @column @header @row @body @footer cellId
  • 47. Exadel Partial update ● Cell from within current row: render="cellId" ● Row(s) from outside the table: render="tableId:rowKey" render="tableId:#{bean.rowKeySet}" ● Cell(s) from outside the table: render="tableId:rowKey:cellId" render="tableId:#{bean.rowKeySet}:cellId"
  • 48. Exadel Rich output, panels ● rich:panel ● rich:message(s) ● rich:togglePanel ● rich:paint2D ● rich:accordion ● rich:separator ● rich:popupPanel ● rich:toolBar ● rich:tabPanel ● rich:toolTip ● rich:panelBar ● rich:panelMenu ● rich:collapsiblePanel
  • 49. Exadel Rich input ● rich:autocomplete ● rich:inputNumberSlider ● rich:inputNumberSpinner ● rich:inplaceInput ● rich:calendar ● rich:colorPicker ● rich:editor ● rich:fileUpload
  • 51. Exadel Rich tree ● rich:tree ● rich:treeNode ● Listeners
  • 52. Exadel Rich selects ● rich:orderingList ● rich:pickList ● rich:listShuttle ● rich:selectBox ● rich:inplaceSelect
  • 53. Exadel Rich layout ● rich:page ● rich:layout ◦ rich:layoutPanel ● rich:splitter
  • 54. Exadel Bean Validation (JSR 303) ● JSF 2 has support for Bean Validation (on the server) public class Bean { @Email private String email; } <h:inputText id="email" value="#{bean.email}"> <a4j:ajax event="blur"/> </h:inputText> <rich:message for="email"/>
  • 55. Exadel RichFaces client validation Public class Bean { @Email private String email; } <h:inputText id="email" value="#{bean.email}"> <rich:clientValidator event="blur"/> </h:inputText> <rich:message for="email"/>
  • 56. Exadel RichFaces client validation <h:form> <rich:clientValidator /> <h:inputText/> <h:inputText/> <h:inputText> <rich:clientValidator event="blur"/> </h:inputText> <h:inputText> <rich:clientValidator disabled="true"/> </h:inputText> </h:form>
  • 57. Exadel RichFaces functions ● rich:clientId(id) - returns component client id ● rich:element(id) - returns DOM element ● rich:component(id)- returns RichFaces client component instance to call JS API method ● rich:isUserInRole(role) - returns if the user has specified role ● rich:findComponent(id) - returns component instance for given short id
  • 58. Exadel rich:component(id) function ● Allows to call JS API on a component <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>
  • 59. Exadel Rich miscellaneous ● rich:componentControl ● rich:jQuery ● rich:hotKey ● rich:gmap ● rich:virtualEarth
  • 60. Exadel <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>
  • 61. Exadel <rich:jQuery> <input type="button" id="changeButton" value="Change title" /> <rich:jQuery selector="#changeButton" query="click(function(){ $('#panel #panel_header').text('Capital of Russia'); })"/> <rich:panel header="Moscow" id="panel"> Moscow is the capital, the most populous ... </rich:panel>
  • 63. Exadel 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
  • 64. Exadel Ready-to-use skins ● classic ● emeraldTown ● blueSky ● ruby ● wine ● deepMarine ● plain ● japanCherry ● laguna <context-param> <param-name>org.richfaces.skin</param-name> ● glassX <param-value>ruby</param-value> </context-param> ● darkX
  • 65. Exadel Skin file (properties 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
  • 66. Exadel Skins ● Modify existing or create your own <context-param> <param-name>org.richfaces.skin</param-name> <param-value>myCustomSkin</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>
  • 67. Exadel Overwriting skins <style> .rf-p-hr { // your custom style, applied to all panels on // on page } .panelHeader { // custom header style } </style> <rich:panel id="panel1"> ... </rich:panel id="panel2"> <rich:panel headerClass="panelHeader"> ... </rich:panel>
  • 68. Exadel Exadel Tiggr ● Create, collaborate and share mockups online ● RichFaces palette ● Upcoming features ◦ HTML generation ◦ More widgets and controls ● Give it a try - http://tiggr.exadel.com
  • 69. Exadel Exadel Tiggr – create, share and collobrate on application mockups http://tiggr.exadel.com
  • 74. Exadel Exadel Fiji ● Insert anyFlash/JavaFX widget into as JSF component into a JSF page ◦ Comes with 7 ready-to-use charts (Flash) <h:outputText> <h:inputText> JSF page <h:dataTable> Flash <fiji:swf>
  • 75. Exadel How can we help with RichFaces ● Webapplication development with RichFaces ● Custom component development ● Training: Training Days JSF 1.2, 2 1-2 RichFaces 3, 4 1-2 JSF and RichFaces 2-3 RichFaces 3 to 4 1-2
  • 76. Exadel Thank you! ● max@exadel.com ● http://mkblog.exadel.com ● http://twitter.com/maxkatz ● http://exadel.org