Вы находитесь на странице: 1из 60

Tutorial J2EE

Aprendendo EJB de uma maneira fcil! Paulo Silveira

Aprendendo J2EE
RemoteException ApplicationServer

SessionBean

JNDI

CMP EJBLocalHome ejb-jar.xml 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; } }

ejb-jar.xml
... <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) initialContext.get(HelloHome); Hello hello = home.create(); System.out.println(Hello.sayHello());

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 = DriverManager.getConnection(jdbc://my sql...); Statement s = con.createStatement(); ... BD }

Uma conexo para todos


static Connection con; void save() { Statement s = con.createStatement(); ... BD }

Pool de conexes
List list = new ArrayList(); public synchronized Connection get() { return (Connection) list.remove(0); } public synchronized void free(Coonection c) { BD list.add(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(usuario.isAdmin()) { logger.log(apagando usuario); userDao.delete(usuario); }

Voc tem de se importar com:


banco

segurana lgica de negcio

log Sua lgica de negcio ou aplicaao est fazendo muita coisa!

Antipatterns.com

Antipatterns.com

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 (amazon.com). Necessidades: l Transao l Acesso multi threaded l Persistncia l Segurana

Idia!
l Conversamos

com um objeto de

mentira. carrinho.add(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) { compras.add(livro); total += livro.getPreco(); } 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) { compras.add(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. carrinho.addLivro(livro); carrinho.getTotal(); 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 = casa.create(); carrinho.add(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. compra.add(carrinho); compra.save();
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 = casa.create(paulo); user.setSenha(xpto); user.setEndereco(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


compra.add(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(!usuario.isAdmin()) { throw new SecurityException(); }

Ao remover um usurio:
if(!usuario.isAdmin()) { throw new SecurityException(); }

l Ao

visualizar encomendas

if(!usuario.isAdmin()) { 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(!usuario.isAdmin()) { 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!!! http://java.sun.com/j2ee/tutorial/1_3fcs/index.html Ou procurem por j2ee tutorial no search do java.sun.com

Prximos passos!
Baixem o jboss 3.2.1 http://www.jboss.org 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 www.guj.com.br