os 10 maus hábitos dos desenvolvedores jsf

77
Os 10 (dez) maus hábitos dos desenvolvedores JSF Rafael Ponte http://www.rponte.com.br [email protected] Tarso Bessa http://www.tarsobessa.com [email protected]

Upload: tarsobessa

Post on 03-Jul-2015

8.197 views

Category:

Technology


3 download

DESCRIPTION

Apresentação sobre Maus Hábitos em JSF realizada no JustJava '09.

TRANSCRIPT

Page 1: Os 10 Maus Hábitos dos Desenvolvedores JSF

Os 10 (dez) maus hábitos

dos desenvolvedores JSF

Rafael Pontehttp://[email protected]

Tarso Bessahttp://[email protected]

Page 2: Os 10 Maus Hábitos dos Desenvolvedores JSF

Quem?

● Desenvolvedor● Coordenador do

grupo JavaSF● Entusiasta Java e

JSF● Consultor da

TriadWorks

“Rafael Ponte”● Arquiteto Java● Entusiasta Java e

JSF● Membro do Cejug● Trabalha na

Dataprev

“Tarso Bessa”

Page 3: Os 10 Maus Hábitos dos Desenvolvedores JSF

JSF tenta encapsular toda a complexidade no desenvolvimento web com Java

Page 4: Os 10 Maus Hábitos dos Desenvolvedores JSF

A maioria dos desenvolvedores web que já trabalharam ou trabalham com algum framework “action-like” acabam tendo grandes dificuldades ao desenvolverem com JSF.

Page 5: Os 10 Maus Hábitos dos Desenvolvedores JSF

Criando-se então maus hábitos..

Page 6: Os 10 Maus Hábitos dos Desenvolvedores JSF

10º Mau hábito

Page 7: Os 10 Maus Hábitos dos Desenvolvedores JSF

Usar <c:if/> ou <c:when/> para esconder componentes do usuário

Page 8: Os 10 Maus Hábitos dos Desenvolvedores JSF

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

<h:column>...

</h:column></h:dataTable>

</c:if>

Page 9: Os 10 Maus Hábitos dos Desenvolvedores JSF

Usar <c:if/> ou <c:when/> para esconder componentes do usuário

SOLUÇÃO?

Page 10: Os 10 Maus Hábitos dos Desenvolvedores JSF

Utilizar o atributo rendered dos

componentes para escondê-los do usuário

Page 11: Os 10 Maus Hábitos dos Desenvolvedores JSF

<c:if test=”#{bean.admin}”><h:dataTable

rendered=”#{bean.admin}”><h:column>

...</h:column>

</h:dataTable></c:if>

Page 12: Os 10 Maus Hábitos dos Desenvolvedores JSF

9º Mau hábito

Page 13: Os 10 Maus Hábitos dos Desenvolvedores JSF

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

Page 14: Os 10 Maus Hábitos dos Desenvolvedores JSF

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

Page 15: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 16: Os 10 Maus Hábitos dos Desenvolvedores JSF

Garantir a avaliação consistente da EL entre requisições.

Page 17: Os 10 Maus Hábitos dos Desenvolvedores JSF

session?

Page 18: Os 10 Maus Hábitos dos Desenvolvedores JSF

O uso indevido ou exarcebado da session é prejudicial para a aplicação.

Page 19: Os 10 Maus Hábitos dos Desenvolvedores JSF

✔ Myfaces Tomahawk [t:saveState]✔ Myfaces Orchestra✔ Myfaces Trinidad [pageFlowScope]✔ JBoss Seam✔ JBoss Richfaces [a4j:keepAlive]✔ etc

mais longo que request | mais curto que session

Page 20: Os 10 Maus Hábitos dos Desenvolvedores JSF

8º Mau hábito

Page 21: Os 10 Maus Hábitos dos Desenvolvedores JSF

Usar <redirect/> nas regras de navegação para forçar a mudança da URL

Page 22: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 23: Os 10 Maus Hábitos dos Desenvolvedores JSF

Simplesmente entendam como funciona um

REDIRECT

Page 24: Os 10 Maus Hábitos dos Desenvolvedores JSF

7º Mau hábito

Page 25: Os 10 Maus Hábitos dos Desenvolvedores JSF

Alterar o estado de algum componente no lado cliente [browser] através de javascript e esperar que isso seja “entendido” pelo JSF

Page 26: Os 10 Maus Hábitos dos Desenvolvedores JSF

Firebug

Page 27: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 28: Os 10 Maus Hábitos dos Desenvolvedores JSF

Alterar o estado do componente no lado servidor via AJAX e

re-renderizar o componente

Page 29: Os 10 Maus Hábitos dos Desenvolvedores JSF

6º Mau hábito

Page 30: Os 10 Maus Hábitos dos Desenvolvedores JSF

Utilização demasiada de parâmetros de request e desenvolvimento voltado a "chave primária"

Page 31: Os 10 Maus Hábitos dos Desenvolvedores JSF

<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>

Page 32: Os 10 Maus Hábitos dos Desenvolvedores JSF

public void remove(){ Integer id = new Integer( facesContext.getExternalContext(). getRequestParametersMap(). get(“id”) );

User user = search(id); if(user != null){ ... }}

Page 33: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 34: Os 10 Maus Hábitos dos Desenvolvedores JSF

Pensar mais orientado a objetos e deixar com que os

componentes troquem objetos e não “chaves

primárias”

Page 35: Os 10 Maus Hábitos dos Desenvolvedores JSF

<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>

Page 36: Os 10 Maus Hábitos dos Desenvolvedores JSF

public void setUser(User user){ this.user = user;}

public void remove(){ if(user != null){

// ... }}

Page 37: Os 10 Maus Hábitos dos Desenvolvedores JSF

É fundamental implementar os métodos equals() e hashCode()das entidades da aplicação.

Page 38: Os 10 Maus Hábitos dos Desenvolvedores JSF

5º Mau hábito

Page 39: Os 10 Maus Hábitos dos Desenvolvedores JSF

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

Page 40: Os 10 Maus Hábitos dos Desenvolvedores JSF
Page 41: Os 10 Maus Hábitos dos Desenvolvedores JSF

RestoreView

ApplyRequest Values

ProcessValidations

RenderResponse

InvokeApplication

UpdateModelValues

Page 42: Os 10 Maus Hábitos dos Desenvolvedores JSF

//immediate=falseprivate UIInput input;

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

if( date.after ( otherDate ) ) { //calculate }}

Page 43: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 44: Os 10 Maus Hábitos dos Desenvolvedores JSF

Dividir o formulário em subforms

Page 45: Os 10 Maus Hábitos dos Desenvolvedores JSF
Page 46: Os 10 Maus Hábitos dos Desenvolvedores JSF

private Date date;

//immediate=falsepublic void calcTaxes(ActionEvent e) { if( date.after ( otherDate ) ) { //calculate }}

Page 47: Os 10 Maus Hábitos dos Desenvolvedores JSF

✔ Myfaces Tomahawk [t:subform]✔ Myfaces Trinidad [tr:subform]✔ JBoss Richfaces [a4j:region]

A quem recorrer?

Page 48: Os 10 Maus Hábitos dos Desenvolvedores JSF

4º Mau hábito

Page 49: Os 10 Maus Hábitos dos Desenvolvedores JSF

Implementam o próprio mecanismo de SEGURANÇA

Page 50: Os 10 Maus Hábitos dos Desenvolvedores JSF

public class LoginPhaseListener implements PhaseListener {

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

Page 51: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 52: Os 10 Maus Hábitos dos Desenvolvedores JSF

Utilizem um framework especializado

Page 53: Os 10 Maus Hábitos dos Desenvolvedores JSF

Usar /faces/* ou *.jsf quando se tem páginas em xhtml pode levar a uma exposição do código fonte.

Page 54: Os 10 Maus Hábitos dos Desenvolvedores JSF

3º Mau hábito

Page 55: Os 10 Maus Hábitos dos Desenvolvedores JSF

Paginação de registros na session

Page 56: Os 10 Maus Hábitos dos Desenvolvedores JSF
Page 57: Os 10 Maus Hábitos dos Desenvolvedores JSF

Uma das melhores maneiras de matar a escalabilidade da aplicação é a utilização indiscriminada da session

Page 58: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 59: Os 10 Maus Hábitos dos Desenvolvedores JSF

Paginação sob demanda

Page 60: Os 10 Maus Hábitos dos Desenvolvedores JSF

2º Mau hábito

Page 61: Os 10 Maus Hábitos dos Desenvolvedores JSF
Page 62: Os 10 Maus Hábitos dos Desenvolvedores JSF

Efetuar consultas de maneira

INEFICIENTE

Page 63: Os 10 Maus Hábitos dos Desenvolvedores JSF

<h:dataTable value="#{bean.usersList}" var="user">

<h:column ...> ...

</h:column></h:dataTable>

Page 64: Os 10 Maus Hábitos dos Desenvolvedores JSF

public class Bean {

public List<User> getUsersList() { return service.findAllUsers(); } }

Page 65: Os 10 Maus Hábitos dos Desenvolvedores JSF

SOLUÇÃO?

Page 66: Os 10 Maus Hábitos dos Desenvolvedores JSF

Usar consultas em eventos ou

callbacks

Page 67: Os 10 Maus Hábitos dos Desenvolvedores JSF

public class Bean {

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

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

Page 68: Os 10 Maus Hábitos dos Desenvolvedores JSF

public class Bean {

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

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

Page 69: Os 10 Maus Hábitos dos Desenvolvedores JSF

1º Mau hábito

Page 70: Os 10 Maus Hábitos dos Desenvolvedores JSF

1º -e o pior- Mau hábito

Page 71: Os 10 Maus Hábitos dos Desenvolvedores JSF

JSF LIFECYCLE

Page 72: Os 10 Maus Hábitos dos Desenvolvedores JSF

JSF LIFECYCLE

A maioria dos desenvolvedores NÃO

entendem

Page 73: Os 10 Maus Hábitos dos Desenvolvedores JSF

JSF LIFECYCLE

SOLUÇÃO?

Page 74: Os 10 Maus Hábitos dos Desenvolvedores JSF

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

Entendam o ciclo de vida

Page 75: Os 10 Maus Hábitos dos Desenvolvedores JSF

Concluindo..

Page 76: Os 10 Maus Hábitos dos Desenvolvedores JSF

Perguntas?

Page 77: Os 10 Maus Hábitos dos Desenvolvedores JSF

Obrigado!twitter.com/rponte

twitter.com/tarsobessa