Dificuldades todos temos, principalmente quando estamos aprendendo uma nova tecnologia, framework ou paradigma, e isso torna-se ainda pior quando não temos qualquer interesse em aprender sobre os mesmos.
Não é de hoje que percebo que a maioria das dúvidas postadas sobre JSF em listas de discussão e fóruns estão intimamente ligadas a falta de conhecimento base sobre a tecnologia ou mesmo sobre os conceitos na qual o framework (JSF) foi construído – sim, estou falando de conceitos sobre desenvolvimento web e component-based.
É óbvio que JSF existe para tentar abstrair toda a complexidade existente no desenvolvimento web Java, complexidade esta que deveríamos evitar, mas é indispensável termos o mínimo de conhecimento sobre a mesma. Pois se você acha que apenas conhecendo os componentes você construirá uma aplicação decente então você está enganado.
Assusto-me com o número de dúvidas na javasf em que o mínimo de conhecimento sobre web seria suficiente para solucionar o problema, independente do framework utilizado. Evidente que muitas das dúvidas estão ligadas a tecnologia, JSF no caso, mas estes mesmos problemas também seriam facilmente resolvidos se os desenvolvedores se dessem ao trabalho de tentar entender os fundamentos do framework.
Quando falo dos fundamentos de JSF eu estou me referindo ao ciclo de vida, comunicação entre managed beans, escopos de conversação, árvore de componentes, a idéia por trás dos converters e validators, phase listeners, modelo dos componentes etc.
Desenvolver aplicações JSF guiado por “brute-force” é algo que todo desenvolvedor deveria evitar, de fato, ver um exemplinho (ou demo) básico de um componente, copiar o código, joga-lo na aplicação e ainda por cima achar que deveria funcionar é algo ingénuo demais até mesmo para um programador iniciante.
Pior que isso é continuar tentando fazer o componente ou bloco de código funcionar a todo custo sem nem ao menos ler a documentação do mesmo [por isso o termo “brute-force”].
Não adianta correr para tentar usar os componentes se você não possui os fundamentos básicos sobre JSF ou mesmo sobre desenvolvimento web.
Saber o básico é importante
Saber o básico de qualquer tecnologia é obrigatório, e com JSF não seria diferente. Acredito que em primeiro lugar é importante entender o que é JSF e qual a diferença entre uma implementação e um conjunto de componentes.
Criar e configurar um projeto web JSF faz parte do aprendizado, independente da IDE, claro. Como disse, o interessante é não depender exclusivamente da IDE, mas sim conhecer o mínimo necessário para configurar e rodar um projeto com faces (como as libs necessárias e configuração do web.xml).
Entenda que um managed bean é apenas um POJO e que deveria ser o mais simples possível (refletindo estritamente o necessário da GUI). E por favor, coloque uma vez por todas na sua cabeça que os componentes (através de EL) acessam os valores dos managed beans através dos métodos assessores (getters e/ou setters) e não das propriedades.
Depois disso eu aconselharia o entendimento sobre converters e validators, pois eles tornam o desenvolvimento bem mais simples se comparado a outros frameworks MVC. Principalmente os converters, pois eles sim “quebram um galho” danado!
Entenda como o framework e os componentes disparam/tratam os eventos e listeners, e principalmente quando utiliza-los, pois utilizar um listener incorreto para um determinado cenário pode dificultar muito a sua vida, mesmo que no final a coisa funcione. Praticamente tudo o que você precisa saber estará na documentação do componente.
Procure entender o sistema de regras de navegação entre páginas do JSF, principalmente quando e porquê você deveria usar redirect ao invés de um simples forward. E claro, lembre-se que JSF trabalha (submete formulários) apenas com o método POST, não com GET.
Quando as páginas tornam-se grandes e até complexas vale a pena organizar os blocos de componentes através de componentes “maiores”, ou seja, componentes do tipo naming containers, com eles se torna possível manipular os componentes tanto no lado cliente quanto no lado servidor de forma mais simples.
Os fundamentos chaves do framework também fazem parte do conhecimento básico, ou você acha que apenas saber utilizar os componentes, navegar entre páginas e criar seu próprio validator são suficientes?
Sendo, é muito importante que você os compreenda da melhor forma possível. Provavelmente alguns deles você terá alguma dificuldade de entender no inicio, isto é normal, mas é interessante que você ao menos conheça superficialmente cada um deles.
Comece entendendo como e quando a árvore de componentes é gerada (está muito ligado ao ciclo de vida), busque entender como o JSF persiste o estado da árvore de componentes entre requests e porque utilizar JSTL no momento certo é importante.
Os passos necessários para estender ou construir seu próprio componente é algo também importante, mesmo que você não seja um expert nisso, conheça estes passos. Eu particularmente nunca tive a necessidade de criar um componente, apenas estendi um [uma única vez], e com a gama de componentes hoje em dia eu acho muito difícil -mas não improvável- você precisar criar seu próprio componente.
Um fundamento extremamente importante é conhecer as maneiras como os objetos e managed beans se comunicam entre si numa aplicação JSF, pois sem este conhecimento provavelmente você cometeria erros e subutilizaria o framework na sua aplicação.
E por fim, o mais importante fundamento, sem sombra de dúvidas, é entender o ciclo de vida (lifecycle) das requisições no JSF. Procure entende-lo muito bem, pois assim você evitará horas quebrando a cabeça com problemas relativamente simples (quem nunca teve dificuldades de entender como funciona o atributo immediate?).
Vale salientar que independente do(s) conjunto(s) de componentes que você pretenda utilizar os conceitos acima te permitirão trabalhar de forma prática, correta e produtiva.
Mas vá além do básico
Os conhecimentos básicos são obrigatórios quando se pretende desenvolver qualquer aplicação com JSF, por menor que ela seja, mas a partir do momento que se desenvolve aplicações maiores e até complexas se faz necessário adotar certos frameworks, abordagens e até conhecer ou saber que existem algumas soluções mais interessantes.
Assim como a maioria dos frameworks web, JSF trabalha com páginas, muitas páginas para falar a verdade, e isto nos leva a necessidade de um framework para templating. E sempre que falamos em um framework com esta finalidade para JSF nós não devemos esquecer: Aplicações sérias em JSF usam Facelets.
Para quem ainda acha que deve criar seu converter apenas para formatar e remover máscaras de strings deve se interessar por abordagens mais práticas e produtivas de se trabalhar com componentes e conversão de entidades de domínio da aplicação.
Um dos grandes problemas para quem está começando com JSF e componentes AJAX é a maneira como estes desenvolvedores subutilizam os recursos AJAX do framework e dos componentes. Sendo, vale a pena estudar e adotar uma abordagem mais eficiente para isso, uma abordagem com foco em navegação orientada a estados.
Uma abordagem orientada a estados é realmente eficaz e produtiva, mas em certos momentos precisamos “tunar” as requisições AJAX dos componentes ou mesmo diminuir os gargalos em determinadas páginas, buscar melhores práticas para os conjuntos de componentes e/ou frameworks AJAX adotados para um projeto é dever do desenvolvedor, sejam estas práticas para JBoss Richfaces, Myfaces Trinidad ou qualquer outro.
A Expression Language (EL) do JSF por padrão ainda é bem limitada, porém muito extensível, e muitas vezes precisamos de features bem mais arrojadas, logo, não podemos abrir mão de extensões como a JBoss EL para que assim evitemos implementar soluções bizarras.
Como havia dito antes, JSF trabalha apenas com POST, porém algumas vezes precisamos submeter formulários via GET ou disponibilizar links (bookmarking) que acessam recursos ou executam algum método no managed bean antes de renderizar uma página. E antes que você implemente seu próprio phase listener ou alguma solução nada elegante eu indico a você o framework Restfaces.
Nem todas as aplicações web necessitam de um mecanismo arrojado de segurança, muitas vezes uma simples página de login para autenticação e um Servlet Filter (ou phase listener) para autorização de recursos resolve o problema. Mas qualquer coisa além disso você deveria, obrigatoriamente, partir para um framework especializado no assunto: como o Spring Security ou JAAS.
Já cansei muito de bater na tecla que não existe arquitetura de referência (aka bala-de-prata) para solucionar todos os problemas de softwares, já discuti muito isso na lista do javasf, cejug e já comentei sobre isso em vários posts meus e de colegas.
Mas também sei que muitos desenvolvedores/arquitetos tem dificuldades em dar inicio numa arquitetura base que se integre bem com JSF, desta forma, eu aconselho a leitura de dois excelentes posts do Cagatay como referência básica. 1) sobre a integração de JSF+JPA+Spring com o uso massivo de anotações e 2) com a integração anterior mais o Spring Security e Myfaces Orchestra.
Se por algum motivo você não gosta ou não se dá bem com Spring então vale a pena dar uma olhada em um projeto recente de integração entre JSF e Guice, o Guicesf. O Guicesf foi uma iniciativa do Volnei, um dos membros do JavaServer Faces International Group (javasf), e que está caminhando muito bem diga-se de passagem.
Ainda assim, acredito que se você tem tempo para estudar e levantar uma arquitetura para seu projeto então corra e dê uma olhada no JBoss Seam, pois todos os problemas (escopos conversacionais, LazyInitializationException, bookmarking etc) que você encontrará com JSF e solucionará com a integração de alguns frameworks e componentes você com toda certeza poderá ter a mesma solução muito mais simples e muito melhor implementada no JBoss Seam, ou seja, soluções prontas!
Concluindo
A maior parte do conhecimento que você precisa para se tornar um bom desenvolvedor JSF está ligada aos fundamentos do framework, e aos fundamentos sobre desenvolvimento web. Com estes conhecimentos alinhados você não terá muitas dificuldades.
Além do mais, não se assuste se você tiver alguma dificuldade no inicio, principalmente se você já trabalhou com algum framework action-like, como Struts ou Webwork, pois a maioria dos desenvolvedores vindos do “mundo” action-like são os que mais possuem dificuldades em desenvolver aplicações com JSF.
Não pare por aqui, continue pesquisando e estudando sobre a tecnologia, principalmente sobre as novidades do JSF2.0 que estão por vir. Se você já possui experiência com JSF integrado a outros frameworks então aproveite seu tempo e dê uma chance ao JBoss Seam, pois sem dúvida alguma ele está trazendo grande produtivade no desenvolvimento “Enterprisey”.
Enfim, o intuito do post é abrir os olhos de novos desenvolvedores -e até de alguns veteranos- sobre como desenvolver melhor com JSF, e claro, disponibilizar fontes de estudos (quase todos os links levam a outros posts).
No final de tudo, este post nada mais é do que a minha opinião.
fala Ponte.
ótimo post. Achei até o seu MELHOR post!!
muito bons esses links, ja estão anotados.
continue assim amego…
até.
Aê Rafael, mandou bem.
Reforço também a qualidade do Seam. Eu fiz um pouco o caminho inverso. Meus primeiros contatos com JSF foram com o Seam, somente depois participei de um projeto JSF sem o Seam. O sentimento era que JSF tinham muitas limitações e que o Seam é quase que obrigatório para quem quer desenvolver com JSF, já que, como você mesmo falou, resolve grande parte dos problemas encontrados e de maneira bem elegante.
Parabéns pelo post BEM completo e com ótimas referências.
Bom post, percebo também muitas vezes perguntas basicas o que comprova a falta de pesquisa ou até mesmo de tentativas praticas para solucionar o problema. É importante lembrar que para aprender qualquer nova tecnologia iremos sempre nos esbarrar com algum tipo de problema, e são eles que nos faz aprender e dominar a tecnologia de fato.
Outro problema que percebo, são programadores que estão migrando de tecnologias que mantem a muito tempo um certo padrão de desenvolvimento ou até mesmo uma base de conhecimento padronizada. O que no java parece muitas vezes algo disperso, afinal temos varias tecnologias, e podemos usar elas combinadas ou não e podemos ter bons resultados. Para quem esta entrando neste mundo tende a ter muitas dificuldades e ficam em perguntas basicas.
A minha dica é, procure sempre a documentação oficial, ou um material de referência com procedência, sempre terá um “como iniciar”, “primeiro exemplo”… etc… Não tenham medo, leia o material, tente os exemplos, e terão a certeza que é mais simples do que parece.
Antes de postar qualquer pergunta, pergunte a sí mesmo, se você leu a documentação, se entendeu, se fez algum exemplo, e o mais importante se pesquisou algum problema parecido? caso as respostas não atendam a necessidade ai sim se faz necessário uma pergunta em forum.
De certa forma isso parece ser rude demais, mas é apenas uma dica para o bem de todos os interessados em tecnologias. Já cometi erros do tipo, e hoje procuro seguir essa pequena receita e venho obtendo sucesso.
Um abraço a todos,
Isso não foi um post… foi um capítulo de livro!
Valeu Ponte, “the jsf reference” 🙂
Muito bom o post. Parabéns.
Marcelo Carvalheiro
Simplesmente leitura obrigatória!
Parabéns Ponte, seguindo o raciocínio do Joel, já pensou em escrever um livro?
Abraço!
Ola Sr. Rafael Ponte,
eu ja assinava seu RSS a um tempo, e acompanho as postagens na lista javasf@googlegroups.com.
Mto bom ter alguem com seu nível de conhecimento, nos passando dicas e artigos para nosso aprimoramento profissional.
Atenciosamente, um abraco
Marcao
PR
muito bom,Ponte…
esses teus posts são salvadores-da-pátria…geralmente as pessoas são um pouco egoístas em relacao ao conhecimento:é realmente raro se ter um blog num nível alto como esse teu!
parabéns!
Beleza Rafael! Ótimo post.
Você vem se tornando A referência em JSF para mim.
Obrigado e parabéns!
Dos melhores posts… sem duvidas…
Parabens!
Gostei do seu blog e dos links que você recomenda. Estou começando aogra com JSF e tive muita dificuldade para entender como o Converter funciona, ele dava erro e não sabia porque ai cheguei no seu blog atraves de um arqtigo que você explica que sempre que usamos converter, os metodos equals e hashCode devem ser sobreescritos.
sempre que puder estarei lendo o seu blog
abraço
Parabens Rafael pelo excelente post.
Eu só teria uma coisa a acrescentar, que seria sobre a criação de componentes, onde algumas pessoas desejam apenas alterar o que uma determinada tag escreve (Renderer), então gostaria de colocar um link como referência (http://matthiaswessendorf.wordpress.com/2008/02/20/extending-trinidads-default-renderers/).
Valeu.
“O que todo bom desenvolvedor JSF deveria saber”: conheça o Wicket, e você verá a quantidade de conceitos e camadas e abstrações feitas pelos frameworks ‘complementares’ (Seam & cia.) que foram criadas pra resolver problemas inventados pelo próprio JSF.
É sério, depois de usar o Wicket, você percebe quanto tempo perdeu tentando martelar essas soluções mágicas.
eu ñ entendi nada meu,mas deve ser isso??
Removido comentário de um anônimo. Se o dono do comentário não tem coragem e hombridade de expor sua identidade então seu comentário, com certeza, é que não estará exposto no meu blog.
Faz pouco tempo q eu tenho tentado entender sobre JEE e desenvolvimento web e eu preciso dizer q teu post foi fundamental para eu compreender um zigalhão de coisas. E nesses tempos, pra entender alguns fundamentos eu tinha sempre q ler algo ‘do b+a=ba’ oq torna a evolução do aprendizado meio massante por sempre começar do zero.
Pra mim foi como pegar um bonde andando, mas agora eu já sei bem melhor oq estudar quando nao entender algo.
Grato pelo extrato de conhecimento, e pela excelente fonte de referencias!!
Rafael, venho do php e cada dia que estudo java, não dá vontade de parar, mas desenvolvedores também dormem :p. Foi um dos posts mais longos que já li, pois a cada link sugerido, nos leva para links que parecem intermináveis. Assim como o Dalton falou, ainda estou digerindo muitas coisas. Mas exclareci muitas dúvidas sem precisar perguntar nada. Leitura altamente recomendada. Parabéns pelo teu trabalho.
Parabéns pelo post. Muito útil e eu diria também, como outros já comentaram, leitura obrigatória.
Muito bom cara, parabens pelo post.
Este é o tipo de post que todo desenvolvedor deveria ler.
Mais uma vez, Parabens.
…e obrigado!
Muto bom, parabéns!
Perfeito!!
Esse caso do ““mundo” action-like” é com certeza verdade!
Vlw!
Puts cara já trabalho com jsf e esse post matou a paú mesmo.
Abraço
Ponte,
Conhecia o JSF em uma pós-graduação com enfase orientação a
objetos, deu para ter uma noção de como utilizá-lo JSP para desenvolvimento de aplicações web,
Gostei muito do JSP quanto ao tratamento de variaveis para uso da sessão, com muita facilidade criamos um chat, muito legal,
Tive a oportunidade de conhecer o PHP, quando comecei a utilizar o tratamento de variáveis para uso da sessão, me deu um desânimo danado,
Ae voltei para o bom e velho java para web, tive da extensão do JSP por meio do JSF,
Estou muito aminado, depois de ter lido o seu post,
PARABÉNS,
Esclareceu muitas dúvidas.
Parabéns! Adorei o post, muito instrutivo principalmente para mim q estou iniciando na carreira.
Ótimo post, apresenta uma trilha de estudos muito boa pra ser seguida o/
Show de bola! Em particular a parte do ‘pense simples’. Vejo muito o pessoal agregando um monte de pacotes e dependências desnecessárias quando poderiam criar alguma coisa simples que evitaria a necessidade de se incluir novas complexidades na aplicação.
De fato penso que até mesmo o “kit JBoss” é um tiro de canhão para a maior parte dos desenvolvedores.
Outra coisa que o pessoal esquece às vezes: JSF é servlet… saber como funcionar o mecanimos servlet é essencial.
essencial para quem está começando como eu.
parabéns!
Parabens amigo o post é excelente, abro eles diariamente para ler e reler.
Muito bom, parabéns pelo post.
Eu sei que é meio tarde, mas é que estou começando agora a trabalhar com JSF, e penando muito justamente por não ter tido tempo para aprender esses conceitos básicos.
Muito bom seu post! Parabéns!
Kara. Parabéns seus post foi um dos melhores que eu já li, estou aprendendo o JSF por conta própria para utilizar no meu TCC. E com esse post você me direcionou para vários caminhos. Valeu , muito obrigado.