SessionBeans

Propaganda
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
FachadaContaCorrente
Bean
• 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.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"
*/
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.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)
Saída no console
Dúvidas?
Download