Você está na página 1de 25

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
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
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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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. @Entity
4. public class Aeroporto implements Serializable {
5.
6. private static final long serialVersionUID = 1L;
7.
8. @Id
9. @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 SETTERS
22. }
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. @Entity
26. public class Passageiro implements Serializable {
27.
28. private static final long serialVersionUID = 1L;
29.
30. @Id
31. @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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

48. private String estado;


49. private String telefone;
50. private String celular;
51. private String fax;
52.
53. // GETTERS e SETTERS
54. }

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. @Entity
58. public class Reserva implements Serializable {
59.
60. private static final long serialVersionUID = 1L;
61.
62. @GeneratedValue(strategy = GenerationType.IDENTITY)
63. @Id
64. private Long id;
65.
66. @ManyToOne
67. private Passageiro passageiro;
68.
69. @ManyToOne
70. private Voo voo;
71.
72. private Integer adultos;
73. private Integer bebes;
74. private Integer criancas;
75.
76. // Total de assentos reservados
77. 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. @Entity
86. public class Voo implements Serializable {
87.
88. private static final long serialVersionUID = 1L;
89.

7
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

90. @Id
91. @GeneratedValue(strategy = GenerationType.IDENTITY)
92. private Long id;
93.
94. @ManyToOne
95. private Aeroporto origem;
96.
97. @ManyToOne
98. 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 voo
112. 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 vagos
120.
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. @Override
130. 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 SETTERS
138. }

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 SETTERs
149. }

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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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. @Local
158. 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. @Remote
177. 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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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. @PersistenceContext
193. 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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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.

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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.
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) {

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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"/>
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"/>

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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. @EJB
350. 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;
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 destino
392. 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. }

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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>
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>

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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.*;
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. @EJB
515. 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.

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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 ida
533. sb.setVooIda(null);
534. for (VooSelecionado vooSelecionado : getVoosIda()) {
535. if (vooSelecionado.getSelecionado()) {
536. sb.setVooIda(vooSelecionado.getVoo());
537. break;
538. }
539. }
540. // Voo de volta
541. 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 logado
552. return "identificar";
553. } else {
554. // Passageiro já está logado
555. 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. }

5.6 Formulário de login

5.6.1 Imagem do formulário

5.6.2 Propriedades dos componentes


Componente Nome Propriedades
StaticText 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”

1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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. @EJB
577. 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) {
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

2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

5.7.2 Propriedades dos componentes


Componente Nome Propriedades
staticText "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"

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. @EJB
644. SessionFacadeGolLocal facade;
645. Passageiro passageiro = new Passageiro();
646.
647. public Passageiro getPassageiro() {
648. return passageiro;

2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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}"
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.

2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

666. public class ConfirmarPedido extends AbstractPageBean {


667. @EJB
668. 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 ida
677. 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 volta
684. 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 inicial
693. 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.

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

2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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: {
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 {

2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com

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;
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. }

Você também pode gostar