Tutorial J2EE
Aprendendo EJB de uma maneira fcil! Paulo Silveira
Aprendendo J2EE
RemoteException ApplicationServer
SessionBean
JNDI
CMP EJBLocalHome [Link] CMR EJBContext
RequiresNew
Aprendendo J2EE
l Quem
j tentou aprender EJBs? l Maiores dificuldades?
Objetivos desse tutorial
Pblico: quem no conhece EJB, ou quem j conhece, mas no sabe o que est fazendo (extremamente comum). Superar as enormes dificuldades iniciais!
l l l l
O que realmente EJB? Quando preciso usar? Quando eu estiver codificando, quero saber realmente o que estou fazendo. Porque esse monte de interfaces e XMLs?
Tutoriais comuns
Como no aprender J2EE
Home Interface
public interface HelloHome extends EJBHome { Hello create() throws CreateException, RemoteException; }
Object Interface
public interface Hello extends EJBObject { String sayHello() throws RemoteException; }
Component
public class HelloBean implements SessionBean { public void ejbCreate() throws CreateException {} public String sayHello() { return Ol Mundo; } }
[Link]
... <session> <ejb-name>Hello</ejb-name> <home>HelloHome</home> <remote>Hello</remote> <ejb-class>HelloBean</ejb-class> </session> ... Ou ento usa uma ferramenta estranha para ger-lo, e a gente no sabe o que acontece!
Cliente
Context initialContext = new InitialContext(); HelloHome home = (HelloHome) [Link](HelloHome); Hello hello = [Link](); [Link]([Link]());
Para que tudo isso?
??????????????
Incrvel resultado
Ol Mundo.
Porque J2EE?
Motivao Exemplo: abrindo conexes com BD
Abrindo uma conexo para cada
void save() { Connection con = [Link](jdbc://my sql...); Statement s = [Link](); ... BD }
Uma conexo para todos
static Connection con; void save() { Statement s = [Link](); ... BD }
Pool de conexes
List list = new ArrayList(); public synchronized Connection get() { return (Connection) [Link](0); } public synchronized void free(Coonection c) { BD [Link](c); }
Qual a melhor soluo?
Nenhuma das anteriores!
l Qual
o nmero de conexes que devem ser abertos pelo Pool? l Esses nmeros podem variar com o dia! Voc realmente precisa se preocupar com isso?
Lgica de negcio
l Parte
crucial da aplicao l No envolve aspectos gerais da aplicao, como segurana, logging, etc. if([Link]()) { [Link](apagando usuario); [Link](usuario); }
Voc tem de se importar com:
banco
segurana lgica de negcio
log Sua lgica de negcio ou aplicaao est fazendo muita coisa!
[Link]
[Link]
Separation of Concerns
Preocupaes da aplicao
l Voc
no tem tempo de escrever um pool super eficiente l Voc no quer perder tempo fazendo milhares de IFs de segurana repetidos l Voc no quer tem tempo de se preocupar com concorrncia ou transaes! l Socorro! No quero mais SQL!
Carrinho de compras
lA
Amazon precisa de um sistema que aguente 1 milho de carrinhos simultneamente instanciados. precisa implementar o site inteiro, e ainda se preocupar com o volume de acesso que ele vai ter!
l Voc
Inverso de Controle
salvador!
banco ? segurana lgica de negcios aplicao pooling log
EJB
l Enterprise
Java Beans fazem principalmente o papel de lgica de negcios e entidades
?
ejb
ejb ejb ejb
Servidor de Aplicao
Uma especificao para a moradia dos EJBs. Ele que serve as necessidades dos EJBs. Quem quiser, pode implementar um servidor de aplicao (application server) l JBoss l WebLogic l WebSphere l Jonas
Carrinho de Compras
Precisamos de um sistema que manipule milhes de carrinhos de compras simultaneamente ([Link]). Necessidades: l Transao l Acesso multi threaded l Persistncia l Segurana
Idia!
l Conversamos
com um objeto de
mentira. [Link](livro);
interface
O servidor trata a segurana, pooling, log, transao, thread, etc...
Por enquanto, o que precisamos?
lO
Carrinho de compras de mentira l O Carrinho de compras de verdade (EJB). interface Carrinho (o servidor implementa) class CarrinhoEJB (com a lgica)
O EJB (o que est faltando?)
class CarrinhoEJB implements SessionBean { List compras; double total; public void add(Livro livro) { [Link](livro); total += [Link](); } public double getTotal() { return total; } // + um monte de metodos estranhos }
$caro$ construir um EJB!
Carrinhos usados!
interface
O reciclador de ejbs!
class CarrinhoEJB implements SessionBean { List compras; public void ejbCreate() throws CreateException { compras = new ArrayList(); } public void add(Livro livro) { [Link](livro); } // + um monte de metodos estranhos e o getTotal() }
A interface
interface Carrinho extends EJBLocalObject { public void add (Livro livro); public double getTotal(); // outros metodos que seria interessantes }
O que mais falta?
J conseguimos brincar com nosso carrinho. [Link](livro); [Link](); Como acessar um carrinho, ou criar um novo?
Idia: A Casa dos EJBs
Existe um objeto que resposvel por criar, localizar, remover EJBs. a casa de cada EJB. CasaDosCarrinhos casa = .... Carrinho carrinho = [Link](); [Link](livro); ...
A Casa
Acessando a casa dos carrinhos, voc no acessa um em especfico. o ponto de entrada.
casa interface
Cdigo da casa
interface CasaDosCarrinhos extends EJBLocalHome { Carrinho create() throws CreateException; } A casa a Home! O nome correto dela seria CarrinhoHome
Outras vantagens
Pra que tudo isso? Porque no instanciar diretamente os CarrinhoEJBs?
l Um
milho de carrinhos de compra l Todos esto ativos ao mesmo tempo? l E se algum deixar o browser aberto? 1 milho de objetos so muitos megas!
Passivao
l Apesar
de termos 1 milho de clientes acessando os carrinhos, alguns carrinhos no so to acessados.
990 mil carrinhos no acessados no ltimo minuto ejb ejb ejb ejb ejb ejb
10 mil carrinhos acessados no ltimo minuto ejb ejb
Passivando!
990 mil carrinhos no acessados no ltimo minuto ejb ejb ejb ejb
ciclo de vida... Voc precisa se preocupar com isso? HD
E se...
l precisar
que o acesso a um EJB seja transacional? l precisar logar todo acesso a EJBs? l precisar definir regras de segurana? l precisar de acesso remoto?
Voc precisa se preocupar com isso? Algum que me sirva!
E o XML?
Para voc rodar uma aplicao no seu servidro de aplicao, voc precisa de um XML, que fale quem so seus EJBs: Caro servidor, meu EJB chamado CarrinhoDeCompras um EJB, a casa dele se chama CasaDosCarrinhos, e a interface dele para os clientes se chama Carrinho. E quem tem a lgica em si, o CarrinhoEJB. Atenciosamente, programador
Tipos de EJBs
l SessionBeans
Servios caros ou muito usados! (exemplos?) Dois tipos! Stateless e Stateful
l EntityBeans
Representam entidades (veremos).
l MessageDrivenBeans
Consomem mensagens de determinados assuntos.
Entidades: uma introduo
Entidades
Implementamos um SessionBean Gostaramos agora de no nos preocupar mais com SQLs e persistncia. [Link](carrinho); [Link]();
Aqui dentro vai um SQL gigante!
Ser que foi um bom momento para gravar a compra?
Quando persistir?
ejb
ejb ejb ejb
ejb ejb
Voc precisa se preocupar com isso? HD
Persistncia transparente!
CasaDosUsuarios casa = ... Usuario user = [Link](paulo); [Link](xpto); [Link](lins de vasconcelos); // nao existe save!!! Algum dia, ser persistido! Quem tem de se preocupar com isso no voc! Container Managed Persistense (CMP)
Container Managed Relationship
[Link](livro); Livro tambem uma entidade! Quem deve se preocupar com a gerao de primary keys e foreign keys?
Aspect Oriented Programming
Programao orientada a Aspecto
l Hype
do momento! l Servidores de aplicao usam programao orientada a aspecto. Porque?
Um aspecto: segurana
Ao adicionar um usrio:
if(![Link]()) { throw new SecurityException(); }
Ao remover um usurio:
if(![Link]()) { throw new SecurityException(); }
l Ao
visualizar encomendas
if(![Link]()) { throw new SecurityException(); }
l Visualizar
encomendas e editar usurios tem alguma relao em comum?
Apenas o ASPECTO de segurana
Idia!
De alguma maneira, codificar: sempre que os mtodos X e Y da classe Usuario e os mtodos Z e W da classe Encomenda forem acessados, rode:
if(![Link]()) { throw new SecurityException(); }
Linguagens e Frameworks
l AspectJ:
A Xerox comeou seu desenvolvimento, e hoje em dia est sobre o projeto Eclipse. um sueco que resolveu criar um framework de aspectagem. O brasileiro Carlos Villela colabora com o projeto.
l AspectWerkz:
Prximos passos!
Agora esto prontos paraler um pssimo tutorial de EJB!!! [Link] Ou procurem por j2ee tutorial no search do [Link]
Prximos passos!
Baixem o jboss 3.2.1 [Link] Para CMP e CMR, procurem tambm nos tutoriais da Sun.
Dificuldades que iro encontrar
l Escrevendo
XML do ejb-jar
No usem ferramentas na 1a vez!
l Empacotando
um jar de ejb l Fazendo o deploy l Rodando o cliente
Obrigado! Perguntas e Respostas
Paulo Silveira [Link]