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