SlideShare ist ein Scribd-Unternehmen logo
1 von 67
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeMyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeos890
 
Using Play Framework 2 in production
Using Play Framework 2 in productionUsing Play Framework 2 in production
Using Play Framework 2 in productionChristian Papauschek
 
Utilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIUtilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIOliver Busse
 
Monitoring and Tuning GlassFish
Monitoring and Tuning GlassFishMonitoring and Tuning GlassFish
Monitoring and Tuning GlassFishC2B2 Consulting
 
Play Framework and Activator
Play Framework and ActivatorPlay Framework and Activator
Play Framework and ActivatorKevin Webber
 
Polygot Java EE on the GraalVM
Polygot Java EE on the GraalVMPolygot Java EE on the GraalVM
Polygot Java EE on the GraalVMRyan Cuprak
 
Spring Framework 3.2 - What's New
Spring Framework 3.2 - What's NewSpring Framework 3.2 - What's New
Spring Framework 3.2 - What's NewSam Brannen
 
Javantura 2014 - Java 8 JavaScript Nashorn
Javantura 2014 - Java 8 JavaScript NashornJavantura 2014 - Java 8 JavaScript Nashorn
Javantura 2014 - Java 8 JavaScript NashornMiroslav Resetar
 
Web application development using Play Framework (with Java)
Web application development using Play Framework (with Java)Web application development using Play Framework (with Java)
Web application development using Play Framework (with Java)Saeed Zarinfam
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
OpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheConOpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheConos890
 
Scala play-framework
Scala play-frameworkScala play-framework
Scala play-frameworkAbdhesh Kumar
 
Conquering AngularJS Limitations
Conquering AngularJS LimitationsConquering AngularJS Limitations
Conquering AngularJS LimitationsValeri Karpov
 
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
Vert.x - Tehran JUG meeting Aug-2014 - Saeed ZarinfamVert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
Vert.x - Tehran JUG meeting Aug-2014 - Saeed ZarinfamSaeed Zarinfam
 
Migrating to Java 11
Migrating to Java 11Migrating to Java 11
Migrating to Java 11Arto Santala
 
Scala and Play with Gradle
Scala and Play with GradleScala and Play with Gradle
Scala and Play with GradleWei Chen
 
Getting Started with Java EE 7
Getting Started with Java EE 7Getting Started with Java EE 7
Getting Started with Java EE 7Arun Gupta
 

Was ist angesagt? (20)

MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeMyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
 
Using Play Framework 2 in production
Using Play Framework 2 in productionUsing Play Framework 2 in production
Using Play Framework 2 in production
 
Utilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIUtilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino API
 
Monitoring and Tuning GlassFish
Monitoring and Tuning GlassFishMonitoring and Tuning GlassFish
Monitoring and Tuning GlassFish
 
Play Framework and Activator
Play Framework and ActivatorPlay Framework and Activator
Play Framework and Activator
 
Polygot Java EE on the GraalVM
Polygot Java EE on the GraalVMPolygot Java EE on the GraalVM
Polygot Java EE on the GraalVM
 
Java EE 8
Java EE 8Java EE 8
Java EE 8
 
Spring Framework 3.2 - What's New
Spring Framework 3.2 - What's NewSpring Framework 3.2 - What's New
Spring Framework 3.2 - What's New
 
Javantura 2014 - Java 8 JavaScript Nashorn
Javantura 2014 - Java 8 JavaScript NashornJavantura 2014 - Java 8 JavaScript Nashorn
Javantura 2014 - Java 8 JavaScript Nashorn
 
Web application development using Play Framework (with Java)
Web application development using Play Framework (with Java)Web application development using Play Framework (with Java)
Web application development using Play Framework (with Java)
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
OpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheConOpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheCon
 
Scala play-framework
Scala play-frameworkScala play-framework
Scala play-framework
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Conquering AngularJS Limitations
Conquering AngularJS LimitationsConquering AngularJS Limitations
Conquering AngularJS Limitations
 
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
Vert.x - Tehran JUG meeting Aug-2014 - Saeed ZarinfamVert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
 
Java 9 preview
Java 9 previewJava 9 preview
Java 9 preview
 
Migrating to Java 11
Migrating to Java 11Migrating to Java 11
Migrating to Java 11
 
Scala and Play with Gradle
Scala and Play with GradleScala and Play with Gradle
Scala and Play with Gradle
 
Getting Started with Java EE 7
Getting Started with Java EE 7Getting Started with Java EE 7
Getting Started with Java EE 7
 

Ähnlich wie JSF2

JSF 2: Myth of panacea? Magic world of user interfaces
JSF 2: Myth of panacea? Magic world of user interfacesJSF 2: Myth of panacea? Magic world of user interfaces
JSF 2: Myth of panacea? Magic world of user interfacesStrannik_2013
 
Java EE8 - by Kito Mann
Java EE8 - by Kito Mann Java EE8 - by Kito Mann
Java EE8 - by Kito Mann Kile Niklawski
 
Java EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVCJava EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVCJosh Juneau
 
Overview of Java EE 6 by Roberto Chinnici at SFJUG
Overview of Java EE 6 by Roberto Chinnici at SFJUGOverview of Java EE 6 by Roberto Chinnici at SFJUG
Overview of Java EE 6 by Roberto Chinnici at SFJUGMarakana Inc.
 
Utilizing JSF Front Ends with Microservices
Utilizing JSF Front Ends with MicroservicesUtilizing JSF Front Ends with Microservices
Utilizing JSF Front Ends with MicroservicesJosh Juneau
 
LatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 StandardLatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 Standarddenis Udod
 
Java EE 6, Eclipse @ EclipseCon
Java EE 6, Eclipse @ EclipseConJava EE 6, Eclipse @ EclipseCon
Java EE 6, Eclipse @ EclipseConLudovic Champenois
 
Lecture 10 - Java Server Faces (JSF)
Lecture 10 - Java Server Faces (JSF)Lecture 10 - Java Server Faces (JSF)
Lecture 10 - Java Server Faces (JSF)Fahad Golra
 
Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010Rohit Kelapure
 
Java EE 8 Update
Java EE 8 UpdateJava EE 8 Update
Java EE 8 UpdateRyan Cuprak
 
Java EE 6 & GlassFish = Less Code + More Power at CEJUG
Java EE 6 & GlassFish = Less Code + More Power at CEJUGJava EE 6 & GlassFish = Less Code + More Power at CEJUG
Java EE 6 & GlassFish = Less Code + More Power at CEJUGArun Gupta
 
Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 javatwo2011
 
SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4Jon Galloway
 
Groovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentationGroovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentationStuart (Pid) Williams
 
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
 
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnition
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnitionJava EE 6 & GlassFish = Less Code + More Power @ DevIgnition
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnitionArun Gupta
 
Java EE 6 = Less Code + More Power
Java EE 6 = Less Code + More PowerJava EE 6 = Less Code + More Power
Java EE 6 = Less Code + More PowerArun Gupta
 
Java EE 8: On the Horizon
Java EE 8:  On the HorizonJava EE 8:  On the Horizon
Java EE 8: On the HorizonJosh Juneau
 

Ähnlich wie JSF2 (20)

JSF 2: Myth of panacea? Magic world of user interfaces
JSF 2: Myth of panacea? Magic world of user interfacesJSF 2: Myth of panacea? Magic world of user interfaces
JSF 2: Myth of panacea? Magic world of user interfaces
 
Java EE8 - by Kito Mann
Java EE8 - by Kito Mann Java EE8 - by Kito Mann
Java EE8 - by Kito Mann
 
Java EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVCJava EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVC
 
Overview of Java EE 6 by Roberto Chinnici at SFJUG
Overview of Java EE 6 by Roberto Chinnici at SFJUGOverview of Java EE 6 by Roberto Chinnici at SFJUG
Overview of Java EE 6 by Roberto Chinnici at SFJUG
 
Utilizing JSF Front Ends with Microservices
Utilizing JSF Front Ends with MicroservicesUtilizing JSF Front Ends with Microservices
Utilizing JSF Front Ends with Microservices
 
LatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 StandardLatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 Standard
 
Java EE 6, Eclipse @ EclipseCon
Java EE 6, Eclipse @ EclipseConJava EE 6, Eclipse @ EclipseCon
Java EE 6, Eclipse @ EclipseCon
 
Lecture 10 - Java Server Faces (JSF)
Lecture 10 - Java Server Faces (JSF)Lecture 10 - Java Server Faces (JSF)
Lecture 10 - Java Server Faces (JSF)
 
Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010
 
Java EE 8 Update
Java EE 8 UpdateJava EE 8 Update
Java EE 8 Update
 
Java EE 6 & GlassFish = Less Code + More Power at CEJUG
Java EE 6 & GlassFish = Less Code + More Power at CEJUGJava EE 6 & GlassFish = Less Code + More Power at CEJUG
Java EE 6 & GlassFish = Less Code + More Power at CEJUG
 
Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望
 
The JavaFX Ecosystem
The JavaFX EcosystemThe JavaFX Ecosystem
The JavaFX Ecosystem
 
SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4
 
Groovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentationGroovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentation
 
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
 
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnition
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnitionJava EE 6 & GlassFish = Less Code + More Power @ DevIgnition
Java EE 6 & GlassFish = Less Code + More Power @ DevIgnition
 
Java EE 6 = Less Code + More Power
Java EE 6 = Less Code + More PowerJava EE 6 = Less Code + More Power
Java EE 6 = Less Code + More Power
 
Java EE 8: On the Horizon
Java EE 8:  On the HorizonJava EE 8:  On the Horizon
Java EE 8: On the Horizon
 
jQuery On Rails
jQuery On RailsjQuery On Rails
jQuery On Rails
 

Mehr von Alex Tumanoff

Sql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiSql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiAlex Tumanoff
 
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikOdessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikAlex Tumanoff
 
Azure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAzure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAlex Tumanoff
 
Sdlc by Anatoliy Anthony Cox
Sdlc by  Anatoliy Anthony CoxSdlc by  Anatoliy Anthony Cox
Sdlc by Anatoliy Anthony CoxAlex Tumanoff
 
Kostenko ux november-2014_1
Kostenko ux november-2014_1Kostenko ux november-2014_1
Kostenko ux november-2014_1Alex Tumanoff
 
Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Alex Tumanoff
 
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас..."Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...Alex Tumanoff
 
Sql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevSql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevAlex Tumanoff
 
Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoAlex Tumanoff
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsAlex Tumanoff
 
Игры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковИгры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковAlex Tumanoff
 
Android sync adapter
Android sync adapterAndroid sync adapter
Android sync adapterAlex Tumanoff
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergAlex Tumanoff
 
Неформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITНеформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITAlex Tumanoff
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений FirefoxAlex Tumanoff
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...Alex Tumanoff
 
Patterns of parallel programming
Patterns of parallel programmingPatterns of parallel programming
Patterns of parallel programmingAlex Tumanoff
 

Mehr von Alex Tumanoff (20)

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

Kürzlich hochgeladen

Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
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
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
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
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 

Kürzlich hochgeladen (20)

Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
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
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
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
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 

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
  • 4.
  • 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