470 likes | 523 Views
Learn about Session Beans in J2EE, types, lifecycle, key concepts, best practices, and development process using XDoclet tools.
E N D
SessionBeans Marco Antonio Arquiteto de Software
Introdução • Componentes reutilizáveis que processam a regra do negócio. • Contém métodos que representam ações (validarCpf, adicionarProduto, listarUsuarios). • Seu ciclo de vida se resume a uma sessão. • São objetos transientes, pois não são persistidos.
O que é importante • J2EE é uma especificação bastante completa, prevendo todas as situações possíveis. • Na prática, a maioria dessas situações é evitada, pois vamos usar boas práticas de programação, estratégias amplamente difundidas (padrões de projeto). • Nosso exemplo será direcionado a uma típica aplicação EJB, sem a imensa maioria dos detalhes que fazem parte da teoria da especificação.
Tipos de session beans • Stateless – não mantém o valor dos atributos entre chamadas. É compartilhado entre clientes. • Statefull – mantém o valor dos atributos entre chamadas. Consome muita memória, pois é criado um objeto para cada cliente. Não recomendado para sistemas corporativos.
Aplicações J2EE • Construir aplicações J2EE de boa qualidade exige conhecimento de: • Design patterns • Frameworks • Detalhes do funcionamento do AppServer
Aplicações J2EE • Aplicações J2EE geram muito código (interfaces home, remote, local) • Criar descritores EJB e WEB • Construir classes de apoio e utilitários
Aplicações J2EE • Utilize ferramentas como XDoclet, Ant, NetBeans, Eclipse • Automatize o máximo que conseguir
Aplicações J2EE • Trabalhar com equipes heterogêneas, muitas vezes terceirizadas, requer esforço extra para garantir código de boa qualidade
XDoclet • Para automatizar o processo de desenvolvimento iremos utilizar o XDoclet • Na figura podemos ver as configurações necessárias
O projeto • Vamos criar nosso projeto J2EE conforme o exemplo
Projeto de exemplo • O nome do projeto é SistemaBancario • As demais configurações podem ser conferidas na figura a seguir
New Server • Configuração do servidor de aplicação
Diretório do JBoss • Informe o diretório raíz do JBoss
Configuração • Dados sobre endereço IP, porta do servidor, porta do JNDI e tipo de configuração do servidor
Facets • Mude a versão do Java para 5.0
Projeto cliente • Uma boa maneira de organizar o projeto é a criação de vários subprojetos • Nesse exemplo serão três: • SistemaBancario (núcleo da aplicação) • SistemaBancarioCliente (classes do cliente) • SistemaBancarioEAR (dados da aplicação)
Configurações do XDoclet • No menu Window -> Preferences, vamos configurar algumas propridades do XDoclet
ejbdoclet • Clique na opção JBoss -> Edit
webdoclet • Clique na opção JBoss -> Edit
Criação de EJB • O mecanismo padrão para geração de EJB é o XDoclet • Por isso é a única opção disponível
Session bean • EJB da camada de negócio • Responsável pelas regras de negócio da aplicação
EJB • Dados da classe (projeto, package, nome)
EJB • Dados dos arquivos de configuração • Esses nomes serão registrados no JBoss
EJB • Desmarque a opção “Abstract” • Nosso primeiro EJB está pronto
Estrutura de arquivos • A única classe que criamos foi a FachadaContaCorrenteBean • Todas as demais foram geradas pelo XDoclet de forma automatizada
Servidor • Mude para a perpectiva Java EE • Abra a guia Servers e clique com o botão direito do mouse no servidor disponível
Projetos • Adicione nosso projeto no servidor
Configuração de startup • No menu Run -> Open Run Dialog temos as configurações de memória do servidor • Esse tipo de informação faz parte do tuning da aplicação (ajuste fino) • Uma alternativa é deixar tudo em branco
Start do servidor • Clique no botão “Start the server” e acompanhe as mensagens
jndi.properties • Esse arquivo de propriedades indica os dados do servidor que tem os serviços disponíveis
jndi.properties # java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
Cliente • O último passo é a criação do cliente que irá acessar o serviço criado
Cliente package net.sistemabancario.negocio.cliente; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import net.sistemabancario.negocio.FachadaContaCorrente; import net.sistemabancario.negocio.FachadaContaCorrenteHome; public class FachadaContaCorrenteCliente { public static void main(String[] args) { try { Context ctx = new InitialContext(); Object obj = ctx.lookup(FachadaContaCorrenteHome.JNDI_NAME); FachadaContaCorrenteHome home = (FachadaContaCorrenteHome) PortableRemoteObject.narrow(obj, FachadaContaCorrenteHome.class); FachadaContaCorrente fachada = home.create(); fachada.foo(""); } catch (Exception e) { e.printStackTrace(); } } }
Novo método da fachada /** * @ejb.interface-method view-type = "remote" */ publicvoid sacar(String numeroDaConta, Double valorSacado) { System.out.println("Número da conta: " + numeroDaConta); System.out.println("Valor sacado: " + valorSacado); }
Publishing • Quando o status do servidor estiver diferente de Synchronized você deve publicar a aplicação de novo
Mensagem de deploy • O diretório de deploy do JBoss está listado logo abaixo
Cliente v2.0 package net.sistemabancario.negocio.cliente; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import net.sistemabancario.negocio.FachadaContaCorrente; import net.sistemabancario.negocio.FachadaContaCorrenteHome; public class FachadaContaCorrenteCliente { public static void main(String[] args) { try { Context ctx = new InitialContext(); Object obj = ctx.lookup(FachadaContaCorrenteHome.JNDI_NAME); FachadaContaCorrenteHome home = (FachadaContaCorrenteHome) PortableRemoteObject.narrow(obj, FachadaContaCorrenteHome.class); FachadaContaCorrente fachada = home.create(); fachada.foo(""); fachada.sacar(“7594-9”, 350.0); } catch (Exception e) { e.printStackTrace(); } } }
Execução do cliente • Você pode rodar o JBoss dentro do Eclipse ou direto no console (bem mais rápido, mas sem debug)