SlideShare a Scribd company logo
1 of 36
Download to read offline
JavaServer Faces (JSF)
   e boas práticas



Rafael Ponte
rponte@gmail.com
http://www.rponte.com.br
| O que é importante
                 saber...
●   Ciclo de vida de uma requisição JSF
●   Otimizar requisições AJAX e atualizações
    parciais de páginas
●   Tudo funcionando em uma única página
●   E Facelets, vai me servir para algo?
●   Integrando JSF e ExtJs, em busca de
    uma abordagem flexível
Ciclo de vida de
uma requisição JSF
JSF Request lifecycle
            Retrieve component tree
  Restore   from client or session                    May skip to
   View                                             render phase
                        Decode components          or abort request
       Apply Request    (populate w/ String
          Values        values)   Convert Strings to
                  Process         Objects
                 Validations      Validate Objects
 Request
                              Update         Call setters
                              Model          on managed beans
              Invoke bean
                                        Invoke
              method(s)
 Response                            Application
              Compute navigation
                          Call bean getters to    Render
                          populate               Response
                          components
| Depurando o ciclo
●   A primeira chamada
●   Refresh
●   Submetendo o form
●   Adiciona immediate=”true” para UIInput somente
●   Adiciona immediate=”true” para UICommand somente
●   Adiciona immediate=”true” para UIInput e UICommand
●   Erro de conversão
●   Erro de validação
| Depurando o ciclo
●   A primeira chamada
                                          * A fase é “pulada” pois não
                                          houve form submit
    1. Restore view
      Como a UIViewRoot está vazia, não há o que fazer aqui
    2. Apply request values *
    3. Process validations *
    4. Update model values *
    5. Invoke application *
    6. Render response
      Os componentes são criados pela primeira vez e
      armazenados na UIViewRoot e são setados os component
      bindings.
| Depurando o ciclo
●   Refresh
                                         * A fase é “pulada” pois não
                                         houve form submit
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são
      setados os component bindings
    2. Apply request values *
    3. Process validations *
    4. Update model values *
    5. Invoke application *
    6. Render response
      Os valores à serem exibidos são recuperados através dos
      getters no managed bean, se eles não foram setados então o
      valor default será null
| Depurando o ciclo
●   Submetendo o form
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são
      setados os component bindings
    2. Apply request values
      Nada demais aqui. Os valores são recuperados do form e
      setados nos componentes no UIViewRoot
    3. Process validations
      Os valores são recuperados como objetos dos componentes
      através do método getAsObject() do converter e validados
      pelo validator. Finalmente o valueChangeListener é invocado


                                                               [...]
| Depurando o ciclo
●   Submetendo o form
    4. Update model values
      Os valores convertidos e validados serão agora setados
      através do setters dos value bindings do managed bean
    5. Invoke application
      O processamento real da submissão do form acontece aqui
    6. Render response
      Os valores à serem exibidos são recuperados através dos
      getters no managed bean, se um converter é definido então
      o valor será obtido através do método getAsString() do
      converter e o valor será exibido no form
| Depurando o ciclo
●   Adiciona immediate=”true” para UIInput
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são
      setados os component bindings
    2. Apply request values
      Os valores são recuperados através do método getAsObject() do
      converter, validados pelo validator e o valueChangeListener é
      invocado. Daí os valores convertidos e validados são setados nos
      componentes relevantes no UIViewRoot. Isso acontece aqui invés da
      fase Process validations devido ao immediate=”true” no h:inputText

    3. Process validations
      Nada aqui. A conversão e validação já foram processadas na
      fase anterior antes de os valores serem setados nos
      componentes
                                                                      [...]
| Depurando o ciclo
●   Adiciona immediate=”true” para UIInput
    4. Update model values
      Os valores convertidos e validados serão agora setados
      através do setters dos value bindings do managed bean
    5. Invoke application
      O processamento real da submissão do form acontece aqui
    6. Render response
      Os valores à serem exibidos são recuperados através dos
      getters no managed bean, se um converter é definido então
      o valor será obtido através do método getAsString() do
      converter e o valor será exibido no form
| Depurando o ciclo
●   Adiciona immediate=”true” para UICommand
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são
      setados os component bindings
    2. Apply request values
      O processamento real da submissão do form acontece aqui. Isso
      acontece nesta fase invés da fase Invoke application devido ao
      immediate=”true” no h:commandButton. Os componentes UIInput
      que não possuem immediate=”true” setado serão ignorados, e
      portanto, eles não serão convertidos nem validados

    3. Process validations
      Esta fase é “pulada” devido ao immediate=”true” no
      h:commandButton

                                                                       [...]
| Depurando o ciclo
●   Adiciona immediate=”true” para UICommand
    4. Update model values
      Esta fase é “pulada” devido ao immediate=”true” no
      h:commandButton

    5. Invoke application
      Esta fase é “pulada” devido ao immediate=”true” no
      h:commandButton

    6. Render response
      Os valores à serem exibidos são recuperados através dos getters no
      managed bean. Atenção: Como a fase Update model values é
      “pulada” os value bindings não são setados e o getters dos value
      bindings retornarão null. Os componentes UIInput que não possuem
      immediate=”true” setado serão ignorados e não será possível
      recuperar os valores do componente ou value binding.
| Depurando o ciclo
●   Adiciona immediate=”true” para UIInput e
    UICommand
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são setados os component
      bindings

    2. Apply request values
      Os valores são recuperados através do método getAsObject() do converter,
      validados pelo validator e o valueChangeListener é invocado e os valores
      convertidos e validados são setados no componentes relevantes no
      UIViewRoot. Isso acontece aqui invés da fase Process validations devido ao
      immediate=”true” no h:inputText. Finalmente o processamento real da
      submissão do form acontece aqui. Isso acontece nesta fase ao invés da fase
      Invoke application devido ao immediate=”true” no h:commandButton.

    3. Process validations
      Esta fase é “pulada” devido ao immediate=”true” no
      h:commandButton                                                              [...]
| Depurando o ciclo
●   Adiciona immediate=”true” para UIInput e
    UICommand
    4. Update model values
      Esta fase é “pulada” devido ao immediate=”true” no h:commandButton

    5. Invoke application
      Esta fase é “pulada” devido ao immediate=”true” no h:commandButton

    6. Render response
      Os valores à serem exibidos são recuperados através dos getters no managed
      bean. Atenção: Como a fase Update model values é “pulada” os value
      bindings não são setados e o getters dos value bindings retornarão null. Mas
      os valores ainda estão avaliados por component bindings que foram setados
      na fase Apply request values, assim você poderá recuperar o valor do input
      com inputBinding.getValue() no método action(). O novo valor do input será
      também avaliado pelo ValueChangeEvent no método inputChanged()
| Depurando o ciclo
●   Erro de conversão
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são
      setados os component bindings
    2. Apply request values
      Nada demais aqui. Os valores são recuperados do form e
      setados nos componentes no UIViewRoot
    3. Process validations
      Os valores são recuperados como objetos dos componentes
      através do método getAsObject() do converter onde um
      ConverterException é lançado. O validator e o
      valueChangeListener são “pulados”. O ciclo de vida “pulará”
      imediatamente para a fase Render response
                                                                [...]
| Depurando o ciclo
●   Erro de conversão
    4. Update model values
      Esta fase é pulada devido ao ConverterException
    5. Invoke application
      Esta fase é pulada devido ao ConverterException
    6. Render response
      Os valores à serem exibidos são recuperados através dos
      getters no managed bean, explicitando os valores para qual
      os ConverterException tem ocorrido
| Depurando o ciclo
●   Erro de validação
    1. Restore view
      Os componentes são restaurados do UIViewRoot e são
      setados os component bindings
    2. Apply request values
      Nada demais aqui. Os valores são recuperados do form e
      setados nos componentes no UIViewRoot
    3. Process validations
      Os valores são recuperados como objetos dos componentes
      através do método getAsObject() do converter e validados
      pelo validator, onde um ValidatorException é lançado. O
      valueChangeListener é “pulado”. O ciclo de vida “pulará”
      imediatamente para a fase Render response
                                                               [...]
| Depurando o ciclo
●   Erro de validação
    4. Update model values
      Esta fase é pulada devido ao ValidatorException
    5. Invoke application
      Esta fase é pulada devido ao ValidatorException
    6. Render response
      Os valores à serem exibidos são recuperados através dos
      getters no managed bean, explicitando os valores para qual
      os ValidatorException tem ocorrido
Otimizando
AJAX requests
| Richfaces?
●   Projeto da JBoss
●   Insere funcionalidades AJAX em
    aplicações JSF existentes
●   Já inclui Ajax4jsf, é claro!
●   Excelente compatibilidade com diversos
    conjuntos de componentes
●   Possui diversos componentes ricos
| Richfaces?
| Richfaces?


      Ajax4jsf insere
 funcionalidades AJAX em
aplicações JSF já existentes
| Richfaces?
●   Ajax4jsf
| Ajax4jsf?
 Antes de enviar uma
 requisição AJAX..


  Decida o
 que enviar!
| Ajax4jsf?
●   Limitando regiões com a4j:region
●   Diminuindo o trafégo na rede com
    eventsQueue e requestDelay
●   ajaxSingle=”true”, o lobo solitário
●   Ninguém gosta de esperar, mas com
    a4j:status as coisas até melhoram
| Ajax4jsf?
 Antes de enviar uma
 requisição AJAX..


Também decida
 o que mudar!
| Ajax4jsf?
●   Otimizando o atributo reRender
●   Limitando-se a região,
    renderRegionOnly=”true” e
    selfRendered=”true”
●   Limitando a lista de id's também ajuda,
    limitToList=”true”
●   Definindo áreas atualizavéis,
    a4j:outputPanel
Tudo funcionando
  em uma única
     página
| Única página?
●   Menos configurações para regras de
    navegação
●   Menos arquivos (jsp, xhtml) para
    manutenção
●   Renderização mais rápida
●   Menos overhead no servidor
●   Sem reload de página, lógico!
Facelets,
aproveite o
que a vida te
oferece de
melhor
| Facelets?
●   Desenvolvido especialmente para JSF
●   Rápido templating de componentes e
    páginas
●   De 30% à 50% mais rápido que JSP
●   Não está preso a Web Container
●   JBoss Seam usa e abusa
| Facelets?
●   Compatível com JSF 1.1 e JSF 1.2
●   Excelente depuração de erros
●   Será integrado ao JSF 2.0
●   Utiliza-se de XHTML nas páginas (alguns
    seres não gostam disso o.O)
●   Compatível com a maioria (se não
    todos) os conjuntos de componentes
| Facelets?


Eu disse de 30%
   à 50% mais
 rápido que JSP
| Facelets?


 Será integrado
  ao JSF 2.0, tu
entedestes o que
    eu disse?
JSF+ExtJs
Em busca de
uma abordagem
flexível

More Related Content

Viewers also liked

Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFRafael Ponte
 
Importância dos testes automatizadoss
Importância dos testes automatizadossImportância dos testes automatizadoss
Importância dos testes automatizadossRafael Ponte
 
Greenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaGreenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaRafael Ponte
 
Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Rafael Ponte
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesRafael Ponte
 
UtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_Melo
UtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_MeloUtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_Melo
UtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_Melothalesboss
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
11601快訊新聞五則
11601快訊新聞五則11601快訊新聞五則
11601快訊新聞五則beelinelmn
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorAllyson Barros
 
Desenvolvimento Web com JSF
Desenvolvimento Web com JSFDesenvolvimento Web com JSF
Desenvolvimento Web com JSFDalton Valadares
 
Caelum java-testes-jsf-web-services-design-patterns-fj22
Caelum java-testes-jsf-web-services-design-patterns-fj22Caelum java-testes-jsf-web-services-design-patterns-fj22
Caelum java-testes-jsf-web-services-design-patterns-fj22Moisés Moura
 
Entendendo Domain-Driven Design
Entendendo Domain-Driven DesignEntendendo Domain-Driven Design
Entendendo Domain-Driven DesignRafael Ponte
 
Prototipos de Baixa e Alta Fidelidade
Prototipos de Baixa e Alta FidelidadePrototipos de Baixa e Alta Fidelidade
Prototipos de Baixa e Alta FidelidadeErico Fileno
 

Viewers also liked (20)

Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSF
 
Importância dos testes automatizadoss
Importância dos testes automatizadossImportância dos testes automatizadoss
Importância dos testes automatizadoss
 
Greenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaGreenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresa
 
Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer Faces
 
UtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_Melo
UtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_MeloUtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_Melo
UtilizandoJSF_no_Desenvolvimento_de_aplicacoes_web_by_Thales_Batista_de_Melo
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
11601快訊新聞五則
11601快訊新聞五則11601快訊新聞五則
11601快訊新聞五則
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
 
Curso jsf
Curso jsfCurso jsf
Curso jsf
 
Apresentação JSF
Apresentação JSFApresentação JSF
Apresentação JSF
 
Desenvolvimento Web com JSF
Desenvolvimento Web com JSFDesenvolvimento Web com JSF
Desenvolvimento Web com JSF
 
Framework web 3 - JSF + Spring boot
Framework web 3 - JSF + Spring bootFramework web 3 - JSF + Spring boot
Framework web 3 - JSF + Spring boot
 
Pilha e filas
Pilha e filasPilha e filas
Pilha e filas
 
Caelum java-testes-jsf-web-services-design-patterns-fj22
Caelum java-testes-jsf-web-services-design-patterns-fj22Caelum java-testes-jsf-web-services-design-patterns-fj22
Caelum java-testes-jsf-web-services-design-patterns-fj22
 
Apostila JSF 2.0 - K19
Apostila JSF 2.0 - K19Apostila JSF 2.0 - K19
Apostila JSF 2.0 - K19
 
Entendendo Domain-Driven Design
Entendendo Domain-Driven DesignEntendendo Domain-Driven Design
Entendendo Domain-Driven Design
 
JSF - JavaServer Faces
JSF - JavaServer FacesJSF - JavaServer Faces
JSF - JavaServer Faces
 
Prototipos de Baixa e Alta Fidelidade
Prototipos de Baixa e Alta FidelidadePrototipos de Baixa e Alta Fidelidade
Prototipos de Baixa e Alta Fidelidade
 
Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
 

Similar to JSF lifecycle and best practices optimization

WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08Gilson Silva
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEBRafael Chinelato Del Nero
 
Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)Loiane Groner
 
Um framework para validação automática de modelos aplicado ao subsistema de e...
Um framework para validação automática de modelos aplicado ao subsistema de e...Um framework para validação automática de modelos aplicado ao subsistema de e...
Um framework para validação automática de modelos aplicado ao subsistema de e...Italo Pinto Rodrigues
 
Web Service Checker 0.2 (Circuit Breaker)
Web Service Checker 0.2 (Circuit Breaker)Web Service Checker 0.2 (Circuit Breaker)
Web Service Checker 0.2 (Circuit Breaker)Raphael Medeiros
 

Similar to JSF lifecycle and best practices optimization (7)

WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08
 
Entendento Arquitetura MVI + Flow
Entendento Arquitetura MVI + FlowEntendento Arquitetura MVI + Flow
Entendento Arquitetura MVI + Flow
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEB
 
Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)
 
Um framework para validação automática de modelos aplicado ao subsistema de e...
Um framework para validação automática de modelos aplicado ao subsistema de e...Um framework para validação automática de modelos aplicado ao subsistema de e...
Um framework para validação automática de modelos aplicado ao subsistema de e...
 
Web Service Checker 0.2 (Circuit Breaker)
Web Service Checker 0.2 (Circuit Breaker)Web Service Checker 0.2 (Circuit Breaker)
Web Service Checker 0.2 (Circuit Breaker)
 

More from Rafael Ponte

TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSETechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSERafael Ponte
 
TechDay Retrospectiva 2018
TechDay Retrospectiva 2018TechDay Retrospectiva 2018
TechDay Retrospectiva 2018Rafael Ponte
 
Arquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do HypeArquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do HypeRafael Ponte
 
Como treinar seu estagiario
Como treinar seu estagiarioComo treinar seu estagiario
Como treinar seu estagiarioRafael Ponte
 
Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016Rafael Ponte
 
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015Rafael Ponte
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Rafael Ponte
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Rafael Ponte
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Rafael Ponte
 
Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)Rafael Ponte
 
Importância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a diaImportância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a diaRafael Ponte
 
Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)Rafael Ponte
 
Migrations for Java
Migrations for JavaMigrations for Java
Migrations for JavaRafael Ponte
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 

More from Rafael Ponte (14)

TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSETechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
 
TechDay Retrospectiva 2018
TechDay Retrospectiva 2018TechDay Retrospectiva 2018
TechDay Retrospectiva 2018
 
Arquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do HypeArquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do Hype
 
Como treinar seu estagiario
Como treinar seu estagiarioComo treinar seu estagiario
Como treinar seu estagiario
 
Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016
 
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)
 
Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)
 
Importância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a diaImportância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a dia
 
Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)
 
Migrations for Java
Migrations for JavaMigrations for Java
Migrations for Java
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 

JSF lifecycle and best practices optimization

  • 1. JavaServer Faces (JSF) e boas práticas Rafael Ponte rponte@gmail.com http://www.rponte.com.br
  • 2. | O que é importante saber... ● Ciclo de vida de uma requisição JSF ● Otimizar requisições AJAX e atualizações parciais de páginas ● Tudo funcionando em uma única página ● E Facelets, vai me servir para algo? ● Integrando JSF e ExtJs, em busca de uma abordagem flexível
  • 3. Ciclo de vida de uma requisição JSF
  • 4. JSF Request lifecycle Retrieve component tree Restore from client or session May skip to View render phase Decode components or abort request Apply Request (populate w/ String Values values) Convert Strings to Process Objects Validations Validate Objects Request Update Call setters Model on managed beans Invoke bean Invoke method(s) Response Application Compute navigation Call bean getters to Render populate Response components
  • 5. | Depurando o ciclo ● A primeira chamada ● Refresh ● Submetendo o form ● Adiciona immediate=”true” para UIInput somente ● Adiciona immediate=”true” para UICommand somente ● Adiciona immediate=”true” para UIInput e UICommand ● Erro de conversão ● Erro de validação
  • 6. | Depurando o ciclo ● A primeira chamada * A fase é “pulada” pois não houve form submit 1. Restore view Como a UIViewRoot está vazia, não há o que fazer aqui 2. Apply request values * 3. Process validations * 4. Update model values * 5. Invoke application * 6. Render response Os componentes são criados pela primeira vez e armazenados na UIViewRoot e são setados os component bindings.
  • 7. | Depurando o ciclo ● Refresh * A fase é “pulada” pois não houve form submit 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values * 3. Process validations * 4. Update model values * 5. Invoke application * 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean, se eles não foram setados então o valor default será null
  • 8. | Depurando o ciclo ● Submetendo o form 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values Nada demais aqui. Os valores são recuperados do form e setados nos componentes no UIViewRoot 3. Process validations Os valores são recuperados como objetos dos componentes através do método getAsObject() do converter e validados pelo validator. Finalmente o valueChangeListener é invocado [...]
  • 9. | Depurando o ciclo ● Submetendo o form 4. Update model values Os valores convertidos e validados serão agora setados através do setters dos value bindings do managed bean 5. Invoke application O processamento real da submissão do form acontece aqui 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean, se um converter é definido então o valor será obtido através do método getAsString() do converter e o valor será exibido no form
  • 10. | Depurando o ciclo ● Adiciona immediate=”true” para UIInput 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values Os valores são recuperados através do método getAsObject() do converter, validados pelo validator e o valueChangeListener é invocado. Daí os valores convertidos e validados são setados nos componentes relevantes no UIViewRoot. Isso acontece aqui invés da fase Process validations devido ao immediate=”true” no h:inputText 3. Process validations Nada aqui. A conversão e validação já foram processadas na fase anterior antes de os valores serem setados nos componentes [...]
  • 11. | Depurando o ciclo ● Adiciona immediate=”true” para UIInput 4. Update model values Os valores convertidos e validados serão agora setados através do setters dos value bindings do managed bean 5. Invoke application O processamento real da submissão do form acontece aqui 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean, se um converter é definido então o valor será obtido através do método getAsString() do converter e o valor será exibido no form
  • 12. | Depurando o ciclo ● Adiciona immediate=”true” para UICommand 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values O processamento real da submissão do form acontece aqui. Isso acontece nesta fase invés da fase Invoke application devido ao immediate=”true” no h:commandButton. Os componentes UIInput que não possuem immediate=”true” setado serão ignorados, e portanto, eles não serão convertidos nem validados 3. Process validations Esta fase é “pulada” devido ao immediate=”true” no h:commandButton [...]
  • 13. | Depurando o ciclo ● Adiciona immediate=”true” para UICommand 4. Update model values Esta fase é “pulada” devido ao immediate=”true” no h:commandButton 5. Invoke application Esta fase é “pulada” devido ao immediate=”true” no h:commandButton 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean. Atenção: Como a fase Update model values é “pulada” os value bindings não são setados e o getters dos value bindings retornarão null. Os componentes UIInput que não possuem immediate=”true” setado serão ignorados e não será possível recuperar os valores do componente ou value binding.
  • 14. | Depurando o ciclo ● Adiciona immediate=”true” para UIInput e UICommand 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values Os valores são recuperados através do método getAsObject() do converter, validados pelo validator e o valueChangeListener é invocado e os valores convertidos e validados são setados no componentes relevantes no UIViewRoot. Isso acontece aqui invés da fase Process validations devido ao immediate=”true” no h:inputText. Finalmente o processamento real da submissão do form acontece aqui. Isso acontece nesta fase ao invés da fase Invoke application devido ao immediate=”true” no h:commandButton. 3. Process validations Esta fase é “pulada” devido ao immediate=”true” no h:commandButton [...]
  • 15. | Depurando o ciclo ● Adiciona immediate=”true” para UIInput e UICommand 4. Update model values Esta fase é “pulada” devido ao immediate=”true” no h:commandButton 5. Invoke application Esta fase é “pulada” devido ao immediate=”true” no h:commandButton 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean. Atenção: Como a fase Update model values é “pulada” os value bindings não são setados e o getters dos value bindings retornarão null. Mas os valores ainda estão avaliados por component bindings que foram setados na fase Apply request values, assim você poderá recuperar o valor do input com inputBinding.getValue() no método action(). O novo valor do input será também avaliado pelo ValueChangeEvent no método inputChanged()
  • 16. | Depurando o ciclo ● Erro de conversão 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values Nada demais aqui. Os valores são recuperados do form e setados nos componentes no UIViewRoot 3. Process validations Os valores são recuperados como objetos dos componentes através do método getAsObject() do converter onde um ConverterException é lançado. O validator e o valueChangeListener são “pulados”. O ciclo de vida “pulará” imediatamente para a fase Render response [...]
  • 17. | Depurando o ciclo ● Erro de conversão 4. Update model values Esta fase é pulada devido ao ConverterException 5. Invoke application Esta fase é pulada devido ao ConverterException 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean, explicitando os valores para qual os ConverterException tem ocorrido
  • 18. | Depurando o ciclo ● Erro de validação 1. Restore view Os componentes são restaurados do UIViewRoot e são setados os component bindings 2. Apply request values Nada demais aqui. Os valores são recuperados do form e setados nos componentes no UIViewRoot 3. Process validations Os valores são recuperados como objetos dos componentes através do método getAsObject() do converter e validados pelo validator, onde um ValidatorException é lançado. O valueChangeListener é “pulado”. O ciclo de vida “pulará” imediatamente para a fase Render response [...]
  • 19. | Depurando o ciclo ● Erro de validação 4. Update model values Esta fase é pulada devido ao ValidatorException 5. Invoke application Esta fase é pulada devido ao ValidatorException 6. Render response Os valores à serem exibidos são recuperados através dos getters no managed bean, explicitando os valores para qual os ValidatorException tem ocorrido
  • 21. | Richfaces? ● Projeto da JBoss ● Insere funcionalidades AJAX em aplicações JSF existentes ● Já inclui Ajax4jsf, é claro! ● Excelente compatibilidade com diversos conjuntos de componentes ● Possui diversos componentes ricos
  • 23. | Richfaces? Ajax4jsf insere funcionalidades AJAX em aplicações JSF já existentes
  • 24. | Richfaces? ● Ajax4jsf
  • 25. | Ajax4jsf? Antes de enviar uma requisição AJAX.. Decida o que enviar!
  • 26. | Ajax4jsf? ● Limitando regiões com a4j:region ● Diminuindo o trafégo na rede com eventsQueue e requestDelay ● ajaxSingle=”true”, o lobo solitário ● Ninguém gosta de esperar, mas com a4j:status as coisas até melhoram
  • 27. | Ajax4jsf? Antes de enviar uma requisição AJAX.. Também decida o que mudar!
  • 28. | Ajax4jsf? ● Otimizando o atributo reRender ● Limitando-se a região, renderRegionOnly=”true” e selfRendered=”true” ● Limitando a lista de id's também ajuda, limitToList=”true” ● Definindo áreas atualizavéis, a4j:outputPanel
  • 29. Tudo funcionando em uma única página
  • 30. | Única página? ● Menos configurações para regras de navegação ● Menos arquivos (jsp, xhtml) para manutenção ● Renderização mais rápida ● Menos overhead no servidor ● Sem reload de página, lógico!
  • 31. Facelets, aproveite o que a vida te oferece de melhor
  • 32. | Facelets? ● Desenvolvido especialmente para JSF ● Rápido templating de componentes e páginas ● De 30% à 50% mais rápido que JSP ● Não está preso a Web Container ● JBoss Seam usa e abusa
  • 33. | Facelets? ● Compatível com JSF 1.1 e JSF 1.2 ● Excelente depuração de erros ● Será integrado ao JSF 2.0 ● Utiliza-se de XHTML nas páginas (alguns seres não gostam disso o.O) ● Compatível com a maioria (se não todos) os conjuntos de componentes
  • 34. | Facelets? Eu disse de 30% à 50% mais rápido que JSP
  • 35. | Facelets? Será integrado ao JSF 2.0, tu entedestes o que eu disse?
  • 36. JSF+ExtJs Em busca de uma abordagem flexível