Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
22 de agosto de 2015
As apostilas atualizadas esto disponveis em www.k19.com.br
Sumrio i
Sobre a K19 1
Seguro Treinamento 2
Termo de Uso 3
Cursos 4
1 Enterprise JavaBeans 1
1.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 EJB Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
www.facebook.com/k19treinamentos i
S UMRIO ii
5 Persistncia 95
5.1 Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.3 persistence.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.4 Entity Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.5 Entity Classes e Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.7 Entity Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.8 Entity Manager Factories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6 Transaes 115
6.1 ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.2 Transao Local ou Distribuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.3 JTA e JTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.4 Container Managed Transactions - CMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.5 Bean Managed Transactions - BMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7 Segurana 127
7.1 Realms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.3 Autenticao - Aplicaes Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
ii www.k19.com.br
iii S UMRIO
8 Interceptadores 149
8.1 Interceptor Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
8.2 Internal Interceptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
8.3 External Interceptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
8.4 Excluindo Interceptadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
8.5 Invocation Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
8.6 Ordem dos Interceptadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
8.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
9 Scheduling 163
9.1 Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
9.2 Mtodos de Timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
9.3 Timers Automticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
9.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
A Projeto 187
A.1 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
www.facebook.com/k19treinamentos iii
S UMRIO iv
iv www.k19.com.br
1 S UMRIO
Sobre a K19
A K19 uma empresa especializada na capacitao de desenvolvedores de software. Sua equipe
composta por profissionais formados em Cincia da Computao pela Universidade de So Paulo
(USP) e que possuem vasta experincia em treinamento de profissionais para rea de TI.
Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melho-
ria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizados
didtica e tecnicamente.
www.facebook.com/k19treinamentos 1
S UMRIO 2
Seguro Treinamento
Na K19 o aluno faz o curso quantas vezes quiser!
Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que pos-
sui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejar
mediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.
As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas ao
alunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treina-
mento 10% do valor total do curso.
2 www.k19.com.br
3 S UMRIO
Termo de Uso
Termo de Uso
Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizada
livremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como material
de apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida pelo
MEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material.
proibida qualquer utilizao desse material que no se enquadre nas condies acima sem
o prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito s
medidas legais cabveis.
www.facebook.com/k19treinamentos 3
S UMRIO 4
TR
EIN
AM
EN
TR
TO
EIN
S
TREINAMENTOS
AM
EN
TO
S
Conhea os nossos cursos
www.k19.com.br/cursos
4 www.k19.com.br
CAPTULO
E NTERPRISE J AVA B EANS
1
Introduo
Muitos sistemas corporativos so desenvolvidos seguindo a arquitetura definida pelo padro En-
terprise JavaBeans (EJB). Ao utilizar essa arquitetura, diversos recursos so disponibilizados a esses
sistemas.
Transaes: A arquitetura EJB define um suporte sofisticado para utilizao de transaes. Esse
suporte integrado com a Java Transaction API (JTA) e oferece inclusive a possibilidade de
realizar transaes distribudas.
Remotabilidade: Aplicaes EJB podem ser acessadas remotamente atravs de diversos protocolos
de comunicao. Consequentemente, possvel desenvolver aplicaes clientes de diversos
tipos. Por exemplo, aplicaes EJB podem ser como Web Services.
Multithreading e Concorrncia: A arquitetura EJB permite que as aplicaes sejam acessados por
mltiplos usurios simultaneamente de maneira controlada para evitar problemas de concor-
rncia.
Persistncia: Facilidades para utilizar os servios dos provedores de persistncia que seguem a es-
pecificao JPA.
Integrao: A arquitetura EJB fortemente integrada com os componentes da plataforma Java EE.
Podemos, por exemplo, facilmente integrar os recursos do JSF em uma aplicao EJB.
EJB Container
Toda aplicao EJB executada e gerenciada por um EJB Container. H diversas opes de EJB
Container disponveis. Os servidores de aplicao Java EE como o Glassfish e o JBoss possuem um
EJB Container. Portanto, podemos utiliz-los para executar as nossas aplicaes EJB.
www.facebook.com/k19treinamentos 1
E NTERPRISE J AVA B EANS 2
Exerccios de Fixao
1 Copie o arquivo glassfish-4.1.zip da pasta K19-Arquivos para a sua rea de Trabalho. Depois,
descompacte esse arquivo.
Importante
Voc tambm pode obter o arquivo glassfish-4.1.zip atravs do site da K19: www.k19.
com.br/arquivos.
Importante
Voc tambm pode obter o arquivo jboss-as-7.1.1.Final.zip atravs do site da K19:
www.k19.com.br/arquivos.
Importante
Voc tambm pode obter o arquivo wildfly-8.2.0.Final.zip atravs do site da K19:
www.k19.com.br/arquivos.
2 www.k19.com.br
3 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 3
E NTERPRISE J AVA B EANS 4
4 www.k19.com.br
5 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 5
E NTERPRISE J AVA B EANS 6
6 www.k19.com.br
7 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 7
E NTERPRISE J AVA B EANS 8
8 www.k19.com.br
9 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 9
E NTERPRISE J AVA B EANS 10
6 Configure o Glassfish no Eclipse Luna. Digite CTRL+3 para abrir o Quick Access. Em seguida,
pesquise por Define a new server.
10 www.k19.com.br
11 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 11
E NTERPRISE J AVA B EANS 12
7 Pare o Glassfish. Em seguida, configure o JBoss no Eclipse Luna. Digite CTRL+3 para abrir o
Quick Access. Em seguida, pesquise por Define a new server.
12 www.k19.com.br
13 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 13
E NTERPRISE J AVA B EANS 14
14 www.k19.com.br
15 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 15
E NTERPRISE J AVA B EANS 16
8 Pare o JBoss. Em seguida, configure o Wildfly no Eclipse Luna. Digite CTRL+3 para abrir o
Quick Access. Em seguida, pesquise por Define a new server.
16 www.k19.com.br
17 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 17
E NTERPRISE J AVA B EANS 18
18 www.k19.com.br
19 E NTERPRISE J AVA B EANS
www.facebook.com/k19treinamentos 19
E NTERPRISE J AVA B EANS 20
20 www.k19.com.br
CAPTULO
S TATELESS S ESSION B EANS
2
Session Beans
Um sistema corporativo composto por muitos processos ou tarefas. Por exemplo, um sistema
bancrio possui processos especficos para realizar transferncias, depsitos, saques, emprstimos,
cobranas, entre outros. Esses procedimentos so chamados de regras de negcio. Cada aplicao
possui as suas prprias regras de negcio j que elas so consequncia imediata do contexto da apli-
cao.
Caracterizando os SLSBs
Stateless Session Bean o primeiro tipo de Session Bean. Muitas vezes, utilizaremos a sigla SLSB
para fazer referncia a esse tipo de componente. A caracterstica fundamental dos SLSBs que eles
no armazenam estado conversacional. Vejamos alguns exemplos a seguir.
Servio de Cmbio
Considere um sistema de converso monetria. Esse sistema capaz de converter valores mone-
trios de uma moeda para outra. Por exemplo, converter 100 reais para o valor correspondente em
dlar americano. Poderamos, implementar essa regra de negcio atravs do mtodo a seguir.
A execuo do mtodo converte() no depende das suas execues anteriores. Em outras pala-
vras, o mtodo converte() no precisa manter estado conversacional.
Dicionrio
Considere a implementao de um dicionrio digital de portugus. Dado uma palavra, o dicio-
nrio digital deve devolver a definio dela. Podemos criar um mtodo para implementar essa regra
de negcio.
www.facebook.com/k19treinamentos 21
S TATELESS S ESSION B EANS 22
Consulta de CEP
Considere um sistema de consulta de CEP. Esse sistema capaz de informar o CEP de uma deter-
minada localidade. Podemos criar um mtodo para implementar essa regra de negcio.
1 public String consultaCEP ( String estado , String cidade , String logradouro , Integer -
numero ) {
2 // lgica da consulta do CEP
3 }
Como cada consulta de CEP independe das consultas anteriores, no necessrio manter dados
entre uma consulta e outra. Em outras palavras, no necessrio manter estado conversacional.
O primeiro passo para implementar um SLSB definir os seus mtodos de negcio atravs de
uma interface. Por exemplo, suponha um SLSB que realiza operaes matemticas. Uma possvel
interface para esse SLSB seria:
Depois da interface, o segundo passo seria implementar as operaes do SLSB atravs de uma
classe.
22 www.k19.com.br
23 2.4. SLSB - EJB 3.1
O terceiro passo especificar o tipo de Session Bean que queremos utilizar. No caso da calcula-
dora, o tipo seria SLSB. Essa definio realizada atravs da anotao @Stateless.
1 @Stateless
2 public class CalculadoraBean implements Calculadora {
3 ...
4 }
Por fim, necessrio definir se o acesso do SLSB local ou remoto. Quando o acesso local, ape-
nas quem est dentro do servidor de aplicao no qual se encontra o SLSB pode acess-lo. Quando
o acesso remoto, tanto quem est dentro quanto quem est fora do servidor de aplicao no qual
se encontra o SLSB pode acess-lo.
A definio do tipo de acesso pode ser realizada atravs das anotaes: @Local e @Remote.
1 @Stateless
2 @Remote ( Calculadora . class )
3 public class CalculadoraBean implements Calculadora {
4 ...
5 }
1 @Stateless
2 @Local ( Calculadora . class )
3 public class CalculadoraBean implements Calculadora {
4 ...
5 }
Nas anotaes @Local e @Remote, devemos informar as interfaces que definem os mtodos de
negcio do nosso SLSB. A classe CalculadoraBean poderia implementar diversas interfaces. Con-
tudo, apenas os mtodos das interfaces declaradas nessas anotaes sero considerados mtodos de
negcio.
1 @Stateless
2 public class CalculadoraBean {
3
4 public double soma ( double a , double b ) {
5 return a + b ;
6 }
7
8 public double subtrai ( double a , double b ) {
9 return a - b ;
10 }
11
12 public double multiplica ( double a , double b ) {
www.facebook.com/k19treinamentos 23
S TATELESS S ESSION B EANS 24
13 return a * b ;
14 }
15
16 public double divide ( double a , double b ) {
17 return a / b ;
18 }
19 }
Como vimos os session beans so utilizados para implementar as regras negcio das nossas apli-
caes. Em particular, os stateless session beans so utilizados para implementar as regras de neg-
cio que no necessitam manter estado conversacional. Contudo, alm das regras de negcio, deve-
mos nos preocupar com a interface dos usurios. Hoje em dia, na maioria dos casos, essa interface
web.
A seguir, vamos implementar um sistema que realiza operaes matemticas bsicas para exem-
plificar a utilizao da arquitetura EJB em conjunto com as tecnologias Java para desenvolvimento
de interfaces web. Suponha que todo o sistema (session beans e a camada web) esteja no mesmo
servidor de aplicao.
Depois de definir a interface, devemos implementar as operaes do SLSB atravs de uma classe
java com as anotaes apropriadas.
1 @Stateless
2 @Local ( Calculadora . class )
3 public class CalculadoraBean implements Calculadora {
4 public double soma ( double a , double b ) {
5 return a + b ;
6 }
7 }
Perceba que o acesso local foi definido para esse SLSB pois ele ser acessado por uma camada
web no mesmo servidor de aplicao. Nesse momento, o SLSB est pronto.
O prximo passo implementar a camada web. A interface Calculadora que define as operaes
do SLSB precisa estar no classpath da camada web diferentemente da classe CalculadoraBean que
implementa as operaes.
24 www.k19.com.br
25 2.4. SLSB - EJB 3.1
Suponha que a camada web da nossa aplicao utiliza apenas Servlets. Podemos injetar, atravs
da anotao @EJB, o SLSB em uma Servlet.
Agora, suponha que a camada web utilize JSF. Podemos injetar o SLSB em um managed bean
tambm atravs da anotao @EJB.
1 @ManagedBean
2 public class CalculadoraMB {
3 @EJB
4 private Calculadora calculadora ;
5
6 private double a ;
7
8 private double b ;
9
10 private double resultado ;
11
12 public void soma () {
13 this . resultado = this . calculadora . soma (a , b ) ;
14 }
15
16 // GETTERS AND SETTERS
17 }
Exerccios de Fixao
1 Crie um EJB project no eclipse. Voc pode digitar CTRL+3 em seguida new EJB project e
ENTER. Depois, siga exatamente as imagens abaixo.
www.facebook.com/k19treinamentos 25
S TATELESS S ESSION B EANS 26
26 www.k19.com.br
27 2.4. SLSB - EJB 3.1
calculadora: As classes que implementam os SLSB devem ser colocadas nesse projeto.
calculadoraClient: As interfaces que definem as operaes dos SLSB devem ser colocadas nesse
projeto.
2 Crie um Dynamic Web Project no eclipse para implementar a camada web. Voc pode digitar
CTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens
abaixo.
www.facebook.com/k19treinamentos 27
S TATELESS S ESSION B EANS 28
28 www.k19.com.br
29 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 29
S TATELESS S ESSION B EANS 30
30 www.k19.com.br
31 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 31
S TATELESS S ESSION B EANS 32
5 No projeto calculadora, crie uma classe java chamada CalculadoraBean em um pacote cha-
mado br.com.k19.sessionbeans.
32 www.k19.com.br
33 2.4. SLSB - EJB 3.1
6 No projeto calculadoraWeb, crie uma classe java chamada CalculadoraMB em um pacote cha-
mado br.com.k19.managedbeans.
7 Crie uma simples tela na aplicao web para utilizar o managed bean. Adicione o arquivo
soma.xhtml na pasta WebContent do projeto calculadoraWeb com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : h = " http :// java . sun . com / jsf / html " >
6
7 <h : head >
8 < title > Calculadora - Soma </ title >
9 </ h : head >
10
11 <h : body >
12 <h : form >
13 <h : outputLabel value = " Valor A : " / >
14 <h : inputText value = " #{ calculadoraMB . a } " / >
15
16 <h : outputLabel value = " Valor B : " / >
17 <h : inputText value = " #{ calculadoraMB . b } " / >
18
19 <h : commandButton action = " #{ calculadoraMB . soma } " value = " soma " / >
20
21 <h : outputLabel value = " Resultado : " / >
22 <h : outputText value = " #{ calculadoraMB . resultado } " / >
23 </ h : form >
24 </ h : body >
25 </ html >
www.facebook.com/k19treinamentos 33
S TATELESS S ESSION B EANS 34
8 Adicione o projeto calculadoraEAR no Glassfish. Clique com o boto direito no Glassfish utili-
zando view Servers e escolha a opo Add and Remove.
9 Certifique-se que o JBoss e o Wildfly estejam parados. Inicie o Glassfish. Acesse a url http:
//localhost:8080/calculadoraWeb/soma.xhtml e teste o funcionamento da aplicao.
Como dito anteriormente, na verso 3.1, quando o acesso a um SLSB local, no mais neces-
srio definir uma interface Java nem utilizar a anotao @Local.
Alm disso, as regras de empacotamento foram simplificadas. Os Session Beans podem ser em-
pacotados no mdulo web. Isso simplifica bastante o funcionamento das IDEs como o eclipse. Per-
ceberemos essa diferena o exerccio seguinte.
Exerccios de Fixao
11 Crie um Dynamic Web Project no eclipse para implementar a camada web. Voc pode digitar
CTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens
34 www.k19.com.br
35 2.4. SLSB - EJB 3.1
abaixo.
www.facebook.com/k19treinamentos 35
S TATELESS S ESSION B EANS 36
36 www.k19.com.br
37 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 37
S TATELESS S ESSION B EANS 38
14 Crie uma simples tela na aplicao web para utilizar o managed bean. Adicione o arquivo
dado.xhtml na pasta WebContent do projeto dadoWeb com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : h = " http :// java . sun . com / jsf / html " >
6
7 <h : head >
38 www.k19.com.br
39 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 39
S TATELESS S ESSION B EANS 40
Vimos os SLSBs sendo acessados localmente por aplicaes web implantadas no mesmo servi-
dor de aplicao. Contudo, eles podem ser acessados remotamente, ou seja, podem ser acessados
por aplicaes fora do mesmo servidor de aplicao. Inclusive, um SLSB pode ser acessado por apli-
caes Java SE.
Quando o acesso local, podemos injetar um SLSB atravs da anotao @EJB no componente
que necessita dos servios implementados pelo SLSB. Agora, quando o acesso remoto, no temos
o recurso de injeo de dependncia. Dessa forma, os SLSBs devem ser obtidos de outra maneira.
Todo SLSB implantado em um servidor de aplicao recebe um nome. Toda aplicao fora
desse servidor de aplicao pode utilizar esse nome para obter a referncia remota do SLSB.
Antes da verso 3.1, os nomes dos Session Beans no eram padronizados. Consequentemente,
cada servidor de aplicao possua uma regra diferente para nomear os Session Beans. A partir da
verso 3.1, os nomes foram padronizados e portanto so portveis (iguais em todos os servidores de
aplicao). Consulte a especificao para conhecer as regras de nomenclatura http://jcp.org/en/
jsr/detail?id=318.
Uma aplicao Java remota deve acessar o servio de nomes (JNDI) do servidor de aplicao no
qual o SLSB que ela deseja utilizar est implantado. O trecho de cdigo Java para fazer uma consulta
por um SLSB no JNDI teria o seguinte padro.
40 www.k19.com.br
41 2.4. SLSB - EJB 3.1
Uma vez com a referncia do SLSB, a aplicao pode chamar as operaes normalmente como
se o Session Bean estivesse local. Contudo, importante ressaltar que as chamadas so remotas e
portanto mais demoradas.
Exerccios de Fixao
www.facebook.com/k19treinamentos 41
S TATELESS S ESSION B EANS 42
20 Crie um Java project no eclipse. Voc pode digitar CTRL+3 em seguida new Java project e
ENTER. Depois, siga exatamente as imagens abaixo.
42 www.k19.com.br
43 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 43
S TATELESS S ESSION B EANS 44
44 www.k19.com.br
45 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 45
S TATELESS S ESSION B EANS 46
24 Republique o projeto dadoWeb. Voc pode clicar com o boto direito nesse projeto na view
Servers dentro do Glassfish e selecionar a opo Full publish.
Ciclo de Vida
As instncias dos SLSBs so administradas pelo EJB Container. Devemos entender o ciclo de vida
desses objetos para utilizar corretamente a tecnologia EJB. Trs aspectos fundamentais dos SLSBs
nos ajudam a entender o ciclo de vida das instncias.
2. Uma instncia de um SLSB no atende duas chamadas ao mesmo tempo. Em outras palavras,
ela processa uma chamada de cada vez.
3. O EJB Container pode criar vrias instncias do mesmo SLSB para atender mais rapidamente
as chamadas dos clientes.
Estados
O ciclo de vida das instncias de um SLSB possui apenas dois estados.
1. NO EXISTE
2. PRONTO
De acordo com a quantidade de chamadas e critrios de cada servidor de aplicao, o EJB Con-
tainer pode criar novas instncias de um SLSB. Cada instncia criada passa para o estado PRONTO.
No estado PRONTO, uma instncia est apta a receber uma chamada.
46 www.k19.com.br
47 2.4. SLSB - EJB 3.1
Escalabilidade e Pool
As caractersticas dos SLSBs favorecem a escalabilidade da aplicao pois, de acordo com a de-
manda, o EJB Container cria novas instncias e cada instncia pode atender vrios clientes.
O EJB Container administra as instncias criadas atravs de um Pool. Cada servidor de aplicao
oferece configuraes especficas para melhorar a eficincia no atendimento das chamadas. Por
exemplo, o Glassfish permite que uma quantidade mxima de instncias de um determinado SLSB
seja definida pela aplicao.
Callbacks
Podemos associar lgicas especficas nas transies de estado no ciclo de vida dos SLSBs.
@PostConstruct
Podemos registrar um mtodo de instncia no EJB Container para que ele o execute em cada
instncia logo aps ela ser criada. Esse registro realizado atravs da anotao @PostConstruct.
1 @Stateless
www.facebook.com/k19treinamentos 47
S TATELESS S ESSION B EANS 48
O EJB Container utiliza o construtor sem argumentos para criar uma instncia de um SLSB. De-
pois de chamar o construtor sem argumentos, o EJB Container injeta eventuais dependncias na
instncia criada. Por fim, os mtodos anotados com @PostConstruct so executados.
@PreDestroy
Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o execute em
cada instncia imediatamente antes dela ser destruda. Esse registro realizado atravs da anotao
@PreDestroy.
1 @Stateless
2 public class CalculadoraBean {
3
4 @PreDestroy
5 public void destruindo () {
6 System . out . println ( " Mais uma calculadora ser destruda ... " )
7 }
8
9 // METODOS DE NEGOCIO
10 }
Exerccios de Fixao
48 www.k19.com.br
49 2.4. SLSB - EJB 3.1
www.facebook.com/k19treinamentos 49
S TATELESS S ESSION B EANS 50
Mtodos Assncronos
A partir da verso 3.1 do EJB, podemos definir mtodos assncronos nos session beans. Geral-
mente, mtodos assncronos so utilizados para implementar tarefas demoradas. Para definir um
mtodo assncrono, basta utilizar a anotao @Asynchronous. Se essa anotao for aplicada na
classe que define um session bean, todos os mtodos de negcio desse session bean sero assncro-
nos. Por outro lado, podemos aplicar essa anotao somentes nos mtodos de negcio que devem
ser assncronos.
1 @Stateless
2 @Asynchronous
3 public class MeuSessionBean {
4
5 public Future < Integer > metodoAssincrono1 () {. . . }
6
7 public Future < String > metodoAssincrono2 () {. . . }
8 }
50 www.k19.com.br
51 2.4. SLSB - EJB 3.1
1 @Stateless
2 public class MeuSessionBean {
3
4 @Asynchronous
5 public Future < Integer > metodoAssincrono1 () {. . . }
6
7 @Asynchronous
8 public Future < String > metodoAssincrono2 () {. . . }
9
10 public String metodoSincrono1 () {. . . }
11
12 public Integer metodoSincrono2 () {. . . }
13 }
1 MeuSessionBean bean = . . .
2 Future < String > future = bean . metodoAssincrono2 () ;
3 // executa alguma coisa enquanto o session bean trabalha
4
5 // verifica se a tarefa terminou
6 if ( future . isDone () ) {
7
8 }
A interface Future tambm permite que o resultado seja recuperado atravs do mtodo get().
1 MeuSessionBean bean = . . .
2 Future < String > future = bean . metodoAssincrono2 () ;
3 // executa alguma coisa enquanto o session bean trabalha
4
5 // verifica se a tarefa terminou
6 if ( future . isDone () ) {
7 String resultado = future . get () ;
8 }
Exerccios de Fixao
java.util.Map
java.util.HashMap
java.util.concurrent.Future
1 ...
2 @Asynchronous
3 public Future < Map < Integer , Integer > > calculaFrequencia () {
4 Map < Integer , Integer > map = new HashMap < Integer , Integer >() ;
5 map . put (1 , 0) ;
6 map . put (2 , 0) ;
7 map . put (3 , 0) ;
8 map . put (4 , 0) ;
www.facebook.com/k19treinamentos 51
S TATELESS S ESSION B EANS 52
9 map . put (5 , 0) ;
10 map . put (6 , 0) ;
11
12 for ( int i = 0; i < 500; i ++) {
13 int v = this . gerador . nextInt (6) + 1;
14 map . put (v , map . get ( v ) + 1) ;
15 try {
16 Thread . sleep (100) ;
17 } catch ( InterruptedException e ) {
18 }
19 System . out . println ( i ) ;
20 }
21 return new AsyncResult < Map < Integer , Integer > >( map ) ;
22 }
23 . . .
java.util.Map
java.util.concurrent.Future
1 ...
2 Future < Map < Integer , Integer > > calculaFrequencia () ;
3 ...
52 www.k19.com.br
53 2.4. SLSB - EJB 3.1
34 Republique o projeto dadoWeb. Voc pode clicar com o boto direito nesse projeto na view
Servers dentro do Glassfish e selecionar a opo Full publish.
www.facebook.com/k19treinamentos 53
S TATELESS S ESSION B EANS 54
54 www.k19.com.br
CAPTULO
S TATEFUL S ESSION B EANS
3
Caracterizando os SFSBs
Stateful Session Bean o segundo tipo de Session Bean. Muitas vezes, utilizaremos a sigla SFSB
para fazer referncia a esse tipo de componente. A ideia fundamental por trs dos SFSBs a necessi-
dade de manter estado conversacional.
Carrinho de Compras
Para exemplificar, suponha o funcionamento de um carrinho de compras de uma loja virtual. As
regras de negcio do carrinho podem ser implementas atravs de alguns mtodos.
1 class CarrinhoBean {
2
3 public void adiciona ( Produto produto ) {
4 // lgica para adicionar produto
5 }
6
7 public void remove ( Produto produto ) {
8 // lgica para remover produto
9 }
10
11 public void finalizaCompra () {
12 // lgica para finalizar a compra
13 }
14 }
1 class CarrinhoBean {
2
3 private Set < Produto > produtos = new HashSet < Produto >() ;
4
5 public void adiciona ( Produto produto ) {
6 this . produtos . add ( produto ) ;
7 }
8
9 public void remove ( Produto produto ) {
10 this . produtos . remove ( produto ) ;
11 }
www.facebook.com/k19treinamentos 55
S TATEFUL S ESSION B EANS 56
12
13 public void finalizaCompra () {
14 // lgica para finalizar a compra
15 }
16 }
Prova Digital
Outro exemplo, suponha o funcionamento de um sistema para aplicar provas que permita que
os usurios respondam as questes em qualquer ordem ou modifiquem respostas j realizadas antes
de finalizar a prova. As resposta poderiam ser mantidas em um mapa.
1 class ProvaBean {
2 private Map < Integer , Character > respostas = new HashMap < Integer , Character >() ;
3
4 public void responde ( Integer questao , Character resposta ) {
5 this . respostas . put ( questao , resposta ) ;
6 }
7
8 public void finaliza () {
9 // lgica para finalizar a prova
10 }
11 }
Uma instncia da classe ProvaBean no pode atender dois clientes para no misturar as respos-
tas de dois usurios diferentes. Alm disso, as respostas j realizadas devem ser mantidas entre as
chamadas.
TrackList
Mais um exemplo, suponha o funcionamento de um player de vdeo que permite que os usurios
selecionem um conjunto de vdeos para assistir.
1 class ListaDeVideos {
2 private List < Video > videos = new ArrayList < Video >() ;
3
4 public void adiciona ( Video video ) {
5 this . videos . add ( video ) ;
6 }
7
8 public void embaralha () {
9 Collections . shuffle ( this . videos ) ;
10 }
11 }
Novamente, cada instncia da classe ListaDeVideos deve ser exclusiva de um cliente e os vdeos
adicionados devem ser mantidos entre as chamadas dos mtodos.
56 www.k19.com.br
57 S TATEFUL S ESSION B EANS
O primeiro passo para implementar um SFSB definir a sua interface de utilizao atravs de
uma interface java. Por exemplo, considere um SFSB que implemente o funcionamento do carrinho
de compras. Uma possvel interface de utilizao para esse session bean seria:
Aps definir a interface de utilizao, o segundo passo seria implementar as operaes do SFSB
atravs de uma classe java.
O terceiro passo especificar o tipo de session bean que queremos utilizar. No caso do carrinho,
o tipo seria SFSB. Essa definio realizada atravs da anotao @Stateful.
1 @Stateful
2 public class CarrinhoBean implements Carrinho {
3 ...
4 }
Por fim, necessrio definir se o SFSB poder ser acessado remotamente ou apenas localmente.
Quando o acesso a um SLSB local, ele s pode ser acessado por aplicaes que estejam no mesmo
servidor de aplicao que ele. Caso contrrio, quando o acesso a um SLSB remoto, ele pode ser
acessado tanto por aplicaes que estejam no mesmo servidor de aplicao quanto aplicaes que
no estejam.
1 @Stateful
2 @Remote ( Carrinho . class )
3 public class CarrinhoBean implements Carrinho {
4 ...
5 }
1 @Stateful
2 @Local ( Carrinho . class )
3 public class CarrinhoBean implements Carrinho {
4 ...
5 }
www.facebook.com/k19treinamentos 57
S TATEFUL S ESSION B EANS 58
Na verso 3.1, quando o acesso a um SFSB local, no mais necessrio definir uma interface
java nem utilizar a anotao @Local. Ento, bastaria implementar uma classe java com a anotao
@Stateful.
1 @Stateful
2 public class CarrinhoBean {
3
4 private Set < Produto > produtos = new HashSet < Produto >() ;
5
6 public void adiciona ( Produto produto ) {
7 this . produtos . add ( produto ) ;
8 }
9
10 public void remove ( Produto produto ) {
11 this . produtos . remove ( produto ) ;
12 }
13 }
Exerccios de Fixao
1 Para no confundir, feche os projetos dadoWeb e dadoJavaSE. Para isso, clique com o boto
direito do mouse sobre esses projetos e selecione a opo Close Project.
58 www.k19.com.br
59 S TATEFUL S ESSION B EANS
www.facebook.com/k19treinamentos 59
S TATEFUL S ESSION B EANS 60
60 www.k19.com.br
61 S TATEFUL S ESSION B EANS
www.facebook.com/k19treinamentos 61
S TATEFUL S ESSION B EANS 62
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : h = " http :// java . sun . com / jsf / html " >
6
7 <h : head >
8 < title > Carrinho de Compras </ title >
9 </ h : head >
10
11 <h : body >
12 <h : form >
13 <h : outputLabel value = " Produto : " / >
14 <h : inputText value = " #{ carrinhoMB . produto } " / >
15 <h : commandButton action = " #{ carrinhoMB . adiciona } " value = " Adiciona no carrinho " / >
16
17 < hr / >
18
19 <h : outputLabel value = " Produtos no carrinho : " / >
20 <h : dataTable value = " #{ carrinhoMB . produtos } " var = " p " >
21 <h : column >
22 <h : outputText value = " #{ p } " / >
23 </ h: column >
24 <h : column >
25 <h : commandLink action = " #{ carrinhoMB . remove ( p ) } " value = " remove " / >
26 </ h: column >
27 </ h : dataTable >
28 </ h : form >
29 </ h : body >
30 </ html >
Ciclo de Vida
As instncias dos SFSBs so administradas pelo EJB Container. Devemos entender o ciclo de vida
desses objetos para utilizar corretamente a tecnologia EJB. Para entender mais facilmente o ciclo de
vida das instncias dos SFSBs, devemos sempre ter em mente que cada instncia atende apenas um
cliente.
Estados
O ciclo de vida das instncias de um SFSB possui trs estados.
1. NO EXISTE
2. PRONTO
3. PASSIVADO
62 www.k19.com.br
63 S TATEFUL S ESSION B EANS
Quando um cliente recebe por injeo ou recupera por lookup um SFSB, o EJB Container cria
uma nova instncia desse SFSB para atender exclusivamente esse cliente. Nesse instante, logo aps
ser criada, a instncia se encontra no estado PRONTO e pode atender as chamadas do seu respectivo
cliente.
Outros fatores alm da ociosidade podem levar o EJB Container decidir passivar instncias dos
SFSBs. Por exemplo, quando um certo limite de instncias no estado PRONTO (ocupando memria)
for atingido.
O EJB Container o responsvel por destruir uma instncia de um SFSB que no mais til. Por
outro lado, a aplicao responsvel por determinar quando uma instncia se torna intil. Adicio-
nando um mtodo de negcio anotado com @Remove a aplicao declara que aps a execuo desse
mtodo a instncia no mais necessria.
1 @Stateful
2 public class CarrinhoBean {
3
4 private Set < String > produtos = new HashSet < String >() ;
5
6 public void adiciona ( String produto ) {
7 this . produtos . add ( produto ) ;
8 }
9
10 public void remove ( String produto ) {
www.facebook.com/k19treinamentos 63
S TATEFUL S ESSION B EANS 64
Callbacks
Podemos associar lgicas especficas nas transies de estado no ciclo de vida dos SFSBs.
@PostConstruct
Podemos registrar um mtodo de instncia no EJB Container para que ele o execute em cada
instncia logo aps ela ser criada. Esse registro realizado atravs da anotao @PostConstruct.
1 @Stateful
2 public class CarrinhoBean {
3
64 www.k19.com.br
65 S TATEFUL S ESSION B EANS
4 @PostConstruct
5 public void inicializando () {
6 System . out . println ( " Mais um carrinho criado ... " ) ;
7 }
8
9 // METODOS DE NEGOCIO
10 }
O EJB Container utiliza o construtor sem argumentos para criar uma instncia de um SLSB. De-
pois de chamar o construtor sem argumentos, o EJB Container injeta eventuais dependncias na
instncia criada. Por fim, os mtodos anotados com @PostConstruct so executados.
@PreDestroy
Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o execute em
cada instncia imediatamente antes dela ser destruda. Esse registro realizado atravs da anotao
@PreDestroy.
1 @Stateful
2 public class CarrinhoBean {
3
4 @PreDestroy
5 public void destruindo () {
6 System . out . println ( " Mais um carrinho ser destrudo ... " ) ;
7 }
8
9 // METODOS DE NEGOCIO
10 }
@PrePassivate
Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o execute em
cada instncia imediatamente antes dela ser passivada. Esse registro realizado atravs da anotao
@PrePassivate.
1 @Stateful
2 public class CarrinhoBean {
3
4 @PrePassivate
5 public void passivando () {
6 System . out . println ( " Mais um carrinho ser passivado ... " ) ;
7 }
8
9 // METODOS DE NEGOCIO
10 }
@PostActivate
Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o execute em
cada instncia imediatamente depois dela ser ativada. Esse registro realizado atravs da anotao
@PostActivate.
1 @Stateful
www.facebook.com/k19treinamentos 65
S TATEFUL S ESSION B EANS 66
Exerccios de Fixao
66 www.k19.com.br
67 S TATEFUL S ESSION B EANS
25 }
26
27 public void remove ( String produto ) {
28 this . produtos . remove ( produto ) ;
29 }
30
31 public Set < String > getProdutos () {
32 return produtos ;
33 }
34
35 @Remove
36 public void finalizaCompra () {
37 System . out . println ( " Finalizando a compra " ) ;
38 }
39
40 @PostConstruct
41 public void postContruct () {
42 synchronized ( CarrinhoBean . class ) {
43 CarrinhoBean . contadorTotal ++;
44 CarrinhoBean . contadorAtivos ++;
45 this . id = CarrinhoBean . contadorTotal ;
46
47 System . out . println ( " PostConstruct " ) ;
48 System . out . println ( " ID : " + this . id ) ;
49 System . out . println ( " ContatorTotal : " + CarrinhoBean . contadorTotal ) ;
50 System . out . println ( " ContatorAtivos : " + CarrinhoBean . contadorAtivos ) ;
51 }
52 }
53
54 @PrePassivate
55 public void prePassivate () {
56 synchronized ( CarrinhoBean . class ) {
57 CarrinhoBean . contadorAtivos - -;
58
59 System . out . println ( " PrePassivate " ) ;
60 System . out . println ( " ID : " + this . id ) ;
61 System . out . println ( " ContatorTotal : " + CarrinhoBean . contadorTotal ) ;
62 System . out . println ( " ContatorAtivos : " + CarrinhoBean . contadorAtivos ) ;
63 }
64 }
65
66 @PostActivate
67 public void postActivate () {
68 synchronized ( CarrinhoBean . class ) {
69 CarrinhoBean . contadorAtivos ++;
70
71 System . out . println ( " PostActivate " ) ;
72 System . out . println ( " ID : " + this . id ) ;
73 System . out . println ( " ContatorTotal : " + CarrinhoBean . contadorTotal ) ;
74 System . out . println ( " ContatorAtivos : " + CarrinhoBean . contadorAtivos ) ;
75 }
76 }
77
78 @PreDestroy
79 public void preDestroy () {
80 synchronized ( CarrinhoBean . class ) {
81 CarrinhoBean . contadorAtivos - -;
82
83 System . out . println ( " PreDestroy " ) ;
84 System . out . println ( " ID : " + this . id ) ;
85 System . out . println ( " ContatorTotal : " + CarrinhoBean . contadorTotal ) ;
86 System . out . println ( " ContatorAtivos : " + CarrinhoBean . contadorAtivos ) ;
87 }
88 }
89 }
www.facebook.com/k19treinamentos 67
S TATEFUL S ESSION B EANS 68
10 Republique o projeto carrinhoWeb. Voc pode clicar com o boto direito nesse projeto na view
Servers dentro do JBoss e selecionar a opo Full publish.
Username: k19
Password: 1234
Utilize o script add-user.sh para adicionar o usurio k19 no JBoss. Siga os passos abaixo.
68 www.k19.com.br
69 S TATEFUL S ESSION B EANS
1 ...
2 < stateful default - access - timeout = " 5000 " cache - ref = " passivating " / >
3 ...
4 < cache name = " passivating " passivation - store - ref = " file " aliases = " SimpleStatefulCache " / -
>
5 ...
6 < file - passivation - store name = " file "
7 idle - timeout = " 10 "
8 idle - timeout - unit = " SECONDS "
9 max - size = " 5 " / >
10 ...
13 Crie um Java project no eclipse. Voc pode digitar CTRL+3 em seguida new Java project e
ENTER. Depois, siga exatamente as imagens abaixo.
www.facebook.com/k19treinamentos 69
S TATEFUL S ESSION B EANS 70
70 www.k19.com.br
71 S TATEFUL S ESSION B EANS
www.facebook.com/k19treinamentos 71
S TATEFUL S ESSION B EANS 72
72 www.k19.com.br
73 S TATEFUL S ESSION B EANS
www.facebook.com/k19treinamentos 73
S TATEFUL S ESSION B EANS 74
74 www.k19.com.br
CAPTULO
S INGLETON S ESSION B EANS
4
Caracterizando os Singleton Session Beans
Singleton Session Bean o terceiro tipo de session bean. Este tipo de session bean surgiu na
verso 3.1 da especificao Enterprise Java Beans. A ideia fundamental dos Singleton Session Beans
a necessidade de compartilhar dados transientes entre todos os usurios de uma aplicao EJB.
1 class ContadorDeUsuariosBean {
2
3 private int contador = 0;
4
5 public void adiciona () {
6 this . contador ++;
7 }
8
9 public int getContador () {
10 return this . contador ;
11 }
12 }
Uma nica instncia da classe ContadorDeUsuariosBean deve ser criada para contabilizar cor-
retamente o nmero de usurios conectados. Alm disso, o contador de usurios conectados no
precisa ser persistido entre duas execues da aplicao.
Sistema de chat
Outro exemplo, suponha o funcionamento de um sistema de chat no qual as salas so criadas
dinamicamente pelos usurios durante a execuo. Podemos definir alguns mtodos para imple-
mentar esse sistema.
1 class ChatBean {
2 private Set < String > salas = new HashSet < String >() ;
3
4 public void criaSala ( String sala ) {
5 this . salas . add ( sala ) ;
6 }
7
8 public List < String > listaSalas () {
9 return new ArrayList < String >( this . salas ) ;
10 }
11 }
www.facebook.com/k19treinamentos 75
S INGLETON S ESSION B EANS 76
Trnsito Colaborativo
Mais um exemplo, suponha um sistema colaborativo para informar o grau de congestionamento
nas vias de uma cidade. As regras desse sistema poderiam ser implementadas atravs de alguns
mtodos.
1 class TransitoBean {
2 private Map < String , List < Integer > > vias = new HashMap < String , List < Integer > >() ;
3
4 public void registra ( String via , Integer velocidade ) {
5 if ( this . vias . containsKey ( via ) ) {
6 this . vias . get ( via ) . add ( velocidade ) ;
7 }
8 }
9
10 public List < Integer > getVelocidadesRegistradas ( String via ) {
11 return this . vias . get ( via ) ;
12 }
13 }
Os dados sobre o trnsito so fornecidos pelos usurios e todos podem consultar as mesmas
informaes. A princpio, no necessrio manter esses dados persistidos.
Implementao
Para implementar um Singleton Session Bean podemos definir uma interface java com as assina-
turas dos mtodos de negcio. Por exemplo, suponha que um Singleton Session Bean ser utilizado
para implementar um sistema de chat.
Aps definir a interface de utilizao, o segundo passo seria implementar as operaes do session
bean atravs de uma classe java.
76 www.k19.com.br
77 S INGLETON S ESSION B EANS
8
9 public List < String > listaSalas () {
10 return new ArrayList < String >( this . salas ) ;
11 }
12 }
O terceiro passo especificar o tipo de session bean que queremos utilizar. No caso do chat, o
tipo seria Singleton. Essa definio realizada atravs da anotao @Singleton.
1 @Singleton
2 public class ChatBean implements Chat {
3 ...
4 }
Por fim, necessrio definir se o session bean poder ser acessado remotamente ou apenas lo-
calmente. Quando o acesso a um session bean local, ele s pode ser acessado por aplicaes que
estejam no mesmo servidor de aplicao que ele. Caso contrrio, quando o acesso a um session bean
remoto, ele pode ser acessado tanto por aplicaes que estejam no mesmo servidor de aplicao
quanto aplicaes que no estejam.
1 @Singleton
2 @Remote ( Chat . class )
3 public class ChatBean implements Chat {
4 ...
5 }
1 @Singleton
2 @Local ( Chat . class )
3 public class ChatBean implements Chat {
4 ...
5 }
1 @Singleton
2 public class ChatBean {
3
4 private Set < String > salas = new HashSet < String >() ;
5
6 public void criaSala ( String sala ) {
7 this . salas . add ( sala ) ;
8 }
9
10 public List < String > listaSalas () {
11 return new ArrayList < String >( this . salas ) ;
12 }
www.facebook.com/k19treinamentos 77
S INGLETON S ESSION B EANS 78
13 }
Exerccios de Fixao
1 Para no confundir, feche os projetos carrinhoWeb e carrinhoJavaSE. Para isso, clique com o
boto direito do mouse sobre esses projetos e selecione a opo Close Project.
78 www.k19.com.br
79 S INGLETON S ESSION B EANS
www.facebook.com/k19treinamentos 79
S INGLETON S ESSION B EANS 80
80 www.k19.com.br
81 S INGLETON S ESSION B EANS
www.facebook.com/k19treinamentos 81
S INGLETON S ESSION B EANS 82
5 Adicione o arquivo chat.xhtml na pasta WebContent do projeto chatWeb com o seguinte con-
tedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Chat </ title >
11 </ h : head >
12
13 <h : body >
14 <h : form >
15 <h : outputLabel value = " Nova Sala : " / >
16 <h : inputText value = " #{ chatMB . sala } " / >
17 <h : commandButton value = " Criar " action = " #{ chatMB . adicionaSala } " / >
18
19 < hr / >
20
21 <h : dataTable value = " #{ chatMB . salas } " var = " sala " >
22 <h : column >
23 <h : outputText value = " #{ sala } " / >
24 </ h: column >
82 www.k19.com.br
83 S INGLETON S ESSION B EANS
Ciclo de Vida
As instncias dos Singleton Session Beans so administradas pelo EJB Container. Devemos en-
tender o de ciclo de vida desses objetos para utilizar corretamente a tecnologia EJB. Para entender
mais facilmente o ciclo de vida das instncias dos Singleton Session Beans, devemos sempre ter em
mente que o EJB Container cria apenas uma instncia de cada session bean desse tipo.
Estados
O ciclo de vida das instncias dos Singleton Session Beans possui dois estados.
1. NO EXISTE
2. PRONTO
O EJB Container cria apenas uma instncia para cada Singleton Session Bean. Por padro, o EJB
Container quem decide quando a criao da instncia de um Singleton Session Bean deve ser rea-
lizada. Contudo, possvel determinar que essa criao seja realizada na inicializao da aplicao
atravs da anotao @Startup.
1 @Singleton
2 @Startup
3 class ContadorDeUsuariosBean {
4
5 private int contador = 0;
6
7 public void adiciona () {
8 this . contador ++;
9 }
10
11 public int getContador () {
12 return this . contador ;
13 }
14 }
www.facebook.com/k19treinamentos 83
S INGLETON S ESSION B EANS 84
Quando a instncia de um Singleton Session Bean criada, ela passa para do estado NO EXISTE
para o estado PRONTO e pode atender as chamadas dos clientes da aplicao.
Callbacks
Podemos associar lgicas especficas nas transies de estado no ciclo de vida dos Singleton Ses-
sion Beans.
@PostConstruct
Podemos registrar um mtodo de instncia no EJB Container para que ele o execute em cada
instncia logo aps ela ser criada. Esse registro realizado atravs da anotao @PostConstruct.
1 @Singleton
2 class ContadorDeUsuariosBean {
3
4 @PostConstruct
5 public void inicializando () {
6 System . out . println ( " Contador de usurios criado ... " ) ;
7 }
8
9 // METODOS DE NEGOCIO
10 }
84 www.k19.com.br
85 S INGLETON S ESSION B EANS
O EJB Container utiliza o construtor sem argumentos para criar a instncia de um Singleton Ses-
sion Bean. Depois de chamar o construtor sem argumentos, o EJB Container injeta eventuais depen-
dncias na instncia criada. Por fim, os mtodos anotados com @PostConstruct so executados.
@PreDestroy
Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o execute em
cada instncia imediatamente antes dela ser destruda. Esse registro realizado atravs da anotao
@PreDestroy.
1 @Singleton
2 class ContadorDeUsuariosBean {
3
4 @PreDestroy
5 public void destruindo () {
6 System . out . println ( " Contador de usurios ser destrudo ... " ) ;
7 }
8
9 // METODOS DE NEGOCIO
10 }
Exerccios de Fixao
www.facebook.com/k19treinamentos 85
S INGLETON S ESSION B EANS 86
34 }
1 ...
2 @Singleton
3 @Startup
4 public class ChatBean {
5 ...
6 }
Concorrncia
1 @Singleton
2 @ConcurrencyManagement ( ConcurrencyManagementType . CONTAINER )
3 public class ContadorDeUsuariosBean {
4 ...
5 }
86 www.k19.com.br
87 S INGLETON S ESSION B EANS
1 @Singleton
2 @ConcurrencyManagement ( ConcurrencyManagementType . BEAN )
3 public class ContadorDeUsuariosBean {
4 ...
5 }
CMC
No modo CMC, todo mtodo de negcio associado ao Read Lock ou ao Write Lock. Chama-
das a mtodos associados ao Read Lock podem ser executadas simultaneamente. Por outro lado,
chamadas a mtodos associados ao Write Lock so executadas uma de cada vez.
Por padro, no CMC, os mtodos so associados ao Write Lock. Opcionalmente, podemos de-
clarar o tipo de Lock atravs da anotao @Lock. Mas, lembre-se que no necessrio pois o Write
Lock associado aos mtodos de negcio por padro.
1 @Singleton
2 @Lock ( LockType . WRITE )
3 public class ContadorDeUsuariosBean {
4 private int contador = 0;
5
6 public void adiciona () {
7 this . contador ++;
8 }
9
10 public int getContador () {
11 return this . contador ;
12 }
13 }
1 @Singleton
2 public class ContadorDeUsuariosBean {
3 private int contador = 0;
4
5 @Lock ( LockType . WRITE )
6 public void adiciona () {
7 this . contador ++;
8 }
9
10 public int getContador () {
11 return this . contador ;
12 }
13 }
A anotao @Lock pode ser aplicada na classe do session bean ou diretamente nos mtodos de
negcio.
Para associar o Read Lock aos mtodos de negcio, devemos utilizar a anotao @Lock na classe
do session bean ou nos mtodos de negcio.
1 @Singleton
2 @Lock ( LockType . READ )
3 public class ContadorDeUsuariosBean {
4 private int contador = 0;
5
www.facebook.com/k19treinamentos 87
S INGLETON S ESSION B EANS 88
1 @Singleton
2 public class ContadorDeUsuariosBean {
3 private int contador = 0;
4
5 public void adiciona () {
6 this . contador ++;
7 }
8
9 @Lock ( LockType . READ )
10 public int getContador () {
11 return this . contador ;
12 }
13 }
BMC
No modo BMC, o controle de concorrncia deve ser implementado dentro dos mtodos de ne-
gcio. Voc pode utilizar a instruo synchronized ou os recursos do pacote java.util.concurrent.
Para isso, voc precisa ter bons conhecimento de programao concorrente.
Exerccios de Fixao
88 www.k19.com.br
89 S INGLETON S ESSION B EANS
8 @Singleton
9 @Lock ( LockType . READ )
10 @Remote ( Contador . class )
11 public class ContadorBean implements Contador {
12
13 private int valor ;
14
15 public void incrementa () {
16 this . valor ++;
17 }
18
19 public int getValor () {
20 return this . valor ;
21 }
22 }
13 Crie um Java project no eclipse. Voc pode digitar CTRL+3 em seguida new Java project e
ENTER. Depois, siga exatamente as imagens abaixo.
www.facebook.com/k19treinamentos 89
S INGLETON S ESSION B EANS 90
90 www.k19.com.br
91 S INGLETON S ESSION B EANS
Importante: Selecione o arquivo jboss-client.jar contido na pasta client que est na pasta bin
do diretrio de instalao do Wildfly.
www.facebook.com/k19treinamentos 91
S INGLETON S ESSION B EANS 92
Username: k19
Password: singleton123#
Utilize o script add-user.sh para adicionar o usurio k19 no JBoss. Siga os passos abaixo.
92 www.k19.com.br
93 S INGLETON S ESSION B EANS
www.facebook.com/k19treinamentos 93
S INGLETON S ESSION B EANS 94
27 System . out . println ( " Incrementando " + threads . length * threads . length
28 + " vezes " ) ;
29 for ( int i = 0; i < threads . length ; i ++) {
30 threads [ i ] = new Thread ( new Runnable () {
31 @Override
32 public void run () {
33 for ( int i = 0; i < threads . length ; i ++) {
34 contador . incrementa () ;
35 }
36 }
37 }) ;
38 threads [ i ]. start () ;
39 }
40
41 for ( Thread thread : threads ) {
42 thread . join () ;
43 }
44
45 System . out . println ( " Contador = " + contador . getValor () ) ;
46 }
47 }
94 www.k19.com.br
CAPTULO
P ERSISTNCIA
5
Data Sources
Aplicaes Java se comunicam com banco de dados atravs de conexes JDBC. Para estabelecer
uma conexo JDBC, algumas informaes como usurio, senha e base de dados so necessrias.
As configuraes relativas s conexes JDBC podem ser definidas nas aplicaes ou nos servido-
res de aplicao. Quando definidas em uma aplicao sero utilizadas somente por essa aplicao.
Quando definidas em um servidor de aplicao podem ser utilizadas em diversas aplicaes.
Os Data Sources permitem que uma nica configurao JDBC seja utilizada por diversas aplica-
es. Eles tambm permitem que outros tipos de configuraes sejam compartilhadas. Por exemplo,
a configurao de um Connection Pool.
Alm disso, atravs de Data Sources podemos utilizar facilmente o servio de transaes dos
servidores de aplicao. Esse servio definido pela especificao Java Transaction API (JTA).
Exerccios de Fixao
Importante
Voc tambm pode obter o driver JDBC do MySQL atravs do site da K19: www.k19.
com.br/arquivos.
2 Acesse o MySQL Server atravs do MySQL Workbench ou atravs do cliente de linha de co-
mando; apague a base de dados k22_glassfish caso ela exista; crie uma base de dados chamada
k22_glassfish.
www.facebook.com/k19treinamentos 95
P ERSISTNCIA 96
96 www.k19.com.br
97 P ERSISTNCIA
DatabaseName: k22_glassfish
Password: root
ServerName: localhost
URL: jdbc:mysql://localhost:3306/k22_glassfish
url: jdbc:mysql://localhost:3306/k22_glassfish
User: root
Depois, clique em finish. Para testar o Connection Pool K19, siga os passos abaixo:
www.facebook.com/k19treinamentos 97
P ERSISTNCIA 98
98 www.k19.com.br
99 P ERSISTNCIA
www.facebook.com/k19treinamentos 99
P ERSISTNCIA 100
100 www.k19.com.br
101 P ERSISTNCIA
4 Agora, vamos configurar um Data Source no Wildfly. Crie uma pasta chamada mysql dentro
da pasta modules/system/layers/base/com do Wildfly. Dentro da pasta mysql crie uma pasta cha-
mada main. Copie o arquivo mysql-connector-java-VERSAO-bin.jar que se encontra na pasta K19-
Arquivos/mysql-connector-java-VERSAO da rea de Trabalho para a pasta main.
Importante
Voc tambm pode obter o driver JDBC do MySQL atravs do site da K19: www.k19.
com.br/arquivos.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < module xmlns = " urn:jboss:module:1 .0 " name = " com . mysql " >
3 < resources >
4 < resource - root path = " mysql - connector - java -5.1.35 - bin . jar " / >
5 </ resources >
6 < dependencies >
www.facebook.com/k19treinamentos 101
P ERSISTNCIA 102
Na linha 4, indique corretamente o nome correspondente ao arquivo do driver que voc est
utilizando.
6 Acesse o MySQL Server atravs do MySQL Workbench ou atravs do cliente de linha de comando;
apague a base de dados k22_wildfly caso ela exista; crie uma base de dados chamada k22_wildfly.
1 ...
2 < datasource jndi - name = " java: / jdbc / K19 " pool - name = " K19 " jta = " true "
3 enabled = " true " use - java - context = " true " use - ccm = " true " >
4 < connection - url > jdbc:mysql: // localhost:3306 / k22_wildfly </ connection - url >
5 < driver > com . mysql </ driver >
6 < security >
7 < user - name > root </ user - name >
8 < password > root </ password >
9 </ security >
10 </ datasource >
11 ...
1 ...
2 < driver name = " com . mysql " module = " com . mysql " >
3 <xa - datasource - class >
4 com . mysql . jdbc . jdbc2 . optional . MysqlXADataSource
5 </ xa - datasource - class >
6 < driver - class > com . mysql . jdbc . Driver </ driver - class >
7 </ driver >
8 ...
8 Pare o Glassfish. Inicie o Wildfly e observe se o Data Source foi criado corretamente. No console,
deve aparecer uma mensagem semelhante a que apresentada abaixo.
persistence.xml
Em um ambiente Java EE, diversas configuraes relativas persistncia so realizadas nos Data
Sources. Contudo, algumas configuraes ainda devem ser realizadas pelas aplicaes. A especifi-
cao JPA determina que cada aplicao contenha um arquivo de configuraes chamado persis-
tence.xml dentro de uma pasta chamada META-INF no classpath da aplicao.
102 www.k19.com.br
103 P ERSISTNCIA
No arquivo persistece.xml podemos definir qual Data Source ser utilizado pela aplicao.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 < provider > org . hibernate . ejb . HibernatePersistence </ provider >
10 <jta - data - source > jdbc / K19 </ jta - data - source >
11
12 < properties >
13 < property name = " hibernate . show_sql " value = " true " / >
14 < property name = " hibernate . format_sql " value = " true " / >
15 < property name = " hibernate . hbm2ddl . auto " value = " update " / >
16 < property name = " hibernate . dialect " value = " org . hibernate . dialect . -
MySQL5InnoDBDialect " / >
17 </ properties >
18 </ persistence - unit >
19 </ persistence >
Entity Beans
As regras de negcio de uma aplicao EJB so implementadas nos session beans. Por outro
lado, os dados da aplicao que devem ser persistidos so armazenados em objetos chamados Entity
Beans. So exemplos de entity beans que poderiam formar uma aplicao:
clientes
produtos
pedidos
funcionrios
fornecedores
Os Entity Beans so definidos por classes java (Entity Classes). As Entity Classes devem ser ma-
peadas para tabelas no banco de dados atravs de anotaes ou XML. As principais anotaes de
mapeamento so:
@Entity a principal anotao do JPA. Ela que deve aparecer antes do nome de uma classe. E deve
ser definida em todas as classes que tero objetos persistidos no banco de dados.
As classes anotadas com @Entity so mapeadas para tabelas. Por conveno, as tabelas pos-
suem os mesmos nomes das classes. Mas, podemos alterar esse comportamento utilizando a
anotao @Table.
Os atributos declarados em uma classe anotada com @Entity so mapeados para colunas na
tabela correspondente classe. Outra vez, por conveno, as colunas possuem os mesmos no-
www.facebook.com/k19treinamentos 103
P ERSISTNCIA 104
mes dos atributos. E novamente, podemos alterar esse padro utilizando para isso a anotao
@Column.
@Id Utilizada para indicar qual atributo de uma classe anotada com @Entity ser mapeado para a
chave primria da tabela correspondente classe. Geralmente o atributo anotado com @Id
do tipo Long.
@GeneratedValue Geralmente vem acompanhado da anotao @Id. Serve para indicar que o valor
de um atributo que compe uma chave primria deve ser gerado pelo banco no momento em
que um novo registro inserido.
Supondo uma aplicao que administra livros e autores. As seguintes classes so exemplos de
Entity Classes mapeadas com anotaes que poderiam ser utilizadas no contexto dessa aplicao:
1 @Entity
2 public class Livro {
3
4 @Id @GeneratedValue ( strategy = GenerationType . IDENTITY )
5 private Long id ;
6
7 private String nome ;
8
9 private Double preco ;
10
11 // GETTERS AND SETTERS
12 }
1 @Entity
2 public class Autor {
3
4 @Id @GeneratedValue ( strategy = GenerationType . IDENTITY )
5 private Long id ;
6
7 private String nome ;
8
9 @ManyToMany
10 private List < Livro > livros ;
11
12 // GETTERS AND SETTERS
13 }
Consulte a apostila do curso K21 - Persistncia com JPA 2 e Hibernate para obter detalhes sobre
o mapeamento das Entity Classes http://www.k19.com.br/downloads/apostilas-java.
Exerccios de Fixao
9 Para no confundir, feche os projetos chatWeb e contadorJavaSE. Para isso, clique com o boto
direito do mouse sobre esses projetos e selecione a opo Close Project.
10 Crie um Dynamic Web Project no eclipse chamado persistenciaWeb. Voc pode digitar CTRL+3
em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens abaixo.
104 www.k19.com.br
105 P ERSISTNCIA
www.facebook.com/k19treinamentos 105
P ERSISTNCIA 106
106 www.k19.com.br
107 P ERSISTNCIA
www.facebook.com/k19treinamentos 107
P ERSISTNCIA 108
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " create " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
14 Adicione no pacote br.com.k19.entidades uma Entity Class para definir autores dos livros de
uma editora.
108 www.k19.com.br
109 P ERSISTNCIA
Entity Managers
Consulte a apostila do curso Persistncia com JPA 2 para obter detalhes sobre o funcionamento
dos Entity Managers http://online.k19.com.br.
1 manager . close () ;
Por outro lado, em um ambiente Java EE, o gerenciamento dos Entity Managers pode ser atri-
budo ao servidor de aplicao. Nesse caso, para uma aplicao Java EE obter um Entity Manager, ela
pode utilizar o recurso de Injeo de Dependncia oferecido pelo servidor de aplicao. Por exem-
plo, dentro de um Session Bean, podemos pedir a injeo de um Entity Manager atravs da anotao
@PersistenceContext.
1 @Stateless
2 public class CalculadoraBean {
3
4 @PersisteceContext
5 private EntityManager manager ;
6
www.facebook.com/k19treinamentos 109
P ERSISTNCIA 110
7 // Resto do cdigo
8 }
As Entity Managers Factories so objetos responsveis pela criao de Entity Managers de acordo
com as configuraes definidas no arquivo persistence.xml, nos Data Sources e atravs das anota-
es de mapeamento nas Entity Classes.
O mtodo createEntityManagerFactory() deve ser chamado apenas uma vez a cada execuo
da aplicao. No necessrio cham-lo mais do que uma vez porque a aplicao no necessita de
mais do que uma Entity Manager Factory e o custo de criao desse objeto alto.
Por outro lado, em um ambiente Java EE, o controle sobre a criao das Entity Manager Factories
responsabilidade do servidor de aplicao. Inclusive, o servidor de aplicao evita a criao de
fbricas desnecessrias.
Se uma aplicao Java EE deseja obter a Entity Manager Factory criada pelo servidor de aplicao,
ela deve utilizar a anotao @PersistenceUnit para pedir a injeo desse objeto.
1 @Stateless
2 public class CalculadoraBean {
3
4 @PersisteceUnit
5 private EntityManagerFactory factory ;
6
7 // Resto do cdigo
8 }
1 @Stateless
2 public class CalculadoraBean {
3
4 @PersisteceContext
5 private EntityManager manager ;
6
7 // Resto do cdigo
8 }
110 www.k19.com.br
111 P ERSISTNCIA
Exerccios de Fixao
www.facebook.com/k19treinamentos 111
P ERSISTNCIA 112
17 Crie uma tela para cadastrar livros. Adicione na pasta WebContent um arquivo chamado li-
vros.xhtml com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Livros </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Novo Livro </ h1 >
15 <h : messages / >
16 <h : form >
17 <h : outputLabel value = " Nome : " / >
18 <h : inputText value = " #{ livroMB . livro . nome } " / >
19
20 <h : outputLabel value = " Preo : " / >
21 <h : inputText value = " #{ livroMB . livro . preco } " / >
22
23 <h : commandButton action = " #{ livroMB . adiciona } " value = " Salvar " / >
24 </ h : form >
25
26 < h1 > Lista de Livros </ h1 >
27 <h : dataTable value = " #{ livroMB . livros } " var = " livro " >
28 <h : column >
29 <h : outputText value = " #{ livro . nome } " / >
30 </ h : column >
31 <h : column >
32 <h : outputText value = " #{ livro . preco } " / >
33 </ h : column >
34 </ h : dataTable >
35 </ h : body >
36 </ html >
112 www.k19.com.br
113 P ERSISTNCIA
19 Acesse o MySQL Server atravs do MySQL Workbench ou atravs do cliente de linha de comando;
21 Acesse o MySQL Server atravs do MySQL Workbench ou atravs do cliente de linha de comando;
Verifique as tabelas geradas na base de dados k22_wildfly e seus respectivos dados.
www.facebook.com/k19treinamentos 113
P ERSISTNCIA 114
114 www.k19.com.br
CAPTULO
T RANSAES
6
Geralmente, uma aplicao realiza diversas tarefas diferentes. Tambm comum e muitas vezes
necessrio dividir as tarefa em pequenos passos. Da surge o conceito de transao. Uma transa-
o um conjunto de passos que devem ser executados em uma ordem especfica para que uma
determinada tarefa seja realizada. Tipicamente, as transaes modificam informaes armazenadas
em resources (bases de dados, filas de mensagens, sistemas corporativos de informao - EIS, entre
outros).
ACID
Alm da restrio natural de ordem, as transaes possuem outras quatro propriedades funda-
mentais: Atomicidade, Consistncia, Isolamento e Durabilidade. A sigla ACID utilizada para indicar
a existncia dessas propriedades.
Atomicidade: Todos os passos de uma transao devem ser executados com sucesso para que a
prpria transao seja executada com sucesso. Se algum passo falhar a transao falhar e
todos os passos realizados at o momento da falha sero desfeitos.
Consistncia: No pode existir inconsistncia nos dados da aplicao nem antes nem depois da
execuo de uma transao. Ou seja, uma transao leva a aplicao de um estado consistente
para outro estado consistente.
Isolamento: Alteraes realizadas por uma transao no finalizada no podem afetar operaes
que no fazem parte da transao.
Durabilidade: Aps a confirmao de uma transao, as modificaes realizadas por ela devem ser
refletidas nos resources mesmo que acontea uma falha de hardware.
Quando as alteraes realizadas por uma transao afetam apenas um resource (bases de dados,
filas de mensagens, sistemas corporativos de informao - EIS, entre outros), dizemos que a transa-
o local. Caso contrrio, se dois ou mais resources so modificados por uma nica transao ela
dita distribuda.
JTA e JTS
www.facebook.com/k19treinamentos 115
T RANSAES 116
Todo servidor de aplicao Java EE deve oferecer suporte para as aplicaes utilizarem transa-
es. As especificaes relacionadas a esse tpico so: Java Transaction API - JTA e Java Transaction
Service - JTS. Os documentos dessas especificaes podem ser obtidos atravs do site: www.jcp.org.
A especificao Enterprise Java Beans (EJB) fortemente integrada com as especificaes JTA e
JTS, simplificando bastante o trabalho dos desenvolvedores de aplicao EJB que no precisam em
momento nenhum lidar diretamente com JTS e muito pouco com JTA.
Podemos definir o modo CMT individualmente para cada Session Bean da nossa aplicao atra-
vs da anotao @TransactionManagement.
1 @Stateful
2 @TransactionManagement ( TransactionManagementType . CONTAINER )
3 public class CarrinhoBean {
4 ...
5 }
Atributo Transacional
O EJB Container abre, confirma, aborta ou suspende transaes de acordo com o atributo tran-
sacional de cada mtodo dos Session Beans em modo CMT. O atributo transacional de um mtodo
pode ser definido com um dos seguintes valores: REQUIRED, REQUIRES_NEW, SUPPORTS, MAN-
DATORY, NOT_SUPPORTED e NEVER.
116 www.k19.com.br
117 T RANSAES
Atributo Transacional J existia uma transao aberta? O que o EJB Container faz?
REQUIRED NO Abre uma nova transao
REQUIRED SIM Usa a transao que j estava
aberta
REQUIRES_NEW NO Abre uma nova transao
REQUIRES_NEW SIM Abre uma transao e Sus-
pende a que estava aberta
SUPPORTS NO No faz nada
SUPPORTS SIM Usa a transao que j estava
aberta
MANDATORY NO Lana EJBTransactionRequire-
dException
MANDATORY SIM Usa a transao que j estava
aberta
NOT_SUPPORTED NO No faz nada
NOT_SUPPORTED SIM Suspende a que estava aberta
NEVER NO No faz nada
NEVER SIM Lana EJBException
Quando queremos que todos os mtodos de um Session Bean possuam o mesmo atributo tran-
sacional, devemos anotar a classe com @TransactionAttribute.
1 @Stateful
2 @TransactionManagement ( TransactionManagementType . CONTAINER )
3 @TransactionAttribute ( TransactionAttributeType . REQUIRED )
4 public class CarrinhoBean {
5 ...
6 }
Caso nenhum atributo transacional seja definido explicitamente, o EJB Container utilizar por
padro o REQUIRED.
1 @Stateful
2 public class CarrinhoBean {
3
4 @Resource
5 private SessionContext context ;
6
7 public void adiciona ( String produto ) {
8 if ( produto == null ) {
www.facebook.com/k19treinamentos 117
T RANSAES 118
9 context . setRollbackOnly () ;
10 }
11 ...
12 }
13 }
Por padro, quando um mtodo de um Session Bean lana uma System Exception, o EJB Contai-
ner aborta a transao corrente. Por outro lado, quando uma Application Exception lanada, o EJB
Container no aborta a transao corrente.
1 @ApplicationException
2 public class ValorNegativoException extends RuntimeException {
3
4 }
A mesma anotao pode alterar o comportamento padro para rollback das Application Excep-
tions.
1 @Stateful
118 www.k19.com.br
119 T RANSAES
No modo BMT, devemos injetar um UserTransaction atravs da anotao @Resource. Esse ob-
jeto permite que a aplicao abra, confirme ou aborte transaes.
1 @Stateful
2 @TransactionManagement ( TransactionManagementType . BEAN )
3 public class CarrinhoBean {
4 @Resource
5 private UserTransaction ut ;
6
7 public void adiciona ( Produto p ) {
8 try {
9 ut . begin () ;
10 // IMPLEMENTACAO
11 ut . commit () ;
12 } catch ( ProdutoInvalidoException e ) {
13 ut . rollback () ;
14 } catch ( Exception e ) {
15 e . printStackTrace () ;
16 }
17 }
18 }
O modo BMT permite um controle maior sobre as transaes. Contudo, o modo CMT mais
simples de utilizar e mais fcil de manter.
Exerccios de Fixao
1 Para no confundir, feche o projeto persistenciaWeb. Para isso, clique com o boto direito do
mouse sobre esse projeto e selecione a opo Close Project.
2 Crie um Dynamic Web Project no eclipse chamado transacoesWeb. Voc pode digitar CTRL+3
em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens abaixo.
www.facebook.com/k19treinamentos 119
T RANSAES 120
120 www.k19.com.br
121 T RANSAES
www.facebook.com/k19treinamentos 121
T RANSAES 122
122 www.k19.com.br
123 T RANSAES
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " create " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
www.facebook.com/k19treinamentos 123
T RANSAES 124
124 www.k19.com.br
125 T RANSAES
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Produtos </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Novo Produto </ h1 >
15 <h : form >
16 <h : outputLabel value = " Nome : " / >
17 <h : inputText value = " #{ produtoMB . produto . nome } " / >
18
19 <h : outputLabel value = " Preo : " / >
20 <h : inputText value = " #{ produtoMB . produto . preco } " / >
21
22 <h : commandButton action = " #{ produtoMB . adiciona } " value = " Salvar " / >
23 </ h : form >
24
25 < h1 > Lista de Produtos </ h1 >
26 <h : dataTable value = " #{ produtoMB . produtos } " var = " produto " >
27 <h : column >
28 <h : outputText value = " #{ produto . nome } " / >
29 </ h : column >
30 <h : column >
31 <h : outputText value = " #{ produto . preco } " / >
32 </ h : column >
33 </ h : dataTable >
34 </ h : body >
35 </ html >
10 Adicione o projeto transacoesWeb no glassfish. Clique com o boto direito no glassfish da view
Servers e escolha a opo Add and Remove.
Adicione alguns produtos e observe que produtos com preo negativo no so persistidos devido
www.facebook.com/k19treinamentos 125
T RANSAES 126
ao rollback.
126 www.k19.com.br
CAPTULO
S EGURANA
7
O processo de autenticao consiste na identificao dos usurios atravs de algum tipo de cer-
tificado (usurio e senha). J o processo de autorizao determina o que cada usurio autenticado
pode acessar dentro da aplicao.
Na plataforma Java, esses dois processos so padronizados pela especificao JAAS (Java Authen-
tication and Authorization Service).
Realms
Em um ambiente Java EE, para realizar o processo de autenticao, devemos criar um ou mais
Realms. Um Realm uma base de dados na qual os usurios de uma ou mais aplicaes esto ca-
dastrados.
Exerccios de Fixao
www.facebook.com/k19treinamentos 127
S EGURANA 128
2 Adicione um usurio chamado K19 dentro de um grupo chamado admin com a senha K19. Siga
os passos abaixo:
128 www.k19.com.br
129 S EGURANA
www.facebook.com/k19treinamentos 129
S EGURANA 130
4 Acesse o MySQL Server atravs do MySQL Workbench ou atravs do cliente de linha de comando;
crie tabelas chamadas Usuario, Grupo e Usuario_Grupo na base de dados k22_glassfish.
130 www.k19.com.br
131 S EGURANA
Name: K19-Realm-JDBC
Class Name: com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
JAAS Context: jdbcRealm
JNDI: jdbc/K19
User Table: Usuario
User Name Column: nome
Password Column: senha
Group Table: Usuario_Grupo
www.facebook.com/k19treinamentos 131
S EGURANA 132
A maior parte das configuraes referentes ao processo de autenticao que as aplicaes web
devem realizar so definidas no arquivo web.xml. Contudo, alguns servidores de aplicao exigem
configuraes extras. Veremos no exerccio como configurar uma aplicao web no Glassfish para
realizar o processo de autenticao.
Exerccios de Fixao
7 Para no confundir, feche o projeto transacoesWeb. Para isso, clique com o boto direito do
mouse sobre esse projeto e selecione a opo Close Project.
8 Crie um Dynamic Web Project no eclipse chamado segurancaWeb. Voc pode digitar CTRL+3
em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens abaixo.
132 www.k19.com.br
133 S EGURANA
www.facebook.com/k19treinamentos 133
S EGURANA 134
134 www.k19.com.br
135 S EGURANA
www.facebook.com/k19treinamentos 135
S EGURANA 136
1 ...
2 < security - role - mapping >
3 < role - name > ADMIN </ role - name >
4 < group - name > admin </ group - name >
5 </ security - role - mapping >
6
7 < security - role - mapping >
8 < role - name > USERS </ role - name >
9 < group - name > users </ group - name >
10 </ security - role - mapping >
11 ...
1 ...
2 < welcome - file - list >
3 < welcome - file > index . xhtml </ welcome - file >
4 </ welcome - file - list >
5
6 < login - config >
7 < auth - method > FORM </ auth - method >
8 < realm - name >K19 - Realm </ realm - name >
9 < form - login - config >
10 < form - login - page >/ login . xhtml </ form - login - page >
11 < form - error - page >/ acesso - negado . xhtml </ form - error - page >
12 </ form - login - config >
13 </ login - config >
14
15 < security - constraint >
16 <web - resource - collection >
17 <web - resource - name > resources </ web - resource - name >
18 <url - pattern > /* </ url - pattern >
19 < http - method > GET </ http - method >
20 < http - method > POST </ http - method >
21 </ web - resource - collection >
22 < auth - constraint >
23 < role - name > ADMIN </ role - name >
24 < role - name > USERS </ role - name >
25 </ auth - constraint >
26 </ security - constraint >
27 ...
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
136 www.k19.com.br
137 S EGURANA
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Segurana </ title >
11 </ h : head >
12
13 <h : body >
14 < form method = " post " action = " j_security_check " >
15 Usurio : < input type = " text " name = " j_username " / >
16 Senha : < input type = " password " name = " j_password " / >
17 < input type = " submit " value = " Login " / >
18 </ form >
19 </ h : body >
20 </ html >
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Segurana </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Acesso Negado </ h1 >
15 <h : link outcome = " / login " value = " Tentar novamente " / >
16 </ h : body >
17 </ html >
13 Adicione um arquivo chamado menu.xhtml em uma pasta chamada includes dentro de Web-
Content/WEB-INF no projeto segurancaWeb com seguinte contedo.
1 < ui : composition xmlns = " http :// www . w3 . org /1999/ xhtml "
2 xmlns : ui = " http :// java . sun . com / jsf / facelets "
3 xmlns : h = " http :// java . sun . com / jsf / html "
4 xmlns : f = " http :// java . sun . com / jsf / core " >
5
6 <h : form >
7 <h : panelGrid >
8 <h : commandLink action = " #{ autenticadorMB . sair } " value = " Sair " / >
9 </ h : panelGrid >
10 </ h : form >
11
12 </ ui : composition >
www.facebook.com/k19treinamentos 137
S EGURANA 138
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Segurana </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Autenticado </ h1 >
15 < ui : include src = " / WEB - INF / includes / menu . xhtml " / >
16 </ h : body >
17 </ html >
138 www.k19.com.br
139 S EGURANA
1 ...
2
3 < login - config >
4 < auth - method > FORM </ auth - method >
5 < realm - name >K19 - Realm - JDBC </ realm - name >
6 < form - login - config >
7 < form - login - page >/ login . xhtml </ form - login - page >
8 < form - error - page >/ acesso - negado . xhtml </ form - error - page >
9 </ form - login - config >
10 </ login - config >
11
12 ...
19 Adicione uma pasta chamada META-INF na pasta src do projeto segurancaWeb. Na pasta
META-INF, crie o arquivo persistence.xml.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " none " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
www.facebook.com/k19treinamentos 139
S EGURANA 140
16
17 public void setNome ( String nome ) {
18 this . nome = nome ;
19 }
20
21 @Override
22 public String toString () {
23 return this . nome ;
24 }
25 }
140 www.k19.com.br
141 S EGURANA
www.facebook.com/k19treinamentos 141
S EGURANA 142
15
16 @ManagedBean
17 public class UsuarioMB {
18
19 @EJB
20 private UsuarioRepositorio usuarioRepositorio ;
21
22 @EJB
23 private GrupoRepositorio grupoRepositorio ;
24
25 private Usuario usuario = new Usuario () ;
26
27 private List < String > nomesDosGrupos ;
28
29 private List < Usuario > usuarios ;
30
31 private List < Grupo > grupos ;
32
33 public void adiciona () throws NoSuchAlgorithmException {
34 // Associando os Grupos ao novo Usurio
35 for ( String nomeDoGrupo : this . nomesDosGrupos ) {
36 Grupo g = new Grupo () ;
37 g . setNome ( nomeDoGrupo ) ;
38 this . usuario . getGrupos () . add ( g ) ;
39 }
40
41 // Criptografando a senha do novo Usurio
42 MessageDigest md = MessageDigest . getInstance ( " MD5 " ) ; // or " SHA -1"
43 md . update ( this . usuario . getSenha () . getBytes () ) ;
44 BigInteger hash = new BigInteger (1 , md . digest () ) ;
45 String senhaCriptografada = hash . toString (16) ;
46 while ( senhaCriptografada . length () < 32) { // 40 for SHA -1
47 senhaCriptografada = " 0 " + senhaCriptografada ;
48 }
49 this . usuario . setSenha ( senhaCriptografada ) ;
50
51 // Salvando o usurio
52 this . usuarioRepositorio . adiciona ( this . usuario ) ;
53 this . usuario = new Usuario () ;
54 this . usuarios = null ;
55 }
56
57 public List < Grupo > getGrupos () {
58 if ( this . grupos == null ) {
59 this . grupos = this . grupoRepositorio . buscaTodos () ;
60 }
61
62 return this . grupos ;
63 }
64
65 public List < Usuario > getUsuarios () {
66 if ( this . usuarios == null ) {
67 this . usuarios = this . usuarioRepositorio . buscaTodos () ;
68 }
69
70 return this . usuarios ;
71 }
72
73 public Usuario getUsuario () {
74 return usuario ;
75 }
76
77 public void setUsuario ( Usuario usuario ) {
78 this . usuario = usuario ;
79 }
80
81 public List < String > getNomesDosGrupos () {
82 return nomesDosGrupos ;
83 }
84
142 www.k19.com.br
143 S EGURANA
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Segurana </ title >
11 </ h : head >
12
13 <h : body >
14
15 < ui : include src = " / WEB - INF / includes / menu . xhtml " / >
16
17 < h1 > Novo Usuario </ h1 >
18
19 <h : messages / >
20
21 <h : form >
22 <h : panelGrid columns = " 2 " >
23 <h : outputLabel value = " Nome " / >
24 <h : inputText value = " #{ usuarioMB . usuario . nome } " required = " true " / >
25 <h : outputLabel value = " Senha " / >
26 <h : inputSecret value = " #{ usuarioMB . usuario . senha } " required = " true " / >
27
28 <h : selectManyCheckbox value = " #{ usuarioMB . nomesDosGrupos } "
29 required = " true " >
30 <f : selectItems value = " #{ usuarioMB . grupos } " var = " g "
31 itemLabel = " #{ g . nome } " itemValue = " #{ g . nome } " / >
32 </ h: selectManyCheckbox >
33 </ h : panelGrid >
34
35 <h : commandButton value = " Salvar " action = " #{ usuarioMB . adiciona } " / >
36 </ h : form >
37
38 < hr / >
39
40 <h : dataTable value = " #{ usuarioMB . usuarios } " var = " u " border = " 1 " >
41 <h : column >
42 <f : facet name = " header " > Nome do Usurio </ f : facet >
43 <h : outputText value = " #{ u . nome } " / >
44 </ h : column >
45
46 <h : column >
47 <f : facet name = " header " > Grupos </ f : facet >
48 <h : outputText value = " #{ u . grupos } " / >
49 </ h : column >
50 </ h : dataTable >
51 </ h : body >
52 </ html >
www.facebook.com/k19treinamentos 143
S EGURANA 144
1 < ui : composition xmlns = " http :// www . w3 . org /1999/ xhtml "
2 xmlns : ui = " http :// java . sun . com / jsf / facelets "
3 xmlns : h = " http :// java . sun . com / jsf / html "
4 xmlns : f = " http :// java . sun . com / jsf / core " >
5
6 <h : form >
7 <h : panelGrid >
8 <h : commandLink action = " #{ autenticadorMB . sair } " value = " Sair " / >
9 <h : commandLink action = " / usuarios " value = " Usurios " / >
10 </ h : panelGrid >
11 </ h : form >
12 </ ui : composition >
Podemos limitar o acesso dos usurios aos mtodos de um Session Bean. Por exemplo, pos-
svel declarar que um determinado mtodo de um Session Bean s pode ser chamado por usurios
administradores ou moderadores.
@RolesAllowed
Restries de acesso podem ser definidas pela anotao @RolesAllowed que pode ser aplicada
na classe ou nos mtodos de um Session Bean. Se aplicada na classe valer para todos os mtodos.
Se aplicada ao mesmo tempo na classe e em algum mtodo, valer as restries definidas no mtodo.
144 www.k19.com.br
145 S EGURANA
@PermitAll
Podemos utilizar a anotao @PermitAll para permitir que qualquer tipo de usurio tenha acesso.
Para conseguir o mesmo efeito com a anotao @RolesAllowed, teramos que listar todos os Roles.
Alm disso, caso um Role fosse criado ou destrudo, alteraes seriam necessrias.
1 @PermitAll
2 public void adiciona ( Produto produto ) {
3 this . manager . persist ( produto ) ;
4 }
1 @PermitAll
2 @Stateful
3 class CarrinhoBean {
4 ...
5 }
@DenyAll
O funcionamento da anotao @DenyAll exatamente o oposto da @PermitAll. Podemos uti-
lizar a anotao @DenyAll em aplicaes que so implantadas em ambientes diferentes. Sendo que
em determinados ambientes certas funcionalidades devem ser desabilitadas.
1 @DenyAll
2 public void adiciona ( Produto produto ) {
3 this . manager . persist ( produto ) ;
4 }
1 @DenyAll
2 @Stateful
3 class CarrinhoBean {
4 ...
5 }
@RunAs
Eventualmente, um Session Bean chama outro Session Bean. Suponha, que os mtodos do pri-
meiro possam ser executados por usurios moderadores e os mtodos do segundo por administra-
dores. Para que o primeiro Session Bean possa chamar o Segundo, temos que definir o papel de
administrador para o primeiro Session Bean atravs da anotao @RunAs.
1 @Stateless
2 @RunAs ( " administrador " )
3 class MensagemRepositorio {
4
5 @PersistenceContext
6 private EntityManager manager ;
7
8 @EJB
9 private TopicoRepositorio topicoRepositorio ;
10
11 @RolesAllowed ({ " moderador " })
12 public void remove ( Long id ) {
13 Mensagem m = this . manager . find ( Mensagem . class , id ) ;
14 this . manager . remove ( m ) ;
www.facebook.com/k19treinamentos 145
S EGURANA 146
15
16 Topico t = m . getTopico () ;
17
18 if ( t . getMensagens () . size () == 1) {
19 this . topicoRepositorio . remove ( t ) ;
20 }
21 }
22 }
Exerccios de Fixao
TarefasBean.
146 www.k19.com.br
147 S EGURANA
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Segurana </ title >
11 </ h : head >
12
13 <h : body >
14 < ui : include src = " / WEB - INF / includes / menu . xhtml " / >
15 < h1 > Nova Tarefa </ h1 >
16 <h : form >
17 <h : outputLabel value = " Tarefa : " / >
18 <h : inputText value = " #{ tarefasMB . tarefa } " / >
19
20 <h : commandButton action = " #{ tarefasMB . adiciona } " value = " Salvar " / >
21
22 < h1 > Lista de Tarefas </ h1 >
23 <h : dataTable value = " #{ tarefasMB . tarefas } " var = " tarefa " >
24 <h : column >
25 <h : outputText value = " #{ tarefa } " / >
26 </ h: column >
27 <h : column >
28 <h : commandLink action = " #{ tarefasMB . remove ( tarefa ) } " > remove </ h : commandLink >
29 </ h: column >
30 </ h : dataTable >
31 </ h : form >
32 </ h : body >
33 </ html >
www.facebook.com/k19treinamentos 147
S EGURANA 148
1 < ui : composition xmlns = " http :// www . w3 . org /1999/ xhtml "
2 xmlns : ui = " http :// java . sun . com / jsf / facelets "
3 xmlns : h = " http :// java . sun . com / jsf / html "
4 xmlns : f = " http :// java . sun . com / jsf / core " >
5
6 <h : form >
7 <h : panelGrid >
8 <h : commandLink action = " #{ autenticadorMB . sair } " value = " Sair " / >
9 <h : commandLink action = " / usuarios " value = " Usurios " / >
10 <h : commandLink action = " / tarefas " value = " Tarefas " / >
11 </ h : panelGrid >
12 </ h : form >
13 </ ui : composition >
148 www.k19.com.br
CAPTULO
I NTERCEPTADORES
8
Uma aplicao EJB pode definir, atravs de mtodos de callback, lgicas a serem executadas pelo
EJB Container quando uma instncia de um Session Bean muda de estado.
comum utilizar interceptadores para tarefas que no esto diretamente relacionadas s regras
de negcio implementadas nos Session Beans. Por exemplo, podemos implementar logging ou con-
trole de acesso com interceptadores.
Interceptor Methods
1 @AroundInvoke
2 public Object interceptador ( InvocationContext ic ) throws Exception {
3 // IDA
4 System . out . println ( " ANTES DO MTODO DE NEGCIO " ) ;
5
6 // CHAMANDO O MTODO DE NEGCIO E PEGANDO O SEU RETORNO
7 Object retornoDoMetodoDeNegocio = ic . proceed () ;
www.facebook.com/k19treinamentos 149
I NTERCEPTADORES 150
8
9 // VOLTA
10 System . out . println ( " DEPOIS DO MTODO DE NEGCIO " ) ;
11 return retornoDoMetodoDeNegocio ;
12 }
Internal Interceptors
1 @Stateless
2 class CalculadoraBean {
3
4 // MTODOS DE NEGCIO
5
6 // MTODOS DE CALLBACK
7
8 // MTODO INTERCEPTADOR
9 @AroundInvoke
10 public Object interceptador ( InvocationContext ic ) throws Exception {
11 // IDA
12 System . out . println ( " ANTES DO MTODO DE NEGCIO " ) ;
13
14 // CHAMANDO O MTODO DE NEGCIO E PEGANDO O SEU RETORNO
15 Object retornoDoMetodoDeNegocio = ic . proceed () ;
16
17 // VOLTA
18 System . out . println ( " DEPOIS DO MTODO DE NEGCIO " ) ;
19 return retornoDoMetodoDeNegocio ;
20 }
21 }
External Interceptors
1 class LoggingInterceptor {
2
3 @AroundInvoke
4 public Object interceptador ( InvocationContext ic ) throws Exception {
5 // IDA
6 System . out . println ( " ANTES DO MTODO DE NEGCIO " ) ;
7
8 // CHAMANDO O MTODO DE NEGCIO E PEGANDO O SEU RETORNO
9 Object retornoDoMetodoDeNegocio = ic . proceed () ;
10
11 // VOLTA
12 System . out . println ( " DEPOIS DO MTODO DE NEGCIO " ) ;
13 return retornoDoMetodoDeNegocio ;
14 }
15 }
150 www.k19.com.br
151 I NTERCEPTADORES
Method-Level Interceptors
Interceptadores externos podem ser associados a mtodos de negcio atravs da anotao @In-
terceptors.
1 @Stateless
2 class CalculadoraBean {
3
4 @Interceptors ({ LoggingInterceptor . class })
5 public double soma ( double a , double b ) {
6 return a + b ;
7 }
8 }
Vrios interceptadores externos podem ser associados a um mtodo de negcio atravs da ano-
tao @Interceptors.
1 @Stateless
2 class CalculadoraBean {
3
4 @Interceptors ({ LoggingInterceptor . class , SegurancaInterceptor . class })
5 public double soma ( double a , double b ) {
6 return a + b ;
7 }
8 }
Class-Level Interceptors
Interceptadores externos tambm podem ser associados a Session Beans atravs da anotao
@Interceptors. Quando associado a um Session Bean, um interceptador externo ser aplicado a
todos os mtodos de negcio desse Session Bean.
1 @Stateless
2 @Interceptors ({ LoggingInterceptor . class })
3 class CalculadoraBean {
4
5 public double soma ( double a , double b ) {
6 return a + b ;
7 }
8 }
Vrios interceptadores externos podem ser associados a um Session Bean atravs da anotao
@Interceptors.
1 @Stateless
2 @Interceptors ({ LoggingInterceptor . class , SegurancaInterceptor . class })
3 class CalculadoraBean {
4
5 public double soma ( double a , double b ) {
6 return a + b ;
7 }
8 }
www.facebook.com/k19treinamentos 151
I NTERCEPTADORES 152
Default Interceptors
Interceptadores externos tambm podem ser associados a mtodos de negcio atravs de confi-
guraes adicionadas no arquivo de configurao do EJB, o ejb-jar.xml. Esse arquivo deve ser colo-
cado em uma pasta chamada META-INF dentro do mdulo EJB da aplicao.
Por exemplo, suponha que o interceptador externo definido pela classe LoggingInterceptor
tenha que ser aplicado em todos os mtodos de negcio de todos os Session Beans.
Excluindo Interceptadores
Podemos excluir os Default Interceptors e os Class-Level Interceptors atravs das anotaes @Ex-
cludeDefaultInterceptors e @ExcludeClassInterceptors respectivamente.
1 @Stateless
2 @ExcludeDefaultInterceptors
3 class CalculadoraBean {
4
5 public double soma ( double a , double b ) {
6 return a + b ;
7 }
8 }
1 @Stateless
2 @Interceptors ({ LoggingInterceptor . class , SegurancaInterceptor . class })
3 class CalculadoraBean {
4
5 @ExcludeClassInterceptors
6 public double soma ( double a , double b ) {
7 return a + b ;
8 }
9 }
Invocation Context
152 www.k19.com.br
153 I NTERCEPTADORES
Um mtodo interceptador recebe um Invocation Context como parmetro. Atravs dos Invoca-
tion Context, os mtodos interceptadores podem acessar a instncia do Session Bean que ser utili-
zada para atender a chamada, descobrir qual mtodo de negcio ser executado, quais parmetros
foram passados e at mesmo trocar os parmetros antes de chegar no mtodo de negcio. Veja os
mtodos disponveis nessa interface.
1. Default Interceptors
2. Class-Level Interceptors
3. Method-Level Interceptors
4. Internal Interceptors
Quando dois ou mais Default Interceptors esto associados a um mtodo de negcio, eles sero
executados na ordem em que foram definidos no ejb-jar.xml.
Quando dois ou mais Class-Level Interceptors esto associados a um mtodo de negcio, eles
sero executados na ordem em que foram declarados na anotao @Interceptors.
Quando dois ou mais Method-Level Interceptors esto associados a um mtodo de negcio, eles
sero executados na ordem em que foram declarados na anotao @Interceptors.
Exerccios de Fixao
1 Para no confundir, feche o projeto segurancaWeb. Para isso, clique com o boto direito do
mouse sobre esse projeto e selecione a opo Close Project.
2 Crie um Dynamic Web Project no eclipse chamado interceptadoresWeb. Voc pode digitar
CTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens
abaixo.
www.facebook.com/k19treinamentos 153
I NTERCEPTADORES 154
154 www.k19.com.br
155 I NTERCEPTADORES
www.facebook.com/k19treinamentos 155
I NTERCEPTADORES 156
156 www.k19.com.br
157 I NTERCEPTADORES
3 Adicione uma pasta chamada META-INF na pasta src do projeto interceptadoresWeb. Na pasta
META-INF, crie o arquivo persistence.xml.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " create " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
www.facebook.com/k19treinamentos 157
I NTERCEPTADORES 158
15 @PersistenceContext
16 private EntityManager manager ;
17
18 public void adiciona ( Mensagem mensagem ) {
19 this . manager . persist ( mensagem ) ;
20 }
21
22 public List < Mensagem > getMensagens () {
23 TypedQuery < Mensagem > query = this . manager . createQuery (
24 " select x from Mensagem x " , Mensagem . class ) ;
25
26 return query . getResultList () ;
27 }
28 }
158 www.k19.com.br
159 I NTERCEPTADORES
7 Crie uma tela para cadastrar mensagens. Adicione na pasta WebContent do projeto intercepta-
doresWeb um arquivo chamado mensagens.xhtml com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Mensagens </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Nova Mensagem </ h1 >
15 <h : form >
16 <h : outputLabel value = " Mensagem : " / >
17 <h : inputTextarea value = " #{ mensagemMB . mensagem . texto } " / >
18
19 <h : commandButton action = " #{ mensagemMB . adiciona } " value = " Salvar " / >
20 </ h : form >
21
22 < h1 > Lista de Mensagens </ h1 >
23 <h : dataTable value = " #{ mensagemMB . mensagens } " var = " mensagem " >
24 <h : column >
25 <h : outputText value = " #{ mensagem . id } " / >
26 </ h : column >
27 <h : column >
28 <h : outputText value = " #{ mensagem . texto } " / >
29 </ h : column >
30 </ h : dataTable >
31 </ h : body >
32 </ html >
www.facebook.com/k19treinamentos 159
I NTERCEPTADORES 160
guinte contedo.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 <ejb - jar version = " 3.1 " xmlns = " http :// java . sun . com / xml / ns / javaee "
3 xmlns : xsi = " http :// www . w3 . org /2001/ XMLSchema - instance "
4 xsi : schemaLocation = " http :// java . sun . com / xml / ns / javaee http :// java . sun . com / xml / ns / -
javaee / ejb - jar_3_1 . xsd " >
5
6 < interceptors >
7 < interceptor >
8 < interceptor - class >
9 br . com . k19 . interceptadores . LoggingInterceptor
10 </ interceptor - class >
11 </ interceptor >
12 </ interceptors >
13
14 < assembly - descriptor >
15 < interceptor - binding >
16 <ejb - name >* </ ejb - name >
17 < interceptor - class >
18 br . com . k19 . interceptadores . LoggingInterceptor
19 </ interceptor - class >
20 </ interceptor - binding >
21 </ assembly - descriptor >
22 </ ejb - jar >
fly. Certifique-se que o Glassfish e o JBoss estejam parados. Inicie o Wildfly e teste a aplicao aces-
sando a url http://localhost:8080/interceptadoresWeb/mensagens.xhtml. Verifique o log do
Wildfly para observar as mensagens do interceptador.
11 Implemente um interceptador externo para eliminar palavras proibidas das mensagens adicio-
nas o logging da aplicao. Adicione no pacote br.com.k19.interceptadores do projeto intercepta-
doresWeb a seguinte classe.
160 www.k19.com.br
161 I NTERCEPTADORES
1 ...
2 @Interceptors ({ CensuraInterceptor . class })
3 public void adiciona ( Mensagem mensagem ) {
4 this . manager . persist ( mensagem ) ;
5 }
6 ...
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " none " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
www.facebook.com/k19treinamentos 161
I NTERCEPTADORES 162
162 www.k19.com.br
CAPTULO
S CHEDULING
9
Algumas aplicaes possuem a necessidade de agendar tarefas para serem executadas periodi-
camente ou uma nica vez aps um determinado tempo. Por exemplo, suponha uma aplicao que
calcula o salrio dos funcionrios de uma empresa de acordo com as horas registradas. Possivel-
mente, esse clculo deve ser realizado uma vez por ms.
Outro exemplo, suponha que uma empresa vende seus produtos atravs da internet. As entre-
gas s so realizadas aps a confirmao dos pagamentos. Quando um cliente realiza um pedido,
o sistema da empresa deve esperar alguns dias para verificar se o pagamento correspondente foi
realizado para que a entrega possa ser liberada.
Timers
Para agendar tarefas, podemos criar alarmes (timers) atravs do TimerService. Por exemplo,
suponha que seja necessrio executar uma tarefa uma nica vez depois de 30 minutos.
O primeiro parmentro do mtodo createTimer() quantidade de tempo que ele deve esperar
para disparar e o segundo uma informao que podemos associar ao timer. Tambm, podemos
criar um alarme peridico que dispara a cada 30 minutos atravs do TimerService utilizando a
sobrecarga do mtodo createTimer().
1 @Stateless
2 class FolhaDePagamentoBean {
3
4 @Resource
5 private TimerService timerService ;
6
7 ...
8 }
Os alarmes no podem ser criados para Stateful Session Beans. Essa funcionalidade deve ser
adicionada em verses futuras da especificao Enterprise Java Beans.
Mtodos de Timeout
www.facebook.com/k19treinamentos 163
S CHEDULING 164
Quando um alarme (timer) dispara, o EJB Container executa um mtodo de timeout no Bean
que criou o alarme. Para definir um mtodo de timeout devemos utilizar a anotao @Timeout.
1 @Stateless
2 class PedidoBean {
3
4 @Resource
5 private TimerService timerService ;
6
7 public void registraPedido ( Pedido pedido ) {
8 this . timerService . createTimer (5 * 24 * 60 * 60 * 1000 , pedido ) ;
9 }
10
11 @Timeout
12 public void verificaPagamento ( Timer timer ) {
13 Pedido pedido = ( Pedido ) timer . getInfo () ;
14 // verifica o pagamento do pedido
15 }
16 }
Timers Automticos
Na verso 3.1 da especificao Enterprise Java Beans, os alarmes podem ser criados e automati-
camente associados a mtodos de timeout atravs da anotao @Schedule.
1 @Stateless
2 class FolhaDePagamentoBean {
3
4 @Schedule ( dayOfMonth = " 1 " )
5 public void calculaSalarios () {
6 // implementacao
7 }
8 }
Atributo Valores
second [0 . . . 59]
minute [0 . . . 59]
hour [0 . . . 23]
dayOfMonth [1 . . . 31]
[-7 . . . -1] quantidade de dias para o trmino do ms.
[1st, 2nd, 3rd, 4th, 5th, Last ]
[Sun, Mon, Tue, Wed, Thu, Fri, Sat]
month [1 . . . 12]
[Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec ]
dayOfWeek [0 . . . 7]
[Sun, Mon, Tue, Wed, Thu, Fri, Sat]
year ano com 4 dgitos
164 www.k19.com.br
165 S CHEDULING
1 @Schedule ( second = " * " , minute = " * " , hour = " * " )
Exerccios de Fixao
1 Para no confunfir, feche os projetos interceptadoresWeb. Para isso, clique com o boto direito
do mouse sobre esse projeto e selecione a opo Close Project.
2 Crie um Dynamic Web Project no eclipse chamado schedulingWeb. Voc pode digitar CTRL+3
em seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens abaixo.
www.facebook.com/k19treinamentos 165
S CHEDULING 166
166 www.k19.com.br
167 S CHEDULING
www.facebook.com/k19treinamentos 167
S CHEDULING 168
168 www.k19.com.br
169 S CHEDULING
3 Adicione uma pasta chamada META-INF na pasta src do projeto schedulingWeb. Na pasta
META-INF, crie o arquivo persistence.xml.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " create " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
www.facebook.com/k19treinamentos 169
S CHEDULING 170
170 www.k19.com.br
171 S CHEDULING
7 Crie uma tela para cadastrar produtos. Adicione na pasta WebContent do projeto schedu-
lingWeb um arquivo chamado produtos.xhtml com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Produtos </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Novo Produto </ h1 >
15 <h : form >
16 <h : outputLabel value = " Nome : " / >
17 <h : inputText value = " #{ produtoMB . produto . nome } " / >
18
19 <h : outputLabel value = " Preo : " / >
20 <h : inputText value = " #{ produtoMB . produto . preco } " / >
21
22 <h : commandButton action = " #{ produtoMB . adiciona } " value = " Salvar " / >
23 </ h : form >
24
25 < h1 > Lista de Produtos </ h1 >
26 <h : dataTable value = " #{ produtoMB . produtos } " var = " produto " >
27 <h : column >
28 <h : outputText value = " #{ produto . nome } " / >
29 </ h : column >
30 <h : column >
31 <h : outputText value = " #{ produto . preco } " / >
32 </ h : column >
33 </ h : dataTable >
34 </ h : body >
35 </ html >
www.facebook.com/k19treinamentos 171
S CHEDULING 172
15 @EJB
16 private ProdutoRepositorio repositorio ;
17
18 private Produto produtoDestaque ;
19
20 @Schedule ( second = " */5 " , minute = " * " , hour = " * " , persistent = false )
21 public void trocaProdutoDestaque () {
22 Random gerador = new Random () ;
23 List < Produto > produtos = this . repositorio . getProdutos () ;
24 int i = gerador . nextInt ( produtos . size () ) ;
25 this . produtoDestaque = produtos . get ( i ) ;
26 }
27
28 public void setProdutoDestaque ( Produto produtoDestaque ) {
29 this . produtoDestaque = produtoDestaque ;
30 }
31
32 public Produto getProdutoDestaque () {
33 return produtoDestaque ;
34 }
35 }
1 ...
2 @EJB
3 private ProdutoDestaqueBean produtoDestaqueBean ;
4 ...
1 ...
2 public Produto getProdutoDestaque () {
3 return this . produtoDestaqueBean . getProdutoDestaque () ;
4 }
5 ...
1 ...
2 < h1 > Produto Destaque </ h1 >
3
4 <h : outputLabel value = " Nome : " / >
5 <h : outputText value = " #{ produtoMB . produtoDestaque . nome } " / >
6 <h : outputLabel value = " Preo : " / >
7 <h : outputText value = " #{ produtoMB . produtoDestaque . preco } " / >
8 ...
172 www.k19.com.br
173 S CHEDULING
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " none " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
www.facebook.com/k19treinamentos 173
S CHEDULING 174
174 www.k19.com.br
CAPTULO
C ONTEXTS AND D EPENDENCY
I NJECTION - CDI
10
Aplicaes corporativas costumam utilizar tanto o container WEB para a camada de apresen-
tao quanto o container EJB para a camada de negcio. A integrao entre o container WEB e o
container EJB pode ser mais facilmente realizada atravs dos recursos definidos pela especificao
Contexts and Dependency Injection - CDI.
Dos recursos existentes na arquitetura CDI, podemos destacar o mecanismo de Injeo de De-
pendncia e o gerenciamento do ciclo de vida dos objetos atravs de contextos. De acordo com a
especificao CDI, os seguintes tipos de objetos possuem suporte a esses dois recursos:
Managed Beans
Session Beans
Resources (Java EE resources, Persistence Contexts, Persistence Units, Remote EJBs e Web Ser-
vices)
Managed Beans
Na arquitetura Java EE, os Managed Beans so objetos gerenciados pelo container Java EE. O
container deve oferecer um pequeno conjunto de servios fundamentais aos Managed Beans.
A especificao CDI estende a definio de Managed Beans Na arquitetura CDI, os Managed Be-
ans so definidos por classes que devem respeitar certas restries. Na seo 3.1.1 da especificao
CDI so definidas essas restries.
www.facebook.com/k19treinamentos 175
C ONTEXTS AND D EPENDENCY I NJECTION - CDI 176
As classes que se encaixam nessas restries atuam como fonte de objetos que sero administra-
dos pelo container CDI e podero ser injetados em outros objetos.
Os Producer Methods so apenas mtodos que produzem objetos que sero administrados pelo
container CDI e injetados em outros objetos. Os Producer Methods devem ser anotados com @Pro-
duces.
1 @Produces
2 public List < Produto > listaProdutos () {
3 // implementacao
4 }
Atributos tambm podem ser utilizados como fonte de objetos para o container Java EE. Os Pro-
ducer Fields devem ser anotados com @Produces.
1 @Produces
2 public List < Produto > produtos ;
EL Names
Na arquitetura CDI, pginas JSP ou JSF podem acessar objetos atravs de EL. Somente objetos
com um EL Name podem ser acessados por pginas JSP ou JSF. A princpio, os seguintes tipos de
objetos podem possuir um EL Name:
Managed Beans
176 www.k19.com.br
177 C ONTEXTS AND D EPENDENCY I NJECTION - CDI
Session Beans
Devemos aplicar a anotao @Named aos objetos que devem possuir um EL Name. Utilizando
essa anotao, automaticamente, os objetos recebero um EL Name que determinado de acordo
com o tipo de objeto.
1 @Named
2 @Stateless // Session Bean - EL Name : geradorDeApostas
3 public class GeradorDeApostas {
4 // implementacao
5 }
1 @Named
2 @Produces // Producer Method - EL Name : listaProdutos
3 public List < Produto > listaProdutos () {
4 // implementacao
5 }
6
7 @Named
8 @Produces // Producer Method - EL Name : produtos
9 public List < Produto > getProdutos () {
10 // implementacao
11 }
1 @Named
2 @Produces // Producer Field - EL Name : produtos
3 public List < Produto > produtos ;
beans.xml
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
www.facebook.com/k19treinamentos 177
C ONTEXTS AND D EPENDENCY I NJECTION - CDI 178
2 < beans xmlns = " http: // java . sun . com / xml / ns / javaee "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = "
5 http: // java . sun . com / xml / ns / javaee
6 http: // java . sun . com / xml / ns / javaee / beans_1_0 . xsd " >
7 </ beans >
Exerccios de Fixao
1 Para no confundir, feche o projeto schedulingWeb. Para isso, clique com o boto direito do
mouse sobre esse projeto e selecione a opo Close Project.
2 Crie um Dynamic Web Project no eclipse chamado cdiWeb. Voc pode digitar CTRL+3 em
seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens abaixo.
178 www.k19.com.br
179 C ONTEXTS AND D EPENDENCY I NJECTION - CDI
www.facebook.com/k19treinamentos 179
C ONTEXTS AND D EPENDENCY I NJECTION - CDI 180
180 www.k19.com.br
181 C ONTEXTS AND D EPENDENCY I NJECTION - CDI
www.facebook.com/k19treinamentos 181
C ONTEXTS AND D EPENDENCY I NJECTION - CDI 182
4 Crie uma tela para utilizar o lanador de moedas. Adicione na pasta WebContent do projeto
cdiWeb um arquivo chamado moeda.xhtml com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Moeda </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Moeda </ h1 >
15 <h : form >
16 <h : commandButton action = " #{ lancadorDeMoedaBean . lanca } " value = " Jogar " / >
17 </ h : form >
18 < h2 > Resultado : <h : outputText value = " #{ lancadorDeMoedaBean . resultado } " / > </ h2 >
19 </ h : body >
20 </ html >
7 Crie uma tela para utilizar o gerador de nmeros. Adicione na pasta WebContent do projeto
cdiWeb um arquivo chamado numeros.xhtml com o seguinte contedo.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
182 www.k19.com.br
183 C ONTEXTS AND D EPENDENCY I NJECTION - CDI
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Nmeros </ title >
11 </ h : head >
12
13 <h : body >
14 < h1 > Nmeros </ h1 >
15
16 <h : dataTable value = " #{ numeros } " var = " numero " >
17 <h : column >
18 <h : outputText value = " #{ numero } " / >
19 </ h : column >
20 </ h : dataTable >
21
22 </ h : body >
23 </ html >
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < beans xmlns = " http: // java . sun . com / xml / ns / javaee "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = "
5 http: // java . sun . com / xml / ns / javaee
6 http: // java . sun . com / xml / ns / javaee / beans_1_0 . xsd " >
7 </ beans >
Escopos e Contextos
Request Context: Quando se trata de aplicaes Java WEB, para cada requisio HTTP um novo
Request Context criado pelo container CDI e destrudo no final do processamento da mesma
requisio.
Mltiplos Request Contexts podem existir simultaneamente.
Session Context: Um Session Context est sempre associado a uma HTTP Session. Quando uma
HTTP Session criada pelo container WEB, o container CDI cria um Session Context associado
a essa HTTP Session. Quando uma HTTP Session destruda pelo container WEB, o container
CDI tambm destri o Session Context correspondente.
www.facebook.com/k19treinamentos 183
C ONTEXTS AND D EPENDENCY I NJECTION - CDI 184
Application Context: O container CDI cria um Application Context quando a aplicao iniciali-
zada e o destri quando a aplicao finalizada.
Todo objeto administrado pelo container CDI possui um escopo. O escopo de um objeto define
em qual contexto ele ser armazenado quando criado pelo container CDI. A especificao CDI define
cinco escopos padres: Request, Session, Application, Conversation e Dependent.
Um objeto com escopo Dependent pertence a outro objeto. O objeto dependente armazenado
indiretamente em algum contexto de acordo com o escopo do objeto a qual ele pertence.
1 @RequestScoped
2 public class GeradorDeApostas {
3 // implementacao
4 }
1 @Produces
2 @SessionScoped
3 public List < Produto > listaProdutos () {
4 // implementacao
5 }
Injection Points
Quando um objeto criado pelo container CDI, todas as dependncias so injetados pelo con-
tainer nesse objeto. As dependncias so outros objetos pertencentes ao mesmo contexto do objeto
que est sendo criado. Se alguma dependncia no estiver criada o container se encarrega de cri-la
antes.
184 www.k19.com.br
185 C ONTEXTS AND D EPENDENCY I NJECTION - CDI
Bean Constructors
As dependncias de um objeto podem ser definidas atravs de construtores com a anotao @In-
ject.
Field
As dependncias de um objeto podem ser definidas atravs de atributos com a anotao @Inject.
Initializer methods
As dependncias de um objeto podem ser definidas atravs de mtodos inicializadores com a
anotao @Inject.
Exerccios de Fixao
10 Altere o mtodo getNumeros() da classe GeradorDeNumeros do projeto cdiWeb para que ele
adicione uma mensagem no console toda vez que for chamado.
1 ...
2 @Named
3 @Produces
4 public List < Double > getNumeros () {
5 System . out . println ( " GERANDO NMEROS " ) ;
6 List < Double > numeros = new ArrayList < Double >() ;
7 for ( int i = 0; i < 5; i ++) {
8 numeros . add ( Math . random () ) ;
www.facebook.com/k19treinamentos 185
C ONTEXTS AND D EPENDENCY I NJECTION - CDI 186
9 }
10 return numeros ;
11 }
12 . . .
12 Para evitar que o mtodo getNumeros seja chamado mais do que uma vez por requisio HTTP,
1 ...
2 @Named
3 @Produces
4 @RequestScoped
5 public List < Double > getNumeros () {
6 System . out . println ( " GERANDO NMEROS " ) ;
7 List < Double > numeros = new ArrayList < Double >() ;
8 for ( int i = 0; i < 5; i ++) {
9 numeros . add ( Math . random () ) ;
10 }
11 return numeros ;
12 }
13 ...
186 www.k19.com.br
APNDICE
P ROJETO
A
Neste captulo, implementaremos um pequeno projeto para praticar os conceitos discutidos nos
captulos anteriores. Criaremos um sistema simples de cadastro de bugs.
Exerccios de Fixao
1 Crie um Dynamic Web Project no eclipse chamado bugWeb. Voc pode digitar CTRL+3 em
seguida new Dynamic Web Project e ENTER. Depois, siga exatamente as imagens abaixo.
www.facebook.com/k19treinamentos 187
P ROJETO 188
188 www.k19.com.br
189 P ROJETO
www.facebook.com/k19treinamentos 189
P ROJETO 190
2 Adicione uma pasta chamada META-INF na pasta src do projeto bugWeb. Na pasta META-INF,
crie o arquivo persistence.xml.
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < persistence xmlns = " http: // xmlns . jcp . org / xml / ns / persistence "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = " http: // xmlns . jcp . org / xml / ns / persistence
5 http: // xmlns . jcp . org / xml / ns / persistence / persistence_2_1 . xsd "
6 version = " 2.1 " >
7
8 < persistence - unit name = " K19 " transaction - type = " JTA " >
9 <jta - data - source > jdbc / K19 </ jta - data - source >
10
11 < properties >
12 < property
13 name = " javax . persistence . schema - generation . database . action "
14 value = " create " / >
15 </ properties >
16 </ persistence - unit >
17 </ persistence >
1 <? xml version = " 1.0 " encoding = " UTF -8 " ? >
2 < beans xmlns = " http: // java . sun . com / xml / ns / javaee "
3 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance "
4 xsi:schemaLocation = "
190 www.k19.com.br
191 P ROJETO
4 Configure a aplicao bugWeb para que ele utilize o Realm K19-Realm criado no captulo 7,
adicionando no arquivo web.xml do projeto bugWeb as configuraes necessrias.
1 ...
2 < login - config >
3 < realm - name >K19 - Realm </ realm - name >
4 </ login - config >
5 ...
1 ...
2 < security - role - mapping >
3 < role - name > ADMIN </ role - name >
4 < group - name > admin </ group - name >
5 </ security - role - mapping >
6
7 < security - role - mapping >
8 < role - name > USERS </ role - name >
9 < group - name > users </ group - name >
10 </ security - role - mapping >
11 ...
www.facebook.com/k19treinamentos 191
P ROJETO 192
192 www.k19.com.br
193 P ROJETO
www.facebook.com/k19treinamentos 193
P ROJETO 194
194 www.k19.com.br
195 P ROJETO
www.facebook.com/k19treinamentos 195
P ROJETO 196
69 }
70 }
196 www.k19.com.br
197 P ROJETO
17 @Override
18 public void doFilter ( ServletRequest request , ServletResponse response ,
19 FilterChain chain ) throws IOException , ServletException {
20 HttpServletRequest req = ( HttpServletRequest ) request ;
21
22 if ( req . getRemoteUser () == null && ! req . getRequestURI () . endsWith ( req . -
getContextPath () + " / login . xhtml " ) ) {
23 HttpServletResponse res = ( HttpServletResponse ) response ;
24 res . sendRedirect ( req . getContextPath () + " / login . xhtml " ) ;
25 } else {
26
27 chain . doFilter ( request , response ) ;
28 }
29 }
30
31 @Override
32 public void init ( FilterConfig filterConfig ) throws ServletException {
33 }
34
35 @Override
36 public void destroy () {
37 }
38 }
12 Crie um menu para as telas da aplicao bugWeb. Adicione um arquivo chamado menu.xhtml
na pasta WebContent do projeto bugWeb.
1 < ui : composition xmlns = " http :// www . w3 . org /1999/ xhtml "
2 xmlns : ui = " http :// java . sun . com / jsf / facelets "
3 xmlns : h = " http :// java . sun . com / jsf / html "
4 xmlns : f = " http :// java . sun . com / jsf / core " >
5
6 <h : form >
7 <h : panelGrid >
8 <h : commandLink action = " #{ authenticatorMB . logout } " > logout </ h : commandLink >
9
10 <h : outputLink value = " #{ request . contextPath }/ projects . xhtml " > Projects </ h : -
outputLink >
11
12 <h : outputLink value = " #{ request . contextPath }/ bugs . xhtml " > Bugs </ h : outputLink >
13 </ h : panelGrid >
14 </ h : form >
15 </ ui : composition >
13 Crie um tela de login na aplicao bugWeb. Adicione um arquivo chamado login.xhtml na pasta
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Login </ title >
11 </ h : head >
12
www.facebook.com/k19treinamentos 197
P ROJETO 198
14 Crie uma tela para administrar os projetos. Adicione um arquivo chamado projects.xhtml na
pasta WebContent do projeto bugWeb.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Projects </ title >
11 </ h : head >
12
13 <h : body >
14 < ui : include src = " / menu . xhtml " / >
15
16 < hr / >
17
18 < h1 > New Project </ h1 >
19 <h : form >
20 <h : panelGrid >
21 <h : inputHidden value = " #{ projectMB . project . id } " / >
22
23 <h : outputLabel value = " Name : " / >
24 <h : inputText value = " #{ projectMB . project . name } " / >
25
26 <h : outputLabel value = " Description : " / >
27 <h : inputTextarea value = " #{ projectMB . project . description } " / >
28
29 <h : commandButton action = " #{ projectMB . save } " value = " Save " / >
30 </ h : panelGrid >
31 </ h : form >
32
33 < hr / >
34
35 < h1 > Project List </ h1 >
36 <h : dataTable value = " #{ projectMB . projects } " var = " project "
37 rendered = " #{ not empty projectMB . projects } " border = " 1 " >
38 <h : column >
39 <f : facet name = " header " > Id </ f : facet >
40 #{ project . id }
41 </ h : column >
42
43 <h : column >
44 <f : facet name = " header " > Name </ f : facet >
45 #{ project . name }
46 </ h : column >
198 www.k19.com.br
199 P ROJETO
47
48 <h : column >
49 <f : facet name = " header " > Description </ f : facet >
50 #{ project . description }
51 </ h : column >
52
53 <h : column >
54 <f : facet name = " header " > Delete </ f : facet >
55 <h : form >
56 <h : commandLink action = " #{ projectMB . delete ( project . id ) } " > delete </ h : -
commandLink >
57 </ h: form >
58 </ h : column >
59 <h : column >
60 <f : facet name = " header " > Edit </ f : facet >
61 <h : form >
62 <h : commandLink action = " #{ projectMB . prepareEdit ( project . id ) } " > edit </ h : -
commandLink >
63 </ h: form >
64 </ h : column >
65 </ h : dataTable >
66 </ h : body >
67 </ html >
15 Crie uma tela para administrar os bugs. Adicione um arquivo chamado bugs.xhtml na pasta
WebContent do projeto bugWeb.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Bugs </ title >
11 </ h : head >
12
13 <h : body >
14 < ui : include src = " / menu . xhtml " / >
15
16 < hr / >
17
18 < h1 > New Bug </ h1 >
19 <h : form >
20 <h : panelGrid >
21 <h : inputHidden value = " #{ bugMB . bug . id } " / >
22
23 <h : outputLabel value = " Severity : " / >
24 <h : selectOneMenu value = " #{ bugMB . bug . severity } " >
25 <f : selectItem itemValue = " LOW " / >
26 <f : selectItem itemValue = " MEDIUM " / >
27 <f : selectItem itemValue = " HIGH " / >
28 </ h: selectOneMenu >
29
30
31 <h : outputLabel value = " Description : " / >
32 <h : inputTextarea value = " #{ bugMB . bug . description } " / >
33
34 <h : outputLabel value = " Project : " / >
35 <h : selectOneMenu value = " #{ bugMB . projectId } " >
36 <f : selectItems value = " #{ projectMB . projects } " var = " project "
37 itemLabel = " #{ project . name } " itemValue = " #{ project . id } " / >
38 </ h: selectOneMenu >
www.facebook.com/k19treinamentos 199
P ROJETO 200
39
40 <h : commandButton action = " #{ bugMB . save } " value = " Save " / >
41 </ h : panelGrid >
42 </ h : form >
43
44 < hr / >
45
46 < h1 > Bug List </ h1 >
47 <h : dataTable value = " #{ bugMB . bugs } " var = " bug "
48 rendered = " #{ not empty bugMB . bugs } " border = " 1 " >
49 <h : column >
50 <f : facet name = " header " > Id </ f : facet >
51 #{ bug . id }
52 </ h : column >
53
54 <h : column >
55 <f : facet name = " header " > Project </ f : facet >
56 #{ bug . project . name }
57 </ h : column >
58
59 <h : column >
60 <f : facet name = " header " > Severity </ f : facet >
61 #{ bug . severity }
62 </ h : column >
63
64 <h : column >
65 <f : facet name = " header " > Description </ f : facet >
66 #{ bug . description }
67 </ h : column >
68
69 <h : column >
70 <f : facet name = " header " > Delete </ f : facet >
71 <h : form >
72 <h : commandLink action = " #{ bugMB . delete ( bug . id ) } " > delete </ h : commandLink >
73 </ h: form >
74 </ h : column >
75 <h : column >
76 <f : facet name = " header " > Edit </ f : facet >
77 <h : form >
78 <h : commandLink action = " #{ bugMB . prepareEdit ( bug . id ) } " > edit </ h : commandLink >
79 </ h: form >
80 </ h : column >
81 </ h : dataTable >
82 </ h : body >
83 </ html >
16 Crie uma tela para os erros internos e os erros de autorizao. Adicione um arquivo chamado
error.xhtml na pasta WebContent do projeto bugWeb.
1 <! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
2 " http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd " >
3
4 < html xmlns = " http :// www . w3 . org /1999/ xhtml "
5 xmlns : ui = " http :// java . sun . com / jsf / facelets "
6 xmlns : h = " http :// java . sun . com / jsf / html "
7 xmlns : f = " http :// java . sun . com / jsf / core " >
8
9 <h : head >
10 < title > Error </ title >
11 </ h : head >
12
13 <h : body >
14 < h3 > Internal Error or Client not authorized for this invocation . </ h3 >
15 </ h : body >
16 </ html >
200 www.k19.com.br
201 P ROJETO
17 Configure a pgina de erro no arquivo web.xml do projeto bugWeb. Adicione o seguinte trecho
de cdigo nesse arquivo.
18 Teste a aplicao!!!
www.facebook.com/k19treinamentos 201