34
Universidade Potiguar Pós-Graduação em Projeto e Desenvolvimento de Sistemas Web Tutorial para desenvolvimento Java Enterprise Edition para Web Prof. Msc. Frank Viana

Tutorial para desenvolvimento Java Enterprise Edition para Web

Embed Size (px)

DESCRIPTION

Tutorial Java

Citation preview

Page 1: Tutorial para desenvolvimento Java Enterprise Edition para Web

Universidade Potiguar

Pós-Graduação em Projeto e Desenvolvimento de Sistemas Web

Tutorial para desenvolvimento Java Enterprise

Edition para Web

Prof. Msc. Frank Viana

NATAL/RN

2008

Page 2: Tutorial para desenvolvimento Java Enterprise Edition para Web

SUMÁRIO

1 Modelagem...................................................................................................................4

1.1 Requisitos..............................................................................................................4

1.2 Diagrama de classes..............................................................................................4

2 Projeto de aplicação corporativa..................................................................................4

3 Camada de persistência................................................................................................5

3.1 Banco de dados MySQL.......................................................................................5

3.2 Unidade de persistência e entidades......................................................................5

3.2.1 Arquivo Aeroporto.java.................................................................................6

3.2.2 Arquivo Passageiro.java.................................................................................6

3.2.3 Arquivo Reserva.java.....................................................................................7

3.2.4 Arquivo Voo.java...........................................................................................7

3.2.5 Arquivo VooSelecionado.java.......................................................................8

4 Camada de negócios.....................................................................................................8

4.1 Interface local – Arquivo SessionFacadeGolLocal.java.......................................9

4.2 Interface remota – Arquivo SessionFacadeGolRemote.java.................................9

4.3 Session Bean – Arquivo SessionFacadeGolBean.java..........................................9

4.3.1 Classes importadas.......................................................................................10

4.3.2 Cabeçalho da classe......................................................................................10

4.3.3 Injeção de dependência: contexto de persistência........................................10

4.3.4 Serviços CRUD sem o R (Create/Update/Delete)........................................10

4.3.5 Serviços de consulta (R - Recovery) sem parâmetros..................................11

4.3.6 Serviço de consulta com parâmetros............................................................11

4.3.7 Conversão de lista de Voo para lista de VooSelecionado............................11

4.3.8 Serviço para localizar um passageiro pelo login e senha.............................12

4.3.9 Serviço para confirmar uma reserva.............................................................12

4.3.10 Serviço para retornar os vôos de hoje........................................................12

5 Camada de apresentação............................................................................................13

5.1 Suporte a Visual Web Java Server Faces............................................................13

5.2 Diagrama de navegação de páginas....................................................................13

5.3 Classe Utilitária para criar faixas de opções.......................................................14

5.4 Formulário de compra de passagem....................................................................15

Page 3: Tutorial para desenvolvimento Java Enterprise Edition para Web

5.4.1 Imagem.........................................................................................................15

5.4.2 Java Server Faces.........................................................................................15

5.4.3 Listagem.......................................................................................................16

5.5 Formulário de seleção de vôo..............................................................................17

5.5.1 Imagem do formulário..................................................................................17

5.5.2 Java Server Faces.........................................................................................17

5.5.3 Listagem.......................................................................................................18

5.6 Formulário de login.............................................................................................19

5.6.1 Imagem do formulário..................................................................................19

5.6.2 Propriedades dos componentes....................................................................19

5.6.3 Listagem.......................................................................................................20

5.7 Formulário de novo cadastro...............................................................................20

5.7.1 Imagem do formulário..................................................................................20

5.7.2 Propriedades dos componentes....................................................................21

5.7.3 Listagem.......................................................................................................21

5.8 Formulário de confirmação.................................................................................22

5.8.1 Imagem do formulário..................................................................................22

5.8.2 Propriedades dos componentes....................................................................22

5.8.3 Listagem.......................................................................................................22

6 Cliente Java stand alone.............................................................................................23

6.1.1 Criação do projeto........................................................................................23

6.1.2 Dependências de bibliotecas........................................................................23

6.2 Classes Java.........................................................................................................24

6.2.1 Arquivo EnumServidor.java.........................................................................24

6.2.2 Arquivo ServidorException.java..................................................................24

6.2.3 Arquivo ServiceLocatorGol.java.................................................................24

6.2.4 Arquivo Console.java...................................................................................24

7 Cliente Java stand alone com WebService.................................................................25

7.1 Servidor...............................................................................................................25

7.1.1 Arquivo WebServiceGol..............................................................................25

7.2 Cliente.................................................................................................................25

7.2.1 Arquivo ConsoleWS....................................................................................25

Page 4: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

1 Modelagem

1.1 Requisitos

Os passageiros (clientes) poderão se logar no site da empresa;

Caso o passageiro não tenha cadastro, ele poderá criar um;

O passageiro poderá fazer a reserva de passagens aéreas;

Os vôos deverão especificar o dia, hora e o número de assentos disponíveis;

A reserva deverá especificar se o vôo é somente de ida ou de ida e volta;

A reserva será feita em nome do passageiro e conterá o número de adultos, crianças

e bebês que viajarão;

Após o passageiro escolher a origem e destino, o sistema deverá exibir a lista de

vôos disponíveis para aquele dia e permitir que selecione o vôo mais adequado.

1.2 Diagrama de classes

Após a modelagem dos requisitos, conseguimos o diagrama de classes abaixo:

2 Projeto de aplicação corporativa

Inicie o Netbeans 6.1 e crie uma nova aplicação corporativa. New Project/ Choose Project:

Enterprise/ Enterprise Application. Nome do projeto: Gol. Escolha o servidor: GlassFish. Versão:

Java EE 5. Deixe as opções criar módulo Gol-ejb e Gol-war marcadas. Clique Finish.

Serão criados três projetos: Gol, Gol-ejb e Gol-war. O primeiro é a aplicação corporativa,

que uma vez compilada gerará o arquivo Gol.ear que contém os módulos Gol-

ejb e Gol-war em seu interior.

4

Page 5: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

A camada de negócios e de persistência ficará no projeto Gol-ejb e a camada de

apresentação em Gol-war.

3 Camada de persistência

Para nossa camada de persistência usaremos o JPA (Java Persistence

API).

3.1 Banco de dados MySQL

Usaremos o banco de dados mysql para persistir nossas entidades. Crie um banco de dados

chamado gol e um usuário chamado gol com senha gol que tenha permissão de administrador sobre

o banco de dados criado.

3.2 Unidade de persistência e entidades

Criaremos nossa camada de persistência no projeto Gol-ejb. Para tanto, é necessário criar

uma unidade de persistência.

Clique no projeto Gol-ejb com o botão direito e crie uma unidade de persistência:

1. New/ Other/ Persistence/ Persistence Unit.

2. Persistence unit name: Gol-ejbPU

3. Persistence provider: TopLink

4. Data Source: New Data Source

5. JNDI Name: gol

6. Database connection: New database connection

7. Name: MySQL (Connector/J Driver)

8. Database url: jdbc:mysql://localhost/gol

9. User name: gol

10. Password: gol

11. Use Java Transactions APIs: sim

12. Table Generation Strategy: Create

13. Finish

Crie as classes Java abaixo usando o assistente de criação de classes de entidade ou se

preferir digite as listagens abaixo e use CTRL-SHIFT-I para resolver automaticamente as classes e

interfaces a serem importadas.

Nas listagens não aparecem os métodos GETTERs e SETTERs dos atributos (propriedades)

da classe. Para criá-los vá até o final do código fonte e clique ALT-INS. Em seguida selecione os

atributos desejados e confirme a criação dos métodos.

5

Page 6: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

Para manter o projeto organizado, as entidades serão criadas no pacote

br.unp.pos.gol.dominio.

3.2.1 Arquivo Aeroporto.java

Esta entidade mapeia os aeroportos de origem e destino. Além das anotações habituais que

identificam uma entidade (@Entity, @Id e @GeneratedValue), identificamos duas relações de um

para muitos entre a entidade Aeroporto e Vôo (voosOrigem e voosDestino).

1. package br.unp.pos.gol.dominio;2.3. @Entity4. public class Aeroporto implements Serializable {5.6. private static final long serialVersionUID = 1L;7.8. @Id9. @GeneratedValue(strategy = GenerationType.IDENTITY)10. private Long id;11.12. @OneToMany(mappedBy = "destino", cascade = CascadeType.ALL)13. private List<Voo> voosDestino;14.15. @OneToMany(mappedBy = "origem", cascade = CascadeType.ALL)16. private List<Voo> voosOrigem;17.18. private String nome;19. private String sigla;20.21. // GETTERS e SETTERS22. }

A relação bidirecional acima descreve que relacionado a cada Aeroporto, existe uma lista de

vôos de origem e outra lista de vôos de destino.

3.2.2 Arquivo Passageiro.java

A entidade passageiro contém os dados básicos sobre nosso cliente. Podemos ver que para

cada passageiro, existe uma lista de reservas. O email do passageiro deve ser única, diferente de

nulo e de comprimento máximo igual a 50 caracteres. A senha também deve ser diferente de vazio e

ter um comprimento máximo de 20 caracteres.

23. package br.unp.pos.gol.dominio;24.25. @Entity26. public class Passageiro implements Serializable {27.28. private static final long serialVersionUID = 1L;29.30. @Id31. @GeneratedValue(strategy = GenerationType.IDENTITY)32. private Long id;33.34. @OneToMany(mappedBy = "passageiro", cascade = CascadeType.ALL)35. private List<Reserva> reservas;36.37. @Column(unique = true, nullable = false, length = 50)38. private String email;39.40. @Column(nullable = false, length = 20)41. private String senha;42. 43. private String titulo;44. private String nome;45. private String sobrenome;46. private String endereco;47. private String cidade;

6

Page 7: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

48. private String estado;49. private String telefone;50. private String celular;51. private String fax;52. 53. // GETTERS e SETTERS54. }

3.2.3 Arquivo Reserva.java

Reserva é uma entidade associativa que liga Passageiro a Voo. Ela deve conter o número de

adultos, bebês e crianças que viajarão. A inclusão do método getTotal() permite que no Java Server

Faces, possamos associar a um rótulo a expressão #{reserva.total) e obter o total de passageiros

vinculados a essa reserva.

55. package br.unp.pos.gol.dominio;56.57. @Entity58. public class Reserva implements Serializable {59.60. private static final long serialVersionUID = 1L;61.62. @GeneratedValue(strategy = GenerationType.IDENTITY)63. @Id64. private Long id;65.66. @ManyToOne67. private Passageiro passageiro;68.69. @ManyToOne70. private Voo voo;71.72. private Integer adultos;73. private Integer bebes;74. private Integer criancas;75.76. // Total de assentos reservados77. public Integer getTotal() {78. return getAdultos() + getBebes() + getCriancas();79. }80.81. // GETTERS e SETTERS 82. }

3.2.4 Arquivo Voo.java

Esta entidade guarda informações sobre o vôo (aeroporto de origem, aeroporto de destino,

dia do vôo, hora do vôo e o número de assentos).

Especial atenção é dada aos campos dia e hora que devem conter a anotação @Temporal

que indica se o campo é uma data (DATE) ou hora (TIME).

Por meio do método getOcupacao(), podemos calcular quantos assentos já estão reservados.

Observe que não precisamos nos preocupar se os objetos estão armazenados em disco ou não. O

próprio JPA, no momento apropriado, fará a consulta ao banco e instanciará objetos que

representam os registros do banco.

O método getVagas() também está presente para calcular o número de vagas disponíveis.

83. package br.unp.pos.gol.dominio;84.85. @Entity86. public class Voo implements Serializable {87.88. private static final long serialVersionUID = 1L;89.

7

Page 8: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

90. @Id91. @GeneratedValue(strategy = GenerationType.IDENTITY)92. private Long id;93.94. @ManyToOne95. private Aeroporto origem;96.97. @ManyToOne98. private Aeroporto destino;99.100. @Temporal(javax.persistence.TemporalType.DATE)101. private Date dia;102.103. @Temporal(javax.persistence.TemporalType.TIME)104. private Date hora;105.106. private Integer assentos;107.108. @OneToMany(mappedBy = "voo", cascade = CascadeType.ALL)109. private List<Reserva> reservas;110.111. // Retorna o total de assentos reservados no voo112. public Integer getOcupacao() {113. int total = 0;114. for (Reserva reserva : getReservas()) {115. total += reserva.getTotal();116. }117. return total;118. }119. // Retorna o total de assentos vagos120.121. public Integer getVagas() {122. int total = 0;123. for (Reserva reserva : getReservas()) {124. total += reserva.getTotal();125. }126. return getAssentos() - total;127. }128.129. @Override130. public String toString() {131. return "De " + this.origem.getNome() +132. " para " + this.destino.getNome() +133. " às " + String.format("%1$TH:%1$TM", getHora()) + " [" +134. this.getVagas() + " vagas]";135. }136.137. // GETTERS e SETTERS138. }

3.2.5 Arquivo VooSelecionado.java

VooSelecionado é uma classe normal (não é uma entidade) e será usada na camada de

apresentação para guardar o vôo e se este foi selecionado para ida ou volta. Por comodidade ela está

no mesmo pacote de Voo.

139. package br.unp.pos.gol.dominio;140.141. import java.io.Serializable;142.143. public class VooSelecionado implements Serializable {144.145. Boolean selecionado;146. Voo voo;147.148. // GETTERs e SETTERs149. }

4 Camada de negócios

Na camada de negócios devemos especificar quais serviços estarão disponíveis para as

camadas superiores (camada de apresentação ou clientes externos).

8

Page 9: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

Usaremos a tecnologia EJB 3 (Enterprise Java Beans), presente na especificação Java EE 5,

para construir nossa camada de negócios.

Um EJB deve possuir uma interface local para clientes que rodarão na mesma JVM

(máquina virtual Java) e uma interface remota para clientes que estejam em uma outra JVM na

mesma máquina ou mesmo em um computador remoto.

Nossa camada de negócios estará presente no pacote br.unp.pos.gol.ejb.

4.1 Interface local – Arquivo SessionFacadeGolLocal.java

A interface local é uma simples interface (métodos sem corpo) anotada com @Local.

Somente um cliente que esteja na mesma JVM (no nosso caso a aplicação Gol-war) pode ter acesso

a ela.

150. package br.unp.pos.gol.ejb;151.152. import br.unp.pos.gol.dominio.*;153. import java.util.Date;154. import java.util.List;155. import javax.ejb.Local;156.157. @Local158. public interface SessionFacadeGolLocal {159. public List<Aeroporto> aeroportos();160. public Passageiro localizarPassageiro(String email, String senha);161. public List<Passageiro> passageiros();162. public void vincular(Voo voo, Reserva reserva);163. public List<Voo> voos();164. public List<Voo> voos(Date dia, Long origem, Long destino);165. public List<VooSelecionado> voosSelecionados(Date dia, Long origem, Long destino);166. public List<String> voosHojeLocal();167. public <T> void incluir(T o);168. public <T> T alterar(T o);169. public <T> void apagar(T o);170. }

4.2 Interface remota – Arquivo SessionFacadeGolRemote.java

A interface remota é anotada com @Remote. Tanto uma aplicação local, quanto uma remota

poderão ter acesso a esta interface. Entretanto, não é conveniente um cliente local usar essa

interface, porque seu uso implica em abertura e fechamento de conexões de rede, o que não seria

necessário se esses serviços fossem acessados por uma interface local.

171. package br.unp.pos.gol.ejb;172.173. import java.util.List;174. import javax.ejb.Remote;175.176. @Remote177. public interface SessionFacadeGolRemote {178.179. public List<String> voosHojeRemoto();180. }

4.3 Session Bean – Arquivo SessionFacadeGolBean.java

Nesta classe reside a maior parte da inteligência da aplicação (regras de negócio).

Devido à extensão desse arquivo, iremos apresentá-lo por partes.

9

Page 10: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

4.3.1 Classes importadas

Abaixo as classes que vamos precisar em nosso bean.

181. package br.unp.pos.gol.ejb;182.183. import br.unp.pos.gol.dominio.*;184. import java.util.ArrayList;185. import java.util.Date;186. import java.util.List;187. import javax.ejb.Stateless;188. import javax.persistence.EntityManager;189. import javax.persistence.PersistenceContext;

4.3.2 Cabeçalho da classe

Nosso bean é uma classe comum que implementa as interfaces SessionFacadeGolLocal e

SessionFacaGolRemote definidas anteriormente.

Em especial, essa classe é anotada com @Stateless. Isto informa ao servidor de aplicação

que essa classe é um EJB. O parâmetro mappedName informa que alguma outra classe pode se

referir a esse bean pelo nome “BeanGol”.Esse parâmetro é opcional. Se não o especificarmos, é só

informar o nome completo da interface (br.unp.pos.gol.ejb.SessionFacadeLocal ou

br.unp.pos.gol.ejb. SessionFacadeRemote) para obtermos uma instância desse tipo de bean.

190. @Stateless(mappedName = "BeanGol")191. public class SessionFacadeGolBean implements SessionFacadeGolLocal, SessionFacadeGolRemote {

4.3.3 Injeção de dependência: contexto de persistência

Quando estamos dentro de um projeto EJB que possui uma camada de persistência,

podemos solicitar ao servidor de aplicação (Glassfish no nosso caso), que instancie para nós um

EntityManager por meio da anotação @PersistenceContext. Observe que no nosso código, em

nenhum momento, precisamos iniciar a variável “em”.

192. @PersistenceContext193. EntityManager em;

4.3.4 Serviços CRUD sem o R (Create/Update/Delete)

Os três métodos abaixo permitem incluir uma nova entidade (incluir), alterar uma entidade

existente (alterar) ou apagar uma entidade existente (apagar).

Observe que para executar essas instruções, não é necessário iniciar uma transação (begin)

ou fechá-la (commit ou rollback). O próprio servidor de aplicações inicia uma transação

automaticamente. Ao final do método, se nenhum erro acontecer ocorrerá um commit automático.

Se acontecer alguma exceção, haverá um rollback automático.

194. public <T> void incluir(T o) {195. em.persist(o);196. }197.198. public <T> T alterar(T o) {199. o = em.merge(o);200. return o;201. }202.203. public <T> void apagar(T o) {204. o = em.merge(o);205. em.remove(o);

1

Page 11: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

206. }

4.3.5 Serviços de consulta (R - Recovery) sem parâmetros

Os métodos abaixo são operações simples de consulta que retornam listas de entidades.

207. public List<Aeroporto> aeroportos() {208. List<Aeroporto> lista = 209. em.createQuery("SELECT a FROM Aeroporto a ORDER BY a.nome").getResultList();210. return lista;211. }212.213. public List<Passageiro> passageiros() {214. List<Passageiro> lista = em.createQuery("SELECT p FROM Passageiro p").getResultList();215. return lista;216. }217.218. public List<Voo> voos() {219. List<Voo> lista = em.createQuery("SELECT v FROM Voo v").getResultList();220. return lista;221. }

4.3.6 Serviço de consulta com parâmetros

O método abaixo difere dos anteriores por permitir a passagem de parâmetros. Observe que

o parâmetro passado deve ser compatível com o atributo pesquisado.

222. public List<Voo> voos(Date dia, Long origem, Long destino) {223. List<Voo> lista = em.createQuery(224. "SELECT v FROM Voo v WHERE" +225. " v.dia = :dia AND" +226. " v.origem.id = :origem AND" +227. " v.destino.id = :destino" +228. " ORDER BY v.dia, v.hora")229. .setParameter("dia", dia)230. .setParameter("origem", origem)231. .setParameter("destino", destino)232. .setHint("toplink.refresh", "true")233. .getResultList();234. return lista;235. }

Importante! o método setHint(“toplink.refresh”, “true”) informa ao JPA que, a cada

consulta, ele deve ignorar o cache de objetos que está na memória e consultar diretamente o banco.

Isso somente será necessário se houver outra aplicação acessando concorrentente o banco de dados

gol. Se somente a aplicação Gol-ejb tiver acesso ao banco, essa medida não será necessária.

4.3.7 Conversão de lista de Voo para lista de VooSelecionado

O método abaixo converte a lista de Voo retornada pelo método acima para uma lista de

VooSelecionado a ser usada na camada de apresentação.

236. public List<VooSelecionado> voosSelecionados(Date dia, Long origem, Long destino) {237. boolean s = true;238. List<VooSelecionado> voos = new ArrayList<VooSelecionado>();239. for (Voo v : voos(dia, origem, destino)) {240. VooSelecionado vooSelecionado = new VooSelecionado();241. vooSelecionado.setVoo(v);242. vooSelecionado.setSelecionado(s);243. s = false;244. voos.add(vooSelecionado);245. }246. return voos;247. }

1

Page 12: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

4.3.8 Serviço para localizar um passageiro pelo login e senha

O método abaixo será usado para autenticar o passageiro na camada de apresentação.

248. public Passageiro localizarPassageiro(String email, String senha) {249. Passageiro p = null;250. try {251. p = (Passageiro) em.createQuery("SELECT p FROM Passageiro p " +252. " WHERE p.email = :email AND " +253. " p.senha = :senha")254. .setParameter("email", email)255. .setParameter("senha", senha)256. .getSingleResult();257. } catch (Exception e) {258. e.printStackTrace();259. }260. return p;261. }

4.3.9 Serviço para confirmar uma reserva

O método abaixo confirma uma reserva para o vôo informado.

Uma vez que existe um relacionamento 1-N entre as classes Voo e Reserva, deve-se fazer a

ligação entre os objetos.

Em primeiro lugar, devemos fazer a associação ManyToOne com a linha

“reserva.setVoo(voo)”. Em seguida, fazemos a ligação OneToMany com

“voo.getReservas().add(reserva)”.

262. public void vincular(Voo voo, Reserva reserva) {263. voo = em.merge(voo);264. reserva.setVoo(voo);265. em.persist(reserva);266. voo.getReservas().add(reserva);267. }

4.3.10 Serviço para retornar os vôos de hoje

O método voosHoje retorna a lista de vôos que partem hoje. Esse método não está declarado

nem na interface local, nem remota. Para torná-lo visível, foram criados dois métodos

voosHojeLocal (declarado na interface local) e voosHojeRemoto (declarado na interface remota).

268. private List<String> voosHoje() {269. List<Voo> voos = em.createQuery(270. "SELECT v FROM Voo v WHERE" +271. " v.dia = :dia " +272. " ORDER BY v.origem.nome, v.destino.nome, v.hora")273. .setParameter("dia", new Date())274. .setHint("toplink.refresh", "true")275. .getResultList();276. List<String> lista = new ArrayList<String>();277. for (Voo voo : voos) {278. lista.add(voo.toString());279. }280. return lista;281. }282.283. public List<String> voosHojeLocal() {284. return voosHoje();285. }286.287. public List<String> voosHojeRemoto() {288. return voosHoje();289. }290. }

1

Page 13: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

5 Camada de apresentação

O projeto Gol-war usará o framework Java Server Faces e será usado

como camada de apresentação de nossa aplicação corporativa.

Ao lado podemos ver a estrutura de Gol-war e as pastas que

precisaremos modificar: Web pages, Configuration files, Server Resources,

Source pages, Libraries.

5.1 Suporte a Visual Web Java Server Faces

O projeto Gol-war, criado no início deste tutorial, possui suporte apenas a JSP (Java Server

Pages), mas precisamos em nosso projeto do suporte a JSF (Java Server Faces). Por isso,

precisamos mudar a configuração do projeto Gol-war para termos essa característica.

Clique com o botão direito em cima de Gol-war e em seguida em Properties. Selecione

Frameworks clique em Add... e em seguida Visual Web Java Server Faces.

5.2 Diagrama de navegação de páginas

Vá até a pasta “Configuration files” de Gol-war e dê um duplo-clique em faces-config.xml.

Surgirá a área de navegação de páginas.

Clicando com o botão direito em cima dessa área. Crie as páginas Iniciar.jsp, Comprar.jsp,

ConfirmarPedido.jsp, ListarVoos.jsp, CadastrarPassageiro.jsp e Autenticar.jsp.

De acordo com o desenho ao lado, em cada uma das respectivas páginas crie botões

“Woodstock/Button” e nomei-os conforme o esquema. Por exemplo, na página Comprar.jsp crie um

Button chamado btnProcurarVoo e um btnVoltar.

1

Page 14: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

Na área de navegação, faça as ligações de navegação conforme o esquema. Por exemplo, na

área de navegação, clique no botão btnProcurarVoo e em seguida arraste até o título da página

ListarVoos.jsp.

A página Inicial.jsp será o ponto de partida do sistema. Ela conterá somente dois botões, um

para iniciar o banco e outro para ir para página Comprar.jsp.

5.3 Classe Utilitária para criar faixas de opções

291. package br.unp.pos.gol.jsf.utils;292.293. import com.sun.webui.jsf.model.Option;294. import java.util.ArrayList;295. import java.util.List;296.297. public class Faixa {298.299. public static List<Option> gerar(int inicio, int fim) {300. List<Option> opcoes = new ArrayList<Option>();301. for (int i = inicio; i <= fim; i++) {302. opcoes.add(new Option(Integer.valueOf(i), i + ""));303. }304. return opcoes;305. }306. }

5.4 Formulário de compra de passagem

5.4.1 Imagem

5.4.2 Java Server Faces

307. <webuijsf:staticText id="staticText1" styleClass="titulo" text="Compre sua passagem"/>

308. <webuijsf:button actionExpression="#{Comprar.btnProcurarVoo_action}" id="btnProcurarVoo" text="Procurar vôos"/>

309. <webuijsf:button actionExpression="#{Comprar.btnVoltar_action}" id="btnVoltar" immediate="true" text="Voltar"/>

310. <webuijsf:dropDown id="ddPara" items="#{Comprar.aeroportos}" selected="#{SessionBean1.destino}"/>

311. <webuijsf:dropDown id="ddCrianca2a11" items="#{Comprar.opcoesBebes}" selected="#{SessionBean1.criancas}"/>

312. <webuijsf:message for="calVolta" id="message2" showDetail="false" showSummary="true"/>

313. <webuijsf:label for="rbgIdaVolta" id="label8" text="Passagem"/>314. <webuijsf:radioButtonGroup id="rbgIdaVolta" items="#{Comprar.idaEvoltaOpcoes}”

selected="#{SessionBean1.opcao}"/>315. <webuijsf:label for="rbgIdaVolta" id="label9" text=" Origem/Destino"/>

1

Page 15: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

316. <webuijsf:label for="ddDe" id="label1" text="De"/>317. <webuijsf:dropDown id="ddDe" items="#{Comprar.aeroportos}"

selected="#{SessionBean1.origem}"/>318. <webuijsf:label for="ddPara" id="label2" text="Para"/>319. <webuijsf:image id="image1" url="/resources/aeromoca.jpg"/>320. <webuijsf:label for="rbgIdaVolta" id="label11" text=" Número de passageiros"/>321. <webuijsf:label for="ddAdultos" id="label5" text="Adultos"/>322. <webuijsf:dropDown id="ddAdultos" items="#{Comprar.opcoesAdultos}"

selected="#{SessionBean1.adultos}"/>323. <webuijsf:label for="ddBebes" id="label6" text="Crianças de 0 a 23 meses"/>324. <webuijsf:dropDown id="ddBebes" items="#{Comprar.opcoesCriancas}"

selected="#{SessionBean1.bebes}"/>325. <webuijsf:label for="ddCrianca2a11" id="label7" text="Crianças de 2 a 11 anos"/>326. <webuijsf:label for="rbgIdaVolta" id="label10" text=" Datas"/>327. <webuijsf:label for="calIda" id="label3" text="Ida"/>328. <webuijsf:calendar id="calIda" required="true"

selectedDate="#{SessionBean1.ida}"/>329. <webuijsf:label for="calVolta" id="label4" rendered="#{Comprar.voltaVisivel}"

text="Volta"/>330. <webuijsf:calendar id="calVolta" rendered="#{Comprar.voltaVisivel}"

required="true" selectedDate="#{SessionBean1.volta}" />331. <webuijsf:message for="calIda" id="message1" showDetail="false"

showSummary="true"/>332. <webuijsf:messageGroup id="messageGroup1" title="Mensagens do sistema"/>

5.4.3 Listagem

333. package br.unp.pos.gol.jsf;334.335. import br.unp.pos.gol.jsf.utils.Faixa;336. import br.unp.pos.gol.dominio.*;337. import br.unp.pos.gol.ejb.SessionFacadeGolLocal;338. import com.sun.rave.web.ui.appbase.AbstractPageBean;339. import com.sun.webui.jsf.model.Option;340. import java.util.ArrayList;341. import java.util.List;342. import javax.ejb.EJB;343. import javax.faces.FacesException;344. import javax.faces.application.FacesMessage;345. import javax.faces.context.FacesContext;346.347. public class Comprar extends AbstractPageBean {348.349. @EJB350. SessionFacadeGolLocal sf;351.352. public Comprar() {353. }354.355. public List<Option> getOpcoesAdultos() {356. return Faixa.gerar(1, 9);357. }358.359. public List<Option> getOpcoesCriancas() {360. return Faixa.gerar(0, 9);361. }362.363. public List<Option> getOpcoesBebes() {364. return Faixa.gerar(0, 9);365. }366. private Option idaEvoltaOpcoes[] = {367. new Option(Integer.valueOf(1), "Ida e volta"),368. new Option(Integer.valueOf(2), "Somente ida")369. };370.371. public boolean getVoltaVisivel() {372. return getSessionBean1().getOpcao().equals(Integer.valueOf(1));373. }374.375. public Option[] getIdaEvoltaOpcoes() {376. return idaEvoltaOpcoes;377. }378.379. public List<Option> getAeroportos() {380. List<Option> opcoes = new ArrayList<Option>();381. for (Aeroporto a : sf.aeroportos()) {382. opcoes.add(new Option(a.getId(), a.getNome() + " (" + a.getSigla() + ")"));383. }384. return opcoes;

1

Page 16: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

385. }386.387. public String btnProcurarVoo_action() {388. FacesContext context = FacesContext.getCurrentInstance();389. SessionBean1 sb = getSessionBean1();390.391. // Aeroporto de origem igual a aeroporto de destino392. if (sb.getOrigem().equals(sb.getDestino())) {393. context.addMessage(null, 394. new FacesMessage("Aeroporto de origem deve ser diferente de destino "));395. return null;396. }397. return "procurarVoo";398. }399.400. public String btnVoltar_action() {401. return "voltar";402. }403. }

5.5 Formulário de seleção de vôo

5.5.1 Imagem do formulário

5.5.2 Java Server Faces

404. <webuijsf:staticText id="staticText1" text="Lista de vôos"/>405. <webuijsf:button actionExpression="#{ListarVoos.btnConfirmar_action}" id="btnConfirmar"

text="Fechar pedido"/>406. <webuijsf:button actionExpression="#{ListarVoos.btnVoltar_action}" id="btnVoltar" immediate="true" text="Voltar"/>

407. <h:dataTable border="1" id="dataTableVoosIda" value="#{ListarVoos.voosIda}" var="linha">408. <h:column id="colunaIdaSelecao">409. <f:facet name="header">410. <h:outputText id="outputText11" value="#"/>411. </f:facet>412. <webuijsf:radioButton id="radioButtonIdaSelecao" name="grupoIda"

selected="#{linha.selecionado}"/>413. </h:column>414. <h:column id="colunaIdaID">415. <h:outputText id="outputText1" value="#{linha.voo.id}"/>416. <f:facet name="header">417. <h:outputText id="outputText2" value="ID"/>418. </f:facet>419. </h:column>420. <h:column id="colunaIdaOrigem">421. <h:outputText id="outputText3" value="#{linha.voo.origem.nome}"/>422. <f:facet name="header">423. <h:outputText id="outputText4" value="Origem"/>424. </f:facet>425. </h:column>426. <h:column id="colunaIdaDestino">427. <h:outputText id="outputText5" value="#{linha.voo.destino.nome}"/>428. <f:facet name="header">429. <h:outputText id="outputText6" value="Destino"/>430. </f:facet>

1

Page 17: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

431. </h:column>432. <h:column id="colunaIdaDia">433. <h:outputText converter="#{ListarVoos.dateTimeConverter1}" 434. id="outputText7" value="#{linha.voo.dia}"/>435. <f:facet name="header">436. <h:outputText id="outputText8" value="Dia"/>437. </f:facet>438. </h:column>439. <h:column id="colunaIdaHora">440. <h:outputText converter="#{ListarVoos.dateTimeConverter2}" 441. id="outputText9" value="#{linha.voo.hora}"/>442. <f:facet name="header">443. <h:outputText id="outputText10" value="Hora"/>444. </f:facet>445. </h:column>446. <h:column id="colunaIdaVagas">447. <h:outputText id="outputText23" value="#{linha.voo.vagas}"/>448. <f:facet name="header">449. <h:outputText id="outputText24" value="Vagas"/>450. </f:facet>451. </h:column>452. </h:dataTable>453. <h:dataTable border="1" id="dataTableVoosVolta" rendered="#{ListarVoos.voltaVisivel}"

value="#{ListarVoos.voosVolta}" var="linha" width="552">454. <h:column id="colunaVoltaSelecao">455. <f:facet name="header">456. <h:outputText id="outputText12" value="#"/>457. </f:facet>458. <webuijsf:radioButton id="radioButtonVoltaSelecao" name="grupoVolta"

selected="#{linha.selecionado}"/>459. </h:column>460. <h:column id="colunaVoltaID">461. <h:outputText id="outputText13" value="#{linha.voo.id}"/>462. <f:facet name="header">463. <h:outputText id="outputText14" value="ID"/>464. </f:facet>465. </h:column>466. <h:column id="colunaVoltaOrigem">467. <h:outputText id="outputText15" value="#{linha.voo.origem.nome}"/>468. <f:facet name="header">469. <h:outputText id="outputText16" value="Origem"/>470. </f:facet>471. </h:column>472. <h:column id="colunaVoltaDestino">473. <h:outputText id="outputText17" value="#{linha.voo.destino.nome}"/>474. <f:facet name="header">475. <h:outputText id="outputText18" value="Destino"/>476. </f:facet>477. </h:column>478. <h:column id="colunaVoltaDia">479. <h:outputText converter="#{ListarVoos.dateTimeConverter1}"480. id="outputText19" value="#{linha.voo.dia}"/>481. <f:facet name="header">482. <h:outputText id="outputText20" value="Dia"/>483. </f:facet>484. </h:column>485. <h:column id="colunaVoltaHora">486. <h:outputText converter="#{ListarVoos.dateTimeConverter2}" 487. id="outputText21" value="#{linha.voo.hora}"/>488. <f:facet name="header">489. <h:outputText id="outputText22" value="Hora"/>490. </f:facet>491. </h:column>492. <h:column id="colunaVoltaVagas">493. <h:outputText id="outputText25" value="#{linha.voo.vagas}"/>494. <f:facet name="header">495. <h:outputText id="outputText26" value="Vagas"/>496. </f:facet>497. </h:column>498. </h:dataTable>499. <webuijsf:staticText id="staticText2" styleClass="titulo2" text="Ida"/>500. <webuijsf:staticText id="staticText3" rendered="#{ListarVoos.voltaVisivel}"

text="Volta"/>

5.5.3 Listagem

501. package br.unp.pos.gol.jsf;502.503. import br.unp.pos.gol.dominio.*;

1

Page 18: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

504. import br.unp.pos.gol.ejb.SessionFacadeGolLocal;505. import com.sun.rave.faces.data.DefaultSelectItemsArray;506. import com.sun.rave.web.ui.appbase.AbstractPageBean;507. import java.util.List;508. import javax.ejb.EJB;509. import javax.faces.FacesException;510. import javax.faces.convert.DateTimeConverter;511.512. public class ListarVoos extends AbstractPageBean {513.514. @EJB515. SessionFacadeGolLocal sf;516.517. public ListarVoos() {518. }519.520. public List<VooSelecionado> getVoosIda() {521. SessionBean1 sb = getSessionBean1();522. return sf.voosSelecionados(sb.getIda(), sb.getOrigem(), sb.getDestino());523. }524.525. public List<VooSelecionado> getVoosVolta() {526. SessionBean1 sb = getSessionBean1();527. return sf.voosSelecionados(sb.getVolta(), sb.getDestino(), sb.getOrigem());528. }529.530. public String btnConfirmar_action() {531. SessionBean1 sb = getSessionBean1();532. // Voo de ida533. sb.setVooIda(null);534. for (VooSelecionado vooSelecionado : getVoosIda()) {535. if (vooSelecionado.getSelecionado()) {536. sb.setVooIda(vooSelecionado.getVoo());537. break;538. }539. }540. // Voo de volta541. sb.setVooVolta(null);542. if (sb.getOpcao().equals(Integer.valueOf(1))) {543. for (VooSelecionado vooSelecionado : getVoosVolta()) {544. if (vooSelecionado.getSelecionado()) {545. sb.setVooVolta(vooSelecionado.getVoo());546. break;547. }548. }549. }550. if (getSessionBean1().getPassageiro() == null) {551. // Passageiro não logado552. return "identificar";553. } else {554. // Passageiro já está logado555. return "confirmar";556. }557. }558.559. public String btnVoltar_action() {560. return "voltar";561. }562.563. public boolean getVoltaVisivel() {564. return getSessionBean1().getOpcao().equals(Integer.valueOf(1));565. }566. }

1

Page 19: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

5.6 Formulário de login

5.6.1 Imagem do formulário

5.6.2 Propriedades dos componentes

Componente Nome PropriedadesStaticText staticText1 text = “Identificação”Label label1 text= “Seu endereço de email”TextField textField1 text=”#{Autenticar.email}”

required=”true”Label label2 text=”Senha”PassField passwordField1 password = ”#{Autenticar.senha}”

required =”true”Button btnIdentificar actionExpression=”#{Autenticar.btnIdentificar_action}”

text = “Identificar”Button btnVoltar actionExpression=”#{Autenticar.btnVoltar_action}”

immediate=”true”text = “Voltar”

Button btnCadastrar actionExpression=”#{Autenticar.btnCadastrar_action}”immediate=”true”text = ”Novo cadastro”

5.6.3 Listagem

567. package br.unp.pos.gol.jsf;568.569. import br.unp.pos.gol.dominio.Passageiro;570. import br.unp.pos.gol.ejb.SessionFacadeGolLocal;571. import com.sun.rave.web.ui.appbase.AbstractPageBean;572. import javax.ejb.EJB;573. import javax.faces.FacesException;574.575. public class Autenticar extends AbstractPageBean {576. @EJB577. SessionFacadeGolLocal sf;578. String email;579. String senha;580.581. public Autenticar() {582. }583.584. public String btnIdentificar_action() {585. Passageiro passageiro = sf.localizarPassageiro(email, senha);586. if (passageiro != null) {587. getSessionBean1().setPassageiro(passageiro);588. return "confirmar";589. }590. return null;591. }592.593. public String btnVoltar_action() {594. return "voltar";595. }596.597. public String btnCadastrar_action() {598. return "cadastrar";599. }600.601. public String getEmail() {602. return email;603. }604.605. public void setEmail(String email) {

1

Page 20: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

606. this.email = email;607. }608.609. public String getSenha() {610. return senha;611. }612.613. public void setSenha(String senha) {614. this.senha = senha;615. }616. }

5.7 Formulário de novo cadastro

5.7.1 Imagem do formulário

5.7.2 Propriedades dos componentes

Componente Nome PropriedadesstaticText "staticText1" text="Formulário de cadastro"textField "textFieldTitulo" text="#{CadastrarPassageiro.passageiro.titulo}" label "label1" text="Título" label "label2" text="Nome" textField "textFieldNome" required="true"

text="#{CadastrarPassageiro.passageiro.nome}" label "label3" text="Sobrenome" textField "textFieldSobrenome" required="true"

text="#{CadastrarPassageiro.passageiro.sobrenome}" label "label4" text="Endereço" textField "textFieldEndereco" required="true"

text="#{CadastrarPassageiro.passageiro.endereco}" label "label7" text="Cidade" textField "textFieldCidade" required="true"

text="#{CadastrarPassageiro.passageiro.cidade}" label text="Estado" textField "textFieldEstado" required="true"

text="#{CadastrarPassageiro.passageiro.estado}" label "label8" text="Telefone" textField "textFieldTelefone" required="true"

text="#{CadastrarPassageiro.passageiro.telefone}" label "label9" text="Celular" textField "textFieldCelular" required="true"

text="#{CadastrarPassageiro.passageiro.celular}" label "label10" text="Fax" textField "textFieldFax" text="#{CadastrarPassageiro.passageiro.fax}" label "label11" text="Email" textField "textFieldEmail" required="true"

text="#{CadastrarPassageiro.passageiro.email}" label "label12" text="Senha" passwordField "passwordFieldSenha" password="#{CadastrarPassageiro.passageiro.senha}"

required="true" label "label13" text="Redigite senha" passwordField "passwordFieldConfirmacao" required="true" button "btnConfirmar" actionExpression="#{CadastrarPassageiro.btnConfirmar_action}"

text="Confirmar" button "btnVoltar" actionExpression="#{CadastrarPassageiro.btnVoltar_action}"

immediate="true" text="Voltar"

2

Page 21: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

5.7.3 Listagem

617. package br.unp.pos.gol.jsf;618.619. import br.unp.pos.gol.dominio.Passageiro;620. import br.unp.pos.gol.ejb.SessionFacadeGolLocal;621. import com.sun.rave.web.ui.appbase.AbstractPageBean;622. import com.sun.webui.jsf.component.TextField;623. import javax.ejb.EJB;624. import javax.faces.FacesException;625. import javax.faces.validator.LengthValidator;626.627. public class CadastrarPassageiro 628. extends AbstractPageBean 629. {630. public CadastrarPassageiro() {631. }632.633. public String btnConfirmar_action() {634. facade.incluir(passageiro);635. passageiro = new Passageiro();636. return "voltar";637. }638.639. public String btnVoltar_action() {640. return "voltar";641. }642. 643. @EJB644. SessionFacadeGolLocal facade;645. Passageiro passageiro = new Passageiro();646.647. public Passageiro getPassageiro() {648. return passageiro;649. }650.651. public void setPassageiro(Passageiro passageiro) {652. this.passageiro = passageiro;653. }654. }

5.8 Formulário de confirmação

Ao confirmar o pedido, uma nova reserva será adicionada, termina a sessão e volta a página

inicial.

5.8.1 Imagem do formulário

5.8.2 Propriedades dos componentes

Componente Nome Propriedades staticText "staticText1" text="Discriminação do pedido" button "btnVoltar" actionExpression="#{ConfirmarPedido.btnVoltar_action}"

text="Voltar" button "btnConfirmar" actionExpression="#{ConfirmarPedido.btnConfirmar_action}"

text="Confirmar pedido" staticText "staticText5" text="#{SessionBean1.adultos}" staticText "staticText6" text="#{SessionBean1.criancas}" staticText "staticText7" text="#{SessionBean1.bebes}" staticText "staticText9" text="#{SessionBean1.passageiro.nome}"

2

Page 22: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

Componente Nome Propriedades staticText "staticText12" text="#{SessionBean1.vooIda.origem.nome}" staticText "staticText13" text="#{SessionBean1.vooIda.destino.nome}" label "label1" text="Passageiro" label "label2" text="De" label "label3" text="Para" label "label4" text="Adultos" label "label5" text="Crianças" label "label6" text="Bebês" label "label7" text="Ida" staticText "staticText2" converter="#{ConfirmarPedido.dateTimeConverter1}"

text="#{SessionBean1.vooIda.dia}" label "label8" text="Volta" staticText "staticText3" converter="#{ConfirmarPedido.dateTimeConverter1}"

text="#{SessionBean1.vooVolta.dia}" staticText "staticText4" converter="#{ConfirmarPedido.dateTimeConverter2}"

text="#{SessionBean1.vooIda.hora}" staticText "staticText8" converter="#{ConfirmarPedido.dateTimeConverter2}"

text="#{SessionBean1.vooVolta.hora}"

5.8.3 Listagem

655. package br.unp.pos.gol.jsf;656.657. import br.unp.pos.gol.dominio.*;658. import br.unp.pos.gol.ejb.SessionFacadeGolLocal;659. import com.sun.rave.web.ui.appbase.AbstractPageBean;660. import javax.ejb.EJB;661. import javax.faces.FacesException;662. import javax.faces.context.FacesContext;663. import javax.faces.convert.DateTimeConverter;664. import javax.servlet.http.HttpSession;665.666. public class ConfirmarPedido extends AbstractPageBean {667. @EJB668. SessionFacadeGolLocal sf;669.670. public String btnVoltar_action() {671. return "voltar";672. }673.674. public String btnConfirmar_action() {675. SessionBean1 sb = getSessionBean1();676. // Reserva passagem de ida677. Reserva reserva = new Reserva();678. reserva.setAdultos(sb.getAdultos());679. reserva.setBebes(sb.getBebes());680. reserva.setCriancas(sb.getCriancas());681. reserva.setPassageiro(sb.getPassageiro());682. sf.vincular(sb.getVooIda(), reserva);683. // Reserva passagem de volta684. if (sb.getOpcao().equals(Integer.valueOf(1))) {685. reserva = new Reserva();686. reserva.setAdultos(sb.getAdultos());687. reserva.setBebes(sb.getBebes());688. reserva.setCriancas(sb.getCriancas());689. reserva.setPassageiro(sb.getPassageiro());690. sf.vincular(sb.getVooVolta(), reserva);691. }692. // Termina sessao e volta para a pagina inicial693. FacesContext fc = FacesContext.getCurrentInstance();694. HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);695. session.invalidate();696. return "reiniciar";697. }698. }

6 Cliente Java stand alone

É possível acessar a aplicação instalada no Glassfish remotamente, por exemplo, por meio

de uma aplicação Java isolada. A primeira opção mostrada será usando a interface remota do EJB.

Na seção seguinte, veremos como acessar a aplicação usando web services.

2

Page 23: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

6.1.1 Criação do projeto

Crie um aplicação Java comum. Novo projeto/ Java/ Aplicação Java. Deixe a opção criar

uma classe principal Main ativada.

6.1.2 Dependências de bibliotecas

As seguintes bibliotecas, que se encontram no diretório lib do Glassfish, deverão ser

adicionadas ao projeto:

javaee.jar

com-sun-commons-logging.jar

appserv-rt.jar

appserv-deployment-client.jar

appserv-ext.jar

6.2 Classes Java

6.2.1 Arquivo EnumServidor.java

699. package br.unp.pos.gol.ejb;700.701. public enum EnumServidor {702.703. GLASSFISH, JBOSS;704. }

6.2.2 Arquivo ServidorException.java

705. package br.unp.pos.gol.ejb;706.707. public class ServidorException extends Exception {708.709. public ServidorException(String mensagem) {710. super(mensagem);711. }712. }

6.2.3 Arquivo ServiceLocatorGol.java

713. package br.unp.pos.gol.ejb;714.715. import java.util.Properties;716. import javax.naming.Context;717. import javax.naming.InitialContext;718. import javax.naming.NamingException;719.720. public class ServiceLocatorGol {721.722. public static final String SERVIDOR = "localhost";723. public static final String SERVIDOR_PORTA = "3700";724.725. public static SessionFacadeGolRemote localizar(EnumServidor servidor) 726. throws ServidorException {727. SessionFacadeGolRemote sf;728. try {729. Properties properties = new Properties();730. switch (servidor) {731. case JBOSS:732. properties.put(Context.INITIAL_CONTEXT_FACTORY, 733. "org.jnp.interfaces.NamingContextFactory");734. properties.put(Context.PROVIDER_URL, SERVIDOR + ":" + SERVIDOR_PORTA);735. break;736. case GLASSFISH: {

2

Page 24: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

737. properties.setProperty("java.naming.factory.initial",738. "com.sun.enterprise.naming.SerialInitContextFactory");739. properties.setProperty("org.omg.CORBA.ORBInitialHost", SERVIDOR);740. properties.setProperty("org.omg.CORBA.ORBInitialPort", SERVIDOR_PORTA);741. break;742. }743. default:744. throw new ServidorException("Tipo de servidor desconhecido");745. }746. InitialContext ctx = new InitialContext(properties);747. sf = (SessionFacadeGolRemote) ctx.lookup("BeanGol");748. } catch (NamingException ex) {749. ex.printStackTrace();750. throw new ServidorException("Erro ao conectar o servidor");751. }752. return sf;753. }754. }

6.2.4 Arquivo Console.java

755. package br.unp.pos.gol.horario;756.757. public class Main {758. public static void main(String args[]) {759. try {760. SessionFacadeGolRemote sf = ServiceLocatorGol.localizar(EnumServidor.GLASSFISH);761. List<String> voos = sf.voosHojeRemoto();762. for (String voo : voos) {763. System.out.println(voo);764. }765. System.out.println("Total de vôos: " + voos.size());766. } catch (ServidorException ex) {767. ex.printStackTrace();768. }769. }770. }

7 Cliente Java stand alone com WebService

7.1 Servidor

7.1.1 Arquivo WebServiceGol

771. package br.unp.pos.gol.ws;772.773. @WebService()774. @Stateless()775. public class WebServiceGol {776. @EJB()777. private SessionFacadeGolLocal ejbRef;778.779. @WebMethod(operationName = "voosHoje")780. public List<String> voosHoje() {781. return ejbRef.voosHojeLocal();782. }783.784. @WebMethod(operationName = "voos")785. public String voos() {786. List<String> lista = ejbRef.voosHojeLocal();787. return lista.toString();788. }789.790. }

7.2 Cliente

7.2.1 Arquivo ConsoleWS

791. package br.unp.pos.gol.horario;

2

Page 25: Tutorial para desenvolvimento Java Enterprise Edition para Web

Desenvolvimento de aplicações Java Enterprise Edition [email protected]

792.793. import br.unp.pos.gol.ws.WebServiceGol;794. import br.unp.pos.gol.ws.WebServiceGolService;795.796. public class ConsoleWS {797. public static void main(String args[]) {798. try {799. WebServiceGolService service = new WebServiceGolService();800. WebServiceGol port = service.getWebServiceGolPort();801. for (String voo : port.voosHoje()) {802. System.out.println(voo);803. }804. } catch (Exception ex) {805. ex.printStackTrace();806. }807. }808. }

2