4 de julho de 2007

Tutorial JSF - Parte 2

Bom, terminando o tutorial vou colocar o JSF da página de login e as classes da parte de cadastro com um CRUD completo.

Criada as classes falta criar os devidos JSP das mesmas, então vou montar um JSP bem fácil utilizando libs JSF

Linhas importantes:

Este comando acima além de dizer q o campo é obrigatório (required="true"), no value passamos a EL (Expression Language) com a ação que queremos executar ( value="#{autenticador.login}").

Esta linha nos exibe uma mensagem no qual defini em um properties.
Neste botão eu disparo a ação de pegar os dados do usuário que está logando e validando.

A tela irá ficar mais ou menos assim:

Mas como ligar os Managed Beans na tela?
Pelo faces-config.xml
Ficaria assim:


Em XML:



managed-bean
managed-bean-name autenticador
managed-beanclass br.com.imes.acesso.Acesso
managed-bean-scope session
Todo o Managed-bean tem que ter um nome, uma classe (o Bean lógico), e o scope é para ver se o Bean vai ficar em Sessão ou requisisão.
navigation-rule
from-view-id /login.jsp
navigation-case
from-outcome usuario
to-view-id /agenda.jsp
Aqui eu defino as regras de navegação do meu Bean, para onde vai se a saída for usuário, caso contrário ele mantém o estado e fica na mesma página exibindo a mensagem de erro.
application
message-bundle messages
locale-config
default-locale pt_BR
Nessa área apenas estou dizendo a linguagem nativa que uso e definindo o messages.properties
E pronto, pode rodar que seu login estará perfeitamente validando.
Agora vou colocar as classes e as páginas dos Dados da nossa agenda.
Classe Dados.java
package br.com.imes.dados;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import br.com.imes.acesso.Acesso;
@Entity
         public class Dados {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String telefoneResidencial;
private String telefoneComercial;
private String celular;
private String nextel;
private String email;
private String observacao;
@Temporal(TemporalType.DATE)
private Calendar data = new GregorianCalendar();
public Calendar getData() {
return data;
}
public void setData(Calendar data) {
this.data = data;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCelular() {
return celular;
}
public void setCelular(String celular) {
this.celular = celular;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNextel() {
return nextel;
}
public void setNextel(String nextel) {
this.nextel = nextel;
}
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = observacao;
}
public String getTelefoneComercial() {
return telefoneComercial;
}
public void setTelefoneComercial(String telefoneComercial) {
this.telefoneComercial = telefoneComercial;
}
public String getTelefoneResidencial() {
return telefoneResidencial;
}
public void setTelefoneResidencial(String telefoneResidencial) {
this.telefoneResidencial = telefoneResidencial;
}
}
Aqui possui a relação com Hibernate e os getters e setters.
Classe DadosHandler.java

package br.com.imes.dadoshandler;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;
import org.hibernate.Session;
import br.com.imes.dados.Dados;
import br.com.imes.dao.DAO;
import br.com.imes.hibernate.hibernateutil.HibernateUtil;
public class DadosHandler {
private Dados dados = new Dados();
public Dados getDados() {
return dados;
}
public void setDados(Dados dados) {
this.dados = dados;
}
public void salvarDados() {
Session session = HibernateUtil.getCurrentSession();
System.out.println("Qual id aqui? " + this.dados.getId());
if (dados.getId() == null) {
DAO dao = new DAO(session, Dados.class);
System.out.println("Qual id aqui? " + this.dados.getId());
dao.save(this.dados);
} else {
session.merge(this.dados);
}
this.dados = new Dados();
}
public void deletarDados() {
Session session = HibernateUtil.getCurrentSession();
DAO dao = new DAO(session, Dados.class);
if (dados.getId() == null) {
session.merge(this.dados);
} else {
dao.deleta(this.dados);
}
this.dados = new Dados();
}
//Tabela JSF
public List getDados2() {
Session session = HibernateUtil.getCurrentSession();
DAO dao = new DAO(session, Dados.class);
return dao.list();
}
//Evento do JSF
public void carregaDados(ActionEvent event) {
UIComponent comandLink = event.getComponent();
UIParameter parameter = (UIParameter) comandLink
.findComponent("editId");
Long id = (Long) parameter.getValue();
Session session = HibernateUtil.getCurrentSession();
DAO dao = new DAO(session, Dados.class);
this.dados = dao.load(id);
System.out.println("Qual id aqui2? " + this.dados.getId());
}
//Ajax
public List suggest(String buscaNome) {
Session session = HibernateUtil.getCurrentSession();
DAO dao = new DAO(session, Dados.class);
mandaListaSuggest();
return dao.buscaNome(buscaNome);
}
}
Aqui é onde o programa vai tratar os dados com aquele DAO Genérico criado. Fiz uma pequena brincadeira com AJAX para criar um auto-complete. No Evento do JSF é para pegar o id do usuário para carrega-lo na tabela que só aparecerá quando a mesma estiver montada.
Bom, o suggest ainda não faz nada além de auto-completar, a idéia seria gerar uma pesquisa, mas não implementei, senão deixaria complexo demais para um exemplo simples em JSF, só queria mostrar como é simples implementar Ajax em páginas JSF.
O Amateras não reconhece CSS dentro de tags JSF, logo vocês só verão a tela bonitinha quando rodar do Browser.
Infelizmente o Blogger.com não permite que eu coloque códigos XML, nem HTML na página, não sei porque mas ele tenta rodar, também não deixa nas cores e identização, logo aconselho a baixar o download e testar o código.
Qualquer dúvida estarei disponível, caso eu continue implementando este pequeno projeto eu vou postando ele aqui.
A idéia é que JSF é um padrão da Sun e uma poderosa e rápida ferramenta para se trabalhar.
O Exemplo dispinível com minha palestra no JustJava que está mais completa que este código e com menu está disponível no site, você pode fazer o download do código e testar.

7 comentários:

Anônimo disse...

O codigo do Tutorial JSF parte 2 quando vou fazer o download nao esta funcionando porfavor conserte estou precisando urgente, meu email wallac3@hotmail.com. GRATO esta muito bom esse tutorial parabens.

Bregaida disse...

Bom Dia, sou o criador do Java Anywhere, na verdade o erro do terra é para o número de downloads, por dia ele deixa disponível 30 downloads e bloqueia, infelizmente é o nosso único servidor no momento.
Estou mandando o código em anexo.

Caso alguém não consiga baixa-lo, mande um e-mail para: eduardo.bregaida@gmail.com que estaremos anexando o fonte.

Obrigado

Anônimo disse...

Boas,sera possivel disponibilizar os ficheiros para download, tento mas diz-me que nao estao disponiveis.
Muito Obrigado.

Agradeço que possam ser enviados por email para jjmest@sapo.pt

Unknown disse...

Oie,

estou seguindo o seu tutorial! Parabens.
Só uma coisa...

Está dando erro de compilação em todas as classes (CampanhaHandler, ClienteHandler, RMHandler) que utilizam a linha: "UIComponent comandLink = event.getComponent();"

A mensagem é: "The method getComponent() is undefined for the type ActionEvent".

Estou no aguardo. :)

Bjosss...

Bregaida disse...

Bom Dia Tati, deve ser a versão da lib do JSF, seguinte me adiciona no GTalk e te ajudo a resolver isso.
=)

[]sss

Robson disse...

Excelente este seu tutorial sobre JSF. Parabéns e obrigado por disponibilizar seu conhecimento sobre este excelente framework.

Abraços

Robson

Robson disse...

Excelente este seu tutorial sobre JSF. Parabéns e obrigado por disponibilizar seu conhecimento sobre este excelente framework.

Abraços

Robson