SlideShare a Scribd company logo
JSF 2: миф или панацея?
 Магический мир пользовательских
           интерфейсов.



Сергей Моренец
29 августа 2012 г.
Agenda

•   The history of Java Web frameworks
•   JSF specification and roadmap
•   JSF plugins and extensions
•   Custom components design
•   Q&A
Distributed App UI History
JSF2
Imagination
Reality
The history of Java Web
     frameworks
The Servlet API
• The introduction in March 1998
• Enabled Java developers to write server-side code for
  delivering dynamic Web content
• Java response to CGI
JavaServer Pages
•   Released in 1999 by Sun Microsystems
•   High-level abstraction of Java servlets
•   Java response to PHP
•   Adds tags and expression language
•   Works inside JSP container, which handles all JSP page
    view requests.
Apache Struts
•   Introduced by Apache Foundation in 2000
•   Implementation of the Model-View-Controller paradigm
•   Enabled actions to support navigation
•   Templates in JSP, XML, Velocity
•   Struts 2 with AJAX and plugins support
Spring MVC
•   Released under Apache 2.0 license in 2003
•   Spring response to Struts framework
•   Tightly coupled to the Spring IOC container
•   Defines strategy interfaces for the responsibilities
•   Supports portlet development
The Birth of JSF
• Created as JSR #127
• Designed by Sun, Oracle, IBM and BEA in May 2001
• J2EE framework for building Web applications
The JSF Design Goals
• Create a standard UI component framework
• Define a set of lightweight Java classes for UI
  components, component state, and input events
• Provide a set of common UI components
• Provide a JavaBeans model for dispatching events from
  client-side UI controls to server-side application behavior
The JSF Design Goals
• Define APIs for input validation, including client-side
  validation
• Specify a model for internationalization and localization
• Automatic support of all available client configuration
  data, such as the browser version
• Support Web Accessibility Initiative (WAI)
History of JSF
• Simple things should be simple. Complex things
  should be possible.
                                            Alan Kay
JSF 1.0
• Initial release in March 2004
• Core and performance improvement
• Supports Servlet 2.3 and JSP 1.2
JSF 1.1
• Bugfix release in May 2004
• Performance issues
• Based on J2EE 1.3
JSF 1.2
•   Release in May 2006
•   Fully detached from JSP as view technology
•   Unified expression language support
•   Lack of Ajax out-of-box support
•   Core part of J2EE 5
JSF 2.0
• Release in June 2009
• JSP replaced by facelets as view technology
• Full Ajax support similar to Ajax4jsf
• Annotations and convention-over-configuration
  invention
• New conversation scope
JSF Sample Page
•   <html xmlns=http://www.w3.org/1999/xhtml
•   xmlns:h=http://java.sun.com/jsf/html
•   xmlns:f="http://java.sun.com/jsf/core">
•   <h:body>
•   <h:form>
•   <h2>A Simple JSF Page</h2>
•   <h:outputText value="#{modelBean.currentDate}">
•        <f:convertDateTime type="both"
    timeZone="#{userLocale.timeZone}" />
•   </h:outputText>
•   <h:inputText value="#{modelBean.username}"/>
•   <h:commandButton value="Click Here"/>
•   </h:form>
•   </h:body>
•   </html>
ModelBean.java
public class ModelBean {
private Date currentDate;

private String username;

public Date getCurrentDate() {
         return currentDate;
}

public void setCurrentDate(Date currentDate) {
          this.currentDate = currentDate;
}

public String getUsername() {
           return username;
}

public void setUsername(String username) {
          this.username = username;
}

}
Configuration file
•   <?xml version="1.0" encoding="UTF-8"?>
•   <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
•        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
•        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
•     http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
•        version="2.0">
•        <application>
•                <message-bundle>message</message-bundle>
•        </application>
•        <managed-bean>
•                <managed-bean-name>modelBean</managed-
    bean-name>
•                <managed-bean-
    class>org.mycompany.ModelBean</managed-bean-class>
•                <managed-bean-scope>session</managed-bean-
    scope>
•        </managed-bean>
•   </faces-config>
Component Rendering
Component LifeCycle
Built on JavaBeans
            concepts
• UIComponent hierarchy
Properties
Methods
Events
Validators
Convertors
• Event model
Listener classes
Event objects
• Page navigation
JSF Implementations


• Oracle reference           • UI widgets (MyFaces Tomahawk,
  implementation               MyFaces Trinidad, MyFaces
• Sub-project of Glassfish     Tobago)
                             • Extension packages to (MyFaces
                               Orchestra, MyFaces Extensions
                               Validator, MyFaces Extensions
                               CDI)
                             • Integration modules ( MyFaces
                               Portlet Bridge)
Mojarra vs. MyFaces performance
Testcase                  MyFaces (ms)   Mojarra(ms)
1. JSF Protocol Tests         239           207
2. Full Body
                               42            35
Replacement
3. Multi form situation       4134          4426
4. Testing for
                               24            34
decorated api calls
5. Double Eval
                              2047          2060
Detection
6. Table Test,
replacement of table          7289          9229
elements
6. Partial Page
                              2168          2308
Rendering Nav Case
7. Event Lifecycle test       130           131
Ajax-enabled components and
                        frameworks
•   jBoss RichFaces, Ajax-enabled JSF components for layout, file
    upload, forms, inputs and many other features.
•   ICEfaces, open-source, Java JSF extension framework and rich
    components, Ajax without JavaScript
•   PrimeFaces Ajax framework with JSF components
•   Oracle ADF Faces Rich Client, Oracle Application Development
    Framework
•   Backbase Enterprise Ajax — JSF Edition, Ajax framework
•   IBM Lotus Notes - XPages
•   MyFaces, The Apache Foundation JSF implementation with Ajax
    components
•   Sun Java BluePrints AJAX Components
•   ZK Ajax framework with JSF components
RichFaces 4
•   A full set of AJAX enabled components
•   Client-side validation
•   Advanced queuing
•   Push component upgrades including
    JavaMessaging Service (JMS) integrations
•   Component Development Kit (CDK).
•   Comprehensive documentation covering
    development best practices, and component
    details.
•   Detailed and automated testing facilities for
    components, actions, listeners, and pages.
•   Broad cross-browser support
RichFaces Components
• Ajax4JSF
• RichFaces
Ajax4JSF
• Core Ajax functionality
• Page-level Ajax support
• Utility components
Rich components
• Self-contained and advanced UI components
• Extension of standard JSF components
• Pluggable customization though Ajax support
A Historical Perspective
• Created as Telamon project in 2005 by Alexander
  Smirnov
• Released in 2006 as part of Exadel Visual
  Component Platform
• Split into open-source Ajax4jsf and commercial
  RichFaces in 2006
• Made open-source in 2007 as Jboss Ajax4jsf and
  Jboss RichFaces
• Merged as single RichFaces product in September
  2007
Alexander Smirnov
• Architect of the Jboss Richfaces project
• Java Server Faces expert group member
• Jboss GateIn portal developer
RichFaces Team
Client Side Validation
Data Table
Popup Panel
Data Grid
Tree
Rich Editor
Pick List
Push
RichFaces Push
•   Server-side push technique
•   Based on Atmosphere framework
•   Client-side support(Comet, HTML5 WebSockets)
•   Integration with Java Messaging Service
RichBean.java
• public Date getDate() {
•   return new Date();
• }
•
• public void push() throws MessageException {
•   TopicKey topicKey = new TopicKey("sampleAddress");
•   TopicsContext topicsContext =
  TopicsContext.lookup();
•
•   topicsContext.publish(topicKey, "empty message");
• }
Index.html
• <a4j:commandButton value="Push!"
  action="#{richBean.push}" />
•
• <a4j:push address="sampleAddress">
•   <a4j:ajax event="dataavailable"
  render="outputDate" />
• </a4j:push>
•
• <a4j:outputPanel id="outputDate">
•   Date: #{richBean.date}
• </a4j:outputPanel>
Custom components
 design in JSF 1.2
AdvancedDateComponent.java
• public class AdvancedDateComponent extends
  UIComponentBase {
•     private HtmlSelectOneMenu dayCmb;
•     private HtmlSelectOneMenu monthCmb;
•     private HtmlSelectOneMenu yearCmb;

•     @Override
•     public String getFamily() {
•            return "advanced.Date";
•     }

•     @Override
•     public String getRendererType() {
•            return "renderer.advanced.Date";
•     }
•
AdvancedDateComponent.java
public Object getValue() {
      ValueExpression _ve = getValueExpression("value");
      return (_ve != null) ? _ve.getValue(getFacesContext().getELContext()) : null;
}

public void setSubmittedValue(FacesContext context) {
      Map<String, String> requestParameterValuesMap = context.getExternalContext().
getRequestParameterMap();

       String day = requestParameterValuesMap.get(dayCmb.getClientId(context));
       String month =
requestParameterValuesMap.get(monthCmb.getClientId(context));
 String year = requestParameterValuesMap.get(yearCmb.getClientId(context));

      Calendar calendar = Calendar.getInstance();
      calendar.set(Integer.valueOf(year), Integer.valueOf(month) - 1,
                                      Integer.valueOf(day));

      ValueExpression ve = getValueExpression(“value”);
      ve.setValue(getFacesContext().getELContext(), calendar.getTime());
}
AdvancedDateRenderer.java
• public class AdvancedDateRenderer extends Renderer{

•      @Override
•      public void encodeBegin(FacesContext
    context, UIComponent
•   component) throws IOException {
•      if(component instanceof AdvancedDateComponent)
    {
•      CompositeDateComponent dateComponent =
    (CompositeDateComponent)component;
•      dateComponent.refresh();
•      dateComponent.updateComponents();
•     }
AdvancedDateRenderer.java
• @Override
• public void decode(FacesContext context,
• UIComponent component) {

• if (component instanceof
  AdvancedDateComponent) {
• AdvancedDateComponent dateComponent =
  (AdvancedDateComponent) component;
• dateComponent.refresh();
• dateComponent.setSubmittedValue(context);
• }}}
Configuration file
•   <?xml version="1.0" encoding="UTF-8"?>
•   <faces-config xmlns="http://java.sun.com/xml/ns/javaee">
•     <component>
•          <display-name>advancedDate</display-name>
•          <component-type>advanced.Date</component-type>
•          <component-class>org.test.component.AdvancedDateComponent
•          </component-class>
•          <component-extension>
•          <renderer-type>renderer.advanced.Date</renderer-type>
•        </component-extension>
•     </component>
•   <render-kit>
•        <renderer>
•           <component-family>advanced.Date</component-family>
•           <renderer-type>renderer.advanced.Date</renderer-type>
•           <renderer-class>org.test.component.AdvancedDateRenderer</renderer-
    class>
•        </renderer>
•      </render-kit>
•   </faces-config>
Tag configuration file
• <?xml version="1.0"?>
• <facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
• <namespace>http://test.org/web/tags</namespace>

•   <tag>
•     <tag-name>advancedDate</tag-name>
•     <component>
•       <component-
  type>advanced.Date</component-type>
•       <renderer-
  type>renderer.advanced.Date</renderer-type>
•     </component>
•   </tag>

• </facelet-taglib>
account.xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui=http://java.sun.com/jsf/facelets
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:web="http://test.org/web/tags">

 <h:outputText value="#{msg['account.birthdate']}" />
 <web:compositeDate value=“#{account.birthDate}"
/>

</ui:composition>
Custom components
 design in JSF 2.0
Custom components

•   No configuration, XML or otherwise.
•   No Java code.
•   To which developers can attach functionality.
•   Hot-deploy.
compositeDate.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">

<cc:interface>
   <cc:attribute name="birthDate"
   shortDescription="Value of the component" />
   <cc:attribute name="days"
   shortDescription="List of SelectItem objects representing days" />
   <cc:attribute name="months"
   shortDescription="List of SelectItem objects representing months"
/>
   <cc:attribute name="years"
   shortDescription="List of SelectItem objects representing years"
   />
</cc:interface>
compositeDate.xhtml
<cc:implementation>
   <h:panelGrid columns="3">
       <h:selectOneMenu value="#{date.day}">
          <f:selectItems value="#{days}" />
       </h:selectOneMenu>
       <h:selectOneMenu value="#{date.month}">
           <f:selectItems value="#{months}" />
       </h:selectOneMenu>
       <h:selectOneMenu value="#{date.year}">
            <f:selectItems value="#{years}" />
       </h:selectOneMenu>
     </h:panelGrid>
</cc:implementation>
</html>
account.xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:tr="http://java.sun.com/jsf/composite/trai
ner">

 <h:outputText value="#{msg['account.birthdate']}" />
 <tr:compositeDate date=“#{account.birthDate}"
days="#{days}" months="months" years="#{years}" />

</ui:composition>
Disadvantages
Jobs at dice.com
StackOverflow tagged questions
•   High level of understanding
•   Limited community support
•   Lack of books and comprehensive documentation
•   Multiple resource-consuming dependencies
•   Performance overhead
•   Migration issues between RF3 and RF4
Love bug story
• I am migrating from RF 3.3.1 to 4.0. I'm experiencing
  an issue with the tooltip component. Specifying
  "bottom-left" for the direction attribute results in the
  following error:

• javax.el.ELException: Cannot convert bottom-left of
  type class java.lang.String to class
  org.richfaces.component.Positioning

• Was this attribute implemented in 4.0? Am I doing
  something wrong?
Love bug story
• Just in case someone else has the same issue, I've
  figured it out. In RF 4, 'bottom-right' positioning is no
  longer valid. You have to use 'bottomRight'. I am
  completely shocked that none of these changes have
  made it to their online documentation. I have wasted
  time trying to figure out what was happening with this
  component. I cannot believe users are expected to go
  to the API JavaDocs and look through each class for
  possible attribute values.
•
• If any RichFaces guys read this, please either update the
  online documentation or remove it. There are way too
  many components in there with information that has not
  been updated and is just plain wrong
Q&A




• Сергей Моренец, morenets@mail.ru

More Related Content

PPTX
Overview of PaaS: Java experience
PPTX
Java Development EcoSystem
PDF
Social Connections 2015 CrossWorlds and Domino
PPTX
Why jakarta ee matters (ConFoo 2021)
PPTX
Node.js Development with Apache NetBeans
PDF
Make JSF more type-safe with CDI and MyFaces CODI
PPTX
Preparing for java 9 modules upload
PDF
MyFaces CODI Conversations
Overview of PaaS: Java experience
Java Development EcoSystem
Social Connections 2015 CrossWorlds and Domino
Why jakarta ee matters (ConFoo 2021)
Node.js Development with Apache NetBeans
Make JSF more type-safe with CDI and MyFaces CODI
Preparing for java 9 modules upload
MyFaces CODI Conversations

What's hot (20)

PDF
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
PDF
Using Play Framework 2 in production
PPTX
Utilizing the OpenNTF Domino API
PPT
Monitoring and Tuning GlassFish
PDF
Play Framework and Activator
PDF
Polygot Java EE on the GraalVM
PPTX
Java EE 8
PPTX
Spring Framework 3.2 - What's New
PDF
Javantura 2014 - Java 8 JavaScript Nashorn
PDF
Web application development using Play Framework (with Java)
PPTX
Faster Java EE Builds with Gradle
PDF
OpenWebBeans and DeltaSpike at ApacheCon
PDF
Scala play-framework
PDF
Apache DeltaSpike the CDI toolbox
PDF
Conquering AngularJS Limitations
PDF
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
PDF
Java 9 preview
PPTX
Migrating to Java 11
PDF
Scala and Play with Gradle
PPTX
Getting Started with Java EE 7
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
Using Play Framework 2 in production
Utilizing the OpenNTF Domino API
Monitoring and Tuning GlassFish
Play Framework and Activator
Polygot Java EE on the GraalVM
Java EE 8
Spring Framework 3.2 - What's New
Javantura 2014 - Java 8 JavaScript Nashorn
Web application development using Play Framework (with Java)
Faster Java EE Builds with Gradle
OpenWebBeans and DeltaSpike at ApacheCon
Scala play-framework
Apache DeltaSpike the CDI toolbox
Conquering AngularJS Limitations
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
Java 9 preview
Migrating to Java 11
Scala and Play with Gradle
Getting Started with Java EE 7
Ad

Similar to JSF2 (20)

PPTX
JSF 2: Myth of panacea? Magic world of user interfaces
PPTX
Java EE8 - by Kito Mann
PDF
Java EE 8 Web Frameworks: A Look at JSF vs MVC
PDF
Overview of Java EE 6 by Roberto Chinnici at SFJUG
PDF
Utilizing JSF Front Ends with Microservices
KEY
LatJUG. JSF2.0 - The JavaEE6 Standard
PDF
Java EE 6, Eclipse @ EclipseCon
PDF
Lecture 10 - Java Server Faces (JSF)
PDF
Contextual Dependency Injection for Apachecon 2010
PPTX
Java EE 8 Update
PDF
Java EE 6 & GlassFish = Less Code + More Power at CEJUG
PDF
Java EE 與 雲端運算的展望
PDF
The JavaFX Ecosystem
PPTX
SoCal Code Camp 2011 - ASP.NET MVC 4
ODP
Groovy & Grails eXchange 2012 vert.x presentation
PDF
RichFaces 4 Component Deep Dive - JAX/JSFSummit
PDF
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnition
PDF
Java EE 6 = Less Code + More Power
PDF
Java EE 8: On the Horizon
ZIP
jQuery On Rails
JSF 2: Myth of panacea? Magic world of user interfaces
Java EE8 - by Kito Mann
Java EE 8 Web Frameworks: A Look at JSF vs MVC
Overview of Java EE 6 by Roberto Chinnici at SFJUG
Utilizing JSF Front Ends with Microservices
LatJUG. JSF2.0 - The JavaEE6 Standard
Java EE 6, Eclipse @ EclipseCon
Lecture 10 - Java Server Faces (JSF)
Contextual Dependency Injection for Apachecon 2010
Java EE 8 Update
Java EE 6 & GlassFish = Less Code + More Power at CEJUG
Java EE 與 雲端運算的展望
The JavaFX Ecosystem
SoCal Code Camp 2011 - ASP.NET MVC 4
Groovy & Grails eXchange 2012 vert.x presentation
RichFaces 4 Component Deep Dive - JAX/JSFSummit
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnition
Java EE 6 = Less Code + More Power
Java EE 8: On the Horizon
jQuery On Rails
Ad

More from Alex Tumanoff (20)

PPTX
Sql server 2019 New Features by Yevhen Nedaskivskyi
PPTX
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
PPTX
Azure data bricks by Eugene Polonichko
PPTX
Sdlc by Anatoliy Anthony Cox
PPTX
Kostenko ux november-2014_1
PPTX
Java 8 in action.jinq.v.1.3
PPT
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
PPTX
Spring.new hope.1.3
PPTX
Sql saturday azure storage by Anton Vidishchev
PPTX
Navigation map factory by Alexey Klimenko
PPTX
Serialization and performance by Sergey Morenets
PPTX
Игры для мобильных платформ by Алексей Рыбаков
PDF
Android sync adapter
PPTX
Async clinic by by Sergey Teplyakov
PPTX
Deep Dive C# by Sergey Teplyakov
PPTX
Bdd by Dmitri Aizenberg
PPTX
Неформальные размышления о сертификации в IT
PPTX
Разработка расширений Firefox
PPTX
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
PPTX
Patterns of parallel programming
Sql server 2019 New Features by Yevhen Nedaskivskyi
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Azure data bricks by Eugene Polonichko
Sdlc by Anatoliy Anthony Cox
Kostenko ux november-2014_1
Java 8 in action.jinq.v.1.3
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
Spring.new hope.1.3
Sql saturday azure storage by Anton Vidishchev
Navigation map factory by Alexey Klimenko
Serialization and performance by Sergey Morenets
Игры для мобильных платформ by Алексей Рыбаков
Android sync adapter
Async clinic by by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Bdd by Dmitri Aizenberg
Неформальные размышления о сертификации в IT
Разработка расширений Firefox
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
Patterns of parallel programming

Recently uploaded (20)

PDF
Electronic commerce courselecture one. Pdf
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
cuic standard and advanced reporting.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Empathic Computing: Creating Shared Understanding
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Approach and Philosophy of On baking technology
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
Electronic commerce courselecture one. Pdf
Understanding_Digital_Forensics_Presentation.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
cuic standard and advanced reporting.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Diabetes mellitus diagnosis method based random forest with bat algorithm
Empathic Computing: Creating Shared Understanding
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Reach Out and Touch Someone: Haptics and Empathic Computing
The AUB Centre for AI in Media Proposal.docx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
NewMind AI Weekly Chronicles - August'25 Week I
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Approach and Philosophy of On baking technology
MYSQL Presentation for SQL database connectivity
Dropbox Q2 2025 Financial Results & Investor Presentation
Unlocking AI with Model Context Protocol (MCP)
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Building Integrated photovoltaic BIPV_UPV.pdf

JSF2

  • 1. JSF 2: миф или панацея? Магический мир пользовательских интерфейсов. Сергей Моренец 29 августа 2012 г.
  • 2. Agenda • The history of Java Web frameworks • JSF specification and roadmap • JSF plugins and extensions • Custom components design • Q&A
  • 7. The history of Java Web frameworks
  • 8. The Servlet API • The introduction in March 1998 • Enabled Java developers to write server-side code for delivering dynamic Web content • Java response to CGI
  • 9. JavaServer Pages • Released in 1999 by Sun Microsystems • High-level abstraction of Java servlets • Java response to PHP • Adds tags and expression language • Works inside JSP container, which handles all JSP page view requests.
  • 10. Apache Struts • Introduced by Apache Foundation in 2000 • Implementation of the Model-View-Controller paradigm • Enabled actions to support navigation • Templates in JSP, XML, Velocity • Struts 2 with AJAX and plugins support
  • 11. Spring MVC • Released under Apache 2.0 license in 2003 • Spring response to Struts framework • Tightly coupled to the Spring IOC container • Defines strategy interfaces for the responsibilities • Supports portlet development
  • 12. The Birth of JSF • Created as JSR #127 • Designed by Sun, Oracle, IBM and BEA in May 2001 • J2EE framework for building Web applications
  • 13. The JSF Design Goals • Create a standard UI component framework • Define a set of lightweight Java classes for UI components, component state, and input events • Provide a set of common UI components • Provide a JavaBeans model for dispatching events from client-side UI controls to server-side application behavior
  • 14. The JSF Design Goals • Define APIs for input validation, including client-side validation • Specify a model for internationalization and localization • Automatic support of all available client configuration data, such as the browser version • Support Web Accessibility Initiative (WAI)
  • 15. History of JSF • Simple things should be simple. Complex things should be possible. Alan Kay
  • 16. JSF 1.0 • Initial release in March 2004 • Core and performance improvement • Supports Servlet 2.3 and JSP 1.2
  • 17. JSF 1.1 • Bugfix release in May 2004 • Performance issues • Based on J2EE 1.3
  • 18. JSF 1.2 • Release in May 2006 • Fully detached from JSP as view technology • Unified expression language support • Lack of Ajax out-of-box support • Core part of J2EE 5
  • 19. JSF 2.0 • Release in June 2009 • JSP replaced by facelets as view technology • Full Ajax support similar to Ajax4jsf • Annotations and convention-over-configuration invention • New conversation scope
  • 20. JSF Sample Page • <html xmlns=http://www.w3.org/1999/xhtml • xmlns:h=http://java.sun.com/jsf/html • xmlns:f="http://java.sun.com/jsf/core"> • <h:body> • <h:form> • <h2>A Simple JSF Page</h2> • <h:outputText value="#{modelBean.currentDate}"> • <f:convertDateTime type="both" timeZone="#{userLocale.timeZone}" /> • </h:outputText> • <h:inputText value="#{modelBean.username}"/> • <h:commandButton value="Click Here"/> • </h:form> • </h:body> • </html>
  • 21. ModelBean.java public class ModelBean { private Date currentDate; private String username; public Date getCurrentDate() { return currentDate; } public void setCurrentDate(Date currentDate) { this.currentDate = currentDate; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
  • 22. Configuration file • <?xml version="1.0" encoding="UTF-8"?> • <faces-config xmlns="http://java.sun.com/xml/ns/javaee" • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" • xsi:schemaLocation="http://java.sun.com/xml/ns/javaee • http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" • version="2.0"> • <application> • <message-bundle>message</message-bundle> • </application> • <managed-bean> • <managed-bean-name>modelBean</managed- bean-name> • <managed-bean- class>org.mycompany.ModelBean</managed-bean-class> • <managed-bean-scope>session</managed-bean- scope> • </managed-bean> • </faces-config>
  • 25. Built on JavaBeans concepts • UIComponent hierarchy Properties Methods Events Validators Convertors • Event model Listener classes Event objects • Page navigation
  • 26. JSF Implementations • Oracle reference • UI widgets (MyFaces Tomahawk, implementation MyFaces Trinidad, MyFaces • Sub-project of Glassfish Tobago) • Extension packages to (MyFaces Orchestra, MyFaces Extensions Validator, MyFaces Extensions CDI) • Integration modules ( MyFaces Portlet Bridge)
  • 27. Mojarra vs. MyFaces performance Testcase MyFaces (ms) Mojarra(ms) 1. JSF Protocol Tests 239 207 2. Full Body 42 35 Replacement 3. Multi form situation 4134 4426 4. Testing for 24 34 decorated api calls 5. Double Eval 2047 2060 Detection 6. Table Test, replacement of table 7289 9229 elements 6. Partial Page 2168 2308 Rendering Nav Case 7. Event Lifecycle test 130 131
  • 28. Ajax-enabled components and frameworks • jBoss RichFaces, Ajax-enabled JSF components for layout, file upload, forms, inputs and many other features. • ICEfaces, open-source, Java JSF extension framework and rich components, Ajax without JavaScript • PrimeFaces Ajax framework with JSF components • Oracle ADF Faces Rich Client, Oracle Application Development Framework • Backbase Enterprise Ajax — JSF Edition, Ajax framework • IBM Lotus Notes - XPages • MyFaces, The Apache Foundation JSF implementation with Ajax components • Sun Java BluePrints AJAX Components • ZK Ajax framework with JSF components
  • 30. A full set of AJAX enabled components • Client-side validation • Advanced queuing • Push component upgrades including JavaMessaging Service (JMS) integrations • Component Development Kit (CDK). • Comprehensive documentation covering development best practices, and component details. • Detailed and automated testing facilities for components, actions, listeners, and pages. • Broad cross-browser support
  • 32. Ajax4JSF • Core Ajax functionality • Page-level Ajax support • Utility components
  • 33. Rich components • Self-contained and advanced UI components • Extension of standard JSF components • Pluggable customization though Ajax support
  • 34. A Historical Perspective • Created as Telamon project in 2005 by Alexander Smirnov • Released in 2006 as part of Exadel Visual Component Platform • Split into open-source Ajax4jsf and commercial RichFaces in 2006 • Made open-source in 2007 as Jboss Ajax4jsf and Jboss RichFaces • Merged as single RichFaces product in September 2007
  • 35. Alexander Smirnov • Architect of the Jboss Richfaces project • Java Server Faces expert group member • Jboss GateIn portal developer
  • 41. Tree
  • 44. Push
  • 45. RichFaces Push • Server-side push technique • Based on Atmosphere framework • Client-side support(Comet, HTML5 WebSockets) • Integration with Java Messaging Service
  • 46. RichBean.java • public Date getDate() { • return new Date(); • } • • public void push() throws MessageException { • TopicKey topicKey = new TopicKey("sampleAddress"); • TopicsContext topicsContext = TopicsContext.lookup(); • • topicsContext.publish(topicKey, "empty message"); • }
  • 47. Index.html • <a4j:commandButton value="Push!" action="#{richBean.push}" /> • • <a4j:push address="sampleAddress"> • <a4j:ajax event="dataavailable" render="outputDate" /> • </a4j:push> • • <a4j:outputPanel id="outputDate"> • Date: #{richBean.date} • </a4j:outputPanel>
  • 49. AdvancedDateComponent.java • public class AdvancedDateComponent extends UIComponentBase { • private HtmlSelectOneMenu dayCmb; • private HtmlSelectOneMenu monthCmb; • private HtmlSelectOneMenu yearCmb; • @Override • public String getFamily() { • return "advanced.Date"; • } • @Override • public String getRendererType() { • return "renderer.advanced.Date"; • } •
  • 50. AdvancedDateComponent.java public Object getValue() { ValueExpression _ve = getValueExpression("value"); return (_ve != null) ? _ve.getValue(getFacesContext().getELContext()) : null; } public void setSubmittedValue(FacesContext context) { Map<String, String> requestParameterValuesMap = context.getExternalContext(). getRequestParameterMap(); String day = requestParameterValuesMap.get(dayCmb.getClientId(context)); String month = requestParameterValuesMap.get(monthCmb.getClientId(context)); String year = requestParameterValuesMap.get(yearCmb.getClientId(context)); Calendar calendar = Calendar.getInstance(); calendar.set(Integer.valueOf(year), Integer.valueOf(month) - 1, Integer.valueOf(day)); ValueExpression ve = getValueExpression(“value”); ve.setValue(getFacesContext().getELContext(), calendar.getTime()); }
  • 51. AdvancedDateRenderer.java • public class AdvancedDateRenderer extends Renderer{ • @Override • public void encodeBegin(FacesContext context, UIComponent • component) throws IOException { • if(component instanceof AdvancedDateComponent) { • CompositeDateComponent dateComponent = (CompositeDateComponent)component; • dateComponent.refresh(); • dateComponent.updateComponents(); • }
  • 52. AdvancedDateRenderer.java • @Override • public void decode(FacesContext context, • UIComponent component) { • if (component instanceof AdvancedDateComponent) { • AdvancedDateComponent dateComponent = (AdvancedDateComponent) component; • dateComponent.refresh(); • dateComponent.setSubmittedValue(context); • }}}
  • 53. Configuration file • <?xml version="1.0" encoding="UTF-8"?> • <faces-config xmlns="http://java.sun.com/xml/ns/javaee"> • <component> • <display-name>advancedDate</display-name> • <component-type>advanced.Date</component-type> • <component-class>org.test.component.AdvancedDateComponent • </component-class> • <component-extension> • <renderer-type>renderer.advanced.Date</renderer-type> • </component-extension> • </component> • <render-kit> • <renderer> • <component-family>advanced.Date</component-family> • <renderer-type>renderer.advanced.Date</renderer-type> • <renderer-class>org.test.component.AdvancedDateRenderer</renderer- class> • </renderer> • </render-kit> • </faces-config>
  • 54. Tag configuration file • <?xml version="1.0"?> • <facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> • <namespace>http://test.org/web/tags</namespace> • <tag> • <tag-name>advancedDate</tag-name> • <component> • <component- type>advanced.Date</component-type> • <renderer- type>renderer.advanced.Date</renderer-type> • </component> • </tag> • </facelet-taglib>
  • 55. account.xhtml <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui=http://java.sun.com/jsf/facelets xmlns:h="http://java.sun.com/jsf/html" xmlns:web="http://test.org/web/tags"> <h:outputText value="#{msg['account.birthdate']}" /> <web:compositeDate value=“#{account.birthDate}" /> </ui:composition>
  • 57. Custom components • No configuration, XML or otherwise. • No Java code. • To which developers can attach functionality. • Hot-deploy.
  • 58. compositeDate.xhtml <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:cc="http://java.sun.com/jsf/composite"> <cc:interface> <cc:attribute name="birthDate" shortDescription="Value of the component" /> <cc:attribute name="days" shortDescription="List of SelectItem objects representing days" /> <cc:attribute name="months" shortDescription="List of SelectItem objects representing months" /> <cc:attribute name="years" shortDescription="List of SelectItem objects representing years" /> </cc:interface>
  • 59. compositeDate.xhtml <cc:implementation> <h:panelGrid columns="3"> <h:selectOneMenu value="#{date.day}"> <f:selectItems value="#{days}" /> </h:selectOneMenu> <h:selectOneMenu value="#{date.month}"> <f:selectItems value="#{months}" /> </h:selectOneMenu> <h:selectOneMenu value="#{date.year}"> <f:selectItems value="#{years}" /> </h:selectOneMenu> </h:panelGrid> </cc:implementation> </html>
  • 60. account.xhtml <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:tr="http://java.sun.com/jsf/composite/trai ner"> <h:outputText value="#{msg['account.birthdate']}" /> <tr:compositeDate date=“#{account.birthDate}" days="#{days}" months="months" years="#{years}" /> </ui:composition>
  • 64. High level of understanding • Limited community support • Lack of books and comprehensive documentation • Multiple resource-consuming dependencies • Performance overhead • Migration issues between RF3 and RF4
  • 65. Love bug story • I am migrating from RF 3.3.1 to 4.0. I'm experiencing an issue with the tooltip component. Specifying "bottom-left" for the direction attribute results in the following error: • javax.el.ELException: Cannot convert bottom-left of type class java.lang.String to class org.richfaces.component.Positioning • Was this attribute implemented in 4.0? Am I doing something wrong?
  • 66. Love bug story • Just in case someone else has the same issue, I've figured it out. In RF 4, 'bottom-right' positioning is no longer valid. You have to use 'bottomRight'. I am completely shocked that none of these changes have made it to their online documentation. I have wasted time trying to figure out what was happening with this component. I cannot believe users are expected to go to the API JavaDocs and look through each class for possible attribute values. • • If any RichFaces guys read this, please either update the online documentation or remove it. There are way too many components in there with information that has not been updated and is just plain wrong