Você está na página 1de 77

(dez) maus hbitos

dos desenvolvedores JSF


Rafael Ponte http://www.rponte.com.br rponte@gmail.com Tarso Bessa http://www.tarsobessa.com tarso.bessa@gmail.com

Os 10

Quem? Rafael Ponte

Tarso Bessa

Desenvolvedor Coordenador do grupo JavaSF Entusiasta Java e JSF Consultor da TriadWorks

Arquiteto Java Entusiasta Java e JSF Membro do Cejug Trabalha na Dataprev

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 ento maus hbitos..

10 Mau hbito

Usar <c:if/> ou <c:when/> para esconder componentes do usurio

<c:if test=#{bean.admin}> <h:dataTable var=row> <h:column> ... </h:column> </h:dataTable> </c:if>

Usar <c:if/> ou <c:when/> SOLUO? para esconder componentes do usurio

Utilizar o atributo rendered dos componentes para escond-los do usurio

<c:if test=#{bean.admin}> <h:dataTable rendered=#{bean.admin}> <h:column> ... </h:column> </h:dataTable> </c:if>

9 Mau hbito

Usar stateless EL no atributo rendered em um componente que dispare eventos

<h:commandButton value=Salvar action=#{bean.salvar} rendered=#{bean.admin} />

SOLUO?

Garantir a avaliao consistente da EL entre requisies.

session?

O uso indevido ou exarcebado da session prejudicial para a aplicao.

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 hbito

Usar <redirect/> nas regras de navegao para forar a mudana da URL

SOLUO?

Simplesmente

entendam como funciona um

REDIRECT

7 Mau hbito

Alterar o estado de algum componente no lado cliente [browser] atravs de javascript e esperar que isso seja entendido pelo JSF

Firebug

SOLUO?

Alterar o estado do componente no lado servidor via AJAX e re-renderizar o componente

6 Mau hbito

Utilizao demasiada de parmetros de request e desenvolvimento voltado a "chave primria"

<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){ ... } }

SOLUO?

Pensar mais orientado a objetos e deixar com que os componentes troquem objetos e no chaves primrias

<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 mtodos equals() e hashCode() das entidades da aplicao.

5 Mau hbito

Usar o valor do submittedValue de um componente como se fosse o valor real do componente.

Restore View

Apply Request Values

Process Validations

Render Response

Invoke Application

Update Model 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 } }

SOLUO?

Dividir o formulrio 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 hbito

Implementam o prprio mecanismo de SEGURANA

public class LoginPhaseListener implements PhaseListener { //on RESTORE_VIEW public void afterPhase(PhaseEvent e) { if( !isLoggedIn() && !isLogin() ){ //navigate to login page } } }

SOLUO?

Utilizem um framework especializado

Usar /faces/* ou *.jsf quando se tem pginas em xhtml pode levar a uma exposio do cdigo fonte.

3 Mau hbito

Paginao de registros na session

Uma das melhores maneiras de matar a escalabilidade da aplicao a utilizao indiscriminada da session

SOLUO?

Paginao sob demanda

2 Mau hbito

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(); } }

SOLUO?

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 hbito

1 -e o pior- Mau hbito

JSF LIFECYCLE

JSF LIFECYCLE

A maioria dos desenvolvedores NO entendem

JSF LIFECYCLE

SOLUO?

http://balusc.blogspot.com /2006/09/debug-jsf-lifecycle.html

Entendam o ciclo de vida

Concluindo..

Perguntas?

Obrigado!
twitter.com/rponte twitter.com/tarsobessa

Você também pode gostar