Os 10 Maus Hábitos dos Desenvolvedores JSF
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Os 10 Maus Hábitos dos Desenvolvedores JSF

  • 9,864 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
9,864
On Slideshare
9,570
From Embeds
294
Number of Embeds
6

Actions

Shares
Downloads
118
Comments
0
Likes
4

Embeds 294

http://www.tarsobessa.com 260
http://www.slideshare.net 25
http://jujo00obo2o234ungd3t8qjfcjrs3o6k-a-sites-opensocial.googleusercontent.com 5
http://webcache.googleusercontent.com 2
https://jujo00obo2o234ungd3t8qjfcjrs3o6k-a-sites-opensocial.googleusercontent.com 1
https://twitter.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 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
  • 2. 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
  • 3. JSF tenta encapsular toda a complexidade no desenvolvimento web com Java
  • 4. A maioria dos desenvolvedores web que já trabalharam ou trabalham com algum framework “action-like” acabam tendo grandes dificuldades ao desenvolverem com JSF.
  • 5. Criando-se então maus hábitos..
  • 6. 10º Mau hábito
  • 7. Usar <c:if/> ou <c:when/> para esconder componentes do usuário
  • 8. <c:if test=”#{bean.admin}”> <h:dataTable var=”row”> <h:column> ... </h:column> </h:dataTable> </c:if>
  • 9. Usar <c:if/> ou <c:when/> SOLUÇÃO? para esconder componentes do usuário
  • 10. Utilizar o atributo rendered dos componentes para escondê-los do usuário
  • 11. <c:if test=”#{bean.admin}”> <h:dataTable rendered=”#{bean.admin}”> <h:column> ... </h:column> </h:dataTable> </c:if>
  • 12. 9º Mau hábito
  • 13. Usar “stateless” EL no atributo rendered em um componente que dispare eventos
  • 14. <h:commandButton value=”Salvar” action=”#{bean.salvar}” rendered=”#{bean.admin}” />
  • 15. SOLUÇÃO?
  • 16. Garantir a avaliação consistente da EL entre requisições.
  • 17. session?
  • 18. O uso indevido ou exarcebado da session é prejudicial para a aplicação.
  • 19. mais longo que request | mais curto que session ✔ Myfaces Tomahawk [t:saveState] ✔ Myfaces Orchestra ✔ Myfaces Trinidad [pageFlowScope] ✔ JBoss Seam ✔ JBoss Richfaces [a4j:keepAlive] ✔ etc
  • 20. 8º Mau hábito
  • 21. Usar <redirect/> nas regras de navegação para forçar a mudança da URL
  • 22. SOLUÇÃO?
  • 23. entendam Simplesmente como funciona um REDIRECT
  • 24. 7º Mau hábito
  • 25. Alterar o estado de algum componente no lado cliente [browser] através de javascript e esperar que isso seja “entendido” pelo JSF
  • 26. Firebug
  • 27. SOLUÇÃO?
  • 28. Alterar o estado do componente no lado servidor via AJAX e re-renderizar o componente
  • 29. 6º Mau hábito
  • 30. Utilização demasiada de parâmetros de request e desenvolvimento voltado a "chave primária"
  • 31. <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>
  • 32. public void remove(){ Integer id = new Integer( facesContext.getExternalContext(). getRequestParametersMap(). get(“id”) ); User user = search(id); if(user != null){ ... } }
  • 33. SOLUÇÃO?
  • 34. Pensar mais orientado a objetos e deixar com que os componentes troquem objetos e não “chaves primárias”
  • 35. <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>
  • 36. public void setUser(User user){ this.user = user; } public void remove(){ if(user != null){ // ... } }
  • 37. É fundamental implementar os métodos equals() e hashCode() das entidades da aplicação.
  • 38. 5º Mau hábito
  • 39. Usar o valor do submittedValue de um componente como se fosse o valor real do componente.
  • 40. Apply Restore Process Request View Validations Values Update Render Invoke Model Response Application Values
  • 41. //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 } }
  • 42. SOLUÇÃO?
  • 43. Dividir o formulário em subforms
  • 44. private Date date; //immediate=false public void calcTaxes(ActionEvent e) { if( date.after ( otherDate ) ) { //calculate } }
  • 45. A quem recorrer? ✔ Myfaces Tomahawk [t:subform] ✔ Myfaces Trinidad [tr:subform] ✔ JBoss Richfaces [a4j:region]
  • 46. 4º Mau hábito
  • 47. Implementam o próprio mecanismo de SEGURANÇA
  • 48. public class LoginPhaseListener implements PhaseListener { //on RESTORE_VIEW public void afterPhase(PhaseEvent e) { if( !isLoggedIn() && !isLogin() ){ //navigate to login page } } }
  • 49. SOLUÇÃO?
  • 50. Utilizem um framework especializado
  • 51. Usar /faces/* ou *.jsf quando se tem páginas em xhtml pode levar a uma exposição do código fonte.
  • 52. 3º Mau hábito
  • 53. Paginação de registros na session
  • 54. Uma das melhores maneiras de matar a escalabilidade da aplicação é a utilização indiscriminada da session
  • 55. SOLUÇÃO?
  • 56. Paginação sob demanda
  • 57. 2º Mau hábito
  • 58. Efetuar consultas de maneira INEFICIENTE
  • 59. <h:dataTable value="#{bean.usersList}" var="user"> <h:column ...> ... </h:column> </h:dataTable>
  • 60. public class Bean { public List<User> getUsersList() { return service.findAllUsers(); } }
  • 61. SOLUÇÃO?
  • 62. Usar consultas em eventos ou callbacks
  • 63. public class Bean { @PostConstruct public void initialize(){ this.users = service.findAllUsers(); } public List<User> getUsersList() { return this.users; } }
  • 64. public class Bean { public void search(ActionEvent e){ this.users = service.findUsers( … ); } public List<User> getUsersList() { return this.users; } }
  • 65. 1º Mau hábito
  • 66. 1º -e o pior- Mau hábito
  • 67. JSF LIFECYCLE
  • 68. JSF LIFECYCLE A maioria dos desenvolvedores NÃO entendem
  • 69. JSF LIFECYCLE SOLUÇÃO?
  • 70. http://balusc.blogspot.com /2006/09/debug-jsf-lifecycle.html Entendam o ciclo de vida
  • 71. Concluindo..
  • 72. Perguntas?
  • 73. Obrigado! twitter.com/rponte twitter.com/tarsobessa