Você está na página 1de 60

Tutorial J2EE

Aprendendo EJB de uma maneira fcil!


Paulo Silveira

Aprendendo J2EE
RemoteException

SessionBean

ApplicationServer

JNDI

CMP
EJBLocalHome
ejb-jar.xml

RequiresNew
CMR

EJBContext

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.

l Voc

precisa implementar o site inteiro,


e ainda se preocupar com o volume de
acesso que ele vai ter!

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.

10 mil carrinhos acessados no


ltimo minuto
ejb

ejb

990 mil carrinhos no acessados


no ltimo minuto
ejb

ejb
ejb

ejb

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

Voc precisa se
preocupar com isso?
HD

ejb

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.

l AspectWerkz:

um sueco que resolveu


criar um framework de aspectagem. O
brasileiro Carlos Villela colabora com o
projeto.

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

Você também pode gostar