Enterprise JavaBeans 3.0: Passo a Passopor: Raquel do Carmo
(raquelsilva2006@gmail.com) Tutorial passo a passo para criação de aplicações com EJB 3.0. São abordados os Session Beans e a Java Persistence API. Objetivos do TutorialAjudar no desenvolvimento das primeiras aplicações, utilizando EJB 3.0. Indicar uma sequência de passos a serem seguidos a fim de compreender os principais mecanismos oferecidos por esse framework. Passo 1: Configurar o Ambiente
Passo 2: Contruir ProjetoCrie um Java Project. Modifique o Build Path do projeto para referenciar as APIS do JBOSS que estão no diretório jboss-4.0.5.GA\client. A seguir, uma figura da tela do Eclipse, informando como o projeto deve estar organizado. As classes JAVA serão explicadas nos próximos passos.
Figura 1: Projeto criado no Eclipse Passo 3: Construir Entidadeimport javax.persistence.Entity; import javax.persistence.Id; @Entity public class Curso implements Serializable{ @Id @GeneratedValue private Integer cod; private String nome; //.. getters e setters omitidos } Listagem 1: Entidade Curso Essa entidade utiliza anotações presentes na bibliteca do JPA, Java Persistence API. A anotação @Entity define a classe como persistente. Os cursos serão persistidos na tabela “curso” na base de dados, pois por default o JPA considera o nome da classe igual ao da tabela. A anotação @Id define o atributo cod como o identificador da tabela no banco de dados A anotação @ GeneratedValue define que o valor do atributo cod será gerado automaticamente no momento em que os objetos forem persistidos. Passo 4: Construir Interfaceimport javax.ejb.Local; import javax.ejb.Remote; @Remote public interface Cadastrar { void cadCurso(Curso curso); Collection Listagem 2: Interface remota Características de EJB 3Antes de criar o Session Bean, é preciso definir suas interfaces de acesso. Um Stateless Session Bean, definido no próximo passo, pode ter uma interface local e remota. Nesse exemplo, a interface é remota. A anotação @Remote define essa interface como Remota, oferecendo acesso a clientes remotos. Para declarar uma interface como Local – que não oferece acesso a clientes remotos, deve ser utilizada a anotação @Local. Esse tipo de interface deve ser usado para clientes localizados na mesma JVM onde está rodando o container de EJBs. Passo 5: Construir Session Beanimport javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Stateless public class CadastrarBean implements Cadastrar { private List Listagem 3: Session Bean Características de EJB 3O Session Bean representa um cliente no servidor J2EE. Para acessar a aplicação, o cliente invoca os métodos do Session Bean. É similar a uma sessão interativa, sendo único para cada cliente. Assim como a sessão, os dados do bean não são armazenados em uma base de dados. Quando o cliente encerra a sessão, o session finaliza e não ficará mais associado a ele. Existem dois tipo de Session Bean: Stateless e StateFul. A anotação @Stateless define a classe CadastrarBean como sendo do tipo Stateless. É mais leve e indicado para processos que não necessitam manter estado (valores de atributos) durante as chamadas de métodos. Para definir o tipo Stateful, é necessário atribuir a anotação @Stateful. Esse bean é mais pesado, mas garante a preservação do estado entre as chamadas de métodos de um mesmo cliente. A anotação @PersistenceContext, da API de JPA, possibilita o processo de “injeção de dependência”. O container EJB reconhece a anotação e, automaticamente, injeta um objeto EntityManager na propriedade. Passo 6 : Contruir os arquivos de configuraçãoVejamos o arquivo persistence.xml <?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="Curso"> <jta-data-source>java:/CursoDS</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> Listagem 4: Arquivo persistence.xml Esse arquivo deve ser inserido na
aplicação, no diretório META-INF/persistence.xml. O elemento <?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>CursoDS</jndi-name> <connection-url>jdbc:postgresql://localhost:5432/curso</connection-url> <driver-class>org.postgresql.Driver</driver-class> <user-name>postgres</user-name> <password>postgres</password> <metadata> <type-mapping>PostgreSQL 7.2</type-mapping> </metadata> </local-tx-datasource> </datasources> Listagem 5: Definição do Data Source Esse arquivo deve ser inserido dentro do
diretório “server\default\deploy” do JBOSS. Nesse arquivo, são
configuradas as propriedades referentes à conexão com o banco de
dados PostgreSQL. O nome “CursoDS” configurado através do elemento
Passo 7: Deploy do projetoApós ter criado o projeto, exporte para arquivo .jar dentro do diretório jboss-4.0.5.GA/server\default\deploy do JBOSS. Repare que é o mesmo local onde fica armazenado o curso-ds.xml. Inicie a conexão com o PostgreSQL e crie um banco de dados com o nome “curso”. Coloque o driver do PostreSQL no diretório jboss-4.0.5.GA2\server\default\lib do JBOSS. Inicie o JBOSS e confira se o projeto foi “deployado” . Confira se a tabela curso foi criada no seu banco. Passo 8: Construir o ClienteCrie no mesmo projeto a classe abaixo: import javax.naming.Context; import javax.naming.InitialContext; import java.util.Hashtable; public class Cliente { public static void main(String[] args) throws Exception { Hashtable prop = new Hashtable(); prop.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); prop.put(InitialContext.PROVIDER_URL,"jnp://localhost:1099"); Context ctx = new InitialContext(prop); Cadastrar cad = (Cadastrar) ctx.lookup("CadastrarBean/remote"); Curso curso = new Curso(); curso.setNome("AJAX"); cad.cadCurso(curso); curso.setNome("XML"); cad.cadCurso(curso); curso.setNome("PROGRAMAÇÃO"); cad.cadCurso(curso); for(Curso c : cad.getCursos()){ System.out.println(c.getCod() +” - ” + c.getNome()); } } } Listagem 6: Cliente do EJB 3.0 Características de EJB 3É necessário realizar a conexão com o serviço de nomes, através de um objeto InitialContext da API JNDI (Java Naming and Directory Interface). Através desse objeto, é possível obter um referência para o objeto remoto. Nesse exemplo, o contexto deve ser inicializado por meio de um objeto HashTable. Caso a aplicação fosse construída utilizando um mesmo container, o contexto seria único e conhecido. Então, não seria necessário especificá-lo, possibilitando a inicialização do objeto InitialContext sem parâmetros. Através do método ctx.lookup("nome-da-clase/remote"), um Session Bean remoto é solicitado ao container. Passo 9: inicializar o ClienteAgora, é só rodar o cliente e ser feliz !!! A seguir, a tela do Eclipse com a saída do programa.
Figura 2: Saída do programa
|