create table tb_agenda (
id integer generated always as identity constraint id_pk primary key,
nome varchar(50) not null,
telefone varchar(30),
email varchar(30),
dtnascimento date
);


Depois de terminarmos será criado o seguinte conteúdo para o arquivo:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="Agenda-ejbPU" transaction-type="JTA">
<jta-data-source>jdbc/agenda</jta-data-source>
<properties></properties>
</persistence-unit>
</persistence>
package agenda;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="tb_agenda")
public class Agenda implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="nome",length=50)
private String nome;
@Column(name="telefone",length=40)
private String telefone;
@Column(name="email",length=30)
private String email;
@Column(name="dtnascimento")
@Temporal(TemporalType.DATE)
private Date dtnascimento;
public int getId(){ return id; }
public void setId(int id) { this.id = id; }
public String getNome() { return nome; }
public void setNome(String nome) { this.nome =nome;}
public String getTelefone() { return telefone; }
public void setTelefone(String telefone) {this.telefone = telefone;}
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email;}
public Date getDtnascimento() { return dtnascimento; }
public void setDtnascimento(Date dtnascimento){
this.dtnascimento = dtnascimento;
}
}
Não vou perder tempo explicando as annotations, porque isto já esta ficando grande e porque já tem um monte de site explicando isto :P (sem contar que na javamagazine deste mes tem uma materia sobre JPA).
Agora temos que criar nosso EJB de negócio, um stateless simples que sera acessado pela aplicação web e persistira o nosso Entity agenda usando JPA. Novamente clique com o botão direito sobre o Agenda-ejb selecione New>Session Bean, na janela de diálogo preencha o nome do EJB com Agenda, o pacote tambem pode ser agenda. Serão criados dois arquivos, a classe AgendaBean que é nosso ejb e a interface local AgendaLocal.
Agora vem o exercicio preferido: ctrl+c ctrl+v :) primeiro para o AgendaBean:
package agenda;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
@Stateless
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class AgendaBean implements agenda.AgendaLocal {
@PersistenceContext
private EntityManager manager;
public void salvar(Agenda agenda) {
if (agenda.getId()>0)
manager.merge(agenda);
else
manager.persist(agenda);
}
public void excluir(Agenda agenda) {
Agenda ag =manager.merge(agenda);
manager.remove(ag);
}
public List consultar() {
Query q =manager.createQuery("select a from Agenda a");
return q.getResultList();
}
}
Agora é a vez da interface:
package agenda;
import java.util.List;
import javax.ejb.Local;
@Local
public interface AgendaLocal {
public void salvar(Agenda agenda);
public void excluir(Agenda agenda);
public List consultar();
}
Nossa camada de negócios está pronta agora temos que fazer a nossa camada web (e dalhe MVC).
A primeira coisa a ser feita é configurar a servlet do JSF no web.xml, para isso vá la no projeto Agenda-war e abra o web.xml e faça com que fique assim (e tome ctrl+c ctrl+v)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
Agora vamos criar o arquivo faces-config.xml, na pasta WEB-INF clique com o botão direito selecione New>XML Document nome do arquivo faces-config e deixe as opções default, o resto você ja sabe (mais ctrl+c ctr+v, afinal se chegou ate aqui você já deve estar craque nisso).
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>agendaMB</managed-bean-name>
<managed-bean-class>agenda.AgendaMB</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
package agenda;
import java.util.Date;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
public class AgendaMB {
private Agenda agenda;
private DataModel lista;
@EJB
private AgendaLocal agendaBean;
public void salvar(){
agendaBean.salvar(agenda);
this.agenda = null;
this.lista = null;
}
public void excluir(){
agendaBean.excluir(agenda);
this.agenda = null;
this.lista = null;
}
public DataModel getLista(){
if (lista==null) {
lista = new ListDataModel(agendaService.consultar());
}
return lista;
}
public void selecionar(){
agenda = (Agenda) lista.getRowData();
}
public Agenda getAgenda(){
if (agenda ==null)
agenda =new Agenda();
return agenda;
}
}
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<f:view>
<head>
<title>Agenda</title>
</head>
<body>
<h1>Agenda</h1>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel id="labelID" value="ID" />
<h:panelGroup>
<h:inputText id="id" value="#{agendaMB.agenda.id}"
disabled="true" label="labelID">
<f:convertNumber integerOnly="true"/>
</h:inputText>
<h:message for="id"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelNome" value="Nome"/>
<h:panelGroup>
<h:inputText id="nome" value="#{agendaMB.agenda.nome}"
label="labelNome" size="40" maxlength="50"
required="true"/>
<h:message for="nome"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelTelefone" value="Telefone"/>
<h:panelGroup>
<h:inputText id="telefone"
value="#{agendaMB.agenda.telefone}"
label="labelTelefone" size="20"
maxlength="30"/>
<h:message for="telefone"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelEmail" value="E-Mail"/>
<h:panelGroup>
<h:inputText id="email"
value="#{agendaMB.agenda.email}"
label="labelEmail" size="30" maxlength="30"/>
<h:message for="email"
errorStyle="color:red"/>
</h:panelGroup>
<h:outputLabel id="labelNascimento"
value="Data de Nascimento"/>
<h:panelGroup>
<h:inputText id="dtnascimento"
value="#{agendaMB.agenda.dtnascimento}"
label="labelNascimento" size="12" maxlength="10">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
<h:message for="dtnascimento"
errorStyle="color:red"/>
</h:panelGroup>
<f:facet name="footer">
<h:panelGroup>
<h:commandButton value="Salvar"
action="#{agendaMB.salvar}" />
<h:commandButton value="Excluir"
action="#{agendaMB.excluir}"
rendered="#{agendaMB.agenda.id>0}" />
</h:panelGroup>
</f:facet>
</h:panelGrid>
</h:form>
<hr/>
<h:form>
<h:dataTable value="#{agendaMB.lista}" var="linha">
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:commandLink action="#{agendaMB.selecionar}" >
<h:outputText value="#{linha.id}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome"/>
</f:facet>
<h:outputText value="#{linha.nome}" />
</h:column>
</h:dataTable>
</h:form>
</body>
</f:view>
</html>
<jsp:forward page="agenda.jsf" />
(pelo menos a fonte é a maior :)
Agora é só executar a aplicação e começar a cadastrar os contatos. Num próximo post vou comentar alguns passos (afinal isto aqui ja ta grande pacas).

E por favor comentem pra eu saber que não foi só a minha esposa que viu :P
8 comentários:
Fala Bulinha, muito show essa matéria..ja tinha lido alguma coisa sobre cad aum dos assuntos que você falou, mas ver tudo rodando junto foi do c.. :) Mais uma vez uma grande contribuição pra nós, padawans! ;)
[]´s
Master, muuuiitttooo foda... já estou querendo aprender. []´s
Ronald
E aí Bula!
Muito maneiro esse seu post!
Apesar da sua provável falta de tempo, sempre que puder, posta alguma parada aí! É muito válido e agente vai debulhando os seus exemplos para aprender mais...
Muito bom colega, achei muito legal, mas tentei fazer algo um pouco mais avançado e muito comum , como por exemplo um CRUD de estados e municipios, por exemplo cadastrando só estados e depois cadastrando municipios e associando a um estado previamente cadastrado....Nào consegui fazer, ficaria grato se nos apresentasse esse exemplo altamente didático e útil usando o Postgre 8.1 e um EditTable ou algo parecido.
Grato
Wandrey@gmail.com
Aproveitando de sua boa vontade, poderia apresentar um exemplo master/detail/detail.. ?
Grato,
Wandrey@gmail.com
Aproveitando de sua boa vontade, poderia apresentar um exemplo master/detail/detail.. ?
Grato,
Wandrey@gmail.com
Fala Jedi Master Black Belt!
Só agora que ví seu post!
Fico feliz por ter ajudado em seu exemplo!
=oP
Abs
Saulo
Incrível! se não fosse por "UM NOME TROCADO" no managed bean, teria funcionado de cara! Coisa rara de acontecer nesses tutoriais da internet :)
Postar um comentário