Inicial > Desenvolvimento Java, Engenharia de Software, Testes automatizados > Tutorial JSF 2 + Primefaces + EJB 3 + JPA + GlassFish 3.1.1

Tutorial JSF 2 + Primefaces + EJB 3 + JPA + GlassFish 3.1.1

Para  esse tutorial vamos utilizar:

Eclipse Indigo – > http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/indigosr2-rc3

Glassfish 3.1.1  – > http://glassfish.java.net/downloads/3.1.1-final.html

Primefaces -> Última versão estável do primefaces primefaces3.1.1.jar(23/02/2012)

http://www.primefaces.org/downloads.html

EJB 3, Defult no Glassfish.

JPA 2, Defult no Glassfish.

JSF 2(Mojarra), Defult Glassfish.

   1)      Criando o projeto:

Crie um EJB Project (Botão direito -> new -> EJB Project)

Insira um nome para o projeto e vá em new Runtime -> Glassfish 3.1 ->Click em Next e defina o GlassFish da seguinte forma:

Escolha o jdk em que irá trabalhar  e em Application Server Directory selecione o  Glassfish: %caminho%+glassfish-3.1.1/glassfish (diretório onde está localizado seu glassfish vá em glassfish-3.1.1/glassfish).

Após clicar em finish, marque o checkBox para adicionar o projeto EAR, veja imagem abaixo:

Após selecionar clique em Next até chegar em:

Escolha um nome para o Projeto Cliente no caso ProjetoEjbClient (Contrato para acessar os EJB’s). Clique em Finish.

2) Criando o Projeto Web

Crie um Dynamic Web Project :

Clique em Next, marque o checkBox “Generate Web.xml deployment descriptor” e para finalizar clique finish.

   Vamos adicionar o projetoEjbClient dentro do ProjetoWeb, ou seja para acessar os Ejbs o projeto web precisa conhecer apenas as interfaces (Contratos).

  Clique com o botão direito no ProjetoWeb -> Properties -> Java Build Path -> Projects -> add

    Marque o ProjetoEjbClient e clique em OK :

  

Clique em Ok para finalizar.

  3) Configurando o JSF 2.0 e o Primefaces

Clique com o botão direto no projeto ProjetoWeb -> properties -> project Facets e marque a opção Java server faces version 2.0:

Após selecionar JavaServer Faces clique em “Futher configuration required” e siga os seguintes passos:

Após fazer esses procedimentos clique em OK,  no formulário de baixo Clique e Apply e em OK novamente.

Vamos adicionar a biblioteca do primefaces no projeto:  http://www.primefaces.org/downloads.html , baixe a versão primefaces-3.1.1.jar . Adicione a biblioteca dentro de: /ProjetoWeb/WebContent/WEB-INF/lib depois adicione no Build Path : botão direito do mouse encima de primefaces-3.1.1.jar ->Build Path -> add Build Path.

Agora vamos adicionar o servidor no eclipse, vai  em Servers -> botão direito -> new -> Server->  escolha o Glassfish 3.1, caso não aparece o Glassfish vá em “Download aditional Server adapters” e baixe o plugin do Glassfish.

Após Selecionar o GlassFish 3.1.1 clique em “Add..”  escolha o JDK e selecione a pasta de localização do Glassfish:

Depois Next->Next->Finish -> ainda não adicione o ProjetoEjbEAR no Server.

4) Criando o banco de dados

  • Baixe o jar do mysqlConnector mysql-connector-java-5.1.13-bin
  • Copie o jar para : %caminhoGlassfish%\glassfish-3.1.1\glassfish\lib
  • Crie um banco com o nome tutorial, não insira nenhuma tabela(vamos inserir através de mapeamento no java).
  • Rode o glassfish que está no eclipse (sem aplicação, ou seja tira a nossa aplicação do servidor).
  • Entre com o seguinte endereço no browser.
  • http://localhost:8080
  • Após entrar, no menu vá em  JDBC->JDBC Connection Pools -> New.

Preencha os campos como o exemplo:

Pool Name : tutorial

Resource Type: javax.sql.connectionPoolDataSouce

Dababase Driver Vendor: MySql

  • Clique em Next-> Em Additional Properties (199) preencha os seguintes campos:

DatabaseName: tutorial

User: “usuario do seu banco” ex:”root”

Password:”senha do seu banco” ex:”root”

Servername:”servidor onde encontra o banco” no caso do tutorial “localhost”

URL:jdbc:mysql://localhost:3306/tutorial

url:jdbc:mysql://localhost:3306/tutorial

·         Após esses passos clique em finish e teste a conexão clicando em PING.

·         Caso esteja tudo certo você verá a segunte Mensagem  “Ping Succeeded

       Agora vamos criar o DataSource

No menu do glassfish vá em ->JDBC->JDBC Resources->New. Preenche os seguintes dados:

JNDI Name : jdbc/tutorial

Pool Name: selecione o pool que criamos “tutorial” clique em OK.

  5) Configurar DataSorce no persistence.xml

No projeto ProjetoEjb  vá em /ejbModule/META-INF e insira um xml chamado persistence.xml

Clique com o botão direito em META-INF vá em New-> Other…-> digita xml e escolha XML File.

Dentro de pesistence.xml implemente o seguinte código:

Clique na imagem para ampliar.

Após configurar o persistence.xml, vamos criar as entidades:

No projeto ProjetoEjbClient adicione o seguinte pacote : br.com.tutorial.entidade

Dentro desse pacote crie as classes Clientes e Pedidos.

Clientes.java

Pedidos.java

    6) Criando as intefaes e os EJBs

Essas intefaces servirão Para fazermos lookup no EJB, ou seja caso precisamos que uma outra aplicação acesse nosso ejb tanto no mesmo servidor quanto em outros servidores precisaremos dessa interface (Contrato) para fazermos o lookup.

Porque precisamos dessa interface? Pense… O projeto que irá acessar outro projeto  precisa saber quais métodos existem no outro projeto e qual classe ele irá acessar, logo ele conhecerá apenas a interface.

Vamos Criar nossas interfaces crie no projeto ProjetoEjbClient o seguinte pacote: br.com.tutorial.contratoEjb

As interfaces serão criadas com a anotação @Remote,  pois mais na frente nesse tutorial iremos acessar os ejbs através de uma outra aplicação, ou seja iremos  acessar  remotamente.

@Remote -> para o EJB ficar visível há aplicação externa.

@Local -> EJB Visível apenas para a própria aplicação.

Crie no pacote br.com.tutorial.contratoEjb as interfaces Cliente e Pedido.

ClienteRemote:

PedidoRemote:

Vamos implementar os EJBs, No projeto ProjetoEjb crie o seguinte pacote:

br.com.tutorial.sessionBean

Crie as Classes ClienteSessioBean e PedidoSessionBean

ClienteSessionBean:

PedidoSessionBean:

7) Criar ManagedBean do JSF

No ProjetoWeb dentro de “src” crie o pacote “br.com.tutorial.manegedBean”, dentro desse pacote crie nosso ManegedBean chamado de ClienteBean:

package br.com.tutorial.manegedBean;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import br.com.tutorial.contratoEjb.ClienteRemote;
import br.com.tutorial.entidade.Clientes;

@ManagedBean
@RequestScoped
public class ClienteBean {

@EJB
private ClienteRemote clienteRemote;

private Clientes cliente;

private List listaClientes;

public void salvar() {
try {
// tirando a mascara de CPF
cliente.setCpf(cliente.getCpf().replace(“.”, “”).replace(“-“, “”));
this.clienteRemote.salvar(cliente);
retornar();
} catch (Exception e) {
this.addMensagem(FacesMessage.SEVERITY_WARN, “Erro ao salvar”);
}
}

private void retornar() {
this.addMensagem(FacesMessage.SEVERITY_INFO,
“Operação realizada com sucesso”);
this.listarClientes();
cliente = new Clientes();
}

public void excluir(){
this.clienteRemote.excluir(getCliente());
cliente = new Clientes();
this.listarClientes();
}

private void addMensagem(Severity tipo, String msg) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(tipo, “”, msg));
}

public void listarClientes() {
this.listaClientes = this.clienteRemote.listarClientes();
}

public void limpar() {
cliente = new Clientes();
listaClientes = new ArrayList();
}

public Clientes getCliente() {
if (cliente == null) {
cliente = new Clientes();
}
return cliente;
}

public void setCliente(Clientes cliente) {
this.cliente = cliente;
}

public List getListaClientes() {
if (listaClientes == null) {
this.listarClientes();
}
return listaClientes;
}

public void setListaClientes(List listaClientes) {
this.listaClientes = listaClientes;
}

}

Com o Maneged Bean criado, vamos implementar nossa página, dentro de  ProjetoWeb/WebContent  crie um xhtml com o nome cliente.xhml:

Clique com o botão direito encima de WebContent new-> other-> HTML , após criar o HTML

Você deve ronomea-lo para cliente.xhtml
cliente.xhtml

   <?xml version=”1.0″ ?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” ”
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml&#8221;
xmlns:h=”http://java.sun.com/jsf/html&#8221;
xmlns:f=”http://java.sun.com/jsf/core&#8221;
xmlns:p=”http://primefaces.org/ui”&gt;

<h:head>
</h:head>

<h:body>

<h:form id=”form” prependId=”true”>
<p:messages showDetail=”true” autoUpdate=”true” id=”msg” />
<!–  <p:growl id=”msg” showDetail=”true” /> –>
<p:panel menuTitle=”Cadastro de Clientes”
header=”Cadastro de Clientes” id=”cadastro”>

<h:inputHidden id=”teste” value=”#{clienteBean.cliente.idCliente}” />

<h:outputLabel value=”CPF:” />
<br />
<p:inputMask mask=”999.999.999-99″ id=”cpf”
requiredMessage=”CPF Obrigatório” required=”true”
value=”#{clienteBean.cliente.cpf}” />
<br />

<h:outputLabel value=”Nome:” />
<br />
<p:inputText value=”#{clienteBean.cliente.nome}” id=”nome”
required=”true” requiredMessage=”Nome Obrigatório” />
<br />

<p:separator />

<!–  update é para atualizar os campos que estao entre as chaves, no nosso caso todo o formulário –>
<p:commandButton value=”Cadastrar” action=”#{clienteBean.salvar}”
update=”form,:consulta” />

<!– imediate é devido aos campos obrigatórios, com immediate true os campos não são obrigatórios na consulta –>
<p:commandButton value=”Consultar”
action=”#{clienteBean.listarClientes}” update=”:consulta”
immediate=”true” />
</p:panel>

<br />
</h:form>

<h:form id=”consulta”>
<!– caso seja alteração –>
<p:dataTable id=”dataTable” var=”var”
value=”#{clienteBean.listaClientes}” paginator=”true” rows=”10″
rendered=”#{not empty clienteBean.listaClientes}”
paginatorTemplate=”{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}”
rowsPerPageTemplate=”5,10,15″>

<p:column>
<f:facet name=”header”>
<h:outputText value=”CPF” />
</f:facet>
<h:outputText value=”#{var.cpf}” />
</p:column>

<p:column>
<f:facet name=”header”>
<h:outputText value=”Nome” />
</f:facet>
<h:outputText value=”#{var.nome}” />
</p:column>

<p:column>
<p:commandButton image=”ui-icon ui-icon-close”
update=”:form,:consulta” title=”Editar Cliente”
action=”#{clienteBean.excluir}”>
<f:setPropertyActionListener value=”#{var}”
target=”#{clienteBean.cliente}” />
</p:commandButton>
</p:column>

</p:dataTable>
<!– oncomplete=”confirmation.show()” update=”:consulta,:confirmacao” –>
</h:form>

</h:body>
</html>

 

 

Após criar a página inicie o glassfish sem a aplicação, vamos adicionar o suporte a hibernate no glassfish, para que a aplicação consiga reconhecer o persistence.xml..

É  muito importante que a aplicação não esteja no glassfish.

 

 

Agora inicie o glassfish:

Após o servidor iniciar acesse no eu Browser : http://localhost:4848

Vá em update Tool ->procure hibernate e marque o checkbox-> clique em install->ok->accept

Esse processo é um pouco lento.

 

Após clicar em accept e esperar um pouco receberá a seguinte mensagem:

Agora vamos reiniciar o glassfish com a nossa aplicação:

Após o glassfish iniciar, verifique se  o jpa criou as entidades no seu banco de dados:

 

Acesse a URL : http://localhost:8080/ProjetoWeb/cliente.jsf

Se os passos foram executados corretamente você verá:

 

O último passo agora é modificar o persistence.xml

Modifique essa linha no persistence.xml

<property name=”hibernate.hbm2ddl.auto” value=”create” />

Por essa:

<property name=”hibernate.hbm2ddl.auto” value=”update” />

 

Com essa modificação o jpa não ficará criando as entidades toda vez que subir o servidor.

Para saber mais sobre o funcionamento de EJB,JPA sugiro a leitura da seguinte apostila

Desenvolvimento Web Avançado com JSF2. EJB 3.1 e CDI

download: http://www.k19.com.br/cursos/desenvolvimento-web-avancado-com-jsf2-ejb3.1-e-cdi

Até o Próximo Tutórial, qualquer dúvida estou a disposição.

Email: jrsilvanio@gmail.com

  1. Lennon
    abril 3, 2012 às 2:09 pm

    Amigo bom dia. Gostaria de tirar uma duvida com relação ao projeto. O Projetoweb tenho que subi-lo junto com o projetoEjbEAR?

    • abril 3, 2012 às 3:38 pm

      Bom dia Lennon,

      Não necessariamente,O Um arquivo “ear” é um arquivo com formato JAR contendo uma aplicação J2EE (Enterprise Application Archive), ou seja nele você irá colocar todos os projetos o ProjetoEjbClient, ProjetoEjb eo ProjetoWeb.

      porém você pode subir o ProjetoWeb separado dos projetos que estão no EAR.

      Para subir o ProjetoWEB dentro do EAR vai em ProjetoEjbEAR -> Clica com o botão direito -> Properties -> Deployment Assembly e adiciona o ProjetoWeb.

      Caso você queira fazer remoto;

      onde estiver

      @EJB
      private ClienteRemote clienteRemote;

      troque por:

      @EJB(lookup=”java:global/ProjetoEjbEAR/ProjetoEjb/ClienteSessionBean!br.com.tutorial.contratoEjb.ClienteRemote”)
      private ClienteRemote clienteRemote;

      isso so é possivel porque marcamos a interface ClienteRemote como @REMOTE

      Qualquer dúvida estou a disposição.

  2. Lennon
    abril 3, 2012 às 4:12 pm

    Silvanio, Obrigado pela resposta! uma duvida o meu cliente.xhtml teria que estar com a extenção .jsf? porque ele nao entra na tela de cadastro de clientes. Ja foi mapeado as entidade no banco mysql. Acho que so falta mesmo essa ultima dela aparecer para eu conseguir cadastrar. Desde já agradeço!

  3. abril 4, 2012 às 2:45 am

    Lennon, é xhtml mesmo.

    Quando você foi configurar jsf em Projeto Facets você informou a extenção?
    como está seu web.xml?

    att,

  4. abril 4, 2012 às 2:46 am

    Outra coisa, como está sua página xhtml, tem como postar aqui? talvez você esqueceu de colocar o ou

  5. Lennon
    abril 4, 2012 às 12:50 pm

    Meu amigo! consegui botar pra funcionar a tela jsf! as duvidas que eu tenho e com relação ao grown id que tiver mudar para um id diferente. Se não ele dava erro na hora de subir a tela da aplicação. E o datable de confirmação nas ultimas linhas realmente tem que ficar como comentario? Obrigado mesmo! Abraços!

  6. Lennon
    abril 4, 2012 às 2:00 pm

  7. Luciano
    junho 16, 2012 às 9:33 pm

    O Silvânio! Estou querendo realizar este exemplo no NetBeans! tens como dar umas dicas na parte da perssistência! O NetBeas já vem com o glassFish configurado! Onde confguro a parte de conexão?? Na tentativa de usar o eclipse, intalei o glassfish mas ele não apareceu no eclipse!
    Bah! Tenho que fazer um projeto usando jsf2.0 com persistência no banco e estou apanhando pra caramba!
    Valeu!

  8. Joao Paulo Ximenes Aragao
    junho 21, 2012 às 10:42 pm

    Amigo, boa noite, vendo este seu tutorial resolvi segui-lo, quando cheguei na interface do glassfish, fui em update tool,onde tem várias opções e uma delas é o hibernate, o qual você seleciona e clica em install, não tem nenhuma opção,será que falta eu copiar alguma biblioteca para alguma pasta do glassfish?Certo de sua atenção antecipo os meus sinceros agradecimentos.

  9. setembro 5, 2012 às 1:41 am

    Silvanio, estou tendo problemas quando vou acessar a interface remota. O meu objeto que está anotado com o @EJB sempre vem null, ou seja, não consigo uma instância do EJB. Você sabe o que pode ser? Obrigado e parabéns pelo post.

  10. Neto
    setembro 16, 2012 às 8:15 pm

    Amigo boa tarde, estou com tal problema quando rodo a app Element type “p:inputMask” must be followed by either attribute specifications, “>” or “/>”. Qual seria a solução

  11. Neto
    setembro 16, 2012 às 8:15 pm

    Amigo boa tarde, estou com tal problema quando rodo a app Element type “p:inputMask” must be followed by either attribute specifications, “>” or “/>”. Qual seria a solução ja tentei de tudo mas deve ser alguma besteira…

    • maio 7, 2013 às 11:49 am

      Neto verifique se você está esquecendo de fechar alguma tag, ou então algum atributo esteja colocado com outro.

  12. Walmor
    dezembro 8, 2012 às 2:35 am

    Olá Silvanio,

    Ao criar os remoto, não consigo importar os beans. Tenho que fazer algo para referenciar o projetoEjb?

  13. Walmor
    dezembro 8, 2012 às 7:42 pm

    Walmor :
    Olá Silvanio,
    Ao criar os remoto, não consigo importar os beans. Tenho que fazer algo para referenciar o projetoEjb?

    Criei os bens no projeto errado rss… valeu. Já corrigi!

  14. Abelardo Barbosa
    maio 4, 2013 às 7:12 pm

    Ops, este artigo é o melhor que encontrei na Internet. Estou desenvolvendo uma aplicação Web EJB e tenho algumas dúvidas, entre elas: Para implementar o autocomplete pelo primefaces, em que pacote do projeto eu colocaria a classe EntidadeConverter? Declaro o método no interface EJB, e implemento o método find na EntidadeSessionBean? algo assim? Grato!

  15. Sérgio
    maio 7, 2013 às 1:26 pm

    Muito obrigado Silvanio.
    estou tendo algumas dificuldades para colocar o jar no caminho do glassfish porq é um ambiente linux e nao sei onde foi instalado o glassfish.
    outra coisa tem a ver com o MySql connector, como istalar no MySql?

  16. Gustavo Soave
    junho 28, 2013 às 9:26 pm

    Muito bom tutorial, me ajudou bastante aqui.
    Mas fiquei com uma duvida sobre como ficou a PedidosBean e a pedidos.xhtml?

    Abraços

  17. julho 3, 2013 às 1:25 pm

    Depois de quebrar muito a cabeça com os erros de null no EJB. consegui descobrir onde estava o erro.
    No método Salvar do Clientebean está faltando passar o valor do nome. Basicamente esta linha que falta:
    cliente.setNome(cliente.getNome());

    Eu quebrei bastante a cabeça nisso e em outros problemas como no banco de dados, pois usei para o tutorial o servidor JBoss e o banco que vem nele. Mas consegui rodar depois de um dia e meio.

    Obrigado pelo tutorial. Foi de grande valia.

  18. maio 5, 2016 às 2:14 pm

    Bom dia, gostaria de saber se tem o projeto para download?

  19. Alessandro
    março 2, 2018 às 2:13 am

    Parabéns pelo tutorial. Estou enfrentando um problema de classloader diferente quando vou manipular o objeto que vem do EJB remoto. Por exemplo, não consigo adicionar o cliente vindo do EJB em pedido pois da um erro de Cast. Sendo que os dos objetos são iguais mas são de instancias diferentes. Sabe o que pode ser?

    • março 2, 2018 às 10:31 am

      Olá Alessandro, o tutorial está um pouco antigo.. Talvez desatualizado, pode me enviar o log?

  1. abril 25, 2012 às 4:20 am

Deixar mensagem para Silvânio Júnior Cancelar resposta