Introduction to Session Beans in J2EE Applications
Learn about Session Beans in J2EE, types, lifecycle, key concepts, best practices, and development process using XDoclet tools.
Introduction to Session Beans in J2EE Applications
E N D
Presentation Transcript
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)