k19 k22 Desenvolvimento Web Avancado Com Jsf2 Ejb3.1 e Cdi

download k19 k22 Desenvolvimento Web Avancado Com Jsf2 Ejb3.1 e Cdi

of 147

Transcript of k19 k22 Desenvolvimento Web Avancado Com Jsf2 Ejb3.1 e Cdi

  • TREINAMENTOS

    Desenvolvimento Web Avanadocom JSF2, EJB3.1 e CDI

  • Desenvolvimento Web Avanado com JSF2, EJB3.1 eCDI

    29 de abril de 2011

  • www.k19.com.br ii

  • Sumrio

    1 Introduo a EJB 11.1 Por que utilizar EJB? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 EJB Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    2 Stateless Session Beans 32.1 Session Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Caracterizando os SLSBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2.2.1 Servio de Cmbio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2.2 Dicionrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2.3 Consulta de CEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    2.3 SLSB - EJB 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.4 SLSB - EJB 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.5 Cliente Java Web Local - EJB 3.0 . . . . . . . . . . . . . . . . . . . . . . . . 62.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.7 Cliente Java Web Local - EJB 3.1 . . . . . . . . . . . . . . . . . . . . . . . . 182.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.9 Cliente Java SE Remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.11 Ciclo de Vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    2.11.1 Estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.11.2 NO EXISTE -> PRONTO . . . . . . . . . . . . . . . . . . . . . . . 302.11.3 PRONTO -> PRONTO . . . . . . . . . . . . . . . . . . . . . . . . . . 302.11.4 PRONTO -> NO EXISTE . . . . . . . . . . . . . . . . . . . . . . . 302.11.5 Escalabilidade e Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.11.6 Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    2.12 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    3 Stateful Session Beans 333.1 Caracterizando os SFSBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    3.1.1 Carrinho de Compras . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.1.2 Prova Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.1.3 TrackList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    3.2 SFSB - EJB 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.3 SFSB - EJB 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    iii

  • SUMRIO SUMRIO

    3.5 Ciclo de Vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.5.1 Estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.5.2 NO EXISTE -> PRONTO . . . . . . . . . . . . . . . . . . . . . . . 433.5.3 PRONTO -> PASSIVADO . . . . . . . . . . . . . . . . . . . . . . . . 433.5.4 PASSIVADA -> PRONTO . . . . . . . . . . . . . . . . . . . . . . . . 433.5.5 PRONTO -> NO EXISTE . . . . . . . . . . . . . . . . . . . . . . . 433.5.6 PASSIVADO -> PRONTO -> NO EXISTE . . . . . . . . . . . . . . 443.5.7 Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    3.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    4 Singleton Session Beans 474.1 Caracterizando os Singleton Session Beans . . . . . . . . . . . . . . . . . . . 47

    4.1.1 Nmero de usurios conectados . . . . . . . . . . . . . . . . . . . . . 474.1.2 Sistema de chat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474.1.3 Trnsito Colaborativo . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    4.2 Implementao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484.2.1 Singleton Session Beans Locais . . . . . . . . . . . . . . . . . . . . . 49

    4.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504.4 Ciclo de Vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    4.4.1 Estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544.4.2 NO EXISTE -> PRONTO . . . . . . . . . . . . . . . . . . . . . . . 544.4.3 PRONTO -> NO EXISTE . . . . . . . . . . . . . . . . . . . . . . . 554.4.4 Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    5 Persistncia 575.1 Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575.3 persistence.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615.4 Entity Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615.5 Entity Classes e Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . 625.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.7 Entity Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    5.7.1 Obtendo Entity Managers . . . . . . . . . . . . . . . . . . . . . . . . 665.8 Entity Manager Factories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    5.8.1 Obtendo Entity Manager Factories . . . . . . . . . . . . . . . . . . . . 675.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    6 Transaes 716.1 ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716.2 Transao Local ou Distribuda . . . . . . . . . . . . . . . . . . . . . . . . . . 716.3 JTA e JTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726.4 Container Managed Transactions - CMT . . . . . . . . . . . . . . . . . . . . . 72

    6.4.1 Atributo Transacional . . . . . . . . . . . . . . . . . . . . . . . . . . . 726.4.2 Rollback com SessionContext . . . . . . . . . . . . . . . . . . . . . . 736.4.3 Rollback com Exceptions . . . . . . . . . . . . . . . . . . . . . . . . 74

    6.5 Bean Managed Transactions - BMT . . . . . . . . . . . . . . . . . . . . . . . 74

    www.k19.com.br iv

  • SUMRIO SUMRIO

    6.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    7 Segurana 817.1 Realms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817.3 Autenticao - Aplicaes Web . . . . . . . . . . . . . . . . . . . . . . . . . . 847.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857.5 Autorizao - Aplicaes EJB . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    7.5.1 @RolesAllowed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897.5.2 @PermitAll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.5.3 @DenyAll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.5.4 @RunAs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    7.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    8 Interceptadores 938.1 Interceptor Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 938.2 Internal Interceptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948.3 External Interceptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    8.3.1 Method-Level Interceptors . . . . . . . . . . . . . . . . . . . . . . . . 958.3.2 Class-Level Interceptors . . . . . . . . . . . . . . . . . . . . . . . . . 958.3.3 Default Interceptors . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    8.4 Excluindo Interceptadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968.5 Invocation Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978.6 Ordem dos Interceptadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    9 Scheduling 1079.1 Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1079.2 Mtodos de Timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1089.3 Timers Automticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1089.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    10 Contexts and Dependency Injection - CDI 11710.1 Managed Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11710.2 Producer Methods and Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . 11810.3 EL Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11810.4 beans.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11910.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11910.6 Escopos e Contextos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12510.7 Injection Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

    10.7.1 Bean Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12610.7.2 Field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12610.7.3 Initializer methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    10.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    11 Projeto 12911.1 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

    v K19 Treinamentos

  • SUMRIO SUMRIO

    www.k19.com.br vi

  • Captulo 1

    Introduo a EJB

    1.1 Por que utilizar EJB?

    Muitos sistemas corporativos so construdos seguindo a arquitetura definida pelo padroEnterprise JavaBeans (EJB). Ao utilizar essa arquitetura, as aplicaes ganham certos benef-cios.

    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 possibi-lidade de realizar transaes distribudas.

    Segurana: Suporte para realizar autenticao e autorizao de maneira transparente. Os de-senvolvedores das aplicaes no precisam implementar a lgica de segurana pois elafaz parte da arquitetura EJB.

    Remotabilidade: Aplicaes EJB podem ser acessadas remotamente atravs de diversos pro-tocolos de comunicao. Consequentemente, possvel desenvolver aplicaes clientesde diversos tipos. Em particular, aplicaes EJB podem ser expostas como Web Services.

    Multithreading e Concorrncia: A arquitetura EJB permite que os sistemas corporativos pos-sam ser acessados por mltiplos usurios simultaneamente de maneira controlada paraevitar problemas de concorrncia.

    Persistncia: Facilidades para utilizar os servios dos provedores de persistncia que seguema especificao JPA.

    Gerenciamento de Objetos: Mecanismos de injeo de dependncias e controle de ciclo devida so oferecidos aos objetos que formam uma aplicao EJB. O mecanismo de con-trole de ciclo de vida pode garantir acesso a uma quantidade varivel de usurios.

    Integrao: A arquitetura EJB fortemente integrada com os componentes da plataforma JavaEE. Podemos, por exemplo, facilmente integrar uma aplicao JSF com uma aplicaoEJB.

    1

  • Introduo a EJB

    1.2 EJB ContainerAs aplicaes EJB executam dentro de um EJB Container pois ele o responsvel pela

    implementao de vrios recursos oferecidos a essas aplicaes. H diversas implementaesde EJB Container disponveis no mercado que podemos utilizar. Neste curso, utilizaremos aimplementao do Glassfish V3.

    A seguir, vamos instalar e configurar o Glassfish V3.

    1.3 Exerccios1. Na rea de Trabalho, entre na pasta K19-Arquivos e copie glassfish-3.0.1-with-hibernate.zip

    para o seu Desktop. Descompacte este arquivo na prpria rea de Trabalho.

    2. Ainda na rea de Trabalho, entre na pasta glassfishv3/glassfish/bin e execute o scriptstartserv para executar o glassfish.

    3. Verifique se o glassfish est executando atravs de um navegador acessando a url:

    http://localhost:8080.

    4. Pare o glassfish executando o script stopserv que est na mesma pasta do script startserv.

    5. No eclipse, abra a view servers e clique com o boto direito no corpo dela. Escolha aopo new e configure o glassfish.

    6. Execute o glassfish pela view servers e verifique se ele est funcionando acessando atra-vs de um navegador a url:

    http://localhost:8080.

    7. Pare o glassfish pela view servers.

    www.k19.com.br 2

  • Captulo 2

    Stateless Session Beans

    2.1 Session Beans

    Um sistema corporativo composto por muitos processos ou tarefas. Por exemplo, umsistema 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 imediatado contexto da aplicao.

    Utilizando a arquitetura EJB, as regras de negcio so implementadas em componentes es-pecficos que so chamados de Session Beans. O EJB Container administra esses componentesoferecendo diversos recursos a eles.

    2.2 Caracterizando os SLSBs

    Stateless Session Bean o primeiro tipo de Session Bean. Muitas vezes, utilizaremos asigla SLSB para fazer referncia a esse tipo de componente. A ideia fundamental por trs dosSLSBs a no necessidade de manter estado entre as execues das regras de negcio que elesimplementam.

    2.2.1 Servio de Cmbio

    Para exemplificar, suponha uma regra de negcio para converter valores monetrios entremoedas diferentes. Por exemplo, converter 100 reais para o valor correspondente em dlaramericano. Poderamos, implementar essa regra de negcio em um nico mtodo.

    1 public double converte(double valor, String moeda1, String moeda2) {2 // lgica da converso monetria3 }

    Devemos perceber que uma execuo do mtodo CONVERTE() no depende das execuesanteriores. Em outras palavras, o mtodo CONVERTE() no precisa manter estado entre aschamadas.

    3

  • Stateless Session Beans

    2.2.2 Dicionrio

    Outro exemplo, suponha a implementao de um dicionrio de portugus. Dado uma pala-vra, o dicionrio deve devolver a definio dela. Podemos criar um mtodo para implementaressa regra de negcio.

    1 public String getDefinicao(String palavra) {2 // lgica do dicionario3 }

    Novamente, perceba que as chamadas ao mtodo getDefinicao() so totalmente indepen-dentes. Dessa forma, no necessrio guardar informaes referentes s chamadas anteriores.

    2.2.3 Consulta de CEP

    Mais um exemplo, dado uma localidade podemos consultar o CEP correspondente. Pode-mos criar um mtodo para implementar essa regra de negcio.

    1 public String consultaCEP(String estado, String cidade, String logradouro, int numero) {

    2 // lgica da consulta do CEP3 }

    Como cada consulta de CEP independe das consultas anteriores, no necessrio manterdados entre uma consulta e outra. Em outras palavras, no necessrio manter estado.

    2.3 SLSB - EJB 3.0

    O primeiro passo para implementar um SLSB definir a sua interface de utilizao atravsde uma interface Java. Por exemplo, suponha um SLSB que implementa algumas operaesmatemticas bsicas. Uma possvel interface de utilizao para esse SLSB seria:

    1 public interface Calculadora {2 double soma(double a, double b);3 double subtrai(double a, double b);4 double multiplica(double a, double b);5 double divide(double a, double b);6 }

    Aps definir a interface de utilizao, o segundo passo seria implementar as operaes doSLSB atravs de uma classe Java.

    www.k19.com.br 4

  • Stateless Session Beans

    1 public class CalculadoraBean implementes Calculadora {23 public double soma(double a, double b){4 return a + b;5 }67 public double subtrai(double a, double b) {8 return a - b;9 }

    1011 public double multiplica(double a, double b) {12 return a * b;13 }1415 public double divide(double a, double b) {16 return a / b;17 }18 }

    O terceiro passo especificar o tipo de Session Bean que queremos utilizar. No caso dacalculadora, o tipo seria SLSB. Essa definio realizada atravs da anotao @Stateless.

    1 @Stateless2 public class CalculadoraBean implementes Calculadora {3 ...4 }

    Por fim, necessrio definir se o SLSB poder ser acessado remotamente ou apenas lo-calmente. Quando o acesso a um SLSB local, ele s pode ser acessado por aplicaes queestejam 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 aplicaoquanto aplicaes que no estejam.

    A definio do tipo de acesso realizada atravs das anotaes: @Local e @Remote.

    1 @Stateless2 @Remote(Calculadora.class)3 public class CalculadoraBean implementes Calculadora {4 ...5 }

    1 @Stateless2 @Local(Calculadora.class)3 public class CalculadoraBean implementes Calculadora {4 ...5 }

    2.4 SLSB - EJB 3.1

    Na verso 3.1, quando o acesso a um SLSB local, no mais necessrio definir umainterface Java nem utilizar a anotao @LOCAL. Ento, bastaria implementar uma classe Javacom a anotao @STATELESS.

    5 K19 Treinamentos

  • Stateless Session Beans

    1 @Stateless2 public class CalculadoraBean {34 public double soma(double a, double b){5 return a + b;6 }78 public double subtrai(double a, double b) {9 return a - b;

    10 }1112 public double multiplica(double a, double b) {13 return a * b;14 }1516 public double divide(double a, double b) {17 return a / b;18 }19 }

    2.5 Cliente Java Web Local - EJB 3.0

    Como vimos os session beans so utilizados para implementar as regras negcio das nossasaplicaes. Em particular, os stateless session beans so utilizados para implementar as regrasde negcio que no necessitam manter estado. Contudo, alm das regras de negcio, devemosnos 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 paraexemplificar a utilizao da arquitetura EJB em conjunto com as tecnologias Java para desen-volvimento de interfaces web. Suponha que todo o sistema (session beans e a camada web)esteja no mesmo servidor de aplicao.

    A seguinte interface Java ser utilizada para definir as operaes de um SLSB.

    1 public interface Calculadora {2 double soma(double a, double b);3 }

    Depois de definir a interface, devemos implementar as operaes do SLSB atravs de umaclasse Java com as anotaes apropriadas.

    1 @Stateless2 @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 umacamada web no mesmo servidor de aplicao. Nesse momento, o SLSB est pronto.

    O prximo passo implementar a camada web. A interface que define as operaes doSLSB precisa estar no classpath da camada web. J a classe que implementa as operaes no

    www.k19.com.br 6

  • Stateless Session Beans

    precisa estar no classpath da camada web.

    Suponha que a camada web da nossa aplicao utiliza apenas Servlets. Podemos injetar,atravs da anotao @EJB, o SLSB em uma Servlet.

    1 @WebServlet("/soma")2 public class SomaServlet extends HttpServlet {3 @EJB4 private Calculadora calculadora;56 protected void service(HttpServletRequest req, HttpServletResponse res) {7 double a = Double.parseDouble(request.getParameter("a"));8 double b = Double.parseDouble(request.getParameter("b"));9

    10 double resultado = this.calculadora.soma(a, b);1112 PrintWriter out = response.getWriter();13 out.println("");14 out.println("Soma: " + resultado);15 out.println("");16 }17 }

    Agora, suponha que a camada web utilize JSF. Podemos injetar o SLSB em um ManagedBean tambm atravs da anotao @EJB.

    1 @ManagedBean2 public class CalculadoraMB {3 @EJB4 private Calculadora calculadora;56 private double a;78 private double b;9

    10 private double resultado;1112 public void soma() {13 this.resultado = this.calculadora.soma(a,b);14 }1516 // GETTERS AND SETTERSs17 }

    2.6 Exerccios

    1. Crie um EJB project no eclipse. Voc pode digitar CTRL+3 em seguida new EJBproject e ENTER. Depois, siga exatamente as imagens abaixo.

    7 K19 Treinamentos

  • Stateless Session Beans

    www.k19.com.br 8

  • Stateless Session Beans

    OBS: Trs projetos sero criados:

    calculadora: As classes que implementam os SLSB devem ser colocadas nesse projeto.

    calculadoraClient: As interfaces que definem as operaes dos SLSB devem ser colo-cadas nesse projeto.

    calculadoraEAR: Esse projeto empacota todos os mdulos do nosso sistema.

    2. Crie um Dynamic Web Project no eclipse para implementar a camada web. Voc podedigitar CTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, sigaexatamente as imagens abaixo.

    9 K19 Treinamentos

  • Stateless Session Beans

    www.k19.com.br 10

  • Stateless Session Beans

    11 K19 Treinamentos

  • Stateless Session Beans

    www.k19.com.br 12

  • Stateless Session Beans

    OBS: O mdulo web j est vinculado ao projeto calculadoraEAR.

    3. Adicione o projeto calculadoraClient como dependncia do projeto calculadoraWeb.Abra as propriedades do projeto calculadoraWeb. Voc pode selecionar o projeto cal-culadoraWeb e digitar ALT+ENTER. Depois, siga as imagens abaixo.

    13 K19 Treinamentos

  • Stateless Session Beans

    www.k19.com.br 14

  • Stateless Session Beans

    4. No projeto calculadoraClient, adicione um pacote chamado sessionbeans e acrescentenele uma interface Java chamada Calculadora.

    1 package sessionbeans;23 public interface Calculadora {4 double soma(double a, double b);5 }

    5. No projeto calculadora, adicione um pacote chamado sessionbeans e acrescente neleuma classe Java chamada CalculadoraBean.

    1 package sessionbeans;23 @Stateless4 @Local(Calculadora.class)5 public class CalculadoraBean implements Calculadora {6 public double soma(double a, double b) {7 return a + b;8 }9 }

    15 K19 Treinamentos

  • Stateless Session Beans

    6. No projeto calculadoraWeb, adicione um pacote chamado managedbeans acrescentanele uma classe Java chamada CalculadoraMB.

    1 package managedbeans;23 import javax.ejb.EJB;4 import javax.faces.bean.ManagedBean;56 import sessionbeans.Calculadora;78 @ManagedBean9 public class CalculadoraMB {

    1011 @EJB12 private Calculadora calculadora;1314 private double a;1516 private double b;1718 private double resultado;1920 public void soma() {21 this.resultado = this.calculadora.soma(a, b);22 }2324 // GETTERS AND SETTERS25 }

    7. Crie uma simples tela na aplicao web para utilizar o Manager Bean. Adicione o ar-quivo soma.xhtml na pasta WebContent do projeto calculadoraWeb com o seguintecontedo.

    1 34 67 8 Calculadora - Soma9

    1011 12 13 14 1516 17 1819 2021 22 23 24 25

    8. Adicione o projeto calculadoraEAR no glassfish. Clique com o boto direito no glas-

    www.k19.com.br 16

  • Stateless Session Beans

    sfish da view Servers e escolha a opo Add and Remove. Depois, siga as imagensabaixo.

    17 K19 Treinamentos

  • Stateless Session Beans

    9. Acesse a url http://localhost:8080/calculadoraWeb/soma.xhtml e testeo funcionamento da aplicao.

    2.7 Cliente Java Web Local - EJB 3.1

    Como dito anteriormente, na verso 3.1, quando o acesso a um SLSB local, no maisnecessrio definir uma interface Java nem utilizar a anotao @LOCAL.

    Alm disso, as regras de empacotamento foram simplificadas. Os Session Beans podemser empacotados no mdulo web. Isso simplifica bastante o funcionamento das IDEs como oeclipse. Perceberemos essa diferena o exerccio seguinte.

    2.8 Exerccios

    10. Crie um Dynamic Web Project no eclipse para implementar a camada web. Voc podedigitar CTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, sigaexatamente as imagens abaixo.

    www.k19.com.br 18

  • Stateless Session Beans

    19 K19 Treinamentos

  • Stateless Session Beans

    www.k19.com.br 20

  • Stateless Session Beans

    11. No projeto dadoWeb, adicione um pacote chamado sessionbeans e acrescente nele umaclasse Java chamada LancadorDeDadoBean.

    1 package sessionbeans;23 import java.util.Random;45 import javax.ejb.Stateless;67 @Stateless8 public class LancadorDeDadoBean {9 private Random gerador = new Random();

    1011 public int lanca(){12 return this.gerador.nextInt(5) + 1;13 }14 }

    12. No projeto dadoWeb, adicione um pacote chamado managedbeans acrescenta nele umaclasse Java chamada DadoMB.

    21 K19 Treinamentos

  • Stateless Session Beans

    1 package managedbeans;23 import javax.ejb.EJB;4 import javax.faces.bean.ManagedBean;56 import sessionbeans.LancadorDeDadoBean;78 @ManagedBean9 public class DadoMB {

    10 @EJB11 private LancadorDeDadoBean lancadorDeDadoBean;1213 private int resultado;1415 public void lancaDado(){16 this.resultado = this.lancadorDeDadoBean.lanca();17 }1819 public int getResultado() {20 return resultado;21 }2223 public void setResultado(int resultado) {24 this.resultado = resultado;25 }26 }

    13. Crie uma simples tela na aplicao web para utilizar o Manager Bean. Adicione o arquivodado.xhtml na pasta WebContent do projeto dadoWeb com o seguinte contedo.

    1 34 67 8 Lanador de dado9

    1011 12 13 1415 16 17 18 19

    14. Adicione o projeto dadoWeb no glassfish. Clique com o boto direito no glassfish daview Servers e escolha a opo Add and Remove. Depois, siga as imagens abaixo.

    www.k19.com.br 22

  • Stateless Session Beans

    23 K19 Treinamentos

  • Stateless Session Beans

    15. Acesse a url http://localhost:8080/dadoWeb/dado.xhtml e teste o funci-onamento da aplicao.

    2.9 Cliente Java SE Remoto

    Vimos os SLSBs sendo acessados localmente por aplicaes web implantadas no mesmoservidor de aplicao. Contudo, eles podem ser acessados remotamente, ou seja, podem seracessados por aplicaes fora do mesmo servidor de aplicao. Inclusive, um SLSB pode seracessado por aplicaes Java SE.

    Quando o acesso local, podemos injetar um SLSB atravs da anotao @EJB no compo-nente 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 deoutra maneira.

    Todo SLSB implantado em um servidor de aplicao recebe um nome. Toda aplicaofora desse servidor de aplicao pode utilizar esse nome para obter a referncia remota doSLSB.

    Antes da verso 3.1, os nomes dos Session Beans no eram padronizados. Consequente-mente, 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 todosos servidores de aplicao). Consulte a especificao para conhecer as regras de nomenclaturahttp://jcp.org/en/jsr/detail?id=318.

    Uma aplicao Java remota deve acessar o servio de nomes (JNDI) do servidor de aplica-o no qual o SLSB que ela deseja utilizar est implantado. O trecho de cdigo Java para fazeruma consulta por um SLSB no JNDI teria o seguinte padro.

    www.k19.com.br 24

  • Stateless Session Beans

    1 InitialContext ic = new InitialContext();2 StatelessSessionBean statelessSessionBean =3 (StatelessSessionBean) ic.lookup("java:global/aplicacaoWeb/StatelessSessionBean");

    Uma vez com a referncia do SLSB, a aplicao pode chamar as operaes normalmentecomo se o Session Bean estivesse local. Contudo, importante ressaltar que as chamadas soremotas e portanto mais demoradas.

    2.10 Exerccios

    16. Adicione uma interface Java no pacote sessionbeans chamada LancadorDeDado.

    1 package sessionbeans;23 public interface LancadorDeDado {4 public int lanca();5 }

    17. Altere a classe LancadorDeDadoBean do projeto dadoWeb.

    1 @Stateless2 @Remote(LancadorDeDado.class)3 public class LancadorDeDadoBean implements LancadorDeDado{4 private Random gerador = new Random();56 public int lanca(){7 return this.gerador.nextInt(5) + 1;8 }9 }

    18. Crie um Java project no eclipse. Voc pode digitar CTRL+3 em seguida new Javaproject e ENTER. Depois, siga exatamente as imagens abaixo.

    25 K19 Treinamentos

  • Stateless Session Beans

    19. Adicione as bibliotecas do Glassfish necessrias para a consulta ao servio de nomes.Abra as propriedades do projeto dadoJavaSE. Voc pode selecionar o projeto dadoJa-vaSE e digitar ALT+ENTER. Depois, siga as imagens abaixo.

    www.k19.com.br 26

  • Stateless Session Beans

    20. Adicione o projeto dadoWeb como dependncia do projeto dadoJavaSE. Abra as pro-

    27 K19 Treinamentos

  • Stateless Session Beans

    priedades do projeto dadoJavaSE. Voc pode selecionar o projeto dadoJavaSE e digitarALT+ENTER. Depois, siga as imagens abaixo

    www.k19.com.br 28

  • Stateless Session Beans

    21. No projeto dadoJavaSE, adicione um pacote chamado testes acrescenta nele uma classeJava chamada TesteDeAcesso.

    1 public class TesteDeAcesso {2 public static void main(String[] args) throws Exception{3 InitialContext ic = new InitialContext();45 LancadorDeDado lancadorDeDado = (LancadorDeDado) ic.lookup("java:global/dadoWeb

    /LancadorDeDadoBean");6 System.out.println(lancadorDeDado.lanca());7 }8 }

    Execute e confira o resultado no console

    2.11 Ciclo de VidaAs instncias dos SLSBs so administradas pelo EJB Container. Devemos entender o de

    ciclo de vida desses objetos para utilizar corretamente a tecnologia EJB. Trs aspectos funda-mentais dos SLSBs nos ajudam a entender o ciclo de vida das instncias.

    1. Uma nica instncia de um SLSB pode atender chamadas de diversos clientes.

    2. Uma instncia de um SLSB no atende duas chamadas ao mesmo tempo. Em outraspalavras, ela processa uma chamada de cada vez.

    3. O EJB Container pode criar vrias instncias do mesmo SLSB para atender mais rapida-mente as chamadas dos clientes.

    29 K19 Treinamentos

  • Stateless Session Beans

    2.11.1 EstadosO ciclo de vida das instncias de um SLSB possui apenas dois estados.

    1. NO EXISTE

    2. PRONTO

    2.11.2 NO EXISTE -> PRONTOAntes de ser criada, dizemos que uma instncia de um SLSB se encontra no estado NO

    EXISTE. Obviamente, nesse estado, uma instncia no pode atender chamadas dos clientes.De acordo com a quantidade de chamadas e critrios de cada servidor de aplicao, o EJB

    Container pode criar novas instncias de um SLSB. Cada instncia criada passa para o estadoPRONTO. No estado PRONTO, uma instncia est apta a receber uma chamada.

    2.11.3 PRONTO -> PRONTOQuando uma chamada realizada, o EJB Container seleciona uma instncia entre as que

    estejam no estado PRONTO para realizar o atendimento. Enquanto, uma instncia est aten-dendo uma chamada ela no pode atender outras chamadas. Depois de finalizar o atendimento,a instncia volta para o estado PRONTO podendo receber outra chamada.

    2.11.4 PRONTO -> NO EXISTENovamente, de acordo com a quantidade de chamadas e critrios de cada servidor de aplica-

    o, o EJB Container pode destruir instncias que estejam no estado PRONTO. Essas instnciasvoltam para o estado NO EXISTE.

    www.k19.com.br 30

  • Stateless Session Beans

    2.11.5 Escalabilidade e Pool

    As caractersticas dos SLSBs favorecem a escalabilidade da aplicao pois, de acordo coma demanda, 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 deaplicaes oferece configuraes especficas para melhorar a eficincia no atendimento daschamadas. Por exemplo, o Glassfish permite que uma quantidade mxima de instncias de umdeterminado SLSB seja definido pela aplicao.

    2.11.6 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 emcada instncia logo aps ela ser criada. Esse registro realizado atravs da anotao @Post-Construct.

    1 @Stateless2 public class CalculadoraBean {34 @PostConstruct5 public void inicializando() {6 System.out.println("Mais uma calculadora criada...")7 }89 // METODOS DE NEGOCIO

    10 }

    O EJB Container utiliza o construtor sem argumentos para criar uma instncia de um SLSB.Depois de chamar o construtor sem argumentos, o EJB Container injeta eventuais dependnciasna 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 exe-cute em cada instncia imediatamente antes dela ser destruda. Esse registro realizado atravsda anotao @PreDestroy.

    1 @Stateless2 public class CalculadoraBean {34 @PreDestroy5 public void destruindo() {6 System.out.println("Mais uma calculadora ser destruda...")7 }89 // METODOS DE NEGOCIO

    10 }

    31 K19 Treinamentos

  • Stateless Session Beans

    2.12 Exerccios22. Adicione mtodos de callbacks na classe LancadorDeDadoBean do projeto dadoWeb.

    1 @Stateless2 @Remote(LancadorDeDado.class)3 public class LancadorDeDadoBean implements LancadorDeDado {4 private Random gerador = new Random();56 @PostConstruct7 public void inicializando(){8 System.out.println("Mais um lanador de dado criado...");9 }

    1011 @PreDestroy12 public void destruindo() {13 System.out.println("Mais um lanador de dado ser destrudo...");14 }1516 public int lanca(){17 return this.gerador.nextInt(5) + 1;18 }19 }

    23. Adicione um teste no pacote testes do projeto dadoJavaSE para fazer consultas em pa-ralelo ao SLSB que lana moedas.

    1 public class TesteCicloDeVidaSLSB {2 public static void main(String[] args) throws Exception {3 InitialContext ic = new InitialContext();45 for (int i = 0; i < 100; i++) {6 final LancadorDeDado lancadorDeDado = (LancadorDeDado) ic7 .lookup("java:global/dadoWeb/LancadorDeDadoBean");89 Thread thread = new Thread(new Runnable() {

    1011 @Override12 public void run() {13 for(int i = 0; i < 100; i++) {14 System.out.println(lancadorDeDado.lanca());15 }16 }17 });18 thread.start();19 }20 }21 }

    Reinicie o Glassfish depois execute o teste e observe o console para conferir as men-sagens dos mtodos de callback

    24. Pare o Glassfish e observe o console para conferir as mensagens dos mtodos de callback.

    www.k19.com.br 32

  • Captulo 3

    Stateful Session Beans

    3.1 Caracterizando os SFSBs

    Stateful Session Bean o segundo tipo de Session Bean. Muitas vezes, utilizaremos asigla SFSB para fazer referncia a esse tipo de componente. A ideia fundamental por trs dosSFSBs a necessidade de manter estado entre as execues das regras de negcio que elesimplementam.

    3.1.1 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 {23 public void adiciona(Produto produto) {4 // lgica para adicionar produto5 }67 public void remove(Produto produto) {8 // lgica para remover produto9 }

    1011 public void finalizaCompra(){12 // lgica para finalizar a compra13 }14 }

    H duas necessidades fundamentais no exemplo do carrinho de compras que devemos ob-servar. Primeiro, uma instncia da classe CARRINHOBEAN no deve atender vrios clientespara no misturar produtos escolhidos por clientes diferentes. Segundo, os produtos adicio-nados devem ser mantidos entre as chamadas dos mtodos da classe CARRINHOBEAN. Emoutras palavras, necessrio manter o estado do carrinho.

    Provavelmente, o estado do carrinho, ou seja, os produtos adicionados seria mantido emuma lista ou em um conjunto.

    33

  • Stateful Session Beans

    1 class CarrinhoBean {23 private Set produtos = new HashSet();45 public void adiciona(Produto produto) {6 this.produtos.add(produto);7 }89 public void remove(Produto produto) {

    10 this.produtos.remove(produto);11 }1213 public void finalizaCompra(){14 // lgica para finalizar a compra15 }16 }

    3.1.2 Prova Digital

    Outro exemplo, suponha o funcionamento de um sistema para aplicar provas que permitaque os usurios respondam as questes em qualquer ordem ou modifiquem respostas j reali-zadas antes de finalizar a prova. As resposta poderiam ser mantidas em um mapa.

    1 class ProvaBean {2 private Map respostas = new HashMap();34 public void responde(Integer questao, Character resposta) {5 this.respostas.put(questao, resposta);6 }78 public void finaliza(){9 // lgica para finalizar a prova

    10 }11 }

    Uma instncia da classe PROVABEAN no pode atender dois clientes para no misturar asrespostas de dois usurios diferentes. Alm disso, as respostas j realizadas devem ser mantidasentre as chamadas.

    3.1.3 TrackList

    Mais um exemplo, suponha o funcionamento de um player de vdeo que permite que osusurios selecionem um conjunto de vdeos para assistir.

    1 class ListaDeVideos {2 private List videos = new ArrayList();34 public void adiciona(Video video) {5 this.videos.add(video);6 }78 public void embaralha() {9 Collections.shuffle(this.videos);

    10 }11 }

    www.k19.com.br 34

  • Stateful Session Beans

    Novamente, cada instncia da classe LISTADEVIDEOS deve ser exclusiva para um clientee os vdeos adicionados devem ser mantidos entre as chamadas dos mtodos.

    3.2 SFSB - EJB 3.0

    O primeiro passo para implementar um SFSB definir a sua interface de utilizao atravsde uma interface Java. Por exemplo, suponha um SFSB que o funcionamento do carrinho decompras. Uma possvel interface de utilizao para esse Session Bean seria:

    1 public interface Carrinho {2 void adiciona(Produto produto);3 void remove(Produto produto);4 }

    Aps definir a interface de utilizao, o segundo passo seria implementar as operaes doSFSB atravs de uma classe Java.

    1 public class CarrinhoBean implements Carrinho {23 private Set produtos = new HashSet();45 public void adiciona(Produto produto) {6 this.produtos.add(produto);7 }89 public void remove(Produto produto) {

    10 this.produtos.remove(produto);11 }12 }

    O terceiro passo especificar o tipo de Session Bean que queremos utilizar. No caso docarrinho, o tipo seria SFSB. Essa definio realizada atravs da anotao @Stateful.

    1 @Stateful2 public class CarrinhoBean implements Carrinho {3 ...4 }

    Por fim, necessrio definir se o SFSB poder ser acessado remotamente ou apenas lo-calmente. Quando o acesso a um SLSB local, ele s pode ser acessado por aplicaes queestejam 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 aplicaoquanto aplicaes que no estejam.

    A definio do tipo de acesso realizada atravs das anotaes: @Local e @Remote.

    1 @Stateful2 @Remote(Carrinho.class)3 public class CarrinhoBean implements Carrinho {4 ...5 }

    35 K19 Treinamentos

  • Stateful Session Beans

    1 @Stateful2 @Local(Carrinho.class)3 public class CarrinhoBean implements Carrinho {4 ...5 }

    3.3 SFSB - EJB 3.1

    Na verso 3.1, quando o acesso a um SFSB local, no mais necessrio definir umainterface Java nem utilizar a anotao @LOCAL. Ento, bastaria implementar uma classe Javacom a anotao @STATEFUL.

    1 @Stateful2 public class CarrinhoBean {34 private Set produtos = new HashSet();56 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 }

    3.4 Exerccios

    1. Crie um Dynamic Web Project no eclipse para implementar o funcionamento do carrinhode compras. Voc pode digitar CTRL+3 em seguida new Dynamic Web Project eENTER. Depois, siga exatamente as imagens abaixo.

    www.k19.com.br 36

  • Stateful Session Beans

    37 K19 Treinamentos

  • Stateful Session Beans

    www.k19.com.br 38

  • Stateful Session Beans

    39 K19 Treinamentos

  • Stateful Session Beans

    2. Crie um pacote chamado sessionbeans e adicione a seguinte classe.

    1 package sessionbeans;23 import java.util.HashSet;4 import java.util.Set;56 import javax.ejb.Stateful;78 @Stateful9 public class CarrinhoBean {

    1011 private Set produtos = new HashSet();1213 public void adiciona(String produto){14 this.produtos.add(produto);15 }1617 public void remove(String produto){18 this.produtos.remove(produto);19 }2021 public Set getProdutos() {22 return produtos;23 }24 }

    3. Crie um pacote chamado managedbeans e adicione a seguinte classe.

    www.k19.com.br 40

  • Stateful Session Beans

    1 package managedbeans;23 import java.util.ArrayList;4 import java.util.List;56 import javax.ejb.EJB;7 import javax.faces.bean.ManagedBean;8 import javax.faces.bean.SessionScoped;9

    10 import sessionbeans.CarrinhoBean;1112 @ManagedBean13 @SessionScoped14 public class CarrinhoMB {15 @EJB16 private CarrinhoBean carrinhoBean;1718 private String produto;1920 public List getProdutos(){21 return new ArrayList(this.carrinhoBean.getProdutos());22 }2324 public void adiciona(){25 this.carrinhoBean.adiciona(this.produto);26 }2728 public void remove(String produto){29 this.carrinhoBean.remove(produto);30 }3132 public void setProduto(String produto) {33 this.produto = produto;34 }3536 public String getProduto() {37 return produto;38 }39 }

    4. Adicione o arquivo produtos.xhtml na pasta WebContent do projeto carrinhoWeb como seguinte contedo.

    41 K19 Treinamentos

  • Stateful Session Beans

    1 34 67 8 Carrinho de Compras9

    1011 12 13 14 15 1617 1819 20 21 22 23 24 25 26 27 28 29 30

    5. Adicione o projeto carrinhoWeb no glassfish e teste a aplicao acessando a url http://localhost:8080/carrinhoWeb/produtos.xhtml.

    6. (Opcional) Faa o carrinho de compras permitir que os produtos sejam cadastrados comquantidade. Por exemplo, o usurio pode adicionar 5 canetas no seu carrinho.

    3.5 Ciclo de Vida

    As instncias dos SFSBs so administradas pelo EJB Container. Devemos entender o deciclo de vida desses objetos para utilizar corretamente a tecnologia EJB. Para entender maisfacilmente o ciclo de vida das instncias dos SFSBs, devemos sempre ter em mente que cadainstncia atende apenas um cliente.

    3.5.1 Estados

    O ciclo de vida das instncias de um SFSB possui trs estados.

    1. NO EXISTE

    2. PRONTO

    3. PASSIVADO

    www.k19.com.br 42

  • Stateful Session Beans

    3.5.2 NO EXISTE -> PRONTO

    Antes de ser criada, dizemos que uma instncia de um SFSB se encontra no estado NOEXISTE. Obviamente, nesse estado, uma instncia no pode atender as chamadas do seu cli-ente.

    Quando um cliente recebe por injeo ou recupera por lookup um SFSB, o EJB Containercria 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 chamadasdo seu respectivo cliente.

    3.5.3 PRONTO -> PASSIVADO

    Uma instncia de um SFSB fica ociosa enquanto no estiver processando uma chamadado seu cliente. Para no consumir a memria do computador, depois de um certo tempo deociosidade, o EJB Container pode transferir o contedo de uma instncia ociosa para disposi-tivos secundrios de armazenamento (hard disk). Esse processo de transferncia chamado depassivao. Aps ser passivada, a instncia ociosa se encontrar no estado PASSIVADO.

    Outros fatores alm da ociosidade podem levar o EJB Container decidir passivar instnciasdos SFSBs. Por exemplo, quando um certo limite de instncias no estado PRONTO (ocupandomemria) for atingido.

    3.5.4 PASSIVADA -> PRONTO

    Se o cliente de uma instncia passivada realizar uma chamada a ela, o EJB Container re-alizar automaticamente o processo de ativao. Esse processo consiste na transferncia docontedo da instncia passivada para a memria principal novamente. Aps ser ativada, a ins-tncia se encontrar no estado PRONTO e apta a atender a chamada realizada.

    3.5.5 PRONTO -> NO EXISTE

    Em determinadas situaes, uma instncia de um SFSB pode no ser mais til. Em outraspalavras, o cliente correspondente pode no precisar mais dela. Por exemplo, quando o clientede um carrinho de compras finaliza a compra, a instncia que representa o carrinho pode serdestruda (no compensa reaproveitar o mesmo carrinho para outro cliente).

    O EJB Container o responsvel por destruir uma instncia de um SFSB que no maistil. Por outro lado, a aplicao responsvel por determinar quando uma instncia se tornaintil. Adicionando um mtodo de negcio anotado com @Remove a aplicao declara queaps a execuo desse mtodo a instncia no mais necessria.

    No exemplo do carrinho de compras, poderamos definir um mtodo para implementar algica de finalizar compra e anot-lo com @REMOVE. Dessa forma, logo aps a execuodesse mtodo a instncia seria destruda pelo EJB Container.

    43 K19 Treinamentos

  • Stateful Session Beans

    1 @Stateful2 public class CarrinhoBean {34 private Set produtos = new HashSet();56 public void adiciona(String produto){7 this.produtos.add(produto);8 }9

    10 public void remove(String produto){11 this.produtos.remove(produto);12 }1314 public Set getProdutos() {15 return produtos;16 }1718 @Remove19 public void finalizaCompra(){20 // lgica para finalizar compra21 }22 }

    3.5.6 PASSIVADO -> PRONTO -> NO EXISTEUma instncia pode ser passivada porque ficou ociosa quando estava no estado PRONTO.

    Ou seja, o respectivo cliente no realizou nenhuma chamada durante um grande perodo detempo. Da mesma maneira, quando passivada, uma instncia pode no receber uma chamadado seu cliente durante um grande perodo de tempo. Nesses casos, o EJB Container podeassumir que o cliente no chamar mais a instncia passivada e portanto ela no mais til.Quando uma instncia passivada no mais til, o EJB Container ativa e depois a destri.

    3.5.7 CallbacksPodemos associar lgicas especficas nas transies de estado no ciclo de vida dos SFSBs.

    www.k19.com.br 44

  • Stateful Session Beans

    @PostConstruct

    Podemos registrar um mtodo de instncia no EJB Container para que ele o execute emcada instncia logo aps ela ser criada. Esse registro realizado atravs da anotao @Post-Construct.

    1 @Stateless2 public class CarrinhoBean {34 @PostConstruct5 public void inicializando() {6 System.out.println("Mais um carrinho criado...");7 }89 // METODOS DE NEGOCIO

    10 }

    O EJB Container utiliza o construtor sem argumentos para criar uma instncia de um SLSB.Depois de chamar o construtor sem argumentos, o EJB Container injeta eventuais dependnciasna 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 exe-cute em cada instncia imediatamente antes dela ser destruda. Esse registro realizado atravsda anotao @PreDestroy.

    1 @Stateless2 public class CarrinhoBean {34 @PreDestroy5 public void destruindo() {6 System.out.println("Mais um carrinho ser destrudo...");7 }89 // METODOS DE NEGOCIO

    10 }

    @PrePassivate

    Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o exe-cute em cada instncia imediatamente antes dela ser passivada. Esse registro realizado atravsda anotao @PrePassivate.

    1 @Stateless2 public class CarrinhoBean {34 @PrePassivate5 public void passivando() {6 System.out.println("Mais um carrinho ser passivado...");7 }89 // METODOS DE NEGOCIO

    10 }

    45 K19 Treinamentos

  • Stateful Session Beans

    @PostActivate

    Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o exe-cute em cada instncia imediatamente depois dela ser ativada. Esse registro realizado atravsda anotao @PostActivate.

    1 @Stateless2 public class CarrinhoBean {34 @PostActivate5 public void ativando() {6 System.out.println("Mais um carrinho foi ativado...");7 }89 // METODOS DE NEGOCIO

    10 }

    3.6 Exerccios7. Implemente uma aplicao com interface web para aplicar provas.

    www.k19.com.br 46

  • Captulo 4

    Singleton Session Beans

    4.1 Caracterizando os Singleton Session Beans

    Singleton Session Bean o terceiro tipo de Session Bean. Este tipo de Session Bean surgiuna verso 3.1 da especificao Enterprise Java Beans. A ideia fundamental por trs desse tipode Session Bean a necessidade de compartilhar dados transientes entre todos os usurios deuma aplicao EJB.

    4.1.1 Nmero de usurios conectados

    Para exemplificar, suponha que seja necessrio contabilizar a nmero de usurios conecta-dos aplicao. Esse servio pode ser implementado atravs de uma classe.

    1 class ContadorDeUsuariosBean {23 private int contador = 0;45 public void adiciona() {6 this.contador++;7 }89 public int getContador() {

    10 return this.contador;11 }12 }

    Uma nica instncia da classe CONTADORDEUSUARIOSBEAN deve ser criada para con-tabilizar corretamente o nmero de usurios conectados. Alm disso, o contador de usuriosconectados no precisa ser persistido entre duas execues da aplicao.

    4.1.2 Sistema de chat

    Outro exemplo, suponha o funcionamento de um sistema de chat no qual as salas so cri-adas dinamicamente pelos usurios durante a execuo. Podemos definir alguns mtodos paraimplementar esse sistema.

    47

  • Singleton Session Beans

    1 class ChatBean {2 private Set salas = new HashSet();34 public void criaSala(String sala) {5 this.salas.add(sala);6 }78 public List listaSalas(){9 return new ArrayList(this.salas);

    10 }11 }

    As salas so criadas dinamicamente e todos os usurios compartilham todas as salas. Se osistema cair por qualquer que seja o motivo no necessrio guardar as salas pois na prximaexecuo novas salas sero criadas pelos usurios. Uma nica instncia da classe CHATBEANdeve ser criada.

    4.1.3 Trnsito ColaborativoMais um exemplo, suponha um sistema colaborativo para informar o grau de congestiona-

    mento nas vias de uma cidade. As regras desse sistema poderiam ser implementadas atravs dealguns mtodos.

    1 class TransitoBean {2 private Map vias = new HashMap();34 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 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 mesmasinformaes. A princpio, no necessrio manter esses dados persistidos.

    4.2 ImplementaoPara implementar um Singleton Session Bean podemos definir uma interface Java com as

    assinaturas dos mtodos desejados. Por exemplo, suponha que um Singleton Session Bean serutilizado para implementar um sistema de chat.

    1 public interface Chat {2 void criaSala(String sala);3 List listaSalas();4 }

    Aps definir a interface de utilizao, o segundo passo seria implementar as operaes doSession Bean atravs de uma classe Java.

    www.k19.com.br 48

  • Singleton Session Beans

    1 public class ChatBean implements Chat {23 private Set salas = new HashSet();45 public void criaSala(String sala) {6 this.salas.add(sala);7 }89 public List listaSalas(){

    10 return new ArrayList(this.salas);11 }12 }

    O terceiro passo especificar o tipo de Session Bean que queremos utilizar. No caso dochat, o tipo seria Singleton. Essa definio realizada atravs da anotao @Singleton.

    1 @Singleton2 public class ChatBean implements Chat {3 ...4 }

    Por fim, necessrio definir se o Session Bean poder ser acessado remotamente ou apenaslocalmente. Quando o acesso a um Session Bean local, ele s pode ser acessado por aplica-es que estejam no mesmo servidor de aplicao que ele. Caso contrrio, quando o acesso aum Session Bean remoto, ele pode ser acessado tanto por aplicaes que estejam no mesmoservidor de aplicao quanto aplicaes que no estejam.

    A definio do tipo de acesso realizada atravs das anotaes: @Local e @Remote.

    1 @Singleton2 @Remote(Chat.class)3 public class ChatBean implements Chat {4 ...5 }

    1 @Singleton2 @Local(Chat.class)3 public class ChatBean implements Chat {4 ...5 }

    4.2.1 Singleton Session Beans Locais

    Quando o acesso a um Singleton Session Bean local, no necessrio definir uma inter-face Java nem utilizar a anotao @LOCAL. Ento, bastaria implementar uma classe Java coma anotao @SINGLETON.

    49 K19 Treinamentos

  • Singleton Session Beans

    1 @Singleton2 public class ChatBean {34 private Set salas = new HashSet();56 public void criaSala(String sala) {7 this.salas.add(sala);8 }9

    10 public List listaSalas(){11 return new ArrayList(this.salas);12 }13 }

    4.3 Exerccios

    1. Crie um Dynamic Web Project no eclipse para implementar o funcionamento de umsistema de chat. Voc pode digitar CTRL+3 em seguida new Dynamic Web Projecte ENTER. Depois, siga exatamente as imagens abaixo.

    www.k19.com.br 50

  • Singleton Session Beans

    51 K19 Treinamentos

  • Singleton Session Beans

    2. Crie um pacote chamado sessionbeans e adicione a seguinte classe.

    1 package sessionbeans;23 import java.util.HashSet;4 import java.util.Set;56 import javax.ejb.Singleton;78 @Singleton9 public class ChatBean {

    1011 private Set salas = new HashSet();1213 public void criaSala(String sala) {14 this.salas.add(sala);15 }1617 public List listaSalas(){18 return new ArrayList(this.salas);19 }20 }

    3. Crie um pacote chamado managedbeans e adicione a seguinte classe.

    www.k19.com.br 52

  • Singleton Session Beans

    1 package managedbeans;23 import java.util.List;45 import javax.ejb.EJB;6 import javax.faces.bean.ManagedBean;78 import sessionbeans.ChatBean;9

    10 @ManagedBean11 public class ChatMB {1213 @EJB14 private ChatBean chatBean;1516 private String sala;1718 public void adicionaSala() {19 this.chatBean.criaSala(this.sala);20 }2122 public List getSalas() {23 return this.chatBean.listaSalas();24 }2526 public void setSala(String sala) {27 this.sala = sala;28 }2930 public String getSala() {31 return sala;32 }33 }

    4. Adicione o arquivo chat.xhtml na pasta WebContent do projeto chatWeb com o se-guinte contedo.

    53 K19 Treinamentos

  • Singleton Session Beans

    1 34 89

    10 Chat11 1213 14 15 16 17 1819 2021 22 23 24 25 26 27 2829

    5. Adicione o projeto chatWeb no glassfish e teste a aplicao acessando a url http://localhost:8080/chatWeb/chat.xhtml atravs de dois navegadores.

    6. (Opcional) Implemente a remoo de salas.

    4.4 Ciclo de VidaAs instncias dos Singleton Session Beans so administradas pelo EJB Container. Devemos

    entender o de ciclo de vida desses objetos para utilizar corretamente a tecnologia EJB. Paraentender mais facilmente o ciclo de vida das instncias dos Singleton Session Beans, devemossempre ter em mente que o EJB Container cria apenas uma instncia de cada Session Beandesse tipo.

    4.4.1 EstadosO ciclo de vida das instncias dos Singleton Session Beans possui dois estados.

    1. NO EXISTE

    2. PRONTO

    4.4.2 NO EXISTE -> PRONTOAntes de ser criada, dizemos que uma instncia de um Singleton Session Bean se encon-

    tra no estado NO EXISTE. Obviamente, nesse estado, uma instncia no pode atender aschamadas dos clientes da aplicao.

    www.k19.com.br 54

  • Singleton Session Beans

    O EJB Container cria apenas uma instncia para cada Singleton Session Bean. Por padro, oEJB Container quem decide quando a criao da instncia de um Singleton Session Bean deveser realizada. Contudo, possvel determinar que essa criao seja realizada na inicializaoda aplicao atravs da anotao @Startup.

    1 @Singleton2 @Startup3 class ContadorDeUsuariosBean {45 private int contador = 0;67 public void adiciona() {8 this.contador++;9 }

    1011 public int getContador() {12 return this.contador;13 }14 }

    Quando a instncia de um Singleton Session Bean criada, ela passa para do estado NOEXISTE para o estado PRONTO e pode atender as chamadas dos clientes da aplicao.

    4.4.3 PRONTO -> NO EXISTE

    Quando a aplicao finalizada, o EJB Container destri as instncias dos Singleton Ses-sion Beans. Dessa forma, elas passam do estado PRONTO para o NO EXISTE.

    55 K19 Treinamentos

  • Singleton Session Beans

    4.4.4 CallbacksPodemos associar lgicas especficas nas transies de estado no ciclo de vida dos Singleton

    Session Beans.

    @PostConstruct

    Podemos registrar um mtodo de instncia no EJB Container para que ele o execute emcada instncia logo aps ela ser criada. Esse registro realizado atravs da anotao @Post-Construct.

    1 @Singleton2 class ContadorDeUsuariosBean {34 @PostConstruct5 public void inicializando() {6 System.out.println("Contador de usurios criado...");7 }89 // METODOS DE NEGOCIO

    10 }

    O EJB Container utiliza o construtor sem argumentos para criar a instncia de um SingletonSession Bean. Depois de chamar o construtor sem argumentos, o EJB Container injeta eventu-ais dependncias na instncia criada. Por fim, os mtodos anotados com @POSTCONSTRUCTso executados.

    @PreDestroy

    Tambm podemos registrar um mtodo de instncia no EJB Container para que ele o exe-cute em cada instncia imediatamente antes dela ser destruda. Esse registro realizado atravsda anotao @PreDestroy.

    1 @Singleton2 class ContadorDeUsuariosBean {34 @PreDestroy5 public void destruindo() {6 System.out.println("Contador de usurios ser destrudo...");7 }89 // METODOS DE NEGOCIO

    10 }

    www.k19.com.br 56

  • Captulo 5

    Persistncia

    5.1 Data Sources

    Aplicaes Java se comunicam com banco de dados atravs de conexes JDBC. Para es-tabelecer uma conexo JDBC, algumas informaes como usurio, senha e base de dados sonecessrias.

    As configuraes relativas s conexes JDBC podem ser definidas nas aplicaes ou nosservidores de aplicao. Quando definidas em uma aplicao sero utilizadas somente por essaaplicao. Quando definidas em um servidor de aplicao podem ser utilizadas em diversasaplicaes.

    Em um servidor de aplicao, as configuraes JDBC so definidas em componentes cha-mados Data Sources. A criao de Data Sources depende do servidor de aplicao utilizado.Em particular, no Glassfish, os Data Sources podem ser criados atravs da interface de admi-nistrao.

    Os Data Sources permitem que uma nica configurao JDBC seja utilizada por diversasaplicaes. 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 o servio de transaes dos servidoresde aplicao. Esse servio definido pela especificao Java Transaction API (JTA).

    5.2 Exerccios

    1. Copie o arquivo mysql-connector-java-5.1.13-bin.jar que se encontra na pasta K19-Arquivos/MySQL-Connector-JDBC da rea de Trabalho para a pasta glassfishv3/glassfish/libtambm da rea de Trabalho.

    2. Atravs do MySQL Query Browser, apague a base de dados k22 caso ela exista. Depois,crie uma base de dados chamada k22.

    3. Com o Glassfish inicializado, abra a interface de administrao acessando a url localhost:4848. Siga os passos abaixo:

    57

  • Persistncia

    4. Defina os seguintes valores para as seguintes propriedades:

    DatabaseName: k22

    Password: root

    ServerName: localhost

    URL: jdbc:mysql://localhost:3306/k22

    url: jdbc:mysql://localhost:3306/k22

    user: root

    www.k19.com.br 58

  • Persistncia

    Depois, clique em finish.

    5. Para testar o Connection Pool K19, siga os passos abaixo:

    59 K19 Treinamentos

  • Persistncia

    OBS: A mensagem Ping Succeeded deve aparecer.

    6. Agora vamos criar o Data Source. Siga os passos abaixo:

    www.k19.com.br 60

  • Persistncia

    5.3 persistence.xmlEm um ambiente Java EE, diversas configuraes relativas persistncia so realizadas nos

    Data Sources. Contudo, algumas configuraes ainda devem ser realizadas pelas aplicaes.A especificao JPA determina que cada aplicao contenha um arquivo de configuraes cha-mado persistence.xml dentro de uma pasta chamada META-INF no classpath da aplicao.

    No arquivo persistece.xml podemos definir qual Data Source ser utilizado pela aplicao.

    1 2 67 8 org.hibernate.ejb.HibernatePersistence9 jdbc/K19

    1011 12 13 14 15 16 17 18

    5.4 Entity BeansAs 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 cha-

    61 K19 Treinamentos

  • Persistncia

    mados Entity Beans. So exemplos de Entity Beans que poderiam formar uma aplicao:

    clientes

    produtos

    pedidos

    funcionrios

    fornecedores

    5.5 Entity Classes e MapeamentoOs Entity Beans so definidos por classes java (Entity Classes). As Entity Classes devem

    ser mapeadas para tabelas no banco de dados atravs de anotaes ou XML. As principaisanotaes 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 tabe-las possuem os mesmos nomes das classes. Mas, podemos alterar esse comportamentoutilizando a anotao @TABLE.

    Os atributos declarados em uma classe anotada com @ENTITY so mapeados para colu-nas na tabela correspondente classe. Outra vez, por conveno, as colunas possuem osmesmos nomes dos atributos. E novamente, podemos alterar esse padro utilizando paraisso a anotao @COLUMN.

    @Id Utilizada para indicar qual atributo de uma classe anotada com @ENTITY ser mapeadopara a chave primria da tabela correspondente classe. Geralmente o atributo anotadocom @ID do tipo LONG.

    @GeneratedValue Geralmente vem acompanhado da anotao @ID. Serve para indicar queo valor de um atributo que compe uma chave primria deve ser gerado pelo banco nomomento em que um novo registro inserido.

    Supondo uma aplicao que administra livros e autores. As seguintes classes so exem-plos de Entity Classes mapeadas com anotaes que poderiam ser utilizadas no contexto dessaaplicao:

    1 @Entity2 public class Livro {34 @Id @GeneratedValue5 private Long id;67 private String nome;89 private Double preco;

    1011 // GETTERS AND SETTERS12 }

    www.k19.com.br 62

  • Persistncia

    1 @Entity2 public class Autor {34 @Id @GeneratedValue5 private Long id;67 private String nome;89 @ManyToMany

    10 private List livros;1112 // GETTERS AND SETTERS13 }

    Consulte a apostila do curso Persistncia com JPA 2 para obter detalhes sobre o mapea-mento das Entity Classes http://www.k19.com.br/downloads/apostilas-java.

    5.6 Exerccios

    7. Crie um Dynamic Web Project no eclipse chamado persistenciaWeb. Voc pode digitarCTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, siga exata-mente as imagens abaixo.

    63 K19 Treinamentos

  • Persistncia

    www.k19.com.br 64

  • Persistncia

    8. Adicione uma pasta chamada META-INF na pasta src do projeto persistenciaWeb.

    9. Faa as configuraes de persistncia adicionando o arquivo persistence.xml na pastaMETA-INF.

    1 2 67 8 org.hibernate.ejb.HibernatePersistence9 jdbc/K19

    1011 12 13 14 15 16 17 18

    10. Crie um pacote chamado entidades no projeto persistenciaWeb e adicione nesse pacoteuma Entity Class para definir os livros de uma editora.

    65 K19 Treinamentos

  • Persistncia

    1 @Entity2 public class Livro {34 @Id @GeneratedValue5 private Long id;67 private String nome;89 private Double preco;

    1011 // GETTERS AND SETTERS12 }

    11. Adicione no pacote entidades uma Entity Class para definir autores dos livros de umaeditora.

    1 @Entity2 public class Autor {34 @Id @GeneratedValue5 private Long id;67 private String nome;89 @ManyToMany

    10 private List livros = new ArrayList();1112 // GETTERS AND SETTERS13 }

    12. Adicione o projeto persistenciaWeb no glassfish. Clique com o boto direito no glassfishda view Servers e escolha a opo Add and Remove.

    5.7 Entity ManagersOs Entity Managers so objetos que administram os Entity Beans. As principais responsa-

    bilidade dos Entity Managers so:

    Recuperar as informaes armazenadas no banco de dados.

    Montar Entity Beans com os dados obtidos do banco de dados atravs de consultas.

    Sincronizar o contedo dos Entity Beans com os registros das tabelas do banco de dados.

    Consulte a apostila do curso Persistncia com JPA 2 para obter detalhes sobre o funciona-mento dos Entity Managers http://www.k19.com.br/downloads/apostilas-java.

    5.7.1 Obtendo Entity ManagersEm um ambiente Java SE, o controle da criao e do fechamento dos Entity Managers

    responsabilidade das aplicaes. Uma aplicao Java SE deve chamar, explicitamente, omtodo CREATEENTITYMANAGER() em uma Entity Manager Factory para obter um novoEntity Manager ou o mtodo CLOSE() em um Entity Manager para fech-lo.

    1 EntityManager manager = factory.createEntityManager();

    www.k19.com.br 66

  • Persistncia

    1 manager.close();

    Por outro lado, em um ambiente Java EE, o gerenciamento dos Entity Managers pode seratribudo ao servidor de aplicao. Nesse caso, para uma aplicao Java EE obter um EntityManager, ela pode utilizar o recurso de Injeo de Dependncia oferecido pelo servidor deaplicao. Por exemplo, dentro de um Session Bean, podemos pedir a injeo de um EntityManager atravs da anotao @PersistenceContext.

    1 @Stateless2 public class CalculadoraBean {34 @PersisteceContext5 private EntityManager manager;67 // Resto do cdigo8 }

    5.8 Entity Manager FactoriesAs Entity Managers Factories so objetos responsveis pela criao de Entity Managers

    de acordo com as configuraes definidas no arquivo PERSISTENCE.XML, nos Data Sources eatravs das anotaes de mapeamento nas Entity Classes.

    5.8.1 Obtendo Entity Manager FactoriesEm um ambiente Java SE, uma Entity Manager Factory obtida atravs do mtodo esttico

    createEntityManagerFactory() da classe Persistence.1 EntityManagerFactory factory = Persistence.createEntityManagerFactory("unidade");

    O mtodo createEntityManagerFactory() deve ser chamado apenas uma vez a cada exe-cuo da aplicao. No necessrio cham-lo mais do que uma vez porque a aplicao nonecessita 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 ManagerFactories responsabilidade do servidor de aplicao. Inclusive, o servidor de aplicao evitaa criao de fbricas desnecessrias.

    Se uma aplicao Java EE deseja obter a Entity Manager Factory criada pelo servidor deaplicao, ela deve utilizar a anotao @PersistenceUnit para pedir a injeo desse objeto.

    1 @Stateless2 public class CalculadoraBean {34 @PersisteceUnit5 private EntityManagerFactory factory;67 // Resto do cdigo8 }

    Em geral, as aplicaes Java EE no necessitam interagir diretamente com as Entity Mana-ger Factories. Na verdade, o comum utilizar diretamente os Entity Managers que so obtidoscom a anotao @PERSISTECECONTEXT.

    1 @Stateless2 public class CalculadoraBean {

    67 K19 Treinamentos

  • Persistncia

    34 @PersisteceContext5 private EntityManager manager;67 // Resto do cdigo8 }

    5.9 Exerccios13. Crie um pacote chamado sessionbeans no projeto persistenciaWeb e adicione nesse

    pacote um SLSB para funcionar como repositrio de livros.

    1 @Stateless2 public class LivroRepositorio {34 @PersistenceContext5 private EntityManager manager;67 public void adiciona(Livro livro) {8 this.manager.persist(livro);9 }

    1011 public List getLivros() {12 TypedQuery query = this.manager.createQuery(13 "select x from Livro x", Livro.class);1415 return query.getResultList();16 }17 }

    14. Crie um pacote chamado managedbeans no projeto persistenciaWeb e adicione nessepacote um Managed Bean para oferecer algumas aes para as telas.

    1 @ManagedBean2 public class LivroMB {34 @EJB5 private LivroRepositorio repositorio;67 private Livro livro = new Livro();89 private List livrosCache;

    1011 public void adiciona(){12 this.repositorio.adiciona(this.livro);13 this.livro = new Livro();14 this.livrosCache = null;15 }1617 public List getLivros(){18 if(this.livrosCache == null){19 this.livrosCache = this.repositorio.getLivros();20 }21 return this.livrosCache;22 }2324 public Livro getLivro() {25 return livro;26 }2728 public void setLivro(Livro livro) {29 this.livro = livro;30 }31 }

    www.k19.com.br 68

  • Persistncia

    15. Crie uma tela para cadastrar livros. Adicione na pasta WebContent um arquivo chamadolivros.xhtml com o seguinte contedo.

    1 34 89

    10 Livros11 1213 14 Novo Livro15 16 17 1819 20 2122 23 2425 Lista de Livros26 27 28 29 30 31 32 33 34 35

    16. (Opcional) Implemente a remoo e alterao de livros.

    17. (Opcional) Implemente a adio, listagem, remoo e alterao de autores.

    69 K19 Treinamentos

  • Persistncia

    www.k19.com.br 70

  • Captulo 6

    Transaes

    Geralmente, uma aplicao realiza diversas tarefas diferentes. Tambm comum e muitasvezes necessrio dividir as tarefa em pequenos passos. Da surge o conceito de transao. Umatransao um conjunto de passos que devem ser executados em uma ordem especfica paraque uma determinada tarefa seja realizada. Tipicamente, as transaes modificam informa-es armazenadas em resources (bases de dados, filas de mensagens, sistemas corporativos deinformao - EIS, entre outros).

    6.1 ACIDAlm da restrio natural de ordem, as transaes possuem outras quatro propriedades fun-

    damentais: Atomicidade, Consistncia, Isolamento e Durabilidade. A sigla ACID utilizadapara indicar a existncia dessas propriedades.

    Atomicidade: Todos os passos de uma transao devem ser executados com sucesso para que aprpria transao seja executada com sucesso. Se algum passo falhar a transao falhare todos os passos realizados at o momento da falha sero desfeitos.

    Consistncia: No pode existir inconsistncia nos dados da aplicao nem antes nem depoisda execuo de uma transao. Ou seja, uma transao leva a aplicao de um estadoconsistente para outro estado consistente.

    Isolamento: Alteraes realizadas por uma transao no finalizada no podem afetar opera-es que no fazem parte da transao.

    Durabilidade: Aps a confirmao de uma transao, as modificaes realizadas por ela de-vem ser refletidas nos resources mesmo que acontea uma falha de hardware.

    6.2 Transao Local ou DistribudaQuando as alteraes realizadas por uma transao afetam apenas um resource (bases de

    dados, filas de mensagens, sistemas corporativos de informao - EIS, entre outros), dizemosque a transao local. Caso contrrio, se dois ou mais resources so modificados por umanica transao ela dita distribuda.

    71

  • Transaes

    6.3 JTA e JTS

    Todo servidor de aplicao Java EE deve oferecer suporte para as aplicaes utilizaremtransaes. As especificaes relacionadas a esse tpico so: Java Transaction API - JTA e JavaTransaction Service - JTS. Os documentos dessas especificaes podem ser obtidos atravs dosite: www.jcp.org.

    A especificao Enterprise Java Beans (EJB) fortemente integrada com as especificaesJTA e JTS, simplificando bastante o trabalho dos desenvolvedores de aplicao EJB que noprecisam em momento nenhum lidar diretamente com JTS e muito pouco com JTA.

    Na arquitetura EJB, as aplicaes podem gerenciar as transaes de dois modos:

    Container Managed Transactions - CMT

    Bean Managed Transactions - BMT

    6.4 Container Managed Transactions - CMT

    Quando optamos pelo gerenciamento CMT, a responsabilidade de abrir, confirmar ou abor-tar transaes atribuda ao EJB Container. Contudo, a aplicao deve indicar ao EJB Contai-ner atravs de configuraes quando ele deve abrir, confirmar ou abortar transaes.

    Podemos definir o modo CMT individualmente para cada Session Bean da nossa aplicaoatravs da anotao @TransactionManagement.

    1 @Stateful2 @TransactionManagement(TransactionManagementType.CONTAINER)3 public class CarrinhoBean {4 ...5 }

    O modo CMT padro. Dessa forma, tecnicamente, no necessrio acrescentar a anotao@TRANSACTIONMANAGEMENT. Mas, podemos adicion-la com o intuito de explicitar aopo de gerenciamento transacional.

    6.4.1 Atributo Transacional

    O EJB Container abre, confirma, aborta ou suspende transaes de acordo com o atributotransacional de cada mtodo dos Session Beans em modo CMT. O atributo transacional de ummtodo pode ser definido com um dos seguintes valores: REQUIRED, REQUIRES_NEW,SUPPORTS, MANDATORY, NOT_SUPPORTED e NEVER.

    O comportamento do EJB Container o seguinte:

    www.k19.com.br 72

  • Transaes

    Atributo Transacional J existia uma transao aberta? O que o EJB Container faz?REQUIRED NO Abre uma nova transaoREQUIRED SIM Usa a transao que j estava

    abertaREQUIRES_NEW NO Abre uma nova transaoREQUIRES_NEW SIM Abre uma transao e Sus-

    pende a que estava abertaSUPPORTS NO No faz nadaSUPPORTS SIM Usa a transao que j estava

    abertaMANDATORY NO Lana EJBTransactionRequi-

    redExceptionMANDATORY SIM Usa a transao que j estava

    abertaNOT_SUPPORTED NO No faz nadaNOT_SUPPORTED SIM Suspende a que estava aberta

    NEVER NO No faz nadaNEVER SIM Lana EJBException

    O atributo transacional de um mtodo pode ser definido pela anotao @TransactionAt-tribute.

    1 @TransactionAttribute(TransactionAttributeType.REQUIRED)2 public void adiciona(String produto){3 ...4 }

    Quando queremos que todos os mtodos de um Session Bean possuam o mesmo atributotransacional, devemos anotar a classe com @TRANSACTIONATTRIBUTE.

    1 @Stateful2 @TransactionManagement(TransactionManagementType.CONTAINER)3 @TransactionAttribute(TransactionAttributeType.REQUIRED)4 public class CarrinhoBean {5 ...6 }

    Caso nenhum atributo transacional seja definido explicitamente, o EJB Container utilizarpor padro o REQUIRED.

    6.4.2 Rollback com SessionContext

    Quando algum erro identificado pela aplicao, ela pode marcar a transao corrente pararollback atravs do SETROLLBACKONLY() do Session Context que pode ser obtido atravs deinjeo com a anotao @RESOURCE.

    73 K19 Treinamentos

  • Transaes

    1 @Stateful2 public class CarrinhoBean {34 @Resource5 private SessionContext context;67 public void adiciona(String produto){8 if(produto == null){9 context.setRollbackOnly();

    10 }11 ...12 }13 }

    6.4.3 Rollback com ExceptionsQuando exceptions ocorrem, transaes podem ser abortadas pelo EJB Container. Devemos

    entender a classificao das exceptions para saber quando as transaes sero abortadas.Na arquitetura EJB, as exceptions so classificadas em dois grupos:

    System Exceptions: Todas Unchecked Exceptions e as JAVA.RMI.REMOTEEXCEPTION, porpadro, so consideradas System Exceptions.

    Application Exceptions: Todas Checked Exceptions exceto as JAVA.RMI.REMOTEEXCEPTION,por padro, so consideradas Application Exceptions.

    Por padro, quando um mtodo de um Session Bean lana uma System Exception, o EJBContainer aborta a transao corrente. Por outro lado, quando uma Application Exception lanada, o EJB Container no aborta a transao corrente.

    Podemos utilizar a anotao @ApplicationException para alterar a classificao de umaSystem Exception.

    1 @ApplicationException2 public class ValorNegativoException extends RuntimeException {34 }

    A mesma anotao pode alterar o comportamento padro para rollback das ApplicationExceptions.

    1 @ApplicationException(rollback=true)2 public class ValorNegativoException extends RuntimeException {34 }

    6.5 Bean Managed Transactions - BMTQuando optamos pelo gerenciamento BMT, a responsabilidade de abrir, confirmar ou abor-

    tar transaes atribuda a aplicao. Podemos definir o modo BMT individualmente para cadaSession Bean da nossa aplicao atravs da anotao @TransactionManagement.

    www.k19.com.br 74

  • Transaes

    1 @Stateful2 @TransactionManagement(TransactionManagementType.BEAN)3 public class CarrinhoBean {4 ...5 }

    No modo BMT, devemos injetar um UserTransaction atravs da anotao @RESOURCE.Esse objeto permite que a aplicao abra, confirme ou aborte transaes.

    1 @Stateful2 @TransactionManagement(TransactionManagementType.BEAN)3 public class CarrinhoBean {4 @Resource5 private UserTransaction ut;67 public void adiciona(Produto p) {8 try {9 ut.begin();

    10 // IMPLEMENTACAO11 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.

    6.6 Exerccios

    1. Crie um Dynamic Web Project no eclipse chamado transacoesWeb. Voc pode digitarCTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, siga exata-mente as imagens abaixo.

    75 K19 Treinamentos

  • Transaes

    www.k19.com.br 76

  • Transaes

    77 K19 Treinamentos

  • Transaes

    2. Adicione uma pasta chamada META-INF na pasta src do projeto transacoesWeb.

    3. Faa as configuraes de persistncia adicionando o arquivo persistence.xml na pastaMETA-INF.

    1 2 67 8 org.hibernate.ejb.HibernatePersistence9 jdbc/K19

    1011 12 13 14 15 16 17 18

    4. Crie um pacote chamado entidades no projeto transacoesWeb e adicione nesse pacoteuma Entity Class para definir os produtos de uma loja.

    1 @Entity2 public class Produto {34 @Id @GeneratedValue5 private Long id;67 private String nome;89 private double preco;

    1011 // GETTERS AND SETTERS12 }

    5. Crie um pacote chamado sessionbeans no projeto transacoesWeb e adicione nesse pa-cote um SLSB para funcionar como repositrio de produtos.

    1 @Stateless2 public class ProdutoRepositorio {34 @PersistenceContext5 private EntityManager manager;67 @Resource8 private SessionContext context;9

    10 public void adiciona(Produto produto) {11 this.manager.persist(produto);12 if(produto.getPreco() < 0){13 this.context.setRollbackOnly();14 }15 }1617 public List getProdutos() {18 TypedQuery query = this.manager.createQuery(

    www.k19.com.br 78

  • Transaes

    19 "select x from Produto x", Produto.class);2021 return query.getResultList();22 }23 }

    6. Crie um pacote chamado managedbeans no projeto transacoesWeb e adicione nessepacote um Managed Bean para oferecer algumas aes para as telas.

    1 @ManagedBean2 public class ProdutoMB {34 @EJB5 private ProdutoRepositorio repositorio;67 private Produto produto = new Produto();89 private List produtosCache;

    1011 public void adiciona(){12 this.repositorio.adiciona(this.produto);13 this.produto = new Produto();14 this.produtosCache = null;15 }1617 public List getProdutos(){18 if(this.produtosCache == null){19 this.produtosCache = this.repositorio.getProdutos();20 }21 return this.produtosCache;22 }2324 public void setProduto(Produto produto) {25 this.produto = produto;26 }2728 public Produto getProduto() {29 return produto;30 }31 }

    7. Adicione o projeto persistenciaWeb no glassfish. Clique com o boto direito no glassfishda view Servers e escolha a opo Add and Remove.

    8. Crie uma tela para adicionar produtos.

    79 K19 Treinamentos

  • Transaes

    1 34 89

    10 Produtos11 1213 14 Novo Produto15 16 17 1819 20 2122 23 2425 Lista de Produtos26 27 28 29 30 31 32 33 34 35

    9. Adicione alguns produtos e observe que produtos com preo negativo no so persistidosdevido ao rollback.

    www.k19.com.br 80

  • Captulo 7

    Segurana

    Para muitas aplicaes, a segurana um aspecto obrigatrio. Da segurana podemos ex-trair dois processos fundamentais: Autenticao e Autorizao.

    O processo de autenticao consiste na identificao dos usurios atravs de algum tipode certificado (usurio e senha). J o processo de autorizao determina o que cada usurioautenticado pode acessar dentro da aplicao.

    Na plataforma Java, esses dois processos so padronizados pela especificao JAAS (JavaAuthentication and Authorization Service).

    7.1 Realms

    Em um ambiente Java EE, para realizar o processo de autenticao, devemos criar um oumais Realms. Um Realm uma base de dados na qual os usurios de uma ou mais aplicaesesto cadastrados.

    Infelizmente, as configuraes necessrias para criar um Realm no so padronizadas, ouseja, cada servidor de aplicao as realiza da sua prpria maneira. Veremos no exerccio comocriar um Realm no Glassfish.

    7.2 Exerccios

    1. Com o Glassfish inicializado, abra a interface de administrao acessando a url localhost:4848. Siga os passos abaixo:

    81

  • Segurana

    2. Adicione um usurio chamado K19 dentro de um grupo chamado admin com a senhaK19. Siga os passos abaixo:

    www.k19.com.br 82

  • Segurana

    83 K19 Treinamentos

  • Segurana

    3. Repita o processo do exerccio anterior e cadastre os seguintes usurios:

    Usurio Grupo Senhakeizo admin keizoafk users afk

    7.3 Autenticao - Aplicaes WebGeralmente, o processo de autenticao realizado na camada web. Portanto, vamos res-

    tringir a nossa discusso a esse tipo de aplicao.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

    www.k19.com.br 84

  • Segurana

    exigem configuraes extras. Veremos no exerccio como configurar uma aplicao web noGlassfish para realizar o processo de autenticao.

    7.4 Exerccios

    4. Crie um Dynamic Web Project no eclipse chamado segurancaWeb. Voc pode digitarCTRL+3 em seguida new Dynamic Web Project e ENTER. Depois, siga exata-mente as imagens abaixo.

    85 K19 Treinamentos

  • Segurana

    www.k19.com.br 86

  • Segurana

    87 K19 Treinamentos

  • Segurana

    5. Acrescente no arquivo sun-web.xml do projeto segurancaWeb o seguinte trecho de c-digo logo aps o elemento CONTEXT-ROOT.

    1 2 ADMIN3 admin4 56 7 USERS8 users9

    Essa configurao especfica do Glassfish.

    Os grupos so utilizados pelo Glassfish e os roles pela aplicao.

    6. Acrescente no arquivo web.xml do projeto segurancaWeb o seguinte trecho de cdigodentro do elemento WEB-APP.

    www.k19.com.br 88

  • Segurana

    1 2 BASIC3 K19-Realm4 56 7 8 resources9 /*

    10 GET11 POST12 13 14 ADMIN15 USERS16 17

    7. Adicione o arquivo index.xhtml na pasta WebContent do projeto segurancaWeb comseguinte contedo.

    1 34 89

    10 Segurana11 1213 14 Voc est autenticado!15 16

    8. Adicione o projeto segurancaWeb no glassfish. Clique com o boto direito no glassfishda view Servers e escolha a opo Add and Remove.

    9. Acesse atravs de um navegador a url http://localhost:8080/segurancaWeb/index.xhtml e teste o processo de autenticao.

    7.5 Autorizao - Aplicaes EJBPodemos limitar o acesso dos usurios aos mtodos de um Session Bean. Por exemplo,

    possvel declarar que um determinado mtodo de um Session Bean s pode ser chamado porusurios administradores ou moderadores.

    7.5.1 @RolesAllowedRestries de acesso podem ser definidas pela anotao @RolesAllowed que pode ser apli-

    cada na classe ou nos mtodos de um Session Bean. Se aplicada na classe valer para todos

    89 K19 Treinamentos

  • Segurana

    os mtodos. Se aplicada ao mesmo tempo na classe e em algum mtodo, valer as restriesdefinidas no mtodo.

    1 @RolesAllowed({"administrador", "moderador"})2 public void adiciona(Produto produto){3 this.manager.persist(produto);4 }

    1 @RolesAllowed({"administrador", "moderador"})2 @Stateful3 class CarrinhoBean {4 ...5 }

    7.5.2 @PermitAllPodemos utilizar a anotao @PermitAll para permitir que qualquer tipo de usurio te-

    nha acesso. Para conseguir o mesmo efeito com a anotao @RolesAllowed, teramos quelistar todos os Roles. Alm disso, caso um Role fosse criado ou destrudo, alteraes seriamnecessrias.

    1 @PermitAll2 public void adiciona(Produto produto){3 this.manager.persist(produto);4 }

    1 @PermitAll2 @Stateful3 class CarrinhoBean {4 ...5 }

    7.5.3 @DenyAllO funcionamento da anotao @DenyAll exatamente o oposto da @PERMITALL. Pode-

    mos utilizar a anotao @DENYALL em aplicaes que so implantadas em ambientes dife-rentes. Sendo que em determinados ambientes certas funcionalidades devem ser desabilitadas.

    1 @DenyAll2 public void adiciona(Produto produto){3 this.manager.persist(produto);4 }

    1 @DenyAll2 @Stateful3 class CarrinhoBean {4 ...5 }

    7.5.4 @RunAsEventualmente, um Session Bean chama outro Session Bean. Suponha, que os mtodos

    do primeiro possam ser executados por usurios moderadores e os mtodos do segundo poradministradores. Para que o primeiro Session Bean possa chamar o Segundo, temos que definiro papel de administrador para o primeiro Session Bean atravs da anotao @RunAs.

    www.k19.com.br 90

  • Segurana

    1 @Stateless2 @RunAs("administrador")3 class MensagemRepositorio {45 @PersistenceContext6 private EntityManager manager;78 @EJB9 private TopicoRepositorio topicoRepositorio;

    1011 @RolesAllowed({"moderador"})12 public void remove(Long id){13 Mensagem m = this.manager.find(Mensagem.class, id);14 this.manager.remove(m);1516 Topico t = m.getTopico();1718 if(t.getMensagens().size() == 1){19 this.topicoRepositorio.remove(t);20 }21 }22 }

    7.6 Exerccios10. Crie um pacote chamado sessionbeans no projeto segurancaWeb e adicione nesse pa-

    cote um Singleton Session Bean.

    1 @Singleton2 public class TarefasBean {34 private List tarefas = new ArrayList();56 @RolesAllowed({"ADMIN", "USERS"})7 public void adiciona(String tarefa){8 this.tarefas.add(tarefa);9 }

    1011 @RolesAllowed({"ADMIN", "USERS"})12 public List listaTarefas() {13 return this.tarefas;14 }1516 @RolesAllowed({"ADMIN"})17 public void remove(String tarefa){18 this.tarefas.remove(tarefa);19 }20 }

    11. Crie um pacote chamado managedbeans no projeto segurancaWeb e adicione nessepacote um Managed Bean.

    1 @ManagedBean2 public class TarefasMB {34 @EJB5 private TarefasBean tarefasBean;67 private String tarefa;89 public void adiciona(){

    10 this.tarefasBean.adiciona(this.tarefa);11 }

    91 K19 Treinamentos

  • Segurana

    1213 public void remove(String tarefa){14 this.tarefasBean.remove(tarefa);15 }1617 public List getTarefas(){18 return this.tarefasBean.listaTarefas();19 }2021 // GETTERS AND SETTERS22 }

    12. Altere o arquivo index.xhtml do projeto segurancaWeb.

    1 34 89

    10 Segurana11 1213 14 Voc est autenticado!15 Nova Tarefa16 17 18 1920 2122 Lista de Tarefas23 24 25 26 27 28 remove29 30 31 32 33

    13. Adicione e remova tarefas utilizando todos os usurios cadastrados. Observe que usu-rios com Role USERS no conseguem remover tarefas.

    www.k19.com.br 92

  • Captulo 8

    Interceptadores

    Uma aplicao EJB pode definir, atravs de mtodos de callback, lgicas a serem executa-das pelo EJB Container quando uma instncia de um Session Bean muda de estado.

    O mtodo de callback PostConstruct executado quando uma instncia de um SessionBean de qualquer tipo muda do estado NO EXISTE para o PRONTO.

    O mtodo de callback PreDestroy executado quando uma instncia de um SessionBean muda do estado PRONTO para o NO EXISTE.

    O mtodo de callback PrePassivate executado quando uma instncia de um StatefulSession Bean muda do estado PRONTO para o PASSIVADO.

    O mtodo de callback PostActivate executado quando uma instncia de um StatefulSession Bean muda do estado PASSIVADO para o PRONTO.

    H um mtodo de callback para cada uma das seguintes transies: NO EXISTE->PRONTO,PRONTO->PASSIVADO, PASSIVADO->PRONTO e PRONTO->NO EXISTE. Alm dessastransies, podemos considerar que toda vez que um mtodo de negcio chamado ocorre atransio PRONTO->PRONTO. No h mtodo de callback para essa transio especial. Con-tudo, na arquitetura EJB, podemos utilizar a ideia de interceptadores para conseguir executarlgicas antes ou depois da execuo de um mtodo de negcio.

    comum utilizar interceptadores para tarefas que no esto diretamente relacionadas sre