sessionbeans marco antonio arquiteto de software
TRANSCRIPT
SessionBeansMarco AntonioArquiteto de Software
IntroduçãoComponentes 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 é importanteJ2EE é 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 beansStateless – 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
Arquivos gerados
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.NamingContextFactoryjava.naming.provider.url=jnp://localhost:1099java.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
Clientepackage 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" */public void 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.0package 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)
Saída no console
Dúvidas?