Neste exemplo podemos encontrar:
- Um sistema CRUDE completo JSF2;
- Persistencia com EJB3;
- Injeção de dependencia via anotação @EJB;
- @ViewScope com @PostConstruct;
- Validação e messagens JSF;
- Utilização da tag <f:ajax />;
- Utilização de skins diferenciados via parametro de contexto “primefaces.THEME” no web.xml;
- Utilização de templates via facelets;
Primeiro você deve ter um ambiente com JDK6, JBOSS 6.0, Eclipse J2EE WTP + JBOSS Tools Plugin – Breve farei um post ensinando como configurar este ambiente.
Baixo o exemplo completo aqui: ejbjsf2.war
Use a opcao do eclipse Import->WAR file …


Depois de clikar finish vc vai ter a aplicação pronta para analise.
Bom, vamos analizar alguns passos que foram utilizados para criar a aplicação:
1 – A aplicação foi criada como um “Dynamic Web Projec”, foi selecionado JBoss 6 comO Targe runtime, servlet 3.0, configuração custom para inserir o JSF2, foi marcada a opção para gerar o web.xml e escolhido a extensão *.xhtml para o JSF;





2 – Depois é montada a aplicação na seguinte estrutura:

2.1 – Dentro de src foi criado a pasta META-INF e um arquivo persistence.xml. Este é o arquivo responsavel pela conexão de bando de dados do JPA utilizado pelos EJB. No caso, inicialmente eu fiz uma configuração utilizando um data source Oracle chamado FrankleyDS que configurei dentro da pasta do JBOSS, mas comentei e fiz uma configuração utilizando o DefaultDS que já vem preconfigurado para melhor portabilidade do exemplo. Feito isso tá pronto a conexão com o banco;

2.2 – Foi criado a classe “Contato.java” dentro do pacote “modelo”:
-implementa Serializable;
- tem a anotação @Entity para indicar que é uma entidade de persistencia;
- tem a anotação @SequenceGenerator(name = “SEQ_CONTATO”, sequenceName = “SEQ_CONTATO”,allocationSize=0,initialValue=1) é para funcionamento em conjunto com oracle (Não é obrigatoria para o exemplo, mas não faz mau deixar);
- temos a anotação @Id;
- a anotação @GeneratedValue( generator = “SEQ_CONTATO” , strategy = GenerationType.SEQUENCE) tambem é para funcionamento em conjunto com oracle (basta por @GeneratedValue para funcionar o exemplo, tambem não faz mau deixar como está)
Feito isto já temos o nosso Mapeamento Objeto Relacional;

2.3 – Foi criado a Interface IContatoBO no pacote “negocio” que serve para especificar nosso EJB;
![]()
2.4 – Foi criado a Classe ContatoBO que é nosso EJB:
- vemos a anotação @Stateless, quer dizer que vai ser um bean que não guarda estado e por isso consome menos memoria;
- vemos a anotação @Local, quer dizer que a comunicação com o EJB vai ser em modo local, os beans não serão serializados e nem vai ser possivel acessar remotamente este EJB;
- a anotação @PersistenceContext é que faz nosso trabalho sujo. Ela indica que vai ser injetado nossa persistence-unit “sample”, que configuramos no nosso persistence.xml, no objeto EntityManager em. Isso vai acontecer porque nois temos apenas uma persistence-unit configurada no nosso projeto, caso tenhamos mais de uma somos obrigados a colocar por exemplo @PersistenceContext(name=”sample”);
Feito isto temos nosso EJB pronto para uso;

2.5 – Foi criado a classe ContatoBean que é o famoso Bean JSF:
- No JSF2, eu não preciso mais configurar faces-config.xml basta por a anatação @ManagedBean para o bean ficar disponivel para o xhtml;
- E colocar a anotation para representar o escopo do bean @ViewScoped, @RequestScoped, @SessionScoped ou @ApplicationScoped. No nosso caso colocamos @ViewScoped para indicar que o bean vai ter escopo de Visão (Novo no JSF2 – Enquanto não trocar de pagina o bean sera mantido na memoria, quase igual a @SessionScoped);
(Ps.: Atentar para na hora de importar essas anotações utilizar o pacote javax.faces.bean.* );
- Temos a anotação @EJB, que é o cora que vai dizer pro JBoss que o nosso objeto IContatoBO contatoBO é um EJB e vai injeta-lo no noss bean jsf. Porem esta injecão ocorre um pouco depois de nosso objeto ser criado na memoria e como estamos utilizando o view scope, não podemos colocar a linha listaContato = contatoBO.listar(); no construtor do Bean JSF. Pois vai dar bilha e por isso existe a anotação @PostConstruct que deve ser colocada em um metodo qualquer sem retorno, exemplo public void construct() – Já tá bem esplicadinho no comentario do codigo.
- Tambem vemos que as actions não precisam ter retorno String, podem ser void;
Pronto temos nosso Bean JSF pronto.

2.6 – Não precisamos de muita configuração, já que o JBoss 6.0 já traz o mojara 2.0 configurado de cara, basta adicionar a biblioteca do primefaces (primefaces-2.2.1.jar) e os temas do primefaces que utilizei para teste bluesky (bluesky-1.0.1.jar) e hot-sneaks (hot-sneaks-1.0.1.jar) e jogar tudo detro do WEB-INF/lib da aplicação.
A configuração do web.xml ficou bem simples, no caso as bobagem de sempre do JSF e nossa escolha do tema “bluesky” para o primefaces ficar com a cara do RichFaces. Caso queira pode por o “hot-sneaks” no lugar já que já tem o “.jar” dele dentro da lib. E a faces-config.xhtml foi criado só pra desencargo de consciencia.

2.7 – foi criado uma pasta templates com os .xhtml: template.xhtml, header.xhtml e footer.xhtml que são os templates de facelet para nossa aplicação.

2.7 – Foi criado uma index.jsp, apenas para redirecionar para contato.xhtml, não sei pq carga dágua esse trem não funfou de forma direta se eu boto um index.xhtml.

2.8 – E foi criado o contato.xhtml utilizando primefaces, primefaces não precisa de configuração no JSF2.
achei interessante que não foi preciso utilizar mais o a4j, em vez diso utilizei o <f:ajax > do JSF2
o resto foi mais pra enfeitar, como as mensagens, validação essas balelas todas.

E Finalmente a Aplicação rodando, ficou biita pra caramba – meninim de papai …

Tentei me ater a explicar mais a parte de background que foi o que mudou + no JSF2.
Bom, espero que este exemplo ajude você que esta lendo este post.
Vai dando uma pesquisada ae,
e espera o proximo post, que é como montar o ambiente.
Sei que devia vir primeiro mais enfim – Jorge Lucas, lançou o Star War 4,5 e 6 antes do 1,2 e 3.
Vlw, tou é com sono …
Parabens Frankalino, O Bean ta com um pequeno problema quando salva o contato não é atualizado na lista abaixo, isso ocorre devido que a mesma na actionSalvar não é recarregada, ou seja, tem que listar novamente. Modifiquei e ficou assim: ha sim detale, no contato.xhtml substitui o actionLimpar pelo actionNovo()
@Named
@ViewScoped
public class ContatoBean implements Serializable{
private static final long serialVersionUID = 1L;
private Contato contato = new Contato();
private List listaContato;
@EJB
private IContatoBO contatoBO;
@PostConstruct
public void construct() {
//chamado quando o managed bean colocado no escopo view,
//e nao a cada requisicao como acontecia com o escopo request
listaContato = contatoBO.listar();
}
public void actionNovo(){
listaContato = contatoBO.listar();
contato = new Contato();
}
public List getListaContato(){
actionNovo();
return listaContato;
}
public void actionSalvar(){
contatoBO.salvar(contato);
actionNovo();
}
public void actionRemove(){
contatoBO.remove(contato);
actionNovo();
}
public Contato getContato() {
return contato;
}
public void setContato(Contato contato) {
this.contato = contato;
}
}
vlw machadim!!!
Muito Bom e Parabéns pela sua iniciativa, gostei do Post. Explica detalhadamente cada passo, utiliza uma comunicação bem humorada, tem muita imagem para poder situar melhor o leitor. Da até vontade de programar (mas aguentarei bravamente).
Falow !
Vlw