Este é o 3º artigo da série. Assume portanto que já tem um projeto de exemplo JSF a funcionar. É altura de fazer algumas experiências, nomeadamente criar um “backing bean”.
Um backing bean é uma classe Java que responde a pedidos e gere o estado dos componentes JSF. É uma espécie de “servlet de alto nível”. Entre várias outras funções, faz a ligação à camada dos serviços que pode ser uma BD, um servidor remoto ou outro. Uma aplicação pode conter múltiplos backing beans.
Os backing beans mais conhecidos em Java são os “managed beans” e os “named beans” (ou CDI beans). Os primeiros são mais comuns; os segundos mais flexíveis. Os conceitos são muito semelhantes. Usaremos os primeiros devido à facilidade de utilização e porque o Tomcat apenas suporta esses.
Um managed bean representa o Controller no padrão MVC. Caracteriza-se consoante o seu âmbito (scope). Os mais importantes são:
- Application: o bean persiste na aplicação estando disponível para todas as sessões;
- Session: o bean existe por utilizador; é útil para dados referentes ao que utilizador está a fazer durante um período de utilização;
- View: semelhante ao session, mas por tab; é como que se cada tab do browser representasse uma sessão diferente;
- Request: a única gestão de estado que existe dura apenas o pedido e por isso é o mais leve.
Para exemplificar como funciona um managed bean… criemos um. Para efeitos de aprendizagem, comecemos com um bean de sessão, o que apresenta menos desafios. Para tal, após ter o projeto JSF (criado no artigo anterior) aberto:
- Clique com o botão direito do rato em Source Packages e faça New > Java Class…:
- Dê-lhe o nome de
ClientesBean
e coloque-o no packagept.revista.programar
. - O bean criado estará automaticamente disponível para ser usado nos XHTML sob a forma de
ClientesBean
(técnica conhecida como convention over configuration). Para tal, anote a classe com as anotações@ManagedBean
e@SessionScoped
(disponíveis emjavax.faces.bean
). - Agora, crie uma propriedade com getter/setter chamada
nome
. Ficará com o seguinte código:package pt.revista.programar; import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean @SessionScoped public class ClientesBean implements Serializable { String nome; public string getNome(){ return nome; } public void setNome(String nome) { this.nome = nome; } }
- Agora, na pasta
Web Pages
, vá aindex.html
e dentro deh:body
coloque o seguinte código:<h:form> <h:inputText Value="#{clientsBean.nome}" /> <h:commandButton Acton="resultado" value="enviar" /> </h:form>
Tal código irá comunicar com o managed bean criado anteriormente. O botão irá submeter o formulário.
Agora precisamos da página para onde seremos redirecionados. Teremos de chamá-la de
resultado.xhtml
para que aaction
no botão anterior seja respeitada. Para criar está página carregue com o botão direito sobre Web Pages > New > Other > Web > XHTML > Next; dê-lhe o nomeresultado
e faça Finish.- Apague todo o conteúdo e copie o conteúdo de
index.html
. - Vamos apenas substituir o conteúdo de
h:body
de maneira a ficar:<h:body> <h:outputText value="Boa tarde #{clientesBean.nome}" /> </h:body>
- Agora está tudo em ordem. Já temos uma página que recebe o seu nome, um bean que o guarda e uma página que o exibe. Para ver tudo em ação, clique com o botão direito no projeto e faça Run.
O JSF é um mundo construído em cima das tecnologias que já conhece (HTTP, servlets, JavaScript, etc.), pelo que por vezes é estranho que seja tão alto nível. Após alguns anos a usá-lo posso garantir que depois do período inicial de aprendizagem, compensa: a velocidade de desenvolvimento aumenta consideravelmente e damos por nós a fazer coisas muito complexas em muito pouco tempo.
Há que assinalar também que, ao usar JSF, devemos tentar sempre conhecer e fazer uso das suas funcionalidades.
Isto porque é provável que ele resolva o nosso problema e não seja preciso escrever código específico. Seja chamadas AJAX, personalização do componente, utilização da query string, entre outros, o JSF já pensou nisso. Se precisamos de um componente mais avançado, existem as bibliotecas de componentes (ICEfaces, RichFaces, PrimeFaces), que trazem componentes muito ricos, flexíveis e funcionais. É improvável que tenhamos de recorrer a código JavaScript para operações comuns; a ideia de usar uma framework server-side é mesmo essa: ser tudo personalizável por via dos atributos XHTML dos componentes.
Espero que tenha gostado do artigo. Qualquer dúvida, sinta-se à vontade para me contactar. Consoante o interesse da comunidade poderei escrever mais artigos sobre o tema, nomeadamente sobre a integração e utilização do PrimeFaces.