Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
4
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
3 Camada de persistência
Para nossa camada de persistência usaremos o JPA (Java Persistence
API).
5
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
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.
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
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. }
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. }
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
9
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
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;
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. }
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. }
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. }
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
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.
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.
1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
5.4.1 Imagem
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
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
1
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
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. }
2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
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.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
Crie um aplicação Java comum. Novo projeto/ Java/ Aplicação Java. Deixe a opção criar
uma classe principal Main ativada.
2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
2
Desenvolvimento de aplicações Java Enterprise Edition jfrank1500@gmail.com
7.1 Servidor
7.2 Cliente