sexta-feira, 27 de março de 2009

Entendendo um pouco de Java Server Faces (JSF)

O que é? - Java Server Faces (JSF) é um framework para desenvolvimento Web;
Por que usar? - Se tornou um padrão; - Fácil de usar; - Open source; - Etc;
O que preciso saber para conseguir acompanhar o tutorial?
-Orientação a objetos básico;
 - Java básico;
 - Jsp básico
 - XML básico;
 Agora podemos começar com algumas definições:
1. Regras de Navegação
- É a central de informações da aplicação Web, elas respondem a pergunta: "ei, para qual página vamos agora?";
 - São definidas no arquivo faces-config.xml; 
- Quando um botão ou um link é clicado, passamos por um método que retornará uma String, ou podemos enviar essa String diretamente; 
- Uma String null ou "", faz a aplicação retornar para a mesma página; 
Vejamos abaixo um exemplo:

  1.   
  2.     /welcomeJSF.jsp    
  3.     case  
  4.         sucesso   
  5.         /main.jsp   
  6.           
  7.      case>  
  8.     case  
  9.         falha   
  10.         /erro.jsp   
  11.           
  12.      case>  
  13.  
 Observações:
  1. /welcomeJSF.jsp  

- Essa linha garante que a String só será analisada se vier de welcomeJSF.jsp
(opcional)
- Muda o endereço da página no navegador; 
- Mais lento, pois são feitas duas requisições;
- Objetos colocados no escopo do request são perdidos durante a segunda requisição;

2. BackingBeans
- São classes simples com variáveis e os famosos setters e getters;
- Armazenarão os dados que serão mostrados no browser;
- Precisam ser configurados no faces-config.xml;

Escopo dos BackingBeans
- request – começa quando uma requisição HTTP é submetida e termina quando a resposta é enviada de volta aocliente;
- session – persiste durante toda a sessão;
- application – persiste por toda a duração da aplicação web. É compartilhado por todas as requisições e por todas as sessões; 

Exemplo:


  1. package beans;  
  2. public class ExemploBean {  
  3.    private String usuario;  
  4.    public void setUsuario (String usuario) {  
  5.         this.usuario = usuario;       
  6.    }  
  7.    public String getUsuario() {  
  8.         return usuario;  
  9.    }       

Agora, configurando no faces-config.xml:

  1.   
  2.     b   
  3.     class>beans.ExemploBeanclass>          
  4.     session  
  5.  

Um exemplo mais completo:

- Se em nossa welcomeJSF.jsp temos:


  1. ...  
  2.   
  3. <%--acessa a variável usuario" do bean chamado de "b"--%>  
  4.   
  5.   
  6. <%--chama o método "ok" do bean "b"--%>  
  7. ...  

- E tivessemos um método chamado "ok" na nossa classe ExemploBean:

  1. public String ok() {         
  2.     if (usuario.equals(“João Sávio”)   
  3.         return “sucesso”;       //Lembram da String? Olha ela aqui!!!!  
  4.     else  
  5.         return “falha”;  
  6. }  

 Quando o botão "OK" for pressionado, ele chamará o método "ok" do bean "b";
- Esse método retornará uma String que será analisada pelas regras de navegação;

Agora vamos ver uma utilização mais apropriada dos Backing Beans:
- Criaremos uma classe chamada ControleBean em um pacote diferenciado;
- Essa classe conterá uma variável que referenciará ExemploBean;
- Mudaremos o bean "b" na regra de navegação;

  1. package controller;  
  2. import beans.ExemploBean;  
  3. public  class ControleBean{  
  4.     private ExemploBean exBean;  
  5.     public ControleBean() {  
  6.         exBean  = new ExemploBean(); //não esquecer de instanciar  
  7.     }  
  8.     public String ok() {  
  9.         if (usuario.equals(“João Sávio”)  
  10.             return “sucesso”;  
  11.         else  
  12.             return “falha”;  
  13.     }                
  14.     //respectivos sets e gets de ExemploBean(obrigatório)  
  15. }  

E no faces-config.xml:

  1.   
  2.     b  
  3.     class>controller.ControleBeanclass>          
  4.     session  
  5.  

E como acessaremos a variável "usuario" de ExemploBean?
- Simples, basta fazer isso: "#{b.exBean.usuario}";

Quais as vantagens dessa abordagem?
- Não teremos uma classe bagunçada, ou seja, cheia de sets, gets e métodos controladores;
- Estaremos implementando o padrão MVC (Model-View-Controller) mais eficientemente, separando o Model (ExemploBean.java), o Controller (ControleBean.java) e a View (welcomeJSF.jsp);

Retirado do site JavaFree