SlideShare a Scribd company logo
1 of 77
Download to read offline
Os 10
          (dez)
    maus hábitos
  dos desenvolvedores JSF

Rafael Ponte               Tarso Bessa
http://www.rponte.com.br   http://www.tarsobessa.com
rponte@gmail.com           tarso.bessa@gmail.com
Quem?
“Rafael Ponte”          “Tarso Bessa”
●   Desenvolvedor       ●   Arquiteto Java
●   Coordenador do      ●   Entusiasta Java e
    grupo JavaSF            JSF
●   Entusiasta Java e   ●   Membro do Cejug
    JSF                 ●   Trabalha na
●   Consultor da            Dataprev
    TriadWorks
JSF tenta encapsular
toda a complexidade
no desenvolvimento
web com Java
A maioria dos desenvolvedores web que já
trabalharam ou trabalham com algum
framework “action-like” acabam tendo
grandes dificuldades ao desenvolverem
com JSF.
Criando-se então maus
hábitos..
10º Mau hábito
Usar <c:if/> ou <c:when/>
para esconder componentes
do usuário
<c:if test=”#{bean.admin}”>
 <h:dataTable var=”row”>
    <h:column>
       ...
    </h:column>
 </h:dataTable>
</c:if>
Usar <c:if/> ou <c:when/>
        SOLUÇÃO?
para esconder componentes
do usuário
Utilizar o atributo
    rendered dos
  componentes para
escondê-los do usuário
<c:if test=”#{bean.admin}”>
 <h:dataTable
     rendered=”#{bean.admin}”>
    <h:column>
       ...
    </h:column>
 </h:dataTable>
</c:if>
9º Mau hábito
Usar “stateless” EL no atributo
rendered em um componente que
dispare eventos
<h:commandButton value=”Salvar”
action=”#{bean.salvar}”
rendered=”#{bean.admin}” />
SOLUÇÃO?
Garantir a avaliação
consistente da EL entre
requisições.
session?
O uso indevido ou exarcebado da
session é prejudicial para a
aplicação.
mais longo que request | mais curto que session



✔   Myfaces Tomahawk [t:saveState]
✔   Myfaces Orchestra
✔   Myfaces Trinidad [pageFlowScope]
✔   JBoss Seam
✔   JBoss Richfaces [a4j:keepAlive]
✔   etc
8º Mau hábito
Usar <redirect/> nas regras
de navegação para forçar a
mudança da URL
SOLUÇÃO?
entendam
Simplesmente
 como funciona um
    REDIRECT
7º Mau hábito
Alterar o estado de algum
componente no lado cliente
[browser] através de javascript e
esperar que isso seja “entendido”
pelo JSF
Firebug
SOLUÇÃO?
Alterar o estado do
componente no lado
servidor via AJAX e
  re-renderizar o
     componente
6º Mau hábito
Utilização    demasiada       de
parâmetros    de     request   e
desenvolvimento voltado a "chave
primária"
<h:dataTable value="#{users}" var="user">
   <h:column ...>
     <h:commandLink value="X"
       action="#{bean.remove}" >
       <f:param name="id"
          value="#{user.id}"/>
      </h:commandLink>
   </h:column>
</h:dataTable>
public void remove(){
  Integer id = new Integer(
  facesContext.getExternalContext().
      getRequestParametersMap().
      get(“id”) );
   User user = search(id);
  if(user != null){
    ...
  }
}
SOLUÇÃO?
Pensar mais orientado a
objetos e deixar com que os
  componentes troquem
  objetos e não “chaves
         primárias”
<h:dataTable value="#{users}" var="user">
   <h:column ...>
     <h:commandLink value="X"
       action="#{bean.remove}" >
       <f:setPropertyActionListener
          value="#{user}"
          target="#{bean.user}"/>
      </h:commandLink>
   </h:column>
</h:dataTable>
public void setUser(User user){
  this.user = user;
}

public void remove(){
  if(user != null){
     // ...
  }
}
É fundamental implementar os
métodos equals() e hashCode()
das entidades da aplicação.
5º Mau hábito
Usar o valor do submittedValue de
um componente como se fosse o
valor real do componente.
Apply
Restore                   Process
            Request
 View                    Validations
             Values




                          Update
 Render      Invoke
                          Model
Response   Application
                          Values
//immediate=false
private UIInput input;

//immediate=true
public void calcTaxes(ActionEvent e) {
   String dateStr = (String)
          input.getSubmittedValue();
   Date date = convertDate ( dateStr );

    if( date.after ( otherDate ) ) {
       //calculate
    }
}
SOLUÇÃO?
Dividir o formulário
   em subforms
private Date date;

//immediate=false
public void calcTaxes(ActionEvent e) {

    if( date.after ( otherDate ) ) {
       //calculate
    }
}
A quem recorrer?



✔   Myfaces Tomahawk [t:subform]
✔   Myfaces Trinidad [tr:subform]
✔   JBoss Richfaces [a4j:region]
4º Mau hábito
Implementam o
próprio mecanismo
 de SEGURANÇA
public class LoginPhaseListener
  implements PhaseListener {

    //on RESTORE_VIEW
    public void afterPhase(PhaseEvent e) {
      if( !isLoggedIn() && !isLogin() ){
         //navigate to login page
      }
    }
}
SOLUÇÃO?
Utilizem um framework
      especializado
Usar /faces/* ou *.jsf quando se tem
páginas em xhtml pode levar a uma
exposição do código fonte.
3º Mau hábito
Paginação de
registros na session
Uma das melhores maneiras de
matar a escalabilidade da
aplicação    é   a    utilização
indiscriminada da session
SOLUÇÃO?
Paginação sob
  demanda
2º Mau hábito
Efetuar consultas de
      maneira
   INEFICIENTE
<h:dataTable
  value="#{bean.usersList}"
  var="user">
   <h:column ...>
    ...
   </h:column>
</h:dataTable>
public class Bean {

    public List<User> getUsersList() {
      return service.findAllUsers();
    }
}
SOLUÇÃO?
Usar consultas
em eventos ou
  callbacks
public class Bean {

    @PostConstruct
    public void initialize(){
       this.users = service.findAllUsers();
    }

    public List<User> getUsersList() {
      return this.users;
    }
}
public class Bean {

    public void search(ActionEvent e){
       this.users = service.findUsers( … );
    }

    public List<User> getUsersList() {
      return this.users;
    }
}
1º Mau hábito
1º -e o pior- Mau
      hábito
JSF LIFECYCLE
JSF LIFECYCLE




    A maioria dos
desenvolvedores NÃO
      entendem
JSF LIFECYCLE




SOLUÇÃO?
http://balusc.blogspot.com
/2006/09/debug-jsf-lifecycle.html




 Entendam o
 ciclo de vida
Concluindo..
Perguntas?
Obrigado!
  twitter.com/rponte

twitter.com/tarsobessa

More Related Content

Similar to Os 10 Maus Hábitos dos Desenvolvedores JSF

Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Anderson Araújo
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Wennder Santos
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFRafael Ponte
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no FrontendHenrique Gogó
 
Dicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidDicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidUbiratan Soares
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 

Similar to Os 10 Maus Hábitos dos Desenvolvedores JSF (20)

Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSF
 
Jj08 otimizacao
Jj08 otimizacaoJj08 otimizacao
Jj08 otimizacao
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
Tutorial.yii
Tutorial.yiiTutorial.yii
Tutorial.yii
 
Dicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidDicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App Android
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 

Os 10 Maus Hábitos dos Desenvolvedores JSF