Você está na página 1de 334

Universidade do Sul de Santa Catarina

Linguagens de Programao II
Disciplina na modalidade a distncia

Palhoa UnisulVirtual 2007

Apresentao
Este livro didtico corresponde disciplina Linguagens de Programao II. O material foi elaborado visando a uma aprendizagem autnoma, abordando contedos especialmente selecionados e adotando uma linguagem que facilite seu estudo a distncia. Por falar em distncia, isso no signica que voc estar sozinho. No esquea que sua caminhada nesta disciplina tambm ser acompanhada constantemente pelo Sistema Tutorial da UnisulVirtual. Entre em contato sempre que sentir necessidade, seja por correio postal, fax, telefone, e-mail ou Espao UnisulVirtual de Aprendizagem. Nossa equipe ter o maior prazer em atend-lo, pois sua aprendizagem nosso principal objetivo. Bom estudo e sucesso! Equipe UnisulVirtual.

Andra Sabedra Bordin Marcelo Medeiro Andrik Dimitrii Braga de Albuquerque

Linguagens de Programao II
Livro didtico
2 Edio revista e atualizada

Design instrucional Flavia Lumi Matuzawa Leandro Kingeski Pacheco

Palhoa UnisulVirtual 2007

Copyright UnisulVirtual 2007 Nenhuma parte desta publicao pode ser reproduzida por qualquer meio sem a prvia autorizao desta instituio.

005.133 B72 Bordin, Andra Sabedra Linguagem de programao II : livro didtico / Andra Sabreda Bordin, Marcelo Medeiro, Andrik Albuquerque ; design instrucional Flavia Lumi Matuzawa, Leandro Kingeski Pacheco. - 2 ed. revista e atualizada - Palhoa : UnisulVirtual, 2007. 334 p. : il. ; 28 cm. Inclui bibliograa. 1. Linguagem de programao (Computadores). 2. Java (Linguagem de programao de computador). I. Medeiro, Marcelo. II. Albuquerque, Andrik. III. Matuzawa, Flavia Lumi. IV. Pacheco, Leandro Kingeski. V. Ttulo.
Ficha catalogrfica elaborada pela Biblioteca Universitria da Unisul

Crditos
Unisul - Universidade do Sul de Santa Catarina UnisulVirtual - Educao Superior a Distncia
Campus UnisulVirtual Rua Joo Pereira dos Santos, 303 Palhoa - SC - 88130-475 Fone/fax: (48) 3279-1541 e 3279-1542 E-mail: cursovirtual@unisul.br Site: www.virtual.unisul.br Reitor Unisul Gerson Luiz Joner da Silveira Vice-Reitor e Pr-Reitor Acadmico Sebastio Salsio Heerdt Chefe de gabinete da Reitoria Fabian Martins de Castro Pr-Reitor Administrativo Marcus Vincius Antoles da Silva Ferreira Campus Sul Diretor: Valter Alves Schmitz Neto Diretora adjunta: Alexandra Orsoni Campus Norte Diretor: Ailton Nazareno Soares Diretora adjunta: Cibele Schuelter Campus UnisulVirtual Diretor: Joo Vianney Diretora adjunta: Jucimara Roesler Bibliotecria Soraya Arruda Waltrick Coordenao dos Cursos Adriano Srgio da Cunha Ana Luisa Mlbert Ana Paula Reusing Pacheco Ctia Melissa S. Rodrigues (Auxiliar) Charles Cesconetto Diva Marlia Flemming Itamar Pedro Bevilaqua Janete Elza Felisbino Jucimara Roesler Lilian Cristina Pettres (Auxiliar) Lauro Jos Ballock Luiz Guilherme Buchmann Figueiredo Luiz Otvio Botelho Lento Marcelo Cavalcanti Mauri Luiz Heerdt Mauro Faccioni Filho Michelle Denise Durieux Lopes Destri Moacir Heerdt Nlio Herzmann Onei Tadeu Dutra Patrcia Alberton Patrcia Pozza Raulino Jac Brning Rose Clr E. Beche Design Grco Cristiano Neri Gonalves Ribeiro (coordenador) Adriana Ferreira dos Santos Alex Sandro Xavier Evandro Guedes Machado Fernando Roberto Dias Zimmermann Higor Ghisi Luciano Pedro Paulo Alves Teixeira Rafael Pessi Vilson Martins Filho Equipe Didtico-Pedaggica Angelita Maral Flores Carmen Maria Cipriani Pandini Caroline Batista Carolina Hoeller da Silva Boeing Cristina Klipp de Oliveira Daniela Erani Monteiro Will Dnia Falco de Bittencourt Enzo de Oliveira Moreira Flvia Lumi Matuzawa Karla Leonora Dahse Nunes Leandro Kingeski Pacheco Ligia Maria Soufen Tumolo Mrcia Loch Patrcia Meneghel Silvana Denise Guimares Tade-Ane de Amorim Vanessa de Andrade Manuel Vanessa Francine Corra Viviane Bastos Viviani Poyer Logstica de Encontros Presenciais Marcia Luz de Oliveira (Coordenadora) Aracelli Araldi Graciele Marins Lindenmayr Jos Carlos Teixeira Letcia Cristina Barbosa Knia Alexandra Costa Hermann Priscila Santos Alves Logstica de Materiais Jeferson Cassiano Almeida da Costa (coordenador) Eduardo Kraus Monitoria e Suporte Rafael da Cunha Lara (coordenador) Adriana Silveira Caroline Mendona Dyego Rachadel Edison Rodrigo Valim Francielle Arruda Gabriela Malinverni Barbieri Gislane Frasson de Souza Josiane Conceio Leal Maria Eugnia Ferreira Celeghin Simone Andra de Castilho Vincius Maycot Seram Produo Industrial e Suporte Arthur Emmanuel F. Silveira (coordenador) Francisco Asp Projetos Corporativos Diane Dal Mago Vanderlei Brasil Secretaria de Ensino a Distncia Karine Augusta Zanoni (secretria de ensino) Ana Paula Pereira Djeime Sammer Bortolotti Carla Cristina Sbardella Grasiela Martins James Marcel Silva Ribeiro Lamuni Souza Liana Pamplona Maira Marina Martins Godinho Marcelo Pereira Marcos Alcides Medeiros Junior Maria Isabel Aragon Olavo Lajs Priscilla Geovana Pagani Silvana Henrique Silva Secretria Executiva Viviane Schalata Martins Tecnologia Osmar de Oliveira Braz Jnior (coordenador) Ricardo Alexandre Bianchini Rodrigo de Barcelos Martins

Edio Livro Didtico


Professor Conteudista Andra Sabedra Bordin Marcelo Medeiro Andrik Dimitrii Braga de Albuquerque Design Instrucional Flavia Lumi Matuzawa Leandro Kingeski Pacheco Projeto Grco e Capa Equipe UnisulVirtual Diagramao Rafael Pessi Reviso Ortogrca B2B

Equipe UnisulVirtual
Administrao Renato Andr Luz Valmir Vencio Incio

Sumrio
Apresentao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Palavras dos professores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Plano de estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11

UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE

1 Introduo a GUI (Grafical User Interface) . . . . . . . . . . . . . . . . . .17 2 Tratamento de Eventos em uma GUI . . . . . . . . . . . . . . . . . . . . . . .45 3 Componentes de uma GUI (JCheckBox, JRadioButton, JComboBox e JList) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71 4 5 6 7 8 9 10 11 12 13 14 15 Trabalhando com Layout de Componentes . . . . . . . . . . . . . . .97 Layout, JTabbedPane e componentes de Menu . . . . . . . . 121 Modelando o Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Conectando o Java ao Banco Dados . . . . . . . . . . . . . . . . . . . . . . 159 Criando as Classes de Representao . . . . . . . . . . . . . . . . . . . . . 175 Criando as Classes de Controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Aplicao Exemplo: Controle de Projetos . . . . . . . . . . . . . . . . 205 Introduo ao Desenvolvimento de Aplicaes Web . . . 209 Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Java Server Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 Java Standard Tag Library (JSTL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Aplicao Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

Para concluir o estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sobre os professores conteudistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Respostas e comentrios das atividades de auto-avaliao . . . . . . . . . . . . . . .

313 315 317 319

Palavras dos professores


Ol, Voc est iniciando a disciplina de Linguagem de Programao II. Para chegar at aqui voc deve ter passado pelas disciplinas de Lgica de Programao I e II, Programao Orientada a Objetos, Banco de Dados I e II e Linguagens de Programao I. Isso quer dizer que voc j tem plenas condies de assimilar o contedo de nvel mais aprofundado que ser abordado nesse livro. Esse livro abordar trs tpicos muito importantes do mundo da programao: construo de GUI (Graphical User Interface), Acesso e manipulao de banco de dados e aplicao web. Primeiramente, sero apresentados para voc os conhecimentos bsicos sobre como construir uma GUI (Graphical User Interface). Uma interface grca de usurio a tela ou view da aplicao que voc desenvolve. O enfoque, nesse assunto, ser sobre aplicaes para desktop e utilizaremos para isso um conjunto de componentes da linguagem Java, denominados componentes Swing. Esse assunto ser abordado ao longo de cinco unidades. O assunto das quatro unidades seguintes trata da conexo e manipulao de dados em um banco. Voc aprender como construir uma aplicao em Java que faa conexo com um banco de dados e manipule (inserir, atualizar, deletar) dados nesse banco de dados. A dcima unidade mostrar o desenvolvimento de uma aplicao exemplo completa, envolvendo a construo de uma GUI para entrada e sada dos dados e a manipulao desses dados em um banco de dados. As unidades nais apresentaro uma introduo ao desenvolvimento de uma aplicao web usando Java Servlets.

Universidade do Sul de Santa Catarina

Como dito, todos os contedos abordados nesse livro tm um nvel tcnico um pouco mais elevado. Por isso, toda a ateno da sua parte bem-vinda. Mas voc certamente j sabe que essa ateno ser recompensada medida que voc ver seus programas funcionando.

Boa Sorte! Professores Andra Sabedra Bordin, Marcelo Medeiros e Andrik Albuquerque

10

Plano de estudo
O plano de estudo visa orient-lo/a no desenvolvimento do Projeto Integrador. Nele, voc encontrar elementos que esclarecero o contexto do mesmo e sugeriro formas de organizar o seu tempo de estudos. O processo de ensino e aprendizagem na UnisulVirtual leva em conta instrumentos que se articulam e se complementam. Assim, a construo de competncias se d sobre a articulao de metodologias e por meio das diversas formas de ao/ mediao. So elementos desse processo: o livro didtico; o Espao UnisulVirtual de Aprendizagem - EVA; as atividades de avaliao a distncia (no sero feitas avaliaes presenciais).

Ementa
Introduo a Java. Programao orientada a objetos. Programao Java: Multitarefa; Cliente/servidor; acesso a banco de dados; interface grca; APPLETS. JDBC. Deployment. Aplicaes web com Java. Aplicaes J2ME.

Carga Horria
A carga horria total da disciplina 120 horas-aula, 8 crditos, incluindo o processo de avaliao.

Universidade do Sul de Santa Catarina

Objetivos
Geral: Fornecer ao aluno conhecimentos bsicos sobre o desenvolvimento de interface grca de aplicao, assim como sobre a conexo de aplicao com banco de dados alm do desenvolvimento de aplicaes dinmicas para web. Especcos: Conhecer os principais componentes Swing para o desenvolvimento de GUI. Aprender a manipular dados em um banco de dados via aplicao (software). Conhecer os fundamentos para o desenvolvimento de uma aplicao web de pequeno porte.

Contedo programtico/objetivos
Os objetivos de cada unidade denem o conjunto de conhecimentos que voc dever deter para o desenvolvimento de habilidades e competncias necessrias sua formao. Neste sentido, veja, a seguir, as unidades que compem o livro didtico desta Disciplina, bem como os seus respectivos objetivos. Unidades de estudo: 15

Unidade 1 Introduo a GUI (Gracal User Interface)


Nesta unidade voc ter uma viso geral dos componentes utilizados para a construo de GUI. Ser mostrado o primeiro componente Swing JLabel e uma introduo ao conceito de interface.

Unidade 2 Tratamento de Eventos em uma GUI


Nesta unidade voc estudar, essencialmente, como funciona o tratamento de eventos em uma GUI.

12

Linguagens de Programao I

Unidade 3 Componentes de uma GUI (JCheckBox, JRadioButton, JComboBox e JList)


Nesta unidade voc conhecer outros componentes Swing.

Unidade 4 Trabalhando com Layout de Componentes


Na unidade 4 voc aprender a trabalhar com o layout dos componentes da tela, atravs do uso de outros gerenciadores de layout.

Unidade 5 Layout, JTabbedPane e componentes de Menu


Nesta unidade voc aprender uma pouco mais sobre layout, conhecer outro componente Swing e aprender a construir GUI com menus.

Unidade 6 Modelando o Banco de Dados


Na unidade 6 voc relembrar como modelar um banco de dados e como criar o banco modelado em um SGBD.

Unidade 7 Conectando o Java ao Banco Dados


Nesta unidade voc aprender como conectar uma aplicao Java a um banco de dados, usando um driver JDBC.

Unidade 8 Criando as Classes de Representao


Na unidade 8 voc aprender a criar as classes de representao de dados, de um banco de dados.

Unidade 9 Criando as Classes de Controle


Na unidade 9, voc criar classes que permitam a execuo de comandos SQL e a conexo e manipulao de dados em um banco de dados.

13

Universidade do Sul de Santa Catarina

Unidade 10 Aplicao Exemplo: Controle de Projetos


Nesta unidade ser exibido o cdigo completo de uma aplicao para Controle de Projetos, que envolver a criao de GUIs e a manipulao de dados no banco de dados.

Unidade 11 Introduo ao Desenvolvimento de Aplicaes Web


Nesta unidade sero apresentados o protocolo HTTP, aplicaes CGI e os conceitos de desenvolvimento de aplicaes web com a tecnologia Java.

Unidade 12 Servlets
Nesta unidade voc conhecer o que so os Servlets e utilizar as funcionalidades oferecidas por essa tecnologia para vericar o desenvolvimento de uma aplicao web.

Unidade 13 Java Server Pages


Na unidade 13 voc conhecer a tecnologia Java Server Pages e como ela facilita o desenvolvimento de aplicaes web utilizando a tecnologia Java.

Unidade 14 Java Standard Tag Library (JSTL)


Nesta unidade ser apresentada a biblioteca JSTL, para facilitar ainda mais o desenvolvimento de aplicaes web de uma forma padronizada.

Unidade 15 Aplicao Web


Nesta unidade ser apresentada uma aplicao completa dando continuidade ao projeto iniciado na unidade 10, porm, agora, com o foco no ambiente web.

14

Linguagens de Programao I

Agenda de atividades/ Cronograma


Verique com ateno o EVA, organize-se para acessar periodicamente o espao da Disciplina. O sucesso nos seus estudos depende da priorizao do tempo para a leitura; da realizao de anlises e snteses do contedo; e da interao com os seus colegas e tutor. No perca os prazos das atividades. Registre no espao a seguir as datas, com base no cronograma da disciplina disponibilizado no EVA. Use o quadro para agendar e programar as atividades relativas ao desenvolvimento da Disciplina.

15

Universidade do Sul de Santa Catarina

Atividades
Avaliao a Distncia 1 Avaliao a Distncia 2 Avaliao Presencial 1 Avaliao Presencial 2 (2 chamada) Avaliao Final

Demais atividades (registro pessoal)

16

UNIDADE 1

Introduo a GUI (Gracal User Interface)


Objetivos de aprendizagem
Entender o que uma GUI e quais os seus principais componentes. Obter uma viso geral dos componentes Swing presentes numa GUI. Compreender o processo de criao de uma GUI com o componente JLabel. Entender o conceito de interface e suas principais aplicaes.

Sees de estudo
Seo 1 Entendendo uma GUI (grafical user interface) Seo 2 Viso Geral dos Componentes Swing Seo 3 Criao da Primeira GUI - Componente JLabel Seo 4 Interface

Universidade do Sul de Santa Catarina

Para incio de conversa


Nessa unidade, voc ser apresentado ao mundo da interface grca de usurio (GUI). Uma interface representa o meio de campo entre o usurio e a aplicao (software). atravs da interface que o usurio pode se comunicar com o aplicativo, ou seja, inserir dados, visualizar informaes, etc. Uma interface pode ser puramente textual ou grca. Interfaces grcas j fazem parte do nosso dia-a-dia, desde o surgimento do sistema operacional Windows e, portanto, necessrio que voc entenda os fundamentos bsicos da sua construo.

Seo 1 Entendendo uma GUI (gracal user interface)


Uma interface grca com o usurio GUI (gracal user interface) apresenta um mecanismo amigvel para interagir com um aplicativo ( a tela do sistema). Uma GUI oferece ao aplicativo uma aparncia e um comportamento. Observe o exemplo de GUI, a seguir, visualizada atravs da janela do navegador Internet Explorer com seus componentes GUI rotulados.
Barra de ttulo Barra de menus Boto Barra de botes

Barra de rolagem

FIGURA 1.1 VISO DE UMA GUI

18

Linguagens de Programao II

Observe que as GUIs so construdas a partir de componentes GUI . Estes componentes podem ser chamados tambm de widget.
Um componente GUI um objeto com que o usurio interage na aplicao via mouse ou teclado ou outro tipo de entrada.

A maioria dos aplicativos utiliza janelas (windows) ou caixas de dilogo para interagir com o usurio. Em geral, as caixas de dilogo so componentes GUI usadas para exibir mensagens importantes para o usurio ou para, em alguns casos, obter-se informaes dele.

Voc sabe trabalhar com caixas de dilogo?

Lembre-se que na disciplina de Programao Orientada a Objetos (POO), voc utilizou somente este tipo de componente (as caixas de dilogo) para fazer interaes com o usurio (entrada e sada de dados). Para exibir caixas de dilogo nos programas, use a classe JOptionPane que est no pacote javax.swing da API de Java (nesta disciplina, voc explorar bastante as outras classes desse pacote). Lembre-se que a linguagem Java possui uma extensa biblioteca de classes prontas para os programadores usarem. Esta biblioteca chamada de API (aplication programming interface). As classes nesta biblioteca so organizadas por funcionalidade, em estruturas chamadas pacotes (package).

As classes dos componentes GUI esto nos pacotes javax.swing e java.awt. Consulte a documentao desses dois pacotes no seguinte site: http://java.sun.com/j2se/1.5.0/docs/api/

Unidade 1

19

Universidade do Sul de Santa Catarina

At o momento, voc muito provavelmente s utilizou essa classe (JOptionPane) do pacote Swing (ser falado deste modo, daqui para a frente). E, muito provavelmente, somente os mtodos static showInputDialog e showMessageDialog dessa classe foram utilizados.
Porm, a classe JOptionPane oferece diversos tipos de caixas de dilogo e voc pode customizar as existentes. Assim, por exemplo, voc pode mudar o texto da barra de ttulo, o tipo de cone exibido, o nome dos botes, etc.

Veja, agora, como customizar alguns dos mtodos j conhecidos e apresentar outros mtodos.

showMessageDialog
Esse mtodo permite a voc exibir uma caixa de dilogo com uma mensagem e um boto. Ele pode ser customizado, ou seja, voc pode alterar o texto da barra de ttulo e o cone da mensagem. Para isso, voc deve chamar esse mtodo passando alguns argumentos adicionais. A forma abaixo uma das maneiras de invoc-lo, embora existam outras que podem ser consultadas na documentao da API Java:

showMessageDialog(Component parentComponent, Object message, String title, int messageType)

Considere os seguintes parmetros:


parentComponent determina o Frame (este conceito

ser aprendido logo) no qual a caixa de dilogo ser mostrada; se for null, ento o Frame default (padro) usado.
message mensagem a ser mostrada. title texto mostrado na barra de ttulo. messageType determina o tipo de mensagem que aparecer na caixa: ERROR_MESSAGE , INFORMATION_MESSAGE , WARNING_MESSAGE , QUESTION_MESSAGE ou PLAIN_MESSAGE (sem cone). Um cone diferencia o tipo de mensagem. 20

Linguagens de Programao II

De acordo com o tipo de mensagem (messageType) passado como argumento, os seguintes cones podem aparecer na caixa de dilogo:

question
(cor amarela)

information
(cor bord)

warning
(cor vermelha)

error
(cor verde)

FIGURA 1.2 CONES POSSVEIS DE UMA CAIXA DE DILOGO

O cdigo, abaixo, demonstra como customizar o texto da barra de ttulo e o cone dessa caixa de dilogo. Edite, compile e veja o resultado!
import javax.swing.*; public class GuiCaixaDialogo{ public static void main(String arg[]){ //chamada do mtodo passando somente os dois primeiros argumentos. Mostra a // mensagem e cone default de informao JOptionPane.showMessageDialog(null,Mensagem de Informao); // chamada do mtodo passando somente os quatro argumentos explicados acima //ttulo customizado e cone de informao JOptionPane.showMessageDialog(null,Mensagem de Informao,Informao, JOptionPane.INFORMATION_MESSAGE);

Parmetro que dene o tipo da mensagem

Parmetro que muda o texto da barra de ttulo

//ttulo customizado e cone de perigo JOptionPane.showMessageDialog(null,Mensagem de Perigo,Perigo, JOptionPane. WARNING_MESSAGE); //ttulo customizado e cone de erro JOptionPane.showMessageDialog(null,Mensagem de Erro,Erro, JOptionPane. ERROR_MESSAGE);

Unidade 1

21

Universidade do Sul de Santa Catarina

//ttulo customizado e cone de questo JOptionPane.showMessageDialog(null,Mensagem de Questionamento,Questionamento, JOptionPane.QUESTION_MESSAGE); //ttulo customizado e sem cone JOptionPane.showMessageDialog(null,Mensagem simples,Simples, JOptionPane.PLAIN_ MESSAGE); } } //fim da classe

Ateno! Em geral, a barra de ttulo de uma janela adota o estilo que emprega o uso de letra inicial maiscula em cada palavra significativa do texto e no termina com pontuao.

Veja algumas outras caixas de dilogo:

showOptionDialog
Com este mtodo, voc pode mostrar uma caixa com botes especcos, cone, mensagem e ttulo. Voc pode mudar o texto que aparece nos botes do dilogo e realizar outros tipos de customizao. Veja os parmetros necessrios para usar esse mtodo:

showOptionDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue)

Acompanhe os parmetros: parentComponent determina o Frame (voc aprender isto logo) no qual a caixa de dilogo ser mostrada; se for null, ento o Frame default (padro) usado.
22

Linguagens de Programao II

message mensagem a ser mostrada. title mensagem de texto mostrada na barra de ttulo. optionType tipo de opes de boto que aparecero: DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION OK_CANCEL_ OPTION. messageType determina o tipo de mensagem que aparecer na caixa: ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_ MESSAGE, QUESTION_MESSAGE, ou PLAIN_ MESSAGE. icon cone mostrado na caixa. options um array de objetos indicando as possveis escolhas que o usurio pode fazer, normalmente um array de String com os nomes dos botes. initialValue opo default de boto que aparecer na caixa. Deve ser usado somente se a opo options tambm for usada. Pode ser null.

Retorno do mtodo: Um valor inteiro indicando a opo escolhida pelo usurio, ou CLOSED_OPTION se o usurio fechou a janela. O cdigo abaixo exemplica a utilizao desse mtodo:

import javax.swing.*; public class GuiCaixaDialogoOptionDialog{ public static void main(String arg[]){ //array de 3 posies, onde cada uma contm o texto de um boto. String[] options = {Sim, por favor, No, obrigada, Cancela}; //compare os parmetros do mtodo showOptionDialog com a explicao dos parmetros acima //parmetro options o array declarado anteriormente. Contm o nome dos botes //parmetro options[0] indica que o primeiro boto estar selecionado //varivel n armazenar o nmero do boto que o usurio clicou int n = JOptionPane.showOptionDialog(null,Confirma o pedido?,

Unidade 1

23

Universidade do Sul de Santa Catarina

Confirmao do Pedido, JOptionPane.YES_NO_CANCEL_OPTION, //optionType JOptionPane.QUESTION_MESSAGE, //messageType null, //sem icon options, options[0]); // n pode ser testado em relao aos valores inteiros literais 0, 1 ou 2 (ordem dos botes) ou em relao //aos atributos static final da classe JOptionPane: YES_OPTION, NO_OPTION E CANCEL_OPTION. if ((n = = 0) || (n = = JOptionPane.YES_OPTION )) JOptionPane.showMessageDialog(null,Pedido confirmado); else if (n= =1) JOptionPane.showMessageDialog(null,Pedido negado); else if (n = = 2) JOptionPane.showMessageDialog(null,Pedido cancelado); else if (n = = JOptionPane.CLOSED_OPTION) JOptionPane.showMessageDialog(null,Janela fechada); System.exit(0); // o atributo JOptionPane.CLOSED_OPTION indica que a janela foi fechada. } }

showInputDialog
Lembre-se que voc j conhece esse mtodo. Ele permite uma entrada de dados por parte do usurio e algumas customizaes. A novidade, mostrada aqui, que o usurio pode escolher, ao invs de digitar, um entre vrios valores estabelecidos previamente. Esse mtodo possui algumas variaes, ou seja, ele pode ser chamado passando-se um conjunto reduzido de argumentos (como foi feito em POO) ou passando-se vrios argumentos, o que possibilita uma customizao maior. Abaixo apresentada a forma mais completa de chamar esse mtodo:
showInputDialog(Component parentComponent, Object message, String title, int messageType, Icon icon, Object[] selectionValues, Object initialSelectionValue)

24

Linguagens de Programao II

Veja o signicado dos Parmetros (s os parmetros novos so explicados, pois, para os outros parmetros, aplica-se a mesma explicao do mtodo mostrado anteriormente):
icon imagem do tipo Icon pode ser mostrada. selectionValues array de objetos com vrios valores

possveis de serem escolhidos pelo usurio. Normalmente um array de String.


initialSelectionValue valor usado para inicializar o

campo de entrada. o valor que aparece no topo do campo. Retorno do mtodo: Entrada ou escolha do usurio ou null se o usurio cancelar a entrada. O cdigo abaixo exemplica a utilizao desse mtodo:

import javax.swing.*; public class GuiCaixaDialogoInputDialog{ public static void main(String arg[]){ //array com as opes de escolha String[] possibilidades = {feminino, masculino}; //nessa chamada de mtodo necessrio fazer o cast (converso) para String pois o dado retornado do tipo Object String s = (String)JOptionPane.showInputDialog(null,Escolha a opo:, Caixa de Entrada Customizada, JOptionPane.PLAIN_MESSAGE, null, possibilidades, possibilidades[0]); if (s.equals(feminino)) JOptionPane.showMessageDialog(null,Feminino); else JOptionPane.showMessageDialog(null,Masculino); System.exit(0); } }

Unidade 1

25

Universidade do Sul de Santa Catarina

Existem outros mtodos e variaes desses mtodos alm dos mostrados aqui na classe JOptionPane. Para maiores informaes, consulte a documentao da API Java: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JOptionPane.html

Caro aluno, a idia, aqui, foi introduzir para voc as imensas possibilidades de uso de apenas uma das classes do pacote de componentes GUI, chamado Swing.

Seo 2 - Viso Geral dos Componentes Swing


Embora seja possvel voc realizar a entrada e a sada de dados utilizando as caixas de dilogo JOptionPane, a maioria dos aplicativos GUI exigem interfaces com usurios, mais elaboradas e personalizadas, com uma srie de componentes sendo exibidos em uma janela. Neste sentido, conhea outros tipos de componentes GUI. A tabela, abaixo, mostra alguns dos componentes GUI mais utilizados nas aplicaes:
Componente
JLabel JTextField JButton JCheckBox JRadioButton JComboBox JList JPanel

Descrio
Exibe texto no editvel ou cones. Permite ao usurio inserir dados atravs do teclado. Pode exibir texto editvel ou no editvel. Boto. Opo associada a um texto que pode ou no ser selecionada. Podem-se selecionar vrias opes de checkbox. Opo associada a um texto que pode ou no ser selecionada. Seleciona-se uma entre vrias opes de radio. Fornece uma lista de itens a partir da qual o usurio pode escolher um deles ou digitar um valor na prpria caixa. Fornece uma lista de itens a partir da qual o usurio pode escolher um ou vrios itens. Fornece uma rea (painel, container) onde outros componentes podem ser colocados e organizados.

26

Linguagens de Programao II

Observe, a seguir, a interface de uma aplicao com todos os componentes listados acima:
J Label

J Textfield J ComboBox J List

JButton

JRadioButton JCheckBox

JFrame

FIGURA 1.3 GUI COM VRIOS COMPONENTES

Swing e AWT
Para construir as aplicaes GUI, voc deve utilizar dois conjuntos de componentes GUI no Java: Swing. AWT. Antes do Swing ser construdo no J2SE 1.2, as GUI de aplicaes em Java eram construdas com componentes do Abstract Window Toolkit (AWT), que esto no pacote java.awt. Quando uma aplicao GUI em Java construda com componentes AWT e executada em diferentes plataformas, esses componentes so exibidos diferentemente em cada uma dessas plataformas. Alm disso, s vezes, a maneira como um usurio interage com um componente AWT difere entre as plataformas. Por exemplo, uma aplicao que contm um boto (objeto Button do pacote java.awt), ao ser executada no sistema operacional Windows, ter a mesma aparncia dos botes do sistema
Unidade 1

27

Universidade do Sul de Santa Catarina

operacional Windows. Se a aplicao for executada no sistema operacional do Macintosh, ento esta aplicao ter a mesma aparncia dos botes desse sistema.

Saiba Mais! A aparncia e comportamento do sistema em determinada plataforma so conhecidos como look and feel.

Os componentes Swing (pacote javax.swing) permitem especicar uniformemente a aparncia e comportamento de um aplicativo em todas plataformas ou utilizar a aparncia e o comportamento personalizados de cada plataforma.

Ateno! Os componentes Swing so implementados em Java. Deste modo, tais componentes so mais portveis e flexveis do que os componentes do pacote AWT. Estes ltimos so baseados nos componentes GUI da plataforma onde a aplicao executada. Ou seja, os componentes AWT operam tendo por base as funcionalidades de alguma biblioteca grfica do sistema onde a aplicao executada.

Componentes GUI leves e pesados


Os componentes GUI so classicados como leves e pesados. Os componentes leves no so vinculados plataforma local. A maioria dos componentes Swing so componentes leves. Os componentes de peso so vinculados plataforma local porque contam com o sistema de janela desta plataforma para determinar sua funcionalidade, aparncia e comportamento. Os componentes AWT so componentes pesados. Alguns poucos componentes do pacote Swing tambm so.

28

Linguagens de Programao II

Seo 3 - Criao da Primeira GUI - Componente JLabel


Criar uma GUI mais elaborada envolve, primeiramente, a criao de um container, que , por sua vez, um componente que pode receber outros componentes. Em uma aplicao GUI desktop, normalmente o container usado um frame (uma janela com barra de ttulo, botes de minimizar, maximizar e fechar a janela). Uma janela ou frame uma instncia da classe JFrame ou uma subclasse de JFrame. Tal classe fornece os atributos e comportamentos bsicos de uma janela. Nesse container (janela ou frame) podem ser adicionados vrios outros componentes GUI. Na gura anterior, 1.3, voc tem uma idia dos componentes mais usados nas aplicaes. Bom, comece criando uma aplicao GUI com uma janela e vrios componentes que tm como funo rotular, ou seja, especicar a funo de outros componentes na janela. Esse componente criado com a classe JLabel. JLabel exibe uma linha de texto, uma imagem ou tanto texto como imagem.
Para maiores informaes sobre a classe JLabel, consulte a documentao da API: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JLabel.html

A aplicao GUI est dividida em duas classes: A classe GuiJLabel.java cria a janela com os componentes JLabel inseridos nela. A classe TesteJLabel.java possui o mtodo main que cria uma instncia (objeto) da classe GuiJLabel.

Unidade 1

29

Universidade do Sul de Santa Catarina

O cdigo, abaixo, demonstra utilizao do componente JLabel:

0 //Classe GuiJLabel.java 1 2 3 4 5 6 //classe gerenciadora de layout que especifica como os componentes so organizados import java.awt.FlowLayout; import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JLabel; //classe do componente de rtulo (label). Pode exibir texto e imagem import javax.swing.SwingConstants; //classe de constantes usadas pelos componentes Swing import javax.swing.Icon; //interface utilizada para manipular imagens import javax.swing.ImageIcon; /classe utilizada para carregar imagens

7 public class GuiJLabel extends JFrame{ 8 9 10 private JLabel label1; private JLabel label2; private JLabel label3;

11 public GuiJLabel(){ 12 super(Exemplo JLabel); 13 setLayout(new FlowLayout()); 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 } 29 } label1 = new JLabel(Tecnlogo em Web Design e Programao); label1.setToolTipText(Este o rotulo 1); add(label1); Icon bug = new ImageIcon(metal-Error.gif); //esta imagem pode ser substituda por outra label2 = new JLabel(Rtulo com texto e imagem, bug,SwingConstants.LEFT); label2.setToolTipText(Este o rtulo 2); add(label2); label3 = new JLabel(); label3.setText(Rtulo com imagem e texto embaixo); label3.setIcon(bug); label3.setHorizontalTextPosition(SwingConstants.CENTER); label3.setVerticalTextPosition(SwingConstants.BOTTOM); label3.setToolTipText(Este o rtulo 3); add(label3);

Agora, acompanhe a anlise linha a linha do cdigo da classe anterior: Linha 7 observe que a classe GuiJLabel estende a classe JFrame, ou seja, uma subclasse de JFrame. Logo ela herdar a aparncia e comportamento de uma janela tpica. Dentro desta janela sero adicionados outros componentes, neste caso, alguns componentes JLabel e imagens (Icon).

30

Linguagens de Programao II

Linhas 8 a 10 veja que so criados trs atributos do tipo JLabel chamados label1, label2 e label3, que sero os componentes adicionados janela. S foram criadas as referncias para os componentes. Eles s sero instanciados no construtor dessa classe (lembre-se que todo componente um objeto). Linha 11 mtodo construtor da classe (lembre-se que todo o construtor tem o mesmo nome da classe e no tem tipo de retorno). Normalmente, no construtor que voc constri a GUI que exibida na tela, ou seja, nele que chamado o construtor da sua superclasse JFrame (esse constri a janela), instancia (cria) os componentes (objetos), os congura e os adiciona janela ou frame (se GuiJLabel estende JFrame, ento ela um JFrame ou abreviando, um frame). Linha 12 chamada ao mtodo construtor da superclasse JFrame (chama-se o construtor de uma superclasse com a palavra super, est lembrado?). Na chamada do construtor da super foi passado o argumento do tipo String Exemplo JLabel. Assim, este texto ser exibido na barra de ttulo da janela. Linha 13 aqui chamado o mtodo setLayout e passado uma referncia (new) do tipo de layout desejado, nesse caso FlowLayout. Ao construir uma GUI, os componentes devem ser adicionados a um container, nesse caso, janela criada com JFrame. Geralmente preciso decidir em qual posio esses componentes sero adicionados e isso pode ser feito atravs de um gerenciador de layout. Existem algumas classes gerenciadoras de layout que se pode utilizar, mas voc ver isto mais tarde. A princpio, voc utilizar o gerenciador de layout chamado FlowLayout. Embora existam IDEs (ambiente de desenvolvimento integrado) que possuem ferramentas grcas que ajudam a fazer o desenho de uma interface (ou seja, com um simples clicar e arrastar voc coloca e posiciona os componentes na janela), voc no utilizar este recurso neste livro. Tal procedimento tem o intuito de fazer com que voc aprenda mais sobre os componentes GUI, suas conguraes e como posicion-los na janela atravs dos gerenciadores de layout. Ou seja, voc aprender a construir aplicaes GUI na mo.

Unidade 1

31

Universidade do Sul de Santa Catarina

Ao usar o gerenciador de layout FlowLayout, os componentes so colocados no container (janela) da esquerda para a direita, na ordem em que so anexados ao container no programa. Quando no houver mais espao para os componentes na mesma linha, eles so colocados na prxima linha, tambm da esquerda para a direita. Se o container for redimensionado, ento o gerenciador FlowLayout ajustar os componentes novamente. Linha 14 depois que especicar o layout, voc pode criar os componentes, congur-los e adicion-los ao container. Veja que, nessa linha criado o primeiro componente (objeto) JLabel e armazenado sua referncia na varivel label1. Ao chamar o construtor dessa classe passado o argumento String Tecnlogo em Web Design e Programao, e isto far com que esse texto seja exibido na janela. Linha 15 o mtodo setToolTipText aqui chamado precedido da referncia ao componente JLabel recm criado. passada como argumento uma String (mensagem de texto) que aparecer quando o usurio posicionar o mouse em cima desse componente. Linha 16 o mtodo add adiciona o componente recm criado ao container GuiJLabel. Esse mtodo herdado da superclasse JFrame (na realidade o mtodo herdado indiretamente da classe Container) e passado a ele a referncia (label1) do componente JLabel.
Ateno! Lembre-se que os componentes sempre devem ser adicionados a um container.

Esse assunto faz parte dos conhecimentos de Orientao a Objetos. Ele muito importante para o entendimento de vrios conceitos relacionados ao uso de componentes GUI e, por isto, ser dedicada uma seo especial a este assunto no nal desta unidade.

Linha 17 Os cones so normalmente utilizados para identicar as funcionalidades de um sistema. Vrios componentes Swing podem exibir imagens. Primeiramente, voc precisa criar um objeto do tipo Icon e associar uma imagem (.gif, .png, .jpg) a ele. Depois voc passa esse objeto para o construtor ou mtodo do componente Swing. Assim foi feito nas linhas 17 e 18. Na linha 17, foi criado um objeto do tipo ImageIcon, (pacote javax.swing) que uma classe que implementa a interface Icon, passando-se como argumento o nome e a extenso da imagem.

32

Linguagens de Programao II

A imagem deve estar na mesma pasta dos arquivos fonte. A referncia desse objeto armazenada na varivel do tipo Icon. Na linha 18, foi criado o componente JLabel label2 e passados, como argumentos para o seu construtor, o texto a ser exibido, o objeto Icon criado e uma constante que representa o alinhamento do texto no componente JLabel, nesse caso esquerda.
Ateno! A interface SwingContants - que pode ser acessada no endereo http://java.sun.com/j2se/1.5.0/docs/ api/javax/swing/SwingConstants.html - possui um conjunto de atributos que fazem a configurao de posicionamento da tela de vrios componentes Swing. Veja que com essas linhas que um JLabel pode exibir uma imagem (objeto Icon).

Linha 19 e 20 especica-se aqui o texto de dica do label2 e adiciona-se ele ao container. Linha 21 cria-se, aqui, um novo componente JLabel e armazena-se a referncia ao label3. Note que o construtor de JLabel est sem argumentos. Qual texto ser exibido neste label (rtulo)? O texto e imagem sero congurados logo abaixo, com mtodos especcos. Existem vrios outros mtodos na classe JLabel que podem ser usados para congurar o componente. Linha 22 congura o texto a ser exibido no label atravs do mtodo setText(); Linha 23 congura a imagem a ser exibida junto com o texto atravs do mtodo setIcon(). passado como argumento o objeto do tipo Icon, chamado bug, declarado anteriormente. Linha 24 congurao da posio horizontal do texto no label atravs do mtodo setHorizontalTextPosition(). passado como argumento a constante SwingConstants.CENTER. Isto faz com que o texto seja posicionado no centro do label em relao ao alinhamento horizontal.

Unidade 1

33

Universidade do Sul de Santa Catarina

Linha 25 congurao da posio vertical do texto no label atravs do mtodo setVerticalTextPosition (). passado como argumento a constante SwingConstants.BOTTOM. Isto faz com que o texto seja posicionado embaixo, dentro do label em relao ao alinhamento vertical. Linha 26 e 27 especica o texto de dica do label3 e o adiciona ao container. A seguir est o cdigo da classe TesteJLabel.java. Essa classe responsvel por criar uma instncia (objeto) do tipo GuiJLabel, congurar a operao de fechamento da janela, denir seu tamanho e torn-la visvel.

0 1 2 3 4 5 6 7 8

import javax.swing.JFrame; public class TesteJLabel{ public static void main(String arg[]){ GuiJLabel guijlabel = new GuiJLabel(); guijlabel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guijlabel.setSize(275,280); guijlabel.setVisible(true); } }

Veja a anlise do cdigo anterior linha a linha: Linha 0 importa-se a classe JFrame, pois na linha 4 se usa uma constante dessa classe. Linha 3 criao do objeto do tipo GuiJLabel, ou seja, criao da janela. Lembre-se que no construtor de GuiJLabel que a janela criada e que se adicionam os componentes a ela. Linha 4 por padro, fechar uma janela a faz car oculta. Neste caso, ao fechar a janela guijlabel voc quer terminar o aplicativo. O mtodo que faz essa congurao setDefaultCloseOperation (). Deve ser passado o argumento constante JFrame.EXIT_ON_ CLOSE. ela que indica que o programa deve ser terminado quando a janela fechar.

34

Linguagens de Programao II

Linha 5 o mtodo setSize () especica a largura e altura da janela. Linha 6 o mtodo setVisible(), com o argumento true, permite exibir a janela na tela. Agora que voc analisou o cdigo dessas duas classes, edite, compile e teste a sua primeira aplicao GUI. No esquea de olhar a documentao do componente JLabel para explorar seus outros recursos. A gura, a seguir, ilustra a aparncia dessa aplicao.

FIGURA 1.4 GUI DA APLICAO TESTEJLABEL

Seo 4 - Interface
Como escrito anteriormente, o entendimento do conceito de interface importante, e ser estudado antes de voc ver outros conceitos e componentes GUI.

Uma interface uma espcie de classe ou estrutura que inicia com a palavra-chave interface ou public interface e possui somente mtodos que so implicitamente public abstract e/ou atributos que so public static final.

Unidade 1

35

Universidade do Sul de Santa Catarina

Voc lembra que no livro de POO foi visto uma srie de modicadores (palavras usadas na denio de uma classe, atributo ou mtodo)? Revise rapidamente.

Sugesto! Revise todos os captulos que abordam orientao a objetos do livro de POO.

Alguns destes modicadores so chamados de modicadores de acesso (public, private, protected), pois sua funo determinar como (de que lugar) uma classe, mtodo ou atributo pode ser acessado. Outros so chamados modicadores gerais e nessa categoria esto: static um mtodo com o modicador static pode ser chamado precedido apenas do nome da classe, sem que nenhum objeto daquela classe tenha sido criado; o atributo static faz com o que o atributo seja compartilhado por todos os objetos criados a partir da classe onde ele foi denido. Ou seja, o atributo da classe e no de cada objeto. nal um mtodo com o modicador nal no pode ser redenido, sobrescrito em uma subclasse; o atributo nal chamado de constante porque o seu valor nunca muda, sempre xo. O atributo nal deve ser inicializado com um valor no momento da sua denio ou no mtodo construtor da classe. abstract uma classe abstract no pode ter objetos criados (instanciados) a partir dela; o mtodo abstract no tem implementao, um mtodo vazio, sem cdigo. Pode ser usado num contexto de herana, numa superclasse, quando a lgica do mtodo diferente para cada subclasse desta superclasse. Todo o mtodo abstract deve ser obrigatoriamente redenido (sobrescrito) por todas as subclasses da superclasse onde o mtodo abstract est.

36

Linguagens de Programao II

Portanto, depois dessa breve reviso, deve ter cado mais claro o que so atributos static nal (com valor xo) e mtodos abstract (sem implementao). Somente estes itens so colocados numa interface.

Para qu serve e como utilizada uma interface?

A interface diferente de uma classe porque no se podem criar objetos a partir de uma interface. A interface utilizada (implementada) por uma classe. Pode ser utilizada nas seguintes situaes (1 e 2): 1) Java no suporta herana mltipla, ou seja, uma classe (subclasse) no pode herdar ou estender mais que uma classe (superclasse). Uma alternativa para essa restrio so as interfaces, pois uma classe pode implementar (implements) vrias interfaces. Como todos os mtodos de uma interface so abstract, eles devem ser obrigatoriamente redenidos nas classes que implementam esta interface. Uma classe pode implementar (uma espcie de herana) vrias interfaces, resolvendo, portanto, a restrio de herana mltipla apresentada anteriormente. A indicao que uma classe implementa outra classe se d pela palavra-chave implements. Veja o exemplo:

public class Quadrilatero implements CalculoFiguras,.....,.... { }

Observe que CalculoFiguras uma interface e que Quadriltero uma classe que implementa CalculoFiguras e mais outras interfaces, se houver necessidade.

Unidade 1

37

Universidade do Sul de Santa Catarina

J que Quadriltero implementa CalculoFiguras, ela tem que redenir, obrigatoriamente, todos os mtodos abstract de CalculoFiguras. Se isto no for feito, Quadriltero se torna uma classe abstract e uma mensagem de erro aparece aps a compilao, indicando que ela deve ser declarada como abstract.

Lembre-se! Uma classe abstract aquela que no pode ter objetos instanciados.

Uma interface utilizada quando existe um comportamento ou operao (mtodo) padro, cuja lgica especca para cada classe e que deve ser executado por classes que no esto relacionadas somente atravs de Herana. Acompanhe o exemplo: O comportamento ou mtodo calculaArea() deve ser executado pelos objetos das classes da hierarquia Quadriltero (superclasse), Trapzio e Retngulo (subclasses) - (estas trs classes esto relacionadas atravs de herana) - e, tambm, pelos objetos da classe Tringulo que no faz parte desse relacionamento. Note que a lgica para calcular a rea dessas guras diferente para cada uma. A primeira soluo seria implementar um mtodo abstract (sem lgica) na superclasse Quadriltero e redeni-lo com a lgica apropriada nas subclasses Trapzio e Retngulo. Porm, se esse mtodo ou comportamento for colocado somente na superclasse Quadriltero, ento s ser visto e redenido pelas subclasses Trapzio e Retngulo. A classe Tringulo no enxerga esse mtodo, pois no faz parte da hierarquia de herana. O que fazer, ento? Uma soluo criar uma interface e inserir esse comportamento (mtodo) calculaArea() l. Voc pode criar uma interface chamada CalculoFiguras e inserir o mtodo calculaArea(). Lembre-se que mtodos numa interface so sempre abstract (sem implementao). Assim, todas as classes (Trapzio, Retngulo e Tringulo) podero implementar

38

Linguagens de Programao II

essa interface. Isto quer dizer que tero que, obrigatoriamente, redenir o(s) mtodo(s) abstract denidos nessa interface. O cdigo, abaixo, demonstra a implementao dessa interface. Esse cdigo deve ser salvo num arquivo chamado CalculoFiguras.java. Depois de editar, o cdigo deve ser somente compilado.
public interface CalculoFiguras{ public abstract double calculaArea(); //os modicadores public abstract no so obrigatrios }

Agora, vrias classes podem implementar essa interface. Seguindo o exemplo, as classes que devem enxergar e redenir o mtodo calculaArea() so Trapzio, Retngulo e Tringulo. Como Trapzio e Retngulo so subclasses de Quadrilatero, esta superclasse que deve implementar a interface CalculoFiguras. Triangulo tambm deve implementar a interface CalculoFiguras. Cada classe deve ser editada e compilada em um arquivo.java separado. No necessrio que voc implemente esse cdigo. A inteno apenas demonstrar a utilizao de uma interface.
//superclasse Quadriltero implementa a interface CalculoFiguras public class Quadrilatero implements CalculoFiguras { //atributos e mtodos .. } //subclasse Trapzio estende a classe Quadriltero public class Trapezio extends Quadrilatero{ //atributos e mtodos .. public double calculaArea(){ //... } } //subclasse Retngulo estende a classe Quadriltero public class Retangulo extends Quadrilatero{ //atributos e mtodos .. public double calculaArea(){ //... } }

Unidade 1

39

Universidade do Sul de Santa Catarina

Note que somente a superclasse implementa a interface. Com este procedimento, o mtodo calculaArea() deveria ser, obrigatoriamente, redenido nesta superclasse. Caso no seja redenido nesta superclasse, como ser o caso (porque no existe clculo de rea a ser implementado na superclasse Quadrilatero), ento a superclasse Quadriltero deve se tornar abstract e este mtodo, por sua vez, repassado atravs da herana para todas as subclasses, devendo ser obrigatoriamente redenido em todas elas. exatamente nas subclasses que deve ser implementado o clculo da rea, j que ele diferente para Trapezio e para Retangulo. A classe Tringulo no pertence hierarquia de herana das classes acima, mas ela tambm possui o comportamento ou mtodo especco para calcular a rea. Ela deve implementar a interface CalculoFiguras e, assim, tem que redenir, obrigatoriamente, o mtodo abstract dessa interface. Conra no cdigo seguinte:

//Classe Triangulo implementa a interface CalculoFiguras public class Triangulo implements CalculoFiguras { //atributos e mtodos .. public double calculaArea(){ //... } }

Em resumo, a interface utilizada quando classes dspares (no relacionadas) precisam compartilhar mtodos e atributos em comum. Assim, permite-se que os mtodos de objetos (classes) que implementam uma interface sejam processados polimorcamente (uso de polimorsmo).

40

Linguagens de Programao II

Ateno! Polimorfismo um conceito que voc estudou em POO, mas no ser abordado neste livro porque ele no necessrio para construir aplicaes GUI.
Final do exemplo

2) Outra aplicao de interface refere-se possibilidade de utiliz-la como um repositrio de constantes. Ou seja, voc pode declarar numa interface um conjunto de constantes (valores xos) que podem ser usados por vrias classes.

Ateno! Lembre-se que todo atributo numa interface static e final.

Observe o cdigo abaixo:


public interface Constantes{ //esta interface deve ser salva no arquivo Constantes.java int UM = 1; int DOIS = 2; int TRES = 3; } public class TesteInterface{ //note que esta classe no precisa implementar a interface Constantes public static void main(String args[]){ if (Constantes.UM = = 1) //nome da interface.nome do atributo System.out.println( igual a 1); } }

Unidade 1

41

Universidade do Sul de Santa Catarina

Sntese
Nessa unidade, voc conheceu o conceito de GUI. Portanto, j sabe que uma GUI composta por vrios outros componentes, tambm conhecidos como widgets. A maioria dos componentes usados para construir uma GUI so componentes leves do pacote javax.swing. Voc tambm construiu sua primeira GUI. Foi uma GUI simples, somente com componentes do tipo rtulo ou JLabel, mas isto j permitiu que voc tenha uma noo de como uma GUI pode ser construda. No nal da unidade, voc ainda estudou um conceito muito importante da orientao a objetos, o conceito de interface. Interfaces so muito utilizadas na construo de GUIs, embora na GUI construda nesta unidade ela no tenha sido utilizada. importante que esses conceitos sejam bem assimilados.

Atividades de auto-avaliao
A partir de seus estudos, leia com ateno e resolva as atividades programadas para a sua auto-avaliao. 1) Escolha alguma aplicao com interface grfica, faa um print screen dela e identifique os componentes GUI inseridos nela, mais especificamente a classe em Java responsvel pela criao desse componente. Alguns componentes podem ser novos para voc. 2) Complete o primeiro exemplo de cdigo que est incompleto na seo 4 Interface. Crie a interface, as trs classes (superclasse e as duas subclasses) e outra classe com o mtodo main() para testar essa aplicao.

42

Linguagens de Programao II

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando a seguinte referncia, principalmente os captulos 10, 11 e 22: DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. Tambm consulte: SILVA, Ivan Jos de Mecenas. Java 2: fundamentos Swing e JDBC. Rio de Janeiro: Editora Alta Books, 2003. Consulte, tambm, os seguintes sites:
http://java.sun.com/docs/books/tutorial/uiswing/index.html (Creating a GUI with JFC/Swing)

Unidade 1

43

UNIDADE 2

Tratamento de Eventos em uma GUI


Objetivos de aprendizagem
Entender o processo de tratamento de eventos em uma GUI. Utilizar os componentes JTextField e JButton em uma GUI. Conhecer os principais tipos de eventos e suas interfaces.

Sees de estudo
Seo 1 Introduo ao Tratamento de Eventos Seo 2 Componente JTextField e JButton Seo 3 Tipos de Eventos GUI e suas Interfaces Seo 4 Entendendo o Tratamento de Eventos

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade, voc aprender o processo de tratamento de eventos de um GUI. Ele importante porque a maioria dos processamentos que voc deseja programar na sua aplicao acionado atravs da interao do usurio com algum componente presente na GUI. Quando essa interao acontece, eventos so gerados e devem ser tratados adequadamente para que o processamento seja executado corretamente. Esse processo ser apresentado em ordem de diculdade crescente durante as sees desta unidade. importante que voc leia e releia esta unidade, pois depender dela o entendimento das unidades seguintes. Nesta unidade, tambm sero apresentados dois componentes novos: JTextField (campo de texto) e JButton (boto).

Seo 1 Introduo ao Tratamento de Eventos


Ao interagir com os componentes GUI de uma aplicao, o usurio indica a tarefa que deve ser executada pela aplicao. Por exemplo, em uma aplicao qualquer, ao clicar num boto com um rtulo Soma, provavelmente, a tarefa de somar alguns nmeros ser executada. Num editor de texto como o Word, o ato de clicar no boto com o cone de um disquete (boto Salvar) indica que a tarefa de salvar o documento ser executada. Para que voc consiga programar uma tarefa em uma aplicao GUI necessrio entender como funciona o tratamento de eventos. Quando o usurio interage com um componente GUI, um evento disparado (um evento tambm um objeto alis, tudo objeto em uma linguagem orientada a objeto).

46

Linguagens de Programao II

Por exemplo, o clique do mouse num boto dispara um evento; digitar caracteres num campo de texto dispara um evento; passar o mouse por cima de algum componente na tela dispara um evento; selecionar um item numa caixa de seleo (combobox) dispara um evento; fechar a janela dispara um evento, etc. Assim, observa-se que a maioria das aes do usurio numa GUI dispara eventos. Um evento precisa ser tratado, ou seja, a tarefa que voc quer programar deve ser colocada dentro de uma estrutura que sempre executada quando o evento disparado. Voltando ao primeiro exemplo, ao clicar no boto Soma um evento ser disparado e as linhas de cdigo associadas a esse evento sero executadas (caso sejam programadas). Nessas linhas de cdigo estar a programao da soma que voc quer que acontea, por exemplo, a soma de, no mnimo, dois nmeros. Por enquanto, voc ca com essa breve explicao. Logo mais, ver que necessrio que qualquer componente esteja atento ou ouvindo esses eventos... A seguir, voc estuda dois novos componentes JTextField e JButton, alm de uma aplicao onde o tratamento de eventos car mais claro para voc.

Seo 2 Componente JTextField e JButton


A classe JTextField (que faz parte do pacote javax.swing) representa o componente conhecido como campo de texto, onde o usurio pode inserir texto numa nica linha atravs do teclado. O texto tambm pode ser exibido nesse componente sem que o usurio entre com ele. Para digitar o texto nesse componente necessrio que o foco esteja nele. Um componente recebe o foco quando voc clica nele.

Unidade 2

47

Universidade do Sul de Santa Catarina

Consulte a documentao dessa classe em: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JTextField.html

A classe JButton (que faz parte do pacote javax.swing) representa o componente boto, que utilizado nas aplicaes GUI para executar uma ao especca (ao ser clicado), como somar, salvar dados de um formulrio, deletar dados, etc. Um boto pode exibir texto e imagem (objeto Icon) dentro dele. O texto chamado de rtulo do boto.

Consulte a documentao dessa classe em: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JButton.html

A aplicao GUI, a seguir, demonstra o uso desses dois componentes numa interface onde o usurio deve entrar com dois nmeros (nos componentes JTextField) e clicar no boto Soma (JButton). Aps o clique, ser exibida a soma dos dois nmeros em outro componente JTextField. A gura 2.1 demonstra tal aplicao, aps ser executada:

FIGURA 2.1 GUI DA APLICAO TESTEJTEXTFIELD

48

Linguagens de Programao II

Veja o cdigo da classe GuiJTextField.java onde a GUI montada, e o cdigo da classe TestJTextField.java onde criado um objeto do tipo GuiJTextField, que por sua vez exibe a interface:
1 import java.awt.FlowLayout; 2 import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela 3 import javax.swing.JLabel; //classe do componente de rtulo (label). Exibe texto e imagem 4 import javax.swing.JTextField; //classe do componente de caixa de texto 5 import java.awt.event.ActionListener; //interface que trata o evento gerado pelo componente JButton 6 import java.awt.event.ActionEvent; //classe do evento gerado pelo componente de JButton 7 import javax.swing.JButton; //classe do componente boto (button) 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

public class GuiJTextField extends JFrame{ private JLabel labelNu1; private JLabel labelNu2; private JTextField textfieldNu1; private JTextField textfieldNu2; private JTextField textfieldResult; private JLabel labelResultado; private JButton button1; public GuiJTextField(){ super(Exemplo JTextField); setLayout(new FlowLayout()); labelNu1 = new JLabel(Primeiro Nmero); labelNu1.setToolTipText(Digite o primeiro nmero); add(labelNu1); textfieldNu1 = new JTextField(10); add(textfieldNu1); labelNu2 = new JLabel(Segundo Nmero); labelNu2.setToolTipText(Digite o segundo nmero); add(labelNu2); textfieldNu2 = new JTextField(10); add(textfieldNu2); button1 = new JButton(Soma); add(button1); TrataEventoBotao trataevento = new TrataEventoBotao(); button1.addActionListener(trataevento);

Unidade 2

49

Universidade do Sul de Santa Catarina

45 labelResultado = new JLabel(Resultado); 46 labelResultado.setToolTipText(Resultado da Soma); 47 add(labelResultado); 48 49 textfieldResult = new JTextField(10); 50 textfieldResult.setEditable(false); 51 add(textfieldResult); 52 53 54 } 55 56 private class TrataEventoBotao implements ActionListener{ 57 public void actionPerformed(ActionEvent event){ 58 textfieldResult.setEditable(true); 59 textfieldResult.setText(Integer.toString(Integer. parseInt(textfieldNu1.getText())+ Integer. parseInt(textfieldNu2.getText()))); 60 61 }//fim do mtodo 62 }//fim da classe interna 63 }//fim da classe de primeiro nvel

Cdigo da classe TestJTextField.java:


1 import javax.swing.JFrame; 2 3 public class TesteJTextField{ 4 5 public static void main(String arg[]){ 6 7 GuiJTextField guijtextfield = new GuiJTextField(); 8 9 guijtextfield.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 guijtextfield.setSize(275,280); 11 guijtextfield.setVisible(true); 12 13 } 14 }

Acompanhe a anlise do cdigo das duas classes, linha a linha: Linhas 1 a 7 importao de todas as classes que sero utilizadas na aplicao. Note que algumas delas pertencem ao pacote java. awt e outras ao pacote javax.swing. Linha 10 denio da classe GuiJTextField. Note que esta classe estende a classe JFrame, logo ela tambm um frame. Isto faz com que a GUI tenha a aparncia de uma janela.
50

Linguagens de Programao II

Linhas 12 a 18 denio de todos os atributos ou componentes da aplicao. JLabel representa os rtulos, JTextField os campos de texto (onde o usurio entrar com os nmeros e o resultado da soma ser exibido) e JButton o componente que acionar a soma dos dois nmeros. Linha 21 incio do construtor da classe GuiJTextField. dentro do construtor que ser montada toda a GUI, ou seja, cria-se os componentes, adiciona-se os componentes ao frame (se GuiJTextField estende JFrame, ele tambm um frame janela), registra-se o objeto que ouve e trata o evento gerado pelo clique no boto ao componente JButton, etc. Esse construtor chamado na classe TesteJTextField, quando um objeto desse tipo criado (linha 7 da classe TesteJTextField). Linha 22 chamada ao construtor da superclasse JFrame. Chamamos o construtor de qualquer superclasse sempre com super(). enviado como argumento o texto que aparecer na barra de ttulo do frame (janela). Linha 23 os componentes numa GUI so dispostos conforme um layout previamente estabelecido. Existem vrios tipos de layout. Por enquanto, voc utilizar o FlowLayout, explicado no cdigo da unidade anterior. Para congurar (setar) o layout, usado o mtodo setLayout() e passado como argumento um objeto do tipo FlowLayout (new FlowLayout). Linhas 25 a 27 um componente do tipo JLabel criado, congurado o texto que ser exibido quando o mouse estiver posicionado em cima desse JLabel e, logo aps, o componente adicionado ao container (frame). Linhas 29 e 30 o primeiro componente JTextField (campo de texto) criado. Neste componente ser digitado o primeiro nmero. O nmero de colunas de texto passado como argumento para o construtor do componente. A largura em pixels de uma coluna de texto determinada pela largura mdia de um caractere, na fonte atual do campo de texto. Quando o texto exibido em um campo for mais longo que o tamanho do campo, a parte direita do texto no car mais visvel. Se o texto digitado exceder a borda direita do campo de texto, ento parte do texto esquerda ser empurrada para fora do lado esquerdo do campo

Unidade 2

51

Universidade do Sul de Santa Catarina

e no car mais visvel. Use as setas esquerda e direita para se locomover no campo de texto. Na linha 30, o componente adicionado ao frame. Linhas 32 a 34 criao do segundo componente JLabel e adio dele ao frame. Linhas 36 e 37 o segundo componente JTextField (campo de texto) criado. Neste componente ser digitado o segundo nmero. Logo aps, ele adicionado ao frame. Linhas 39 e 40 o componente JButton criado. O rtulo que ser exibido no boto passado como argumento para o construtor. Logo aps, ele adicionado ao frame. Linha 42 nessa linha comea o processo de tratamento de evento, comentado no incio desta unidade. Ele ser abordado de maneira resumida neste momento, durante a explicao do cdigo. Na seo seguinte, aps a explicao de todo o cdigo, abordaremos o processo de tratamento de evento de maneira mais detalhada.

Saiba mais sobre o Tratamento de Evento


Como escrito anteriormente, a interao do usurio com um componente gera eventos variados. Com isto, podemos dizer que um componente (um objeto) onde se origina um evento (outro objeto). Este objeto de evento armazena informaes sobre o evento que aconteceu, como por exemplo, a referncia ao componente que originou o evento e outras informaes. No processo de tratamento de um evento, existe um terceiro elemento denominado de objeto ouvinte de evento. Este objeto ouvinte de evento notificado, avisado quando um determinado evento ocorre em um componente, mas, para isto, ele precisa ser registrado (adicionado) junto ao componente que gera eventos. Quando o objeto ouvinte de evento registrado junto ao componente que gera eventos, o componente avisa ou notifica este objeto ouvinte de evento que ocorreu um evento e, ento, esse objeto ouvinte de evento pode executar uma resposta ao evento, ou seja, executar um mtodo com algum cdigo em resposta a esse evento. Esse mtodo recebe como parmetro o objeto de evento.

52

Linguagens de Programao II

Para que esse processo ocorra, os seguintes passos so necessrios: 1 preciso criar uma classe que trate o evento desejado. Essa classe ser criada dentro da classe que cria a GUI. Observe a linha 56. A linguagem Java permite que sejam declaradas classes dentro de classes. Elas so chamadas de classes aninhadas. Nesse caso, essa classe chamada tambm de classe interna. Este tipo de classe freqentemente utilizada para o tratamento de eventos. 2 A classe interna, mencionada acima, deve implementar uma interface ouvinte de evento (listener). Voc j aprendeu que uma interface uma estrutura que pode conter somente mtodos abstract (sem cdigo). Existem vrias interfaces ouvintes de eventos prontas na API do Java. Voc tem que saber qual a interface apropriada para o tipo de evento que ir ocorrer. 3 Um objeto do tipo dessa classe deve ser criado. Esse o objeto ouvinte de evento mencionado acima. Esse objeto deve ser notificado, avisado quando o evento em um componente ocorrer. Para que ele seja avisado, , ento, necessrio registr-lo junto ao componente. Os passos descritos so demonstrados nas linhas 42 (criao do objeto ouvinte de evento), 43 (registro desse objeto junto ao componente que dispara o evento, nesse caso JButton button1) e 56 a 62 (criao da classe que trata o evento, da qual o objeto ouvinte de evento se origina). Na linha 42, um objeto do tipo TrataEventoBotao criado. Esse o objeto ouvinte de evento. TrataEventoBotao classe interna mencionada no passo 1.

Linha 43 Registro do objeto ouvinte de evento junto ao componente JButton button1. Para que o objeto ouvinte de evento oua e trate os eventos gerados por este componente, ele precisa ser registrado junto ao componente JButton button1. O objeto ouvinte de evento registrado com o mtodo addActionListener(). Este mesmo objeto ouvinte de evento, criado na linha 42, passado como argumento. Linhas 45 a 47 criao do segundo componente JLabel label 3 com o rtulo Resultado e adio dele ao frame. Linhas 49 a 51 o terceiro componente JTextField (campo de texto) criado. Nesse componente ser exibido o resultado da
Unidade 2

53

Universidade do Sul de Santa Catarina

soma. Na linha 50, ele congurado para no ser editvel com o mtodo setEditable(false), ou seja, o usurio no poder inserir dados no componente e ele servir apenas para exibir o resultado da soma. Logo aps, o componente adicionado ao frame. Linha 54 m do construtor. Linha 56 incio da classe interna TrataEventoBotao. Essa a classe responsvel pelo tratamento do evento que ocorrer quando o usurio clicar no boto. Note que o modicador de acesso da classe private porque essa classe ser utilizada para tratar eventos gerados pelos componentes denidos na classe principal, tambm chamada de classe de primeiro nvel (GuiJTextField). Ela pode ser public, protected ou private. A classe TrataEventoBotao implementa (implements) a interface j denida na API do Java chamada ActionListener. Ela deve implementar exatamente essa interface porque o evento gerado pelo clique no boto do tipo ActionEvent (classe ActionEvent). O que exatamente signica isso?
Revisando! A interao do usurio (clicar, passar o mouse sobre, digitar caracteres, etc.) com um componente pode gerar vrios tipos de eventos (objetos de evento). Uma interao especfica com um componente, como clicar no boto, gera um tipo de evento especfico. Cada objeto de evento criado por uma classe que implementa uma interface especfica desse tipo de evento.

54

Linguagens de Programao II

Acompanhe o exemplo:

Quando o usurio clica no boto, um objeto de evento do tipo ActionEvent (classe ActionEvent) gerado. Quando o usurio pressiona a tecla Enter num componente JTextEdit, um objeto de evento do tipo ActionEvent tambm gerado. Quando o usurio digita caracteres em um campo de texto, um objeto de evento do tipo KeyEvent gerado. Quando o usurio passa o mouse sobre um componente, um objeto de evento do tipo MouseEvent gerado, etc.

Perceba que, conforme o tipo de interao com o componente, outro tipo de evento pode ocorrer. Em outras aplicaes, voc trabalhar com outros tipos de eventos. O objeto de uma classe que implementa a interface ActionListener somente pode ouvir ou tratar eventos do tipo ActionEvent, desde que esse objeto seja registrado junto ao componente. Lembre-se que o objeto do tipo TrataEventoBotao criado na linha 42 e, na linha 43, ele adicionado (registrado) ao componente JButton button1. Assim, quando o usurio clicar no boto para realizar a soma, um objeto de evento do tipo ActionEvent ser disparado e passado como parmetro para o mtodo do objeto ouvinte de evento, que foi registrado junto ao componente JButton button1. Assim, tudo o que foi programado nesse mtodo (linhas 57 a 61) ser executado.

Que mtodo esse?

Tal mtodo o que est dentro da classe TrataEventoBotao, j que o objeto ouvinte de evento desse tipo. Esse mtodo o actionPerformed(), denido na linha 57.

Unidade 2

55

Universidade do Sul de Santa Catarina

O que est programado dentro dele?

A soma dos dois valores digitados nos componentes JTextField. Linha 57 como mencionado na explicao acima, aqui comea a redenio do mtodo actionPerformed(). Note que o termo usado foi redenio, pois exatamente isso que est sendo feito, uma vez que esse mtodo est denido como abstract na interface ActionListener. Lembre-se que, quando uma classe implementa uma interface, ela deve, obrigatoriamente, redenir (provavelmente com cdigo dentro) todos os mtodos dessa interface. Como esse o nico mtodo da interface ActionListener, necessrio redenir somente ele. Note que esse mtodo recebe como parmetro um objeto de evento do tipo ActionEvent, porque esse tipo de evento que gerado quando o usurio clica no boto. Linha 58 aqui comea a programao do que voc quer que acontea quando o usurio clicar no boto Soma. Tudo o que for programado aqui, ser executado nesse momento.

O que voc quer que acontea?

Que os dois nmeros digitados nos componentes JTextField sejam somados. Para isso, nessa linha o componente texteldResult congurado para true atravs do mtodo setEditable(). Com isso, o campo torna-se editvel e armazena-se o resultado da soma dentro desse componente. Linha 59 essa linha programada para armazenar algum valor no componente texteldResult. Isso feito com o mtodo setText(). O valor que se quer armazenar o que foi digitado e armazenado nos dois primeiros componentes JTextField. Para

56

Linguagens de Programao II

isso, so recuperados esses valores atravs do mtodo getText() de cada componente JTextField. O valor retornado do tipo String; logo, eles precisam ser transformados para int com o mtodo Integer.parseInt(), somados e o resultado da soma transformado para String novamente, para, nalmente, ser passado como argumento para o mtodo setText(), j que este mtodo aceita somente dados do tipo String. Linha 61 m do mtodo actionPerformed(). Linha 62 m da classe interna TrataEventoBotao. Linha 63 m da classe de primeiro nvel GuiJTextField. O cdigo da classe TesteJTextField, analisado abaixo, possui o mtodo main() e dentro dele criado um objeto do tipo da classe GuiJTextField. Linha 7 Um objeto do tipo GuiJTextField criado. Quando o construtor GuiJTextField () desse objeto chamado, a interface exibida porque dentro dele que ela programada. Linha 9 a 11 congura o modo de fechamento da janela, o tamanho da janela e a torna visvel.

Ateno! Primeiramente, edite e compile a classe que representa a janela (estende JFrame, cria os componentes e adiciona eles ao frame). Logo aps, edite e compile a classe que cria um objeto do tipo da classe anterior. Comando para compilar: javac <nome da classe.java> Comando para executar: java <nome da classe>

Unidade 2

57

Universidade do Sul de Santa Catarina

possvel estender o exemplo anterior e criar uma espcie de calculadora. Para isso, necessrio adicionar mais trs componentes JButton na classe GuiJTextField. Os outros botes representaro as aes de subtrao, multiplicao e diviso. A gura 2.2 representa essa aplicao:

FIGURA 2.2 GUI DA APLICAO TESTEJTEXTFIELD

O cdigo da classe GuiJTextField mostrado e as alteraes so comentadas no decorrer do cdigo abaixo:


import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JButton; public class GuiJTextField extends JFrame{ private JLabel labelNu1; private JLabel labelNu2; private JTextField textfieldNu1; private JTextField textfieldNu2; private JTextField textfieldResult; private JLabel labelResultado; private JButton buttonSoma; private JButton buttonSubtracao; private JButton buttonMultiplicacao; private JButton buttonDivisao; public GuiJTextField(){ super(Exemplo JTextField); setLayout(new FlowLayout()); labelNu1 = new JLabel(Primeiro Numero); labelNu1.setToolTipText(Digite o primeiro nmero); add(labelNu1);

So criados mais trs componentes JButton e modicado seus nomes.

58

Linguagens de Programao II

textfieldNu1 = new JTextField(5); add(textfieldNu1); labelNu2 = new JLabel(Segundo Numero); labelNu2.setToolTipText(Digite o segundo nmero); add(labelNu2); textfieldNu2 = new JTextField(10); add(textfieldNu2); buttonSoma = new JButton(Soma); add(buttonSoma); buttonSubtracao = new JButton(Subtrao); add(buttonSubtracao); buttonMultiplicacao = new JButton(Multiplicao); add(buttonMultiplicacao); buttonDivisao = new JButton(Divisao); add(buttonDivisao); TrataEventoBotao trataevento = new TrataEventoBotao(); buttonSoma.addActionListener(trataevento); buttonSubtracao.addActionListener(trataevento); buttonMultiplicacao.addActionListener(trataevento); buttonDivisao.addActionListener(trataevento); labelResultado = new JLabel(Resultado); labelResultado.setToolTipText(Resultado da Soma); add(labelResultado); textfieldResult = new JTextField(10); textfieldResult.setEditable(false); add(textfieldResult); } .. ..
Os quatro componentes JButton so criados e adicionados ao frame um aps o outro

O objeto ouvinte de evento criado. Logo aps, este mesmo objeto registrado junto aos quatro componentes JButton. Isto signica que quando um evento for disparado por causa da interao do usurio em qualquer dos componentes, o mesmo objeto ouvinte de evento ir tratar esse evento. Voc ver mais detalhes na explicao do cdigo da classe TrataEventoBotao.

63 private class TrataEventoBotao implements ActionListener{ 64 public void actionPerformed(ActionEvent event){ 65 textfieldResult.setEditable(true); 66 if (event.getSource() == buttonSoma) 67 textfieldResult.setText(Integer.toString(Integer.parseInt(textfieldNu1.getText())+ Integer.parseInt(textfieldNu2.getText()))); 68 else 69 if (event.getSource() == buttonSubtracao) 70 textfieldResult.setText(Integer.toString(Integer.parseInt(textfieldNu1.getText())Integer.parseInt(textfieldNu2.getText()))); 71 else 72 if (event.getSource() == buttonMultiplicacao) 73 textfieldResult.setText(Integer.toString(Integer.parseInt(textfieldNu1.getText())* Integer.parseInt(textfieldNu2.getText()))); 74 else 75 if (event.getSource() == buttonDivisao) 76 textfieldResult.setText(Integer.toString(Integer.parseInt(textfieldNu1.getText())/ Integer.parseInt(textfieldNu2.getText()))); 77 } //fim do mtodo 78 } //fim da classe interna 79 } //fim da classe inicial

Note que o cdigo do mtodo actionPerformed() foi bastante alterado. Isto aconteceu porque precisamos saber qual o componente que originou o evento. Voc ver mais explicaes aps o cdigo.

Unidade 2

59

Universidade do Sul de Santa Catarina

O cdigo da classe interna TrataEventoBotao ser explicado abaixo: Linha 63 essa numerao sugerida para incio da classe interna TrataEventoBotao. Voc j sabe que essa classe somente tratar eventos do tipo ActionEvent, pois ela implementa somente a interface ActionListener; dizemos somente porque uma classe pode implementar mais de uma interface, lembra? Mas esse no o caso dessa aplicao, pois nela preciso tratar somente eventos do tipo ActionEvent, que so disparados quando o usurio clica com o mouse em algum JButton. Como agora existem quatro componentes JButton na aplicao e todos foram registrados com o mesmo objeto ouvinte de evento (objeto do tipo TrataEventoBotao). Se no se vericar qual o componente que originou o evento, o mesmo cdigo programado dentro do mtodo actionPerformed() ser executado quando o usurio clicar no boto Soma, Subtrao, Diviso e Multiplicao. No se quer isto. Quer-se que quando o usurio clique no boto Soma, os dois nmeros digitados sejam somados, e quando o usurio clicar no boto Multiplicao, os dois nmeros sejam multiplicados, etc. Linha 64 incio do mtodo actionPerformed(). Esse mtodo recebe como parmetro uma referncia (lembre-se que a referncia o endereo de algum objeto na memria) ao objeto do tipo ActionEvent, gerado quando o usurio clica em algum JButton. Essa referncia armazenada na varivel event. O nome dessa varivel pode mudar. Esse objeto contm informaes como qual o componente que originou o evento. Ento, ele, na verdade, a varivel referncia que ser usada para saber qual o componente JButton que originou o evento.

60

Linguagens de Programao II

Linha 66 para saber qual o componente que originou o evento, preciso obter a referncia do componente que o originou, atravs do mtodo getSource() desse evento. Logo, event.getSource() retornar a referncia do objeto componente que originou o evento. preciso vericar se essa referncia (endereo) igual (=) referncia armazenada em cada uma das variveis que guardam as referncias dos quatro componentes JButton (buttonSoma, buttonSubtracao, buttonMultiplicacao, buttonDivisao). Se forem iguais, porque esse componente originou o evento. Dentro do teste (if ) programada a tarefa adequada. Por exemplo, se for o componente buttonSoma, ento uma soma programada.

Seo 3 Tipos de Eventos GUI e suas Interfaces


Voc j leu, anteriormente, que existem vrios tipos de eventos (no somente ActionEvent) que podem ocorrer quando o usurio interage com um componente GUI. As informaes sobre esse evento (objeto de evento) so armazenadas em um objeto (todo o objeto deriva de uma classe) que estende a classe AWTEvent. Veja que nas linhas de importao da classe GUIJTextField foi importado a classe ActionEvent do pacote java.awt.event. Essa classe estende ( uma subclasse de) AWTEvent. A gura 2.3, logo a seguir, ilustra a hierarquia de classes a partir da classe AWTEvent. Todas essas classes representam todos os tipos de objetos de evento que podem ocorrer quando o usurio interage com um componente GUI. Nas prximas aplicaes, voc trabalhar com muitos desses eventos.

Unidade 2

61

Universidade do Sul de Santa Catarina

FIGURA 2.3 HIERARQUIA DAS CLASSES DE EVENTOS

Para cada tipo de objeto de evento, h uma interface ouvinte de evento apropriada. Para tratar esse evento, um objeto ouvinte de evento ou a classe dele precisa implementar a interface correspondente ao tipo de evento que ocorreu. No caso da aplicao anterior, j se sabia que o evento era do tipo ActionEvent. Logo, a interface que a classe do objeto ouvinte de evento teve que implementar foi ActionListener (veja a linha 63). A gura, abaixo, mostra um conjunto de interfaces denidas no pacote java.awt.event. Outras interfaces so declaradas no pacote java.swing.event.

62

Linguagens de Programao II

FIGURA 2.4 HIERARQUIA DE INTERFACES

Cada interface ouvinte de eventos especica um ou mais mtodos de tratamento de evento que devem ser declarados (redenidos) na classe que implementa a interface. A interface ActionListener s especica um mtodo, ActionPerformed(), por isso, s preciso redenir esse mtodo. Um componente pode ter vrios tipos de objeto ouvinte de evento registrados. No caso da aplicao anterior, s tinha um tipo de objeto ouvinte de evento registrado para cada componente.

Unidade 2

63

Universidade do Sul de Santa Catarina

Quando o evento ocorre, o componente GUI que o usurio interagiu notica (avisa) todos os seus objetos ouvintes de eventos (se houver mais de um registrado). Estes, depois de noticados, executam o mtodo apropriado (aquele que foi denido dentro da sua classe). Na prxima seo, voc entender mais a fundo como esse mecanismo de tratamento de evento funciona.

Seo 4 Entendendo o Tratamento de Eventos


Nesta seo, voc ver como funciona internamente, em memria, o mecanismo de tratamento de eventos, com base no ltimo cdigo da aplicao mostrada nesta unidade. Nessa aplicao, existem quatro componentes JButton que geram eventos do tipo ActionEvent quando o usurio clica no boto. Existe apenas um objeto ouvinte de evento para tratar os eventos dos quatro componentes, e ele foi registrado atravs do mtodo addActionListener(), para cada um dos componentes. Quando o evento ocorrer em determinado componente, o objeto ouvinte de evento noticado e responde executando o mtodo implementado na sua classe (actionPerformed()). Depois dessa breve reviso, faz-se necessrio tentar responder duas perguntas:

Como funciona o registro de um objeto ouvinte de evento em determinado objeto componente (observe que se fala no termo componente, mas todo o componente um objeto)? Se possvel registrar vrios tipos de ouvinte de evento em um componente (lembre-se que, para cada tipo evento que um componente dispara, existe um objeto ouvinte de evento apropriado), como o mtodo correto ser chamado?

64

Linguagens de Programao II

Para responder a essas perguntas e entender como o tratamento de evento ocorre, voc deve observar, atentamente, a gura 2.5, em funo da qual mostrado como o tratamento ocorre para o componente JButton buttonSoma. O mesmo acontece para os demais componentes.

Varivel referncia buttonSoma

Varivel referncia trataevento

rea dos objetos


Objeto JButton
var. de instncia listenerList

Objeto TrataEventoBotao
public void actionPerformed(ActionEvent event){ //tratamento do evento

Objeto EventListenerList
Essa referncia criada pela instruo buttonSoma.addActionListener(trataevento)

FIGURA 2.5 Processo de tratamento de evento em memria

Note que existe uma rea dos objetos e uma rea para as variveis referncia, que guardam a referncia (endereo) dos objetos. Na rea das variveis referncia, existem duas variveis referncia: buttonSoma e trataevento. Acompanhe cada varivel referncia em detalhe: buttonSoma a varivel referncia que guarda a referncia para um componente objeto JButtom. trataevento a varivel referncia que guarda a referncia para o objeto ouvinte de evento do tipo TrataEventoBotao.

Unidade 2

65

Universidade do Sul de Santa Catarina

Lembre-se que na disciplina de POO foi ensinado que um objeto ocupa uma determinada rea da memria e, para que esse objeto seja acessado, necessrio que exista uma varivel referncia que guarde a sua referncia (endereo). Na rea dos objetos existem trs objetos do tipo: JButton, TrataEventoBotao e EventListenerList. Veja cada um dos objetos abordados, em detalhe: Dentro do objeto JButton existem vrias variveis de instncia ou atributos para congurar esse tipo de objeto e, tambm, existe uma varivel de instncia chamada listenerList. O mesmo acontece com qualquer tipo de objeto componente. Essa varivel sempre armazena uma referncia para o objeto do tipo EventListenerList. Nesse objeto do tipo EventListenerList sero armazenadas as referncias (endereos) para todos os objetos ouvintes de eventos que forem criados e registrados junto ao componente (no caso da aplicao anterior, s adicionamos um). Entenda esse objeto como um array (vetor), onde cada posio armazena a referncia para um determinado objeto ouvinte de evento. O objeto TrataEventoBotao ter os atributos e mtodos denidos na sua classe. No caso dessa aplicao, somente o mtodo actionPerformed(). Depois das explicaes, referentes gura anterior, existem mais elementos para responder s duas perguntas formuladas.

1) Como um objeto ouvinte de evento registrado?


Primeiramente, ele precisa ser criado (instanciado). Na aplicao, isso feito com a instruo TrataEventoBotao trataevento = new TrataEventoBotao(); e trataevento a varivel referncia do objeto TrataEventoBotao. Logo aps, ele registrado (adicionado) junto ao componente buttonSoma, com a instruo buttonSoma.addActionListener( trataevento). Quando essa instruo for executada, a referncia

66

Linguagens de Programao II

do objeto ouvinte de evento TrataEventoBotao adicionada na varivel (array) de instncia listenerList do componente buttonSoma. Com esse mecanismo, outros tipos de objetos ouvintes de evento podem ser adicionados a um componente GUI. Ou seja, cada componente mantm sua prpria lista de objetos ouvinte de eventos que tratam os eventos do componente.

2) Se houver vrios objetos ouvintes de evento adicionados no componente e cada um deles puder possuir um ou mais mtodos, qual o mtodo correto que dever ser executado?
Lembre-se que dentro de algum mtodo do objeto ouvinte de evento que o processamento que deve ser executado est implementado, como, por exemplo, o processamento da soma, subtrao da aplicao exemplo. O que determina qual mtodo ser executado o tipo de evento que foi gerado. Quando um evento ocorre, o objeto deste evento passado como argumento somente para os mtodos dos objetos ouvinte de evento que aceitam este tipo de objeto de evento. Acompanhe o exemplo:
Quando um evento do tipo ActionEvent ocorre em um componente e esse componente tem registrados vrios tipos de objetos ouvintes de evento - como MouseEvents (eventos que ocorrem quando o usurio interage no componente com o mouse, como passar o mouse em cima do componente, etc), KeyEvents (eventos que acontecem quando o usurio digita caracteres em algum componente, como no caso de um componente do tipo JTextField) e ActionEvents, quais os objetos ouvintes de evento que possuem mtodo que aceitem uma referncia a um objeto do tipo ActionEvent como parmetro? Somente os objetos ouvintes de evento que implementam a interface ActionListener. Olhe na figura 2.5 e veja que o mtodo desse tipo de objeto aceita um parmetro do tipo ActionEvent. Logo, somente esse mtodo ser executado.

Unidade 2

67

Universidade do Sul de Santa Catarina

Sntese
No transcorrer desta unidade, voc aprendeu o processo de tratamento de evento de uma GUI. Voc deve estar achando este assunto muito complicado. Concordamos com voc! Portanto, a dica a mesma do incio da unidade: releia quantas vezes forem necessrias para o seu entendimento. Alm disto, busque as fontes de informao extra, encontradas no nal desta unidade.

Atividades de auto-avaliao
A partir de seus estudos, leia com ateno e resolva as atividades programadas para a sua auto-avaliao. 1) Desenvolva o seguinte programa utilizando uma GUI com os componentes JTextField, JLabel e JButton aprendidos at o momento. O programa deve permitir que o usurio entre com 3 notas. Ao clicar no boto Mdia, a mdia deve ser calculada e apresentada num componente JLabel. Alm disto, a situao do aluno - Aprovado se a mdia for maior ou igual a 7, Exame se a mdia for maior ou igual a 2 e menor que 7 e Reprovado se a mdia for menor que 2 - deve ser apresentada em outro componente JLabel.

68

Linguagens de Programao II

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando a seguinte referncia, principalmente os captulos 10, 11 e 22: DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. Consulte tambm: HORSTMANN, Cay; CORNELL, Gary. Core JAVA 2. Volume I Fundamentos. 7 ed. Editora Alta Books, 2005. Consulte, tambm, o seguinte site:
http://www.inf.pucrs.br/~flash/lapro2/lapro2_eventos.pdf (Tratamento de eventos)

Unidade 2

69

UNIDADE 3

Componentes de uma GUI


(JCheckBox, JRadioButton, JComboBox e JList)

Objetivos de aprendizagem
Desenvolver uma GUI com o componente JCheckBox. Desenvolver uma GUI com o componente JRadioButton. Desenvolver uma GUI com o componente JComboBox. Desenvolver uma GUI com o componente JList.

Sees de estudo
Seo 1 Componente JCheckBox Seo 2 Componente JRadioButton Seo 3 Componente JComboBox Seo 4 Componente JList

Universidade do Sul de Santa Catarina

Para incio de conversa


A partir desta unidade, voc comea a conhecer e trabalhar com outros componentes GUI que geram outros tipos de eventos. Voc j tem o conhecimento bsico necessrio para isso, ou seja, voc j sabe que uma GUI composta por vrios componentes e que a interao com esses componentes gera eventos que precisam ser tratados. Nesta unidade, sero apresentados quatro componentes novos: JCheckBox, JRadioButton, JComboBox e JList. Est curioso e quer comear?

Seo 1 Componente JCheckBox


O componente JCheckBox conhecido como componente caixa de seleo, pois sua interface exibe um pequeno quadro, onde o usurio pode selecionar (check) ou desmarcar a opo. Quando o usurio interage com esse componente, ele mantm um estado interno selecionado ou no selecionado. Normalmente, esse componente utilizado em situaes onde o usurio pode marcar, escolher ou selecionar vrias opes.

Saiba mais sobre o componente JCheckBox! Consulte a documentao contida no site: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JCheckBox.html

O usurio poder interagir com os componentes JCheckBox marcando ou desmarcando as opes existentes. Quando um componente JCheckBox marcado, o smbolo aparece e o estado do componente congurado para selecionado. Se o usurio interage novamente, o smbolo

72

Linguagens de Programao II

desaparece e o estado do componente congurado para no selecionado. A gura 3.1, a seguir, mostra uma GUI onde existe: um componente JTextField com um texto fornecido pela aplicao; dois componentes JCheckBox, rotulados com Negrito e Itlico.

JCheckBox

FIGURA 3.1 GUI DA APLICAO TESTEJCHECKBOX

Ao selecionar o componente JCheckBox Negrito, o texto ser marcado com o estilo Negrito; ao selecionar o JCheckBox Itlico, o texto tambm ser transformado para Itlico. Ao se desmarcar um dos estilos, este estilo retirado do texto. A seguir, exibido o cdigo fonte da aplicao com a classe GuiJCheckBox e a classe TesteJCheckBox, referente gura anterior.
0 1 2 3 4 import java.awt.FlowLayout; import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JTextField; //classe do componente campo de texto import javax.swing.JCheckBox; //classe do componente de caixa de seleo import java.awt.event.ItemListener; //interface para tratamento do evento do componente JCheckBox 5 import java.awt.event.ItemEvent; //classe do evento gerado pelo componente JCheckBox 6 import java.awt.Font; //classe que representa as configuraes de fonte do texto exibido no JTextField 7 8 public class GuiJCheckBox extends JFrame{ 9 10 private JTextField textfield; 11 private JCheckBox checkNegrito; 12 private JCheckBox checkItalico;

Unidade 3

73

Universidade do Sul de Santa Catarina

13 14 public GuiJCheckBox(){ 15 super(Exemplo JCheckBox); 16 setLayout(new FlowLayout()); //configura o layout do frame 17 18 textfield = new JTextField(Tecnologo em Web Design e Programao); 19 textfield.setFont(new Font(Serif, Font.PLAIN, 14)); 20 add(textfield); //adiciona textfield ao frame 21 22 checkNegrito = new JCheckBox(Negrito);//cria o primeiro componente JCheckBox 23 checkItalico = new JCheckBox(Italico);//cria o segundo componente 24 add(checkNegrito);//adiciona os dois componentes ao frame 25 add(checkItalico); 26 27 //cria o objeto ouvinte de evento 28 TrataEventoCheckBox trataevento = new TrataEventoCheckBox(); 29 //adiciona esse objeto a cada um dos componentes. Veja que o mtodo agora addItemListener() 30 checkNegrito.addItemListener(trataevento); 31 checkItalico.addItemListener(trataevento); 32 33 34 } 35 36 private class TrataEventoCheckBox implements ItemListener{ 37 private int valorNegrito = Font.PLAIN; //controla o estilo da fonte Negrito 38 private int valorItalico = Font.PLAIN; //controla o estilo da fonte Itlico 39 40 public void itemStateChanged(ItemEvent event){ 41 42 //verifica a origem do evento. Trata o evento para o componente checkNegrito 43 if (event.getSource() == checkNegrito){ 44 if (checkNegrito.isSelected()) 45 valorNegrito = Font.BOLD; 46 else 47 valorNegrito = Font.PLAIN; 48 } 49 50 //verifica a origem do evento. Trata o evento para o componente checkItalico 51 if (event.getSource() == checkItalico){ 52 if (checkItalico.isSelected()) 53 valorItalico = Font.ITALIC; 54 else 55 valorItalico = Font.PLAIN; 56 } 57 58 textfield.setFont(new Font(Serif,valorNegrito + valorItalico,14)); 59 } 60 } 61 }

74

Linguagens de Programao II

Acompanhe o comentrio de algumas linhas do cdigo anterior: Linha 18 criao do componente de texto JTextField. O texto Tecnlogo em Web Design e Programao passado para o construtor desse componente. Esse procedimento faz com que esse texto aparea dentro do componente. Linha 19 o mtodo setFont() do componente JTextField invocado para fazer a congurao da fonte (nome da fonte, estilo da fonte, tamanho) do texto que ser exibido. Esse mtodo deve recebe a referncia de um novo objeto do tipo Font (veja que essa classe est sendo importada na linha 6). Por isso, o argumento passado new Font(Serif , Font.PLAIN, 14)). Note que, no construtor de Font, so passados como argumento o nome da fonte (Serif ), o estilo da fonte (Font.PLAIN) e o tamanho (14). Font.PLAIN um atributo int static da classe Font.

Consulte a documentao dessa classe Font e voc ver que existem outros estilos que podem ser utilizados. Para tanto, pesquise em: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Font. html

Linha 22 e 23 criao dos componentes JCheckBox. No construtor, o texto passado, isto , o rtulo que aparece do lado direito da caixa de seleo. Linha 28 quando o usurio clica num componente JCheckBox, um evento do tipo ItemEvent (classe ItemEvent importada na linha 5) gerado. Note que, agora, o evento no mais ActionEvent. Outro tipo de evento ser tratado nessa aplicao. Esse evento deve ser tratado por um objeto ouvinte de evento do tipo ItemListener, ou seja, que implementa a interface ItemListener (importada na linha 4), dentro do mtodo itemStateChanged(). Assim, essa linha cria um objeto ouvinte de evento do tipo TrataEventoCheckBox. Essa a classe interna que implementa a interface ItemListener (linha 36). Linha 29 e 30 adiciona o objeto ouvinte de evento aos dois componentes JCheckBox, atravs do mtodo addItemListener().
75

Unidade 3

Universidade do Sul de Santa Catarina

Note que se o evento mudar, a interface do objeto ouvinte de evento e o mtodo que adiciona o objeto ouvinte ao componente tambm mudaro. Linha 36 incio da classe interna TrataEventoCheckBox que implementa a interface ItemListener. Linha 37 e 38 criao de duas variveis de instncia da classe TrataEventoCheckBox. Ambas so do tipo int. Essas duas variveis iro controlar o estilo de formatao Negrito e Itlico. Ao serem declaradas, elas recebem o valor inteiro do estilo PLAIN (simples), estilo sem formatao. Linha 40 incio do mtodo itemStateChanged(). Esse mtodo abstract na interface ItemListener e precisa ser redenido nessa classe. Esse mtodo recebe como parmetro uma referncia ao objeto de evento ItemEvent, gerado quando o usurio interagir com algum componente JCheckBox. Essa referncia armazenada na varivel chamada event (o nome dessa varivel pode mudar). nesse mtodo que ser controlada a interao do usurio com os componentes JCheckBox checkNegrito e JCheckBox checkItalico. Linha 43 testa a origem do evento, ou seja, qual o componente que originou o evento. Esse teste j foi explicado com detalhes na aplicao da unidade anterior. preciso fazer este teste porque o mesmo objeto ouvinte de evento foi registrado junto aos dois componentes JCheckBox. Assim, quando o usurio interagir com algum JCheckBox, o evento ItemEvent ocorrer e ser enviado para o mtodo itemStateChanged(). Linha 44 se for o componente checkNegrito que originou o evento, necessrio testar, tambm, se o componente foi selecionado (marcado) ou no. Esse teste feito com o mtodo isSelected() do componente checkNegrito. Esse mtodo retorna true se o componente foi selecionado. Linhas 45 a 47 se o componente checkNegrito foi selecionado, ento o valor do atributo Font.BOLD armazenado na varivel valorNegrito. Seno, o valor do atributo Font.PLAIN armazenado nessa varivel.

76

Linguagens de Programao II

Linhas 51 a 56 a mesma vericao acontece para o componente checkItalico. S que as conguraes so armazenadas na varivel valorItalico. Linha 58 o mtodo setFont() muda as conguraes de fonte do texto no componente JTextField texteld. O argumento passado a referncia de um novo objeto do tipo Font. Esse objeto do tipo Font mantm o mesmo nome e tamanho de fonte, mas o estilo a soma do contedo das variveis valorNegrito + valorItalico. A seguir, apresentado o cdigo fonte da classe TesteJCheckBox. Esse cdigo semelhante ao cdigo fonte da classe TestJTextField da unidade anterior.
import javax.swing.JFrame; public class TesteJCheckBox{ public static void main(String arg[]){ GuiJCheckBox guijcheckbox = new GuiJCheckBox(); guijcheckbox.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guijcheckbox.setSize(275,280); guijcheckbox.setVisible(true); } }

Caro aluno, edite e compile a classe GuiJCheckBox. Logo aps, edite, compile e execute a classe TesteJCheckBox.

1.1 Outros mtodos de JCheckBox


A classe JCheckBox possui outros mtodos interessantes que podem ser usados no desenvolvimento de umaGUI: void setEnabled(boolean b) marca o JCheckBox. void setTex(String text) seta o label do JCheckBox.

Unidade 3

77

Universidade do Sul de Santa Catarina

Seo 2 Componente JRadioButton


O componente JRadioButton, tambm conhecido como boto de radio, um componente que tambm mantm um estado interno selecionado ou no selecionado. Normalmente, esse componente utilizado com outros componentes JRadioButton, dentro de um grupo no qual somente uma opo deve ser escolhida, ou seja, um JRadioButton selecionado. Assim, quando um componente selecionado, o outro desmarcado automaticamente.

Saiba mais sobre o componente JRadioButton! Consulte a documentao em: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JRadioButton.html

A gura 3.2 mostra a GUI de uma aplicao semelhante anterior. Contudo, nesse caso, o usurio poder escolher somente uma entre as quatro opes que representam os estilos que podem ser aplicados ao texto no JTextField.

JRadioButton
FIGURA 3.2 GUI DA APLICAO TESTEJRADIOBUTTON

78

Linguagens de Programao II

O cdigo, abaixo, da classe GuiJRadioButton.


import java.awt.FlowLayout; //classe do gerenciador de layout import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JTextField; //classe do componente de texto import javax.swing.JRadioButton; //classe do componente boto de rdio import javax.swing.ButtonGroup; //classe do agrupador de botes de rdio import java.awt.event.ItemListener; //interface que trato o evento desse componente import java.awt.event.ItemEvent; //classe do evento gerado pelo componente JRadioButton 8 import java.awt.Font; 9 10 public class GuiJRadioButton extends JFrame{ 11 12 private JTextField textfield; 13 private Font fontNegrito; 14 private Font fontItalico; 15 private Font fontSimples; 16 private Font fontNegritoItalico; 17 private JRadioButton radioNegrito; 18 private JRadioButton radioItalico; 19 private JRadioButton radioSimples; 20 private JRadioButton radioNegritoItalico; 21 private ButtonGroup grupoRadio; 22 23 public GuiJRadioButton(){ 24 super(Exemplo JRadioButton); 25 setLayout(new FlowLayout()); //configura o layout do frame 26 27 textfield = new JTextField(Tecnlogo em Web Design e Programao); 28 textfield.setFont(new Font(Serif, Font.PLAIN, 14)); //configura o tipo da fonte, estilo e tamanho 29 add(textfield); //adiciona textfield ao frame 30 31 radioNegrito = new JRadioButton(Negrito);//cria o primeiro componenteJRadioButton 32 radioItalico = new JRadioButton(Italico);//cria o segundo componente 33 radioSimples = new JRadioButton(Simples);//cria o terceiro componente 34 radioNegritoItalico = new JRadioButton(Negrito + Italico);//cria o quarto componente 35 add(radioNegrito);//adiciona os quatro componentes ao frame 36 add(radioItalico); 37 add(radioSimples); 38 add(radioNegritoItalico); 39 40 grupoRadio = new ButtonGroup(); //cria ButtonGroup - componente agrupador dos botes de radio 41 grupoRadio.add(radioNegrito); //adiciona cada JRadioButton ao ButtonGroup 42 grupoRadio.add(radioItalico); 43 grupoRadio.add(radioSimples); 44 grupoRadio.add(radioNegritoItalico); 45 //cria quatro objeto do tipo Font. Serviropara configurar o texto do JTextField 46 fontNegrito = new Font(Serif, Font.BOLD, 14); 47 fontItalico = new Font(Serif, Font.ITALIC, 14); 48 fontSimples = new Font(Serif, Font.PLAIN, 14); // JTextField 49 fontNegritoItalico = new Font(Serif, Font.BOLD+Font.ITALIC, 14); 50 textfield.setFont(fontSimples); 1 2 3 4 5 6 7

Unidade 3

79

Universidade do Sul de Santa Catarina

51

52 53 54 55 56 57 } //fim do construtor

//cria um objeto ouvinte de evento novo para cada componente e o adiciona ao componente JCheckBox atravs do mtodo addItemListener radioNegrito.addItemListener(new TrataEventoRadio(fontNegrito)); radioItalico.addItemListener(new TrataEventoRadio(fontItalico)); radioSimples.addItemListener(new TrataEventoRadio(fontSimples)); radioNegritoItalico.addItemListener(new TrataEventoRadio(fontNegritoItalico));

58 private class TrataEventoRadio implements ItemListener{ 59 private Font fonte; //varivel de instncia do tipo Font 60 61 public TrataEventoRadio(Font f){ //construtor da classe 62 fonte = f; 63 } 64 65 public void itemStateChanged(ItemEvent event){ 66 textfield.setFont(fonte); //configura a fonte do texto no JTextField 67 } 68 } //fim da classe interna 69 } //fim da classe de primeiro nvel

Veja a explicao do cdigo acima. Linha 40 criao de um objeto do tipo ButtonGroup. Esse objeto tem a funo de agrupar todos os componentes JRadioButton e controlar para que somente um componente seja selecionado por vez. Ele no considerado um componente GUI e no exibido visualmente na GUI. O primeiro JRadioButton adicionado ao grupo aparecer como selecionado. Linha 41 a 44 todos os componentes JRadioButton so adicionados, atravs do mtodo add(), ao objeto ButtonGroup. Linha 46 a 49 criao de quatro objetos do tipo Font. Cada um deles com um estilo diferente. Linha 50 a referncia do objeto Font com estilo PLAIN (sem estilo) armazenada na varivel fontePlain passada como argumento para o mtodo setFont(). Assim, o texto no componente JTextField ca sem estilo (limpo). Linha 52 a 55 nessa aplicao criado e registrado um novo objeto ouvinte de evento para cada componente JRadioButton. Este procedimento difere das outras aplicaes, onde um nico objeto ouvinte de evento foi criado e registrado para todos os

80

Linguagens de Programao II

componentes. Componentes JRadioButton tambm geram objetos de evento do tipo ItemEvent ( o mesmo de JCheckBox). Logo, a classe do objeto ouvinte de evento tambm deve implementar a interface ItemListener. A classe que implementa a interface ItemListener chamada de TrataEventoRadio e, por isso, o objeto ouvinte de evento desse tipo. Nessas linhas, a instruo new TrataEventoRadio (fontNegrito) cria um objeto ouvinte de evento e chama seu construtor passando a referncia de algum objeto Font criado nas linhas 46 a 49 e congurado para o estilo que o objeto JRadioButton representa. A referncia do novo objeto ouvinte de evento passada para o mtodo addItemListener() de cada componente JRadioButton. Esse mtodo faz o registro do objeto ouvinte de evento ao componente. Linha 58 incio da classe interna TrataEventoRadio que implementa a interface ItemListener. Linha 59 declarao de uma varivel de instncia do tipo Font. Essa varivel armazenar a referncia de um algum objeto Font. Linha 61 a 63 incio do mtodo construtor da classe que trata o evento. Essa a primeira vez que programado um construtor na classe tratadora de evento. Ele chamado toda vez que um objeto ouvinte de evento criado (veja linhas 52 a 55). Esse mtodo recebe como parmetro uma referncia a algum objeto do tipo Font, criado nas linhas 46 a 49. Essa referncia armazenada na varivel f. O contedo dessa varivel f armazenado na varivel de instncia fonte, criada na linha 59. Esse procedimento faz com que cada objeto ouvinte de evento guarde um valor prprio (na varivel fonte) de congurao de fonte de texto. Quando o evento do componente JRadioButton ocorrer, o mtodo itemStateChanged() do objeto de evento especco, associado quele componente, ser chamado e o que foi programado dentro dele ser executado. Linha 65 a 67 incio do mtodo itemStateChanged(). A nica linha dentro desse mtodo congura o texto do componente JTextField atravs do mtodo setFont(). O contedo da varivel

Unidade 3

81

Universidade do Sul de Santa Catarina

de instncia fonte passado como parmetro. Voc sabe o que est dentro dessa varivel? A referncia de algum objeto Font que foi passada para ela quando o objeto ouvinte de evento foi criado. Por exemplo, se o usurio clicar no JRadioButton radioNegrito. o texto ser congurado para o estilo Negrito porque, quando o objeto ouvinte de evento desse componente foi criado, foi passado para o seu construtor a referncia de algum objeto Font congurado para Negrito (veja linha 52). Essa referncia foi armazenada na varivel fonte desse objeto ouvinte de evento. Quando o evento ocorrer nesse componente, o mtodo itemStateChanged() ser chamado e, dentro dele, a instruo que congura o texto do campo de texto receber a congurao armazenada na varivel fonte. O cdigo da classe TesteJRadioButton exibido abaixo:
import javax.swing.JFrame; public class TesteJRadioButton{ public static void main(String arg[]){ GuiJRadioButton guijradio = new GuiJRadioButton(); guijradio.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guijradio.setSize(275,280); guijradio.setVisible(true); } }

Caro aluno, edite e compile a classe GuiJRadioButton. Edite, compile e execute a classe TesteJRadioButton.

Seo 3 Componente JComboBox


O componente JComboBox, conhecido como caixa de combinao ou caixa drop-down, fornece uma lista de itens das quais o usurio pode escolher uma nica opo. Essa lista aparece quando a seta clicada com o mouse. A interao do usurio com esse componente gera o objeto de evento do tipo ItemEvent, assim como JCheckBox e JRadioButton.

82

Linguagens de Programao II

Saiba mais sobre o componente JComboBox! Consulte a documentao referente a este componente em: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JComboBox.html

A gura 3.3 mostra a GUI de uma aplicao, em que voc deve escolher um entre vrios nomes de cores disponveis. Ao escolher um item, a cor de fundo do frame modicada para a cor que voc escolheu.

JComboBox

FIGURA 3.3 GUI DA APLICAO TESTEJCOMBOBOX

O cdigo abaixo se refere classe GuiJComboBox.


1 import javax.swing.*; //import que possibilita a utilizao de todas as classes desse pacote 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class GuiJComboBox extends JFrame { 6 private JComboBox listadecores; //componente JComboBox 7 private String nomesCor[] = {Preto, Azul, Ciano, CinzaEscuro, Cinza, Verde, Cinza Claro,Magenta, Laranja, Rosa, Vermelho, Branco, Amarelo }; //array criado e inicializado com o nome das cores 8 private Color cores[] = {Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green,

Unidade 3

83

Universidade do Sul de Santa Catarina

Color.lightGray, Color.magenta, Color.orange,Color.pink, Color.red,Color.white, Color.yellow }; //array do tipo Color 9 10 public GuiJComboBox() { 11 super(Exemplo JComboBox); 12 setLayout( new FlowLayout() ); //configura o gerenciador de layout FlowLayout 13 listadecores = new JComboBox( nomesCor ); 14 listadecores.setMaximumRowCount( 13 ); 15 add( listadecores ); //adiciona o JComboBox ao frame 16 17 TratadorComboBox tratacombo = new TratadorComboBox(); //cria o objeto ouvinte de evento 18 listadecores.addItemListener(tratacombo); //registra o objeto ouvinte ao componente 19 20 getContentPane().setBackground(cores[0]); //configura cor do frame para a primeira cor do array cores, no caso, a cor preto. 21 } 22 23 private class TratadorComboBox implements ItemListener{ 24 public void itemStateChanged(ItemEvent e){ 25 getContentPane().setBackground(cores[listadecores.getSelectedIndex() ] ); 26 } 27 } 28 29 }//fim da classe GuiJComboBox

Acompanhe, agora, a explicao deste cdigo: Linha 6 cria o componente JComboBox. Linha 7 declara e inicializa um array de Strings chamado nomecores[] com os nomes das cores. Note que o nome de cada cor uma String, por isso est em . Linha 8 declara e inicializa um array de objetos do tipo Color (classe Color do pacote java.awt) chamado cores. Cada cor representada por um objeto diferente. Ex. Color.black o objeto Color que representa a cor preta. Linha 13 o componente JComboBox criado. O array do tipo String com o nome das cores passado como argumento para o seu construtor. Linha 14 o nmero de itens (linhas) que aparecero quando o usurio abrir a caixa do componente (clicando na seta)

84

Linguagens de Programao II

congurado atravs do mtodo setMaximumRowCount(13). Nesse caso, o nome das treze primeiras cores aparecer. Se houver itens adicionais, uma barra de rolagem exibida junto com o componente. Linhas 17 e 18 cria o objeto ouvinte de evento para esse tipo de evento ItemEvent e registra-se ele junto ao componente. Linha 20 um componente JFrame ou frame consiste de trs camadas: fundo, painel de contedo e o painel transparente. A camada painel de contedo aparece na frente da camada de fundo e onde os componentes GUI so exibidos. A camada painel transparente utilizada para exibir dicas dos componentes e outros itens que devem aparecer na frente dos componentes GUI. O painel de contedo oculta o fundo do frame. Portanto, para mudar a cor de fundo por trs dos componentes GUI, voc deve mudar a cor do painel de contedo. O mtodo getContentPane() retorna uma referncia ao painel de contedo do JFrame. A partir dessa referncia, chamado o mtodo setBackground() para congurar a cor do painel de contedo. passada, como argumento, a referncia do primeiro objeto Color armazenado no array cores na posio [0], nesse caso, Color.black. Linha 23 a 27 incio da classe interna que tratar o evento TratadorComboBox. Essa classe deve implementar a interface ItemListener porque o evento gerado pelo componente JComboBox do tipo ItemEvent. Logo, o mtodo a ser implementado o itemStateChanged(). Dentro do mtodo, programado para que a cor de fundo do painel de contedo seja alterada para a cor correspondente ao item que o usurio escolheu no JComboBox. Cada item no componente numerado de 0 ao nmero de itens armazenados no JComboBox - 1. O mtodo listadecores.getSelectedIndex() retorna o ndice (nmero) do item selecionado. Por exemplo, se voc selecionou a cor Ciano, o ndice retornado ser 2 porque essa cor e o seu correspondente objeto Color foram inseridos no JComboBox na terceira posio (linha) . Com esse ndice, possvel chamar o mtodo
85

Unidade 3

Universidade do Sul de Santa Catarina

setBackground() e passar, como argumento, o objeto Color que est no array cores na posio (ndice) retornado pelo mtodo getSelectedIndex(). Veja, abaixo, o cdigo da classe TesteJComboBox.
import javax.swing.JFrame; public class TesteJComboBox{ public static void main(String arg[]){ GuiJComboBox guijcombobox = new GuiJComboBox(); guijcombobox.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guijcombobox.setSize(275,280); guijcombobox.setVisible(true); } }

3.1 Outros mtodos de JComboBox


A classe JComboBox possui outros mtodos interessantes que podem ser usados no desenvolvimento de umaGUI:

void addItem(Object anObject) adiciona um item lista do combo. Object getItemAt(int index) retorna o item pelo seu ndice. int getItemCount() retorna o nmero de itens. Object getSelectedItem() retorna o item selecionado. int getSelectedIndex() retorna o ndice do item selecionado. void insertItemAt(Object anObject, int index) insere um item em uma posio especfica. void removeItem(Object anObject) remove o item especificado.

86

Linguagens de Programao II

Seo 4 Componente JList


O componente JList ou componente de lista permite que uma srie de itens sejam exibidos numa caixa. O usurio pode escolher um ou mais itens dessa lista. JList permite a lista de seleo nica, onde apenas um item pode ser escolhido, ou a lista de seleo mltipla, onde vrios itens podem ser escolhidos. A manipulao do componente JList gera objeto de evento do tipo ListSelectionEvent que deve ser tratado por um objeto que implementa a interface ListSelectionListener.

Saiba mais sobre o componente JList! Consulte a documentao referente a este componente em: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JList.html

A gura 3.4 mostra a GUI de uma aplicao onde vrios nomes de pessoas so exibidos numa lista. Ao escolher um item da lista, o mesmo aparece no componente campo de texto.

JList

FIGURA 3.4 GUI DA APLICAO TESTEJLIST

Unidade 3

87

Universidade do Sul de Santa Catarina

O cdigo, abaixo, refere-se classe GuiJList.


1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 import javax.swing.event.ListSelectionListener; //interface que trata o evento do componente JList 5 import javax.swing.event.ListSelectionEvent; //classe do evento 6 import javax.swing.ListSelectionModel; //classe que especifica o modo de seleo da lista 7 8 public class GuiJList extends JFrame{ 9 private JList nomeList; 10 private String nomes[]={Andrea,Cristina,Joao,Lucas}; 11 private JTextField nomeTextField; 12 13 public GuiJList() { 14 super(Exemplo JList); 15 setLayout(new FlowLayout()); 16 17 nomeList = new JList(nomes); 18 nomeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 19 nomeList.setSelectedIndex(0); 20 nomeList.setVisibleRowCount(3); 21 JScrollPane listScrollPane = new JScrollPane(nomeList); 22 add(listScrollPane); 23 TrataEventoList trataeventolist = new TrataEventoList(); //objeto ouvinte de evento de JList 24 nomeList.addListSelectionListener(trataeventolist); 25 26 nomeTextField = new JTextField(10); 27 add(nomeTextField); 28 } 29 30 31 private class TrataEventoList implements ListSelectionListener { 32 33 public void valueChanged(ListSelectionEvent e) { 34 nomeTextField.setText(nomes[nomeList.getSelectedIndex()]); 35 } 36 } 37 } //fim da classe

Entenda o cdigo, conforme a explicao abaixo: Linha 10 declarao e inicializao de um array de String com o nome de vrias pessoas. Linha 17 criao do componente JList. No construtor do componente, o array de String com o nome das pessoas passado como argumento. Isso faz com que os nomes sejam exibidos no componente.

88

Linguagens de Programao II

Linha 18 o mtodo setSelectionMode(ListSelectionModel. SINGLE_SELECTION) congura o modo de seleo da lista, um item ou vrios itens. Nesse caso, passado, como argumento, o valor constante ListSelectionModel.SINGLE_SELECTION, que faz com que apenas um item possa ser selecionado. As constantes que representam os modos de seleo esto na classe ListSelectionModel, importada na linha 6. As outras constantes so: SINGLE_INTERVAL_SELECTION, que permite a seleo de vrios itens num nico intervalo de seleo e MULTIPLE_ INTERVAL_SELECTION, que permite a seleo de vrios itens. Linha 19 o mtodo setSelectedIndex(0) permite congurar qual o elemento que aparecer selecionado inicialmente. passado como argumento o ndice do item na lista. Lembre-se que o primeiro item comea na posio, ndice 0. Nesse caso, o primeiro item da lista aparecer selecionado. Linha 20 o mtodo setVisibleRowCount(3) determina o nmero de itens que aparecero visveis na lista. Nesse caso, trs itens aparecero. Linha 21 O componente JList no exibe automaticamente as barras de rolagem quando o nmero de itens for maior que o tamanho congurado para as linhas visveis. necessrio criar um objeto do tipo JScrollPane para exibir essa funcionalidade. Como argumento para o construtor desse objeto, passada a referncia do componente JList criado na linha 17. Linha 22 o componente JScrollPane adicionado ao frame. Note que no o prprio componente JList que adicionado e, sim, o JScrollPane. Linha 23 e 24 criao do objeto ouvinte de evento para o componente JList. Como voc leu anteriormente, esse componente gera eventos do tipo ListSelectionEvent. Logo o objeto ouvinte de evento deve ser do tipo ListSelectionListener, que a interface responsvel por tratar esse tipo de evento. A classe TrataEventoList criada na linha 31. Logo aps, o objeto registrado junto ao componente JList nomeList. Linha 26 e 27 criao do componente JTextField. Adio dele ao container.

Unidade 3

89

Universidade do Sul de Santa Catarina

Linha 31 a 36 criao da classe interna que tratar o evento gerado pelo componente JList. Note que a classe TrataEventoList implementa a interface ListSelectionListener. Essa interface tem um nico mtodo abstract valueChanged (). Esse mtodo ser invocado sempre que um ou mais itens forem selecionados dentro do componente JList. Nesse caso, cada vez que um item for selecionado, quer-se que ele aparea no componente JTextField. Para isso, o mtodo setText(nomes[nomeList.getSelectedIndex()]) do componente JTextField invocado. passado, como argumento, o contedo do array nomes[] na mesma posio do item selecionado. O mtodo getSelectedIndex() do componente JList nomeList retorna posio ou ndice do item escolhido. Essa mesma posio do item no array nomes[]. Veja o cdigo da classe TesteJList.
1 import javax.swing.JFrame; 2 public class TesteJComboBox{ 3 4 public static void main(String[] args) { 5 GuiJList guijlist = new GuiJList(); 6 7 guijlist.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 8 guijlist.setSize(275,280); 9 guijlist.setVisible(true); 10 11 } 12 }

Vamos criar outra aplicao que permita a seleo de mltiplos itens. Nessa aplicao, voc poder escolher vrios itens na lista e depois clicar no boto Copiar >>, para copiar os itens selecionados para a outra lista. A gura 3.5 exibe a GUI dessa aplicao.

FIGURA 3.5 GUI DA APLICAO TESTEJLISTMULTIPLO

90

Linguagens de Programao II

O cdigo desta outra aplicao exibido abaixo:


import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class GuiJListMultiplo extends JFrame{ private JList nomeList; private JList selecList; private String nomes[]={Andrea,Cristina,Joao,Lucas}; private JButton copiaButton; public GuiJListMultiplo() { super(Exemplo JList com Multipla Seleo); setLayout(new FlowLayout()); nomeList = new JList(nomes); nomeList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); nomeList.setSelectedIndex(0); nomeList.setVisibleRowCount(3); add(new JScrollPane(nomeList)); //cria o objeto JScrollPane dentro do metodo add que adiciona o JScrollPane ao frame copiaButton = new JButton(Copia >>); TrataEventoBotao trataeventobotao = new TrataEventoBotao(); copiaButton.addActionListener(trataeventobotao); add(copiaButton); selecList = new JList(); //lista vazia para armazenar os itens selecionados Linha 20 selecList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); selecList.setVisibleRowCount(3); selecList.setFixedCellWidth(100); //configura a largura da lista selecList.setFixedCellHeight(15); //configura a altura da lista add(new JScrollPane(selecList)); } Linha 35 private class TrataEventoBotao implements ActionListener { public void actionPerformed(ActionEvent e) { Linha 37 selecList.setListData(nomeList.getSelectedValues()); } } }

Observe, agora, a explicao de alguns trechos do cdigo: Linha 20 nessa linha, congurado o modo de seleo de itens da lista para mltiplas selees.

Unidade 3

91

Universidade do Sul de Santa Catarina

Linha 35 a cpia dos itens selecionados deve ocorrer quando o usurio clicar no boto Copiar. Portanto, o evento gerado pelo componente JButton que deve ser tratado. Nessa aplicao, no queremos que algo acontea quando o usurio selecionar itens no componente JList e, sim, quando o usurio clicar no boto. Portanto, devemos saber qual o tipo de evento gerado pelo componente JButton. Esse componente j foi trabalhado na unidade 2, ele gera eventos do tipo ActionEvent e deve ser tratado por um objeto ouvinte de evento do tipo ActionListener. Por isso, a classe que inicia nessa linha implementa a interface ActionListener. Se a classe implementa essa interface, ento ela deve redenir o mtodo actionPerformed() e, dentro dele, deve ser programado para que os itens selecionados na primeira lista sejam copiados para a segunda lista. Linha 37 o mtodo setListData() congura no componente JList selecList os itens que sero exibidos nele. passado, como argumento, o conjunto de itens selecionados no componente JList nomeList. O mtodo getSelectedValues() retorna o conjunto de itens selecionados em JList nomeList.

92

Linguagens de Programao II

4.1 Outros mtodos de JList


A classe JList possui outros mtodos interessantes que podem ser usados no desenvolvimento de uma GUI:

void clearSelection() limpa a marca de seleo. int getMinSelectionIndex() e int getMaxSelectionIndex() retorna o ndice mnimo e ndice mximo em uma seleo. int getSelectedIndex() e int[] getSelectedIndices() retorna o ndice dos itens selecionados. Object getSelectedValue() e Object[] getSelectedValues() retorna os itens selecionados. boolean isSelectionEmpty() retorna true, se no houver nada selecionado. void setListData(Object[] listData) constri a lista com os valores do parmetro.

Sntese
Nesta unidade, voc conheceu mais alguns componentes Swing e trabalhou com outros tipos de eventos. O assunto GUI e tratamento de eventos tm um certo nvel de diculdade, portanto, nossa inteno foi que voc conhecesse mais alguns componentes e seus eventos, de maneira didtica e simplicada. Voc observou que cada componente possui um conjunto de mtodos adicionais que foram exibidos no nal de cada seo. Explore um pouco mais esses mtodos, propondo variaes nas aplicaes apresentadas at aqui ou criando novas aplicaes. Considere como modelos os exerccios trabalhados nas disciplinas de programao anteriores.

Unidade 3

93

Universidade do Sul de Santa Catarina

Atividades de auto-avaliao
A partir de seus estudos, leia com ateno e resolva as atividades programadas para a sua auto-avaliao. 1) Desenvolva uma aplicao com a seguinte GUI.

Nessa aplicao, o usurio deve entrar com o total bruto da compra e escolher a forma de pagamento ( vista ou a prazo). Se for escolhida a forma de pagamento vista, o usurio deve digitar o desconto (%) no outro componente que vai aparecer somente nesse caso, conforme a GUI abaixo mostra.

94

Linguagens de Programao II

Depois de digitar o desconto, o usurio apertar a tecla Enter nesse componente e o valor lquido aparecer, calculado no campo total lquido. Caso seja escolhida a forma de pagamento a prazo, o componente de entrada do desconto no deve aparecer e o valor da compra deve ser mostrado no campo total lquido. Dicas: 1) Para tornar visvel ou no visvel os componentes JLabel e JTextField use o mtodo setVisibel(). Passe o argumento true para deixar visvel o componente e false para ocultar. 2) Nessa GUI, dois tipos de eventos devem ser tratados. ItemEvent, que disparado quando o usurio interage com o componente JRadioButton, e (preste ateno!) ActionEvent, quando o usurio interage com o componente JTextField, apertando a tecla Enter quando o foco est no componente.

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando a seguinte referncia, principalmente os captulos 10, 11 e 12: DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. Consulte, tambm, os seguintes sites:
http://www.csie.ntu.edu.tw/~piaip/docs/Swing/ (Swing The Book) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/Chapter9html/ (ComboBox) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/Chapter10html/ (List) http://java.sun.com/docs/books/tutorial/uiswing/components/button. html (How to Use Buttons, CheckBoxes and Radiop Buttons)

Unidade 3

95

UNIDADE 4

Trabalhando com Layout de Componentes


Objetivos de aprendizagem
Conhecer o componente JTextArea. Conhecer outra forma de tratar eventos. Conhecer outros gerenciadores de layout. Construir GUI com layout mais complexo.

Sees de estudo
Seo 1 Componente JTextArea Seo 2 Utilizao de Classe Interna Annima para
Tratar Eventos

Seo 3 Gerenciadores de Layout Seo 4 Construindo uma GUI com Layout mais
Complexo

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade, voc conhecer mais um componente Swing, conhecido como rea de texto. Aprender a tratar eventos de uma outra forma, ainda atravs de uma classe interna, mas dessa vez annima, ou seja, voc no precisar declarar o cabealho da classe da forma como foi feito nas unidades anteriores. As duas ltimas sees abordaro o assunto do ttulo dessa unidade, layout. Voc ter contato com outros tipos de Gerenciadores de Layout, alm do utilizado at o momento que foi o FlowLayout. Alm disso, comear a construir GUIs com layout mais complexos.

Seo 1 Componente JTextArea


O componente JTextArea fornece uma rea para manipular texto. Esse componente no gera eventos, assim como o componente JList de mltipla seleo. Nesse caso, preciso existir outro componente que gere evento para se executar a ao desejada. A gura 4.1 mostra uma aplicao onde um texto inicial exibido em um dos componentes JTextArea. Veja que o usurio deve selecionar uma parte do texto e clicar no boto Copiar. O texto selecionado copiado para o segundo componente JTextoArea.

FIGURA 4.1 GUI DA APLICAO TESTEJTEXTAREA

98

Linguagens de Programao II

O cdigo da aplicao, referente ao componente JTextArea, exibido abaixo:


1 import java.awt.FlowLayout; 2 import java.awt.event.ActionListener; 3 import java.awt.event.ActionEvent; 4 import javax.swing.JFrame; 5 import javax.swing.JTextArea; 6 import javax.swing.JButton; 7 import javax.swing.JScrollPane; 8 9 public class GuiJTextArea extends JFrame 10 { 11 private JTextArea textArea1; // exibe o texto original 12 private JTextArea textArea2; // exibe o texto destacado 13 private JButton copiaButton; // copia o texto 14 15 16 public GuiJTextArea() { 17 super( Exemplo JTextArea ); 18 setLayout(new FlowLayout()); 19 20 String textOriginal = Desenvolver habilidades que propiciem ao \n+ 21 educando a capacidade de criar, programar e implantar sistemas \n+ 22 computacionais em ambientes WEB, com embasamento terico e slida formao prtica.; 23 24 25 textArea1 = new JTextArea( textOriginal, 15, 25 ); // cria textarea1, configura linhas e colunas 26 add(new JScrollPane( textArea1 )); // adiciona scrollpane ao frame 27 copiaButton = new JButton( Copiar >>> ); // cria boto de cpia 28 copiaButton.addActionListener(new TrataEventoBotao()); 29 add( copiaButton ); // adiciona o boto de cpia ao frame 30 31 textArea2 = new JTextArea( 15, 25 ); // cria segundo textarea 32 textArea2.setEditable( false ); // desativa a edio 33 add( new JScrollPane( textArea2 ) ); // adiciona scrollpane ao frame 34 } // fim do construtor 35 36 37 private class TrataEventoBotao implements ActionListener { 38 public void actionPerformed(ActionEvent e) { 39 textArea2.setText( textArea1.getSelectedText() ); 40 } 41 } 42 } // fim da classe

Conra agora a explicao desse cdigo: Linhas 25 e 31 criam os dois componentes JTextArea. Na linha 25, passada, como argumento para o construtor, a String contendo o texto original (declarada e inicializada na linha 20), o nmero de linhas e colunas exibidas pelo componente.

Unidade 4

99

Universidade do Sul de Santa Catarina

Linha 26 cria um componente JScrollPane e o adiciona ao frame, com o mtodo add(). Lembre-se que esse componente exibe as barras de rolagem, nesse caso, no componente JTextArea. Para o construtor de JScrollPane passado o componente onde as barras devero ser exibidas, nesse caso, JTextArea textArea1. Linhas 27 a 29 criam o componente JButton copiaButton. Adiciona-se o objeto ouvinte de evento ao objeto JButton. Adiciona-se o componente JButton ao frame. Note que trataremos o evento gerado por esse componente, por isso, adicionamos a ele um objeto ouvinte de evento do tipo ActionListener. O objeto ouvinte de evento do tipo ActionListener e, por isso, a classe TrataEventoBotao, da linha 37, implementa a interface ActionListener. Linhas 31 a 33 cria o segundo componente JTextArea. Congura-se o componente para que no possa ser editado com o mtodo setEditable (false). Cria-se um JScrollPane que adiciona o componente JTextArea a ele (para exibio das barras de rolagem). Adiciona-se o JScrollPane ao frame. Linha 39 o componente JTextArea textArea2 congurado para armazenar e exibir o texto selecionado no componente JTextArea textArea1. O mtodo setText() armazena algum texto no componente JTextArea. O mtodo getSelectedText() retorna o texto selecionado no componente JTextArea. O cdigo abaixo refere-se aplicao TesteJTextArea:
import javax.swing.JFrame; public class TesteJTextArea { public static void main( String args[] ) { GuiJTextArea guitextarea = new GuiJTextArea(); guitextarea.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); guitextarea.setSize( 725, 300 ); guitextarea.setVisible( true ); } }

100

Linguagens de Programao II

Seo 2 Utilizao de Classe Interna Annima para Tratar Eventos


Uma classe interna annima um outro tipo de classe interna que declarada sem nome, por isso chamada de annima. Normalmente, ela declarada dentro de um mtodo da classe, diferente da forma como apresentamos at aqui, declarada dentro da classe. Como as outras classes internas, uma classe interna annima pode acessar os membros da sua classe de primeiro nvel. Porm, ela s pode acessar as variveis locais com o modicador nal do mtodo em que for declarada. Variveis locais que tiverem modicador nal no podem ser acessadas. Acompanhe a demonstrao e utilizao de uma classe interna annima para tratar o mesmo evento da aplicao anterior.
1 import java.awt.FlowLayout; 2 import java.awt.event.ActionListener; 3 import java.awt.event.ActionEvent; 4 import javax.swing.JFrame; 5 import javax.swing.JTextArea; 6 import javax.swing.JButton; 7 import javax.swing.JScrollPane; 8 9 public class GuiJTextArea extends JFrame 10 { 11 private JTextArea textArea1; // exibe o texto original 12 private JTextArea textArea2; // exibe o texto destacado 13 private JButton copiaButton; // copia o texto 14 15 16 public GuiJTextArea() { 17 super( Exemplo JTextArea ); 18 setLayout(new FlowLayout()); 19 20 String textOriginal = Desenvolver habilidades que propiciem ao \n+ 21 educando a capacidade de criar, programar e implantar sistemas \n+ 22 computacionais em ambientes WEB, com embasamento terico e slida formao prtica.; 23 24 25 textArea1 = new JTextArea( textOriginal, 15, 25 ); // cria textarea1, configura linhas e colunas 26 add(new JScrollPane( textArea1 )); // adiciona scrollpane ao frame 27 28 29 30 31 copiaButton = new JButton( Copiar >>> ); // cria boto de cpia add(copiaButton); ActionListener ouvinte = new ActionListener(){ public void actionPerformed(ActionEvent e) { textArea2.setText( textArea1.getSelectedText() );

Unidade 4

101

Universidade do Sul de Santa Catarina

32 33 34

} }; copiaButton.addActionListener(ouvinte);

35 36 textArea2 = new JTextArea( 15, 25 ); // cria segundo textarea 37 textArea2.setEditable( false ); // desativa a edio 38 add( new JScrollPane( textArea2 ) ); // adiciona scrollpane ao frame 39 } // fim do construtor 40 } // fim da classe

Note que a classe interna que existia na verso anterior no existe mais. Agora, ela, a classe interna, tornou-se annima e est declarada nas linhas 28 a 32. Ela inicia no smbolo de { da linha 28 e termina no smbolo de } da linha 32. J que a classe interna annima no tem nome, deve-se criar um objeto da classe interna annima no ponto em que ela declarada. Isso est acontecendo no incio da linha 28: ActionListener ouvinte = new ActionListener(). criado um objeto ouvinte de evento do tipo ActionListener. Na linha 33, esse objeto ouvinte de evento registrado junto ao componente JButton copiaButton para tratar o evento ActionEvent gerado por ele. Uma forma mais direta de trabalhar com classe interna annima nessa aplicao segue abaixo:
copiaButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { textArea2.setText( textArea1.getSelectedText() ); } });

O objeto do tipo ActionListener criado dentro do mtodo addActionListener(), que adiciona o objeto ao componente JButton. A classe interna annima comea no primeiro { e termina no ltimo }.

102

Linguagens de Programao II

Seo 3 Gerenciadores de Layout


Os gerenciadores de layout so utilizados para organizar os componentes GUI em um container. Os componentes GUI tambm podem ser organizados no container sem o uso de um gerenciador de layout. Mas, nesse caso, o programador deve se preocupar com a posio absoluta do componente em relao ao container e tambm com o tamanho de cada componente. Isso pode ser extremamente trabalhoso! Ao usar um gerenciador de layout voc ganha rapidez para criar GUIs , mas pode perder algum controle sobre o tamanho e a posio exata de cada componente inserido da GUI. Existe uma outra forma muito fcil e agradvel de programar GUI. Use uma IDE (ambiente de desenvolvimento integrado) com recursos para desenhar GUI. Com esse tipo de ferramenta, voc simplesmente escolhe o componente GUI numa barra de componentes, arrasta e solta o componente na posio que voc quer da janela. Quem produz o cdigo para voc a prpria ferramenta. Alm disso, voc pode programar o cdigo para o tratamento do evento gerado por um componente, clicando duas vezes em cima do componente inserido na janela. Este procedimento abrir o cdigo fonte no ponto necessrio para voc s inserir o cdigo do processamento do evento, ou seja, voc no se preocupa em criar a classe que implementa a interface que trata o evento, etc. Observe que esse recurso no utilizado nesses captulos sobre GUI, porque nosso objetivo que voc aprenda como fazer tais cdigos do zero. Veja, agora, vrios gerenciadores de layout. Com eles, voc poder construir GUIs mais complexas, ou seja, com vrios componentes inseridos e alinhados, da maneira que voc deseja.

Unidade 4

103

Universidade do Sul de Santa Catarina

3.1 FlowLayout
Esse gerenciador j conhecido por voc. o gerenciador mais simples de ser utilizado. Com ele, os componentes so inseridos no container da esquerda para a direita e na ordem que voc os adicionou no cdigo-fonte. Quando algum componente alcana a borda do container, os demais so inseridos na prxima linha. Esse gerenciador permite que os componentes sejam alinhados esquerda, centralizados ou alinhados direita, prevalecendo as caractersticas descritas anteriormente. Se nenhum tipo de alinhamento for estabelecido, como foi o caso das nossas aplicaes at agora, os componentes so centralizados. Esse gerenciador tambm respeita o tamanho dos componentes gerenciados por ele. Veja que a aplicao, a seguir, mostra o uso do gerenciador FlowLayout de uma maneira um pouco diferente da usada at o momento. Nessa aplicao, so exibidos apenas trs botes, dispostos atravs do FlowLayout, inicialmente alinhados esquerda. A gura 4.2 ilustra a GUI.

FIGURA 4.2 GUI DA APLICAO GUIFLOWLAYOUT

Vamos analisar o cdigo da aplicao. 1 import java.awt.FlowLayout; 2 import javax.swing.JFrame; 3 import javax.swing.JButton; 4 5 public class GuiFlowLayout extends JFrame 6 { 7 private JButton leftJButton; // boto para configurar alinhamento esquerda 8 private JButton centerJButton; // boto para configurar alinhamento centralizado 9 private JButton rightJButton; // boto para configurar alinhamento direita 10 private FlowLayout layout; // objeto de layout 11 12 public GuiFlowLayout() 13 {

104

Linguagens de Programao II

14 super( Teste com o Gerenciador de Layout FlowLayout ); 15 16 layout = new FlowLayout(); // cria objeto FlowLayout 17 layout.setAlignment(FlowLayout.LEFT); // configura o alinhamento do frame 18 setLayout( layout ); // configura o layout de frame 19 20 // configura leftJButton 21 leftJButton = new JButton( Esquerdo ); // cria boto Esquerdo 22 add( leftJButton ); // adiciona o boto Esquerdoao frame 23 24 // configura centerJButton 25 centerJButton = new JButton( Centro ); // cria boto Centro 26 add( centerJButton ); // adiciona boto Centroao frame 27 28 // configura rightJButton 29 rightJButton = new JButton( Direito ); // cria boto Direito 30 add( rightJButton ); // adiciona boto Direitoao frame 31 32 } // fim do construtor FlowLayoutFrame 33 34 public static void main(String args[]){ 35 GuiFlowLayout guiflowlayout = new GuiFlowLayout(); 36 guiflowlayout.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 37 guiflowlayout.setSize(475,80); 38 guiflowlayout.setVisible(true; 39 } 40} // fim da classe

Linha 17 conra o alinhamento dos componentes dentro do layout atravs do mtodo setAlignment(). Podem ser passadas, como argumento, as seguintes constantes: FlowLayout.LEFT, FlowLayout.CENTER ou FlowLayout.RIGHT. Linha 34 observe que nessa classe temos o construtor na linha 12 e o mtodo main() na linha 34. Essa a primeira vez que o mtodo main() aparece dentro da classe que cria a GUI. Essa congurao perfeitamente possvel. Toda classe que possui mtodo main() executvel. O que est programado dentro do mtodo? A criao de um objeto do tipo GuiFlowLayout na linha 35. Esse objeto chama o construtor da classe, que, por sua vez, monta a GUI.

Unidade 4

105

Universidade do Sul de Santa Catarina

3.2 BorderLayout
O gerenciador BorderLayout o gerenciador padro de um JFrame. Assim, quando nenhum gerenciador for especicado, ele utilizado. Esse gerenciador organiza os componentes GUI em cinco (5) regies na tela: NORTH (norte), SOUTH (sul), EAST (leste), WEST (oeste) e CENTER (centro). Com esse gerenciador, voc pode inserir apenas cinco componentes no container, um em cada regio. No ache estranho, pois podemos inserir, nessas regies, componentes (containers) como JPanel, que permitem que outros componentes GUI sejam adicionados a eles, construindo, com isso, GUIs mais complexas. Voc estudar este caso na prxima seo. Os componentes inseridos nas regies NORTH e SOUTH estendem-se horizontalmente para os lados do container e tm a altura do componente mais alto inserido nessas regies. Os componentes inseridos nas regies EAST e WEST estendem-se verticalmente entre as regies NORTH e SOUTH e tm a mesma largura que os componentes colocados nas suas regies. O componente inserido na regio CENTER expande-se para ocupar todo o espao restante do layout. Se todas as regies esto ocupadas, todo o espao do container preenchido. Se as regies NORTH e SOUTH no esto ocupadas, os componentes das regies EAST, WEST e CENTER estendem-se para ocupar essas duas regies. Se as regies EAST e WEST no esto ocupadas, o componente da regio CENTER ocupa o espao dessas duas regies. Se a regio CENTER no ocupada, esta rea ca vazia, ou seja, os componentes das outras regies no ocupam esse espao. Os componentes dispostos nesse tipo de gerenciador geralmente no conseguem ter seu tamanho preferido. A gura 4.3 exibe a GUI de uma aplicao onde foram inseridos cinco componentes JButton, um em cada regio do container. Ao clicar em algum boto, ele se torna invisvel e os outros componentes ocupam o seu espao. Note que isso no vai acontecer com o componente JButton da regio CENTER.
106

Linguagens de Programao II

FIGURA 4.3 GUI DA APLICAO GUIBORDERLAYOUT

Observe a anlise do cdigo da aplicao GuiBorderLayout:


1 import java.awt.BorderLayout; 2 import java.awt.event.ActionListener; 3 import java.awt.event.ActionEvent; 4 import javax.swing.JFrame; 5 import javax.swing.JButton; 6 7 public class GuiBorderLayout extends JFrame 8{ 9 private JButton button1; // 10 private JButton button2; // 11 private JButton button3; // 12 private JButton button4; // 13 private JButton button5; // 15 private BorderLayout layout; // objeto borderlayout 16 17 // configura GUI e tratamento de evento 18 public GuiBorderLayout() 19 { 20 super( Exemplo com Gerenciador BorderLayout ); 21 22 layout = new BorderLayout( 5, 5 ); // cria o gerenciador com espaos de 5 pixels 23 setLayout( layout ); // configura o layout do frame para BorderLayout 24 25 button1 = new JButton(Norte); 26 add( button1, BorderLayout.NORTH );// adiciona boto para o norte 27 28 TrataEventoBotao tratabotao = new TrataEventoBotao(); 29 button1.addActionListener(tratabotao); 30 31 button2 = new JButton(Sul); 32 add( button2, BorderLayout.SOUTH ); // adiciona boto para o sul 33 button2.addActionListener(tratabotao); 34 35 button3 = new JButton(Leste); 36 add( button3, BorderLayout.EAST );// adiciona boto para o leste 37 button3.addActionListener(tratabotao); 38 39 button4 = new JButton(Oeste); 40 add( button4, BorderLayout.WEST );// adiciona boto para o oeste 41 button4.addActionListener(tratabotao); 42
Unidade 4

107

Universidade do Sul de Santa Catarina

43 button5 = new JButton(Centro); 44 add( button5, BorderLayout.CENTER );// adiciona boto para o centro 45 button5.addActionListener(tratabotao); 46 47 } // fim do construtor GuiBorderLayout 48 49 private class TrataEventoBotao implements ActionListener{ 50 // trata os eventos de boto 51 public void actionPerformed( ActionEvent event ) { 52 if (event.getSource() == button1){ 53 button1.setVisible( false ); // oculta o boto clicado 54 button2.setVisible( true ); // exibe os demais 55 button3.setVisible( true ); 56 button4.setVisible( true ); 57 button5.setVisible( true ); 58 }else 59 if (event.getSource() == button2){ 60 button2.setVisible( false ); // oculta o boto clicado 61 button1.setVisible( true ); // exibe os demais 62 button3.setVisible( true ); 63 button4.setVisible( true ); 64 button5.setVisible( true ); 65 } else 66 if (event.getSource() == button3){ 67 button3.setVisible( false ); // oculta o boto clicado 68 button1.setVisible( true ); // exibe os demais 69 button2.setVisible( true ); 70 button4.setVisible( true ); 71 button5.setVisible( true ); 72 }else 73 if (event.getSource() == button4){ 74 button4.setVisible( false ); // oculta o boto clicado 75 button1.setVisible( true ); // exibe os demais 76 button2.setVisible( true ); 77 button3.setVisible( true ); 78 button5.setVisible( true ); 79 } else 80 if (event.getSource() == button5){ 81 button5.setVisible( false ); // oculta o boto clicado 82 button1.setVisible( true ); // exibe os demais 83 button2.setVisible( true ); 84 button3.setVisible( true ); 85 button4.setVisible( true ); 86 } 87 88 layout.layoutContainer( getContentPane() ); // painel de contedo de layout 89 90 } // fim do mtodo actionPerformed() 91 } //fim da classe interna. Essa classe no annima 92 93 public static void main( String args[] ) { 94 GuiBorderLayout borderLayout = new GuiBorderLayout(); 95 borderLayout.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 96 borderLayout.setSize( 300, 200 ); // configura o tamanho do frame 97 borderLayout.setVisible( true ); // exibe o frame 98 } // fim de main 99 100 } // fim da classe GuiBorderLayout

108

Linguagens de Programao II

Acompanhe a anlise de algumas destas linhas. Linha 22 criar o objeto gerenciador de layout BorderLayout. Para o construtor passado, como argumento, o espaamento horizontal entre os componentes e o espaamento vertical entre os componentes. Esse valor o nmero de pixels. Linhas 26, 32, 36, 40 e 44 adicionam os cinco componentes JButton ao container e especicam a regio onde cada componente ser inserido. As regies so representadas pelas constantes BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.EAST, BorderLayout.WEST e BorderLayout. CENTER. Linha 28 cria um objeto ouvinte de evento do tipo ActionListener. Esse objeto ser registrado junto aos cinco componentes JButton (linhas 29, 33, 37, 41 e 45). ele que tratar o evento ActionEvent gerado quando o usurio clicar em algum dos botes. Linha 49 incio da classe interna que tratar o evento gerado pelos botes. Essa classe implementa a interface ActionListener porque o evento gerado por um boto do tipo ActionEvent. Linha 51 incio do mtodo actionPerformed(). Dentro do mtodo vericado qual o componente que originou o evento. Se for o componente button1 porque o componente inserido na regio NORTH foi clicado, logo, ele ser congurado para car invisvel com o mtodo setVisible(false) do componente JButton e os demais componentes sero congurados para carem visveis com o mtodo setVisible(true). Assim, os componentes do container devem ser reorganizados e os botes inseridos nas regies EAST, CENTER e WEST ocuparo o espao que antes era do boto da regio NORTH. A gura 4.4 demonstra como car a GUI nessa situao.

Unidade 4

109

Universidade do Sul de Santa Catarina

FIGURA 4.4 GUI DA APLICAO GUIBORDERLAYOUT SEM BOTO NA REGIO NORTE

Observe que esse teste feito para todos os componentes JButton. No nal do teste, na linha 88, o layout desse painel de contedo (lembre que os componentes GUI esto numa camada intermediria chamada de painel de contedo) deve ser reorganizado. Para isso o mtodo layoutContainer() do objeto BorderLayout chamado layout. O painel de contedo utilizado na GUI passado para mtodo como argumento. . Esse painel de contedo obtido com o mtodo getContentPane() que retorna o painel de contedo. Linha 93 incio do mtodo main().

3.3 GridLayout
O gerenciador GridLayout permite que vrios componentes GUI sejam inseridos dentro de uma grade ou tabela. A dimenso da grade, ou o nmero de linhas e colunas, feita no construtor do objeto gerenciador de layout. Nesse gerenciador, cada componente tem a mesma largura e altura. Os componentes so inseridos a partir da primeira clula da primeira linha. A gura 4.5 mostra a GUI de uma aplicao onde seis componentes JButton foram inseridos e organizados atravs do gerenciador GridLayout. Nessa aplicao, no foi programada qualquer ao para os componentes JButton. Ela objetiva apenas mostrar como funciona a disposio dos componentes segundo esse gerenciador de layout.

110

Linguagens de Programao II

FIGURA 4.5 GUI DA APLICAO GUIGRIDLAYOUT

O cdigo da aplicao mostrado abaixo:


1 import java.awt.GridLayout; 2 import java.awt.Container; //importao da classe Container 3 import java.awt.event.ActionListener; 4 import java.awt.event.ActionEvent; 5 import javax.swing.JFrame; 6 import javax.swing.JButton; 7 8 public class GuiGridLayout extends JFrame 9 { 10 private JButton buttons[]; // array de botes 11 private final String names[] = 12 { Boto 1, Boto 2, Boto 3, Boto 4, Boto 5, Boto 6}; //array nome dos botes 13 private Container container; // continer do frame 14 private GridLayout gridLayout; // primeiro gridlayout 15 16 // construtor sem argumento 17 public GuiGridLayout() { 18 super( Exemplo com Gerenciador GridLayout ); 19 gridLayout = new GridLayout( 2, 3, 5, 5 ); // 2 por 3; lacunas de 5 20 21 container = getContentPane(); // obtm painel de contedo 22 container.setLayout( gridLayout ); // configura o layout JFrame 23 buttons = new JButton[ names.length ]; // cria array de JButtons 24 25 for ( int count = 0; count < names.length; count++ ) 26 { 27 buttons[ count ] = new JButton( names[ count ] ); 28 container.add( buttons[ count ] ); // adiciona o boto ao JFrame 29 } // final do for 30 31 } // fim do construtor GuiGridLayout 32 33 public static void main( String args[] ) 34 { 35 GuiGridLayout gridLayout = new GuiGridLayout(); 36 gridLayout.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 37 gridLayout.setSize( 300, 200 ); // configura o tamanho do frame 38 gridLayout.setVisible( true ); // exibe o frame 39 } // fim de main 40 41 } // fim da classe

Unidade 4

111

Universidade do Sul de Santa Catarina

Linha 10 ao invs de se criar seis variveis do tipo JButton, criado um array de objetos JButton. Linha 11 array de String para armazenar o nome ( rtulo ) de cada boto. Linha 13 criao de uma varivel do tipo container. Essa classe representa o painel de contedo do frame. a primeira vez que estamos usando a varivel do tipo container. Em breve esta varivel ser explicada com mais detalhes. Linha 14 criao da varivel que armazenar a referncia a um objeto do tipo GridLayout (gerenciador de layout). Linha 19 criao do objeto gerenciador de layout. Para o construtor, passado o nmero de linhas e de colunas da grid alm do espaamento horizontal e vertical em pixels, entre os componentes na grid. O espaamento em pixel padro 1. Linha 21 o mtodo getContentPane() retorna a referncia ao objeto painel de contedo usado no frame. Essa referncia armazenada na varivel container. Linha 22 o layout do container congurado atravs do mtodo setLayout(). Desta vez, o mtodo est associado varivel container. Essa outra forma de congurar o layout do painel de contedo (menos direta). passado, como argumento, a varivel layout que contm a referncia ao gerenciador de layout desejado. Linha 23 a criao do array buttons[] nalizada nessa linha. Na linha 10, foi criada apenas a varivel referncia do array. Note que o tamanho desse array o tamanho do array names[]. O tamanho de um array obtido com o seu atributo length, portanto, names.length retorna o tamanho do array names[]. Esse ser o tamanho do array buttons[]. Linhas 25 a 29 usado um for para criao os seis objetos JButton. A referncia de cada objeto JButton armazenada numa posio do array buttons[] (linha 27). Logo aps, na linha 28, cada objeto JButton adicionado ao container. Lembre que o gerenciador GridLayout adiciona cada componente na grade, a partir da primeira linha da esquerda para a direita.

112

Linguagens de Programao II

3.4 BoxLayout
O gerenciador BoxLayout como o gerenciador FlowLayout, pelo fato de que cada componente pode ter seu prprio tamanho e pelos componentes serem inseridos na ordem em que so adicionados ao container. Mas o gerenciador BoxLayout difere do FlowLayout porque permite empilhar os componentes horizontalmente e verticalmente (o gerenciador FlowLayout s permite empilhar os componentes horizontalmente). A gura 4.6 mostra a GUI de uma aplicao onde um par de componentes JLabel e JTextField so inseridos na seqncia. Veja que a aplicao no trata nenhum evento.

FIGURA 4.6 GUI DA APLICAO GUIBOXLAYOUT

Acompanhe a anlise do cdigo da aplicao, referente ao gerenciador BoxLayout:


1 import javax.swing.BoxLayout; 2 import javax.swing.JFrame; 3 import javax.swing.JLabel; 4 import javax.swing.JTextField; 5 6 public class GuiBoxLayout extends JFrame 7{ 8 private JLabel labelNome; 9 private JLabel labelEndereco; 10 private JLabel labelCidade; 11 private JTextField textfieldNome; 12 private JTextField textfieldEndereco; 13 private JTextField textfieldCidade; 14 15 private BoxLayout boxLayout; // primeiro gridlayout 16 17 18 // construtor sem argumento

Unidade 4

113

Universidade do Sul de Santa Catarina

19 public GuiBoxLayout() 20 { 21 super( Exemplo com Gerenciador BoxLayout ); 22 boxLayout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS ); // verticalmente 23 24 setLayout( boxLayout ); // configura o layout JFrame 25 26 labelNome = new JLabel(Nome); 27 add(labelNome); 28 29 textfieldNome = new JTextField(30); 30 add(textfieldNome); 31 labelEndereco = new JLabel(Endereo); 32 add(labelEndereco); 33 34 textfieldEndereco = new JTextField(30); 35 add(textfieldEndereco); 36 37 labelCidade = new JLabel(Cidade); 38 add(labelCidade); 39 40 textfieldCidade = new JTextField(30); 41 add(textfieldCidade); 42 43 } // fim do construtor GuiGridLayout 44 45 public static void main( String args[] ) 46 { 47 GuiBoxLayout boxLayout = new GuiBoxLayout(); 48 boxLayout.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 49 boxLayout.setSize( 300, 200 ); // configura o tamanho do frame 50 boxLayout.setVisible( true ); // exibe o frame 51 } // fim do main 52 53} // fim da classe

Veja agora a anlise da linha 22. Linha 22 cria-se o gerenciador de layout BoxLayout. Como argumento para o construtor, passado o painel de contedo, obtido com o mtodo getContenPane(), e o alinhamento desejado vertical (BoxLayout.Y.AXIS) ou horizontal (BoxLayout.X.AXIS). Nesse caso, est sendo passado o alinhamento vertical. Para usar esse gerenciador necessrio informar o painel de contedo que ele ser aplicado.

114

Linguagens de Programao II

Seo 4 Construindo uma GUI com Layout mais complexo


Para construir GUI com layout mais elaborado, voc precisar trabalhar com mltiplos painis. At agora, trabalhamos com um painel, o painel de contedo padro do JFrame. Para criar outro painel necessrio usar a classe JPanel. Um JPanel, conhecido como painel ou panel, tambm considerado um componente GUI, e isso quer dizer que um JPanel pode tratar eventos como uso do mouse, pressionamento de teclas, etc. JPanel um componente do tipo container e, em funo disso, possvel adicionar outros componentes GUI a ele. Voc j deve ter percebido que uma GUI mais elaborada ser composta de vrios componentes JPanel, onde cada um ter mais componentes GUI associados a ele, inclusive outros JPanel, e cada um poder ser gerenciado por um gerenciador de layout especco. O gerenciador de layout controla os componentes que se encontram dentro do componente ao qual ele est associado. Se um JFrame contiver um JPanel e este contiver um JButton, ento o gerenciador de layout do painel controlar o tamanho e a insero do boto, enquanto que o gerenciador de layout do frame controlar o tamanho e a insero do painel. FlowLayout o gerenciador de layout padro de um JPanel. A gura 4.7 mostra uma GUI onde quatro botes aparecem na regio sul do frame. Para construir essa GUI, foi necessrio, primeiramente, criar um JPanel, congurar o layout desse JPanel para GridLayout de uma (1) linha e quatro colunas e adicionar os quatro botes a ele. Posteriormente, o JPanel foi adicionado ao frame na regio SOUTH do container. Lembre que o gerenciador de layout padro de todo JFrame BorderLayout. Num gerenciador BorderLayout necessrio especicar a regio onde o componente ser inserido.

Unidade 4

115

Universidade do Sul de Santa Catarina

FIGURA 4.7 GUI DA APLICAO GUIJPANEL

O cdigo, referente ao componente JPanel, exibido a seguir:


1 import java.awt.BorderLayout; 2 import java.awt.GridLayout; 3 import javax.swing.JFrame; 4 import javax.swing.JPanel; 5 import javax.swing.JButton; 6 7 8 public class GuiJPanel extends JFrame 9 { 10 private JPanel buttonJPanel; // painel para armazenar botes 11 private JButton buttons[]; // array de botes 12 private final String names[] = { Salvar, Editar, Deletar, Sair}; 13 14 // construtor 15 public GuiJPanel() 16 { 17 super( Exemplos utilizando JPanel ); 18 buttons = new JButton[ 4 ]; // cria botes de array 19 20 buttonJPanel = new JPanel(); // cria JPanel 21 buttonJPanel.setLayout( new GridLayout( 1, buttons.length ) ); //configura o layout do JPanel 22 23 // cria e adiciona botes 24 for ( int count = 0; count < buttons.length; count++ ) 25 { 26 buttons[ count ] = new JButton( names [ count ] ) ; 27 buttonJPanel.add( buttons[ count ] ); // adiciona boto ao painel 28 } 29 30 add( buttonJPanel, BorderLayout.SOUTH ); // adiciona painel ao JFrame na regio Sul 31 } // fim do construtor 32 33 public static void main( String args[] ) 34 { 35 GuiJPanel panel = new GuiJPanel(); 36 panel.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 37 panel.setSize( 450, 200 ); // configura o tamanho do frame 38 panel.setVisible( true ); // exibe o frame 39 } // fim do main() 40 } // fim da classe

116

Linguagens de Programao II

Veja a anlise de algumas linhas deste cdigo. Linha 20 cria o componente JPanel. Cada componete JPanel ou panel pode conter outros componentes GUI, inclusive outros JPanel. Linha 21 cada componente JPanel pode ter seu prprio gerenciador de layout. Nessa linha, o JPanel buttonJPanel congurou o gerenciador de layout para GridLayout atravs do mtodo setLayout(). Como argumento para o mtodo, passada uma referncia do gerenciador de layout new GridLayout( 1, buttons.length ). No construtor do gerenciador conguramse os componentes nesse JPanel para serem dispostos em uma linha e quatro colunas (buttons.length retorna tamanho do array buttons). Linha 27 adiciona os componentes JButton ao componente JPanel buttonJPanel. Linha 30 adiciona o componente JPanel ao container principal, especicando a regio onde deve ser adicionado, no caso BorderLayout.SOUTH. A regio pode ser especicada porque o gerenciador de layout padro do container GridLayout, que dispe os componentes em cinco regies.
Saiba mais sobre o componente JComboBox! Consulte a documentao referente a este componente em: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ JPanel.html

Unidade 4

117

Universidade do Sul de Santa Catarina

Sntese
Nessa unidade voc aprendeu a utilizar o componente Swing JTextArea. Aprendeu outra forma de tratar eventos gerados pelos componentes, atravs da criao de classe interna annima. Nas ltimas sees dessa unidade voc conheceu outros tipos de Gerenciadores de Layout, conhecidos como BorderLayout, GridLayout e BoxLayout. Alm desses, existem outros gerenciadores que no sero abordados nessas unidades referentes GUI. Para conhecer mais sobre outros gerenciadores consulte as referncias indicadas no nal da unidade.

Atividades de auto-avaliao
A partir de seus estudos, leia com ateno e resolva as atividades programadas para a sua auto-avaliao. 1) Modifique a aplicao da atividade de auto-avaliao solicitada na unidade anterior para tratar os eventos utilizando classe interna annima. 2) Modifique a aplicao da atividade de auto-avaliao solicitada na unidade anterior utilizando o gerenciador de layout GridLayout.

118

Linguagens de Programao II

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando a seguinte referncia, principalmente os captulos 10, 11 e 22: DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. Tambm consulte: HORSTMANN, Cay; CORNELL, Gary. Core JAVA 2. Volume I Fundamentos. 7 ed. Rio de Janeiro: Alta Books, 2005. Consulte, tambm, os seguintes sites:
http://java.sun.com/docs/books/tutorial/uiswing/components/panel. html (Como usar Panels) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/Chapter3html/ (Frames, Panels, and Borders)

Unidade 4

119

UNIDADE 5

Layout, JTabbedPane e componentes de Menu


Objetivos de aprendizagem
Aprender a construir GUI com Layout mais Complexo. Conhecer o componente JTabbedPane. Criar GUI com componentes de Menu.

Sees de estudo
Seo 1 Construindo GUI com Layout mais
Complexo II

Seo 2 Componente JTabbedPane Seo 3 Criando Menus em uma GUI

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade, voc aprender uma miscelnea de conceitos e componentes GUI. Ser dada continuidade ao assunto abordado no captulo anterior, que tratou de maneira introdutria a construo de uma GUI com layout mais complexo. Neste captulo, aprofundaremos um pouco mais esse assunto, sem contudo, ter a pretenso de esgot-lo. A construo de GUI com layout mais elaborado um assunto que deve ser pesquisado alm do que ser abordado nesses captulos. Logo a seguir, outro componente Swing, JTabbedPane ser abordado. A escolha de quais componentes abordar nos captulos referentes GUI se deu em funo de uma maior utilizao dos mesmos em construo de GUI. No nal dessa unidade so mostrados alguns componentes para a construo de menus em GUI.

Seo 1 - Construindo GUI com Layout mais Complexo II


A gura 5.1 mostra uma GUI onde vrios componentes JPanel foram utilizados para armazenar outros componentes GUI.

FIGURA 5.1 GUI DA APLICAO GUIJPANEL2

Foram criados quatro componentes JPanel:

122

Linguagens de Programao II

1) Um JPanel para adicionar todos os componentes JLabel (lado esquerdo). Nele foi usado o gerenciador GridLayout de 1 coluna. 2) Outro JPanel para adicionar os componentes JTextField (lado direito). Nele tambm foi usado o gerenciador GridLayout de 1 coluna. 3) Outro JPanel para adicionar os JButton (regio sul). Nele foi utilizado o gerenciador GridLayout de 4 colunas. 4) Um JPanel principal foi criado para adicionar todos os outros JPanel, um em cada regio desse JPanel. Para isso, ele foi congurado com o gerenciador BorderLayout para esse JPanel. O JPanel dos labels cou na regio CENTER, o JPanel dos textelds cou na regio EAST e o JPanel dos buttons cou na regio SOUTH. O JPane principal foi congurado para aparecer na regio CENTER do frame. No precisamos congurar o gerenciador do JFrame porque seu gerenciador padro j BorderLayout. O cdigo da aplicao exibido a seguir:
import java.awt.GridLayout; import java.awt.BorderLayout; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JPanel; public class GuiJPanel2 extends JFrame { private JLabel labelNome; private JLabel labelEndereco; private JLabel labelCidade; private JTextField textfieldNome; private JTextField textfieldEndereco; private JTextField textfieldCidade; private JPanel buttonJPanel; // painel para armazenar botes private JButton buttons[] = new JButton[ 4 ]; // array de botes private final String names[] = { Salvar, Editar, Deletar, Sair};

Unidade 5

123

Universidade do Sul de Santa Catarina

// construtor sem argumento public GuiJPanel2() { super(Exemplo com Multiplos Paineis); labelNome = new JLabel(Nome); labelEndereco = new JLabel(Endereo); labelCidade = new JLabel(Cidade); textfieldNome = new JTextField(30); textfieldEndereco = new JTextField(30); textfieldCidade = new JTextField(30); JPanel buttonJPanel = new JPanel(new GridLayout( 0, 4)); // cria JPanel dos botoes // cria e adiciona botes ao panel for ( int count = 0; count < buttons.length; count++ ) { buttons[ count ] = new JButton( names [ count ] ) ; buttonJPanel.add( buttons[ count ] ); // adiciona boto ao painel } JPanel labelPane = new JPanel(new GridLayout(0,1)); // cria JPanel dos labels labelPane.add(labelNome); //adiciona labels ao panel labelPane.add(labelEndereco); labelPane.add(labelCidade); JPanel fieldPane = new JPanel(new GridLayout(0,1));// cria JPanel dos textedit fieldPane.add(textfieldNome); //adiciona textfields ao panel fieldPane.add(textfieldEndereco); fieldPane.add(textfieldCidade); JPanel principalPane = new JPanel(new BorderLayout());// cria JPanel principal principalPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); principalPane.add(labelPane, BorderLayout.CENTER);// adiciona painel ao JFrame na regio Sul principalPane.add(fieldPane, BorderLayout.EAST);// adiciona painel ao JFrame na regio Sul principalPane.add( buttonJPanel, BorderLayout.SOUTH ); // adiciona painel ao JFrame na regio Sul add(principalPane,BorderLayout.CENTER) ; } // fim do construtor public static void main( String args[] ) { GuiJPanel2 panel2 = new GuiJPanel2(); panel2.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); panel2.setSize( 600, 200 ); // configura o tamanho do frame panel2.setVisible( true ); // exibe o frame } // fim de main } // fim da classe

124

Linguagens de Programao II

A linha em negrito congura uma borda para o componente JPanel principalPane. invocado o mtodo setBorder() e passado, como argumento, uma borda criada com a classe BorderFactory. createEmptyBorder(10, 10, 10, 10). O mtodo createEmptyBorder() especica uma borda com dimenses em pixels onde cada argumento representa o seguinte: top (primeiro argumento) - inteiro que especica o comprimento em relao ao topo do componente. left (segundo argumento) - inteiro que especica o comprimento do lado esquerdo. bottom (terceiro argumento) - inteiro que especica o comprimento em relao base do componente. right (terceiro argumento) - inteiro que especica o comprimento em relao ao lado direito.

Seo 2 Componente JTabbedPane


O componente JTabbedPane permite que vrias guias ou abas sejam inseridas nele. Cada aba ou guia pode conter outro componente GUI, provavelmente um componente do tipo container, como um JPanel. Voc j sabe que em um JPanel podem ser inseridos outros componentes GUI. Com isso, cada guia pode exibir um conjunto de componentes em um layout especco.

Unidade 5

125

Universidade do Sul de Santa Catarina

Uma guia pode ser exibida por vez. O padro que elas apaream na parte superior do componente, mas podem ser configuradas para aparecer esquerda, direita ou parte inferior.

A gura 5.2 mostra uma aplicao onde quatro guias esto disponveis. Em cada uma delas foi inserido um JPanel que, por sua vez, teve inserido um JLabel. Isso faz com que, ao exibir cada guia, um texto aparea no centro do panel. Na aba de cada guia, voc pode congurar o nome desejado, inserir uma imagem e congura uma tecla de atalho para acessar a prpria guia.

A tecla de atalho de cada guia est marcada com underline. Isso faz que com que ela possa ser acessada com a combinao de Alt + caracter com underline.

FIGURA 5.2 GUI DA APLICAO GUIJTABBEDPANE

O cdigo da aplicao exibido a seguir:


import javax.swing.JTabbedPane; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.GridLayout; public class GuiJTabbedPane extends JFrame { public GuiJTabbedPane() { super(Exemplo de JTabbedPane); JTabbedPane tabbedPane = new JTabbedPane(); ImageIcon icon = new ImageIcon(middle.gif);

Cria o componente JTabbedPane. Criar o objeto que representa a imagem.

126

Linguagens de Programao II

JPanel panel1 = new JPanel(false); JLabel label1 = new JLabel(Texto da guia 1); label1.setHorizontalAlignment(JLabel.CENTER); panel1.setLayout(new GridLayout(1, 1)); panel1.add(label1); tabbedPane.addTab(Aba 1, icon, panel1,Primeira guia); tabbedPane.setMnemonicAt(0, 1);
- Cria um JPanel - Cria um JLabel com um texto que aparecer no JPanel - Congura o alinhamento do texto no JLabel - Congura o layout do JPanel para GridLayout de uma linha e uma coluna - Adiciona o JLabel ao JPanel - Adiciona uma nova guia ao componente JTabbedPane - Congura a tecla de atalho para acessar a guia.

JPanel panel2 = new JPanel(false); JLabel label2 = new JLabel(Texto da guia 2); label2.setHorizontalAlignment(JLabel.CENTER); panel2.setLayout(new GridLayout(1, 1)); panel2.add(label2); tabbedPane.addTab(Aba 2, icon, panel2,Segunda guia); tabbedPane.setMnemonicAt(1, 2); JPanel panel3 = new JPanel(false); JLabel label3 = new JLabel(Texto da guia 3); label3.setHorizontalAlignment(JLabel.CENTER); panel3.setLayout(new GridLayout(1, 1)); panel3.add(label3); tabbedPane.addTab(Aba 3, icon, panel3,Terceira guia); tabbedPane.setMnemonicAt(2, 3); JPanel panel4 = new JPanel(false); JLabel label4 = new JLabel(Texto da guia 4); label4.setHorizontalAlignment(JLabel.CENTER); panel4.setLayout(new GridLayout(1, 1)); panel4.add(label4); tabbedPane.addTab(Aba 4, icon, panel4,Quarta guia); tabbedPane.setMnemonicAt(3, 4); //Adiciona o JTabbedPane para o frame. add(tabbedPane); } public static void main(String[] args) { GuiJTabbedPane tabbedpane = new GuiJTabbedPane(); tabbedpane.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); tabbedpane.setSize( 350, 200 ); // configura o tamanho do frame tabbedpane.setVisible( true ); // exibe o frame } }

Unidade 5

127

Universidade do Sul de Santa Catarina

Veja, agora, os comentrios de algumas linhas do cdigo. As linhas em negrito inserem uma guia nova no componente JTabbedPane. Isso feito com o mtodo addTab(). So passados, como argumento, os seguintes itens: String com o ttulo da aba; Objeto do tipo Icon que representa uma imagem. Caso voc no deseje inserir uma imagem na aba, passe null. Componente que ser inserido na aba. Normalmente, ele um componente do tipo JPanel que j tenha sido criado e com outros componentes adicionados a ele. String com o texto que ser apresentado quando o usurio passar o mouse em cima da aba. Dica de ferramenta. O mtodo addTab() pode ser invocado passando-se apenas a String com o ttulo da aba e o componente a ser inserido. Depois de adicionar a nova aba congurado o caractere que servir como tecla de atalho para acess-la mais rapidamente. Isso feito com o mtodo setMnemonicAt (0, 1). passado, como argumento, o ndice da aba (que sempre comea em 0) e o caractere de atalho.

Seo 3 Criando Menus em uma GUI


Em uma GUI, os menus permitem que o usurio escolha opes, as quais produzem aes como abrir uma janela com outros componentes GUI, exibir uma caixa de dilogo, etc. As classes utilizadas para construir menus so: JMenu: menu de nvel mais alto, por exemplo Arquivo e Formatar. Contm os itens de menu e so adicionados barra de menus (JMenuBar). Quando um menu clicado, sua lista de itens mostrada.

128

Linguagens de Programao II

JMenuItem: item de menu que est dentro de um JMenu. Quando um item de menu clicado, uma ao executada. Um item de menu pode ser um submenu com mais itens de menu. JMenuBar: componente onde os JMenu Arquivo, Formatar so inseridos. o container dos menus. JCheckBoxMenuItem: itens de menu no formato checkbox, ou seja, itens que podem ser ativados ou desativados. JRadioButtonMenuItem: itens de menu no formato radiobutton. Esses itens tambm podem ser ativados ou desativados. As guras, a seguir, mostram uma GUI de uma aplicao que usa menus. O objetivo da aplicao formatar o texto Texto de Exemplo que aparece na rea central do frame. Nessa aplicao aparecem dois menus: Arquivo e Formatar. Dentro do menu Arquivo aparecem dois itens de menu: Sobre.. e Sair. Ao clicar na opo Sobre, do menu Arquivo, uma caixa de dilogo deve aparecer. Ao clicar na opo Sair, do menu Arquivo, a aplicao termina. Dentro do menu Formatar aparecem dois itens de menu que tambm so submenus: Cor e Fonte. Ao clicar no item Cor, o submenu no formato de botes de rdio com o nome das cores aparece. Ao clicar no item Fonte, um submenu no formato de botes de rdio com o nome de fontes e no formato de checkbox com os estilos aparece.
JMenuBar JMenu JMenuItem

FIGURA 5.3 GUI DA APLICAO GUIJMENU

Unidade 5

129

Universidade do Sul de Santa Catarina

JRadioButtonMenuItem

FIGURA 5.4 GUI DA APLICAO GUIJMENU

JCheckBoxMenuItem
FIGURA 5.5 GUI DA APLICAO GUIJMENU

Veja, a seguir, o cdigo da aplicao.


1 import java.awt.Color; 2 import java.awt.Font; 3 import java.awt.BorderLayout; 4 import java.awt.event.ActionListener; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ItemListener; 7 import java.awt.event.ItemEvent; 8 import javax.swing.JFrame; 9 import javax.swing.JRadioButtonMenuItem; 10 import javax.swing.JCheckBoxMenuItem; 11 import javax.swing.JOptionPane; 12 import javax.swing.JLabel; 13 import javax.swing.SwingConstants; 14 import javax.swing.ButtonGroup; 15 import javax.swing.JMenu; 16 import javax.swing.JMenuItem; 17 import javax.swing.JMenuBar; 18 19 public class GuiJMenu extends JFrame 20 { 21 private final Color colorValues[] = { Color.BLACK, Color.BLUE, Color.RED, Color.GREEN }; 22 private JRadioButtonMenuItem colorItems[]; // itens do menu Cor

130

Linguagens de Programao II

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

private JRadioButtonMenuItem fonts[]; // itens do menu Fonte private JCheckBoxMenuItem styleItems[]; // itens do menu Fonte Estilo private JLabel displayJLabel; // exibe texto de exemplo private ButtonGroup fontButtonGroup; // gerencia itens do menu Fonte private ButtonGroup colorButtonGroup; // gerencia itens do menu Cor private int style; // utilizado para criar estilos de fontes public GuiJMenu() { super( Exemplo com JMenu ); JMenu arquivoMenu = new JMenu( Arquivo ); // cria o menu Arquivo arquivoMenu.setMnemonic( A ); // configura o mnemnico como A // cria item de menu Sobre... JMenuItem sobreItem = new JMenuItem( Sobre... ); sobreItem.setMnemonic( S ); // configura o mnemnico com A arquivoMenu.add(sobreItem); // adiciona o item Sobre ao menu Arquivo sobreItem.addActionListener( new ActionListener() { // classe interna annima // exibe um dilogo de mensagem quando o usurio seleciona Sobre... public void actionPerformed( ActionEvent event ) { JOptionPane.showMessageDialog( GuiJMenu.this, Exemplo de GUI com menus, Sobre, JOptionPane.PLAIN_MESSAGE ); } // fim do mtodo actionPerformed } // fim da classe interna annima ); // fim da chamada para addActionListener JMenuItem sairItem = new JMenuItem( Sair ); // cria o item Sair sairItem.setMnemonic( S ); // configura o mnemnico como S arquivoMenu.add(sairItem); // adiciona o item Sair ao menu Arquivo sairItem.addActionListener( new ActionListener() // classe interna annima { // termina o aplicativo quando o usurio clica Sair public void actionPerformed( ActionEvent event ) { System.exit( 0 ); // encerra o aplicativo } // fim do mtodo actionPerformed } // fim da classe interna annima ); // fim da chamada para addActionListener JMenuBar bar = new JMenuBar(); // cria a barra de menus setJMenuBar( bar ); // adiciona uma barra de menus ao aplicativo bar.add(arquivoMenu); // adiciona o menu File barra de menus JMenu formatMenu = new JMenu( Formatar ); // cria o menu Formatar formatMenu.setMnemonic( F ); // configura o mnemnico como F

Unidade 5

131

Universidade do Sul de Santa Catarina

78 // array listando cores de string 79 String colors[] = { Preto, Azul, Vermelho, Verde }; 80 81 JMenu corMenu = new JMenu( Cor ); // cria o menu Cor 82 corMenu.setMnemonic( C ); // configura o mnemnico como C 83 84 // cria itens do menu Cor com botes de opo 85 colorItems = new JRadioButtonMenuItem[ colors.length ]; 86 colorButtonGroup = new ButtonGroup(); // agrupador de botes 87 88 TrataEventoBotao tratabotao = new TrataEventoBotao(); // ouvinte de evento para os botoes 89 90 // cria itens do menu Cor com botes de opo 91 for ( int count = 0; count < colors.length; count++ ) 92 { 93 colorItems[ count ] = new JRadioButtonMenuItem( colors[ count ] ); // cria o item 95 corMenu.add( colorItems[ count ] ); // adiciona o item ao menu Cor 96 colorButtonGroup.add( colorItems[ count ] ); // adiciona ao grupo 97 colorItems[ count ].addActionListener( tratabotao ); //adiciona o ouvinte a cada botao 98 } // fim do for 99 100 colorItems[ 0 ].setSelected( true ); // seleciona o primeiro item dos botes de cor 101 102 formatMenu.add( corMenu ); // adiciona o menu Cor ao menu Format 103 formatMenu.addSeparator(); // adiciona um separador no menu 104 105 // array listando nomes de fonte 106 String fontNames[] = { Serif, Monospaced, SansSerif }; 107 JMenu fontMenu = new JMenu( Fonte ); // cria a fonte do menu 108 fontMenu.setMnemonic( n ); // configura o mnemnico como n 109 110 // cria itens do menu radiobutton para nomes de fonte 111 fonts = new JRadioButtonMenuItem[ fontNames.length ]; 112 fontButtonGroup = new ButtonGroup(); // agrupador dos botoes das fontes 113 114 // criar itens do menu Font com botes de opo 115 for ( int count = 0; count < fonts.length; count++ ) 116 { 117 fonts[ count ] = new JRadioButtonMenuItem( fontNames[ count ] ); 118 fontMenu.add( fonts[ count ] ); // adiciona fonte ao menu Font 119 fontButtonGroup.add( fonts[ count ] ); // adiciona ao grupo de botes 120 fonts[ count ].addActionListener( tratabotao ); // adiciona handler 121 } // fim do for 122 123 fonts[ 0 ].setSelected( true ); // seleciona o primeiro item do menu Font 124 fontMenu.addSeparator(); // adiciona uma barra separadora ao menu Font 125 126 String styleNames[] = { Bold, Italic }; // nomes dos estilos 127 styleItems = new JCheckBoxMenuItem[ styleNames.length ]; 128 TrataEventoCheckBox tratacheck = new TrataEventoCheckBox(); // ouvinte de evento para JChec 129 130 // criar itens do menu Style com caixas de seleo

132

Linguagens de Programao II

131 for ( int count = 0; count < styleNames.length; count++ ) 132 { 133 styleItems[ count ] = new JCheckBoxMenuItem( styleNames[ count ] ); // para estilo 134 fontMenu.add( styleItems[ count ] ); // adiciona ao menu Font 135 styleItems[ count ].addItemListener( tratacheck ); // handler 136 } // fim do for 137 138 formatMenu.add( fontMenu ); // adiciona o menu Fonte ao menu Formatar 139 bar.add( formatMenu ); // adiciona o menu Formatar barra de menus 140 141 // configura o rtulo para exibir texto 142 displayJLabel = new JLabel( Texto de Exemplo, SwingConstants.CENTER ); 143 displayJLabel.setForeground( colorValues[ 0 ] ); 144 displayJLabel.setFont( new Font( Serif, Font.PLAIN, 72 ) ); 145 146 getContentPane().setBackground( Color.CYAN ); // configura o fundo 147 add( displayJLabel, BorderLayout.CENTER ); // adiciona displayJLabel 148} // fim do construtor 149 150 //classe interna para tratar eventos de ao dos itens de menu 151 private class TrataEventoBotao implements ActionListener 152 { 153 // processa selees de cor e fonte 154 public void actionPerformed( ActionEvent event ) 155 { 156 // processa a seleo de cor 157 for ( int count = 0; count < colorItems.length; count++ ) 158 { 159 if ( colorItems[ count ].isSelected() ) 160 { 161 displayJLabel.setForeground( colorValues[ count ] ); 162 break; 163 } // fim do if 164 } // fim do for 165 166 // processa a seleo de fonte 167 for ( int count = 0; count < fonts.length; count++ ) 168 { 169 if ( event.getSource() == fonts[ count ] ) 170 { 171 displayJLabel.setFont( new Font( fonts[ count ].getText(), style, 72 ) ); 173 } 174 } // fim do for 175 176 repaint(); // redesenha o aplicativo 177 } // fim do mtodo actionPerformed 178} // fim da classe interna 179 180 // classe interna para tratar eventos dos itens de menu com caixa de seleo 181 private class TrataEventoCheckBox implements ItemListener 182 {

Unidade 5

133

Universidade do Sul de Santa Catarina

183 // processa selees de estilo da fonte 184 public void itemStateChanged( ItemEvent e ) 185 { 186 style = 0; // inicializa o estilo 187 // verifica se negrito foi selecionado 188 if ( styleItems[ 0 ].isSelected() ) 189 style += Font.BOLD; // adiciona negrito ao estilo 190 191 // verifica se itlico foi selecionado 192 if ( styleItems[ 1 ].isSelected() ) 193 style += Font.ITALIC; // adiciona itlico ao estilo 194 195 displayJLabel.setFont(new Font( displayJLabel.getFont().getName(), style, 72 ) ); 197 repaint(); // redesenha o aplicativo 198 } // fim do mtodo 199} // fim da classe interna 200 201 202 203 public static void main( String args[] ) 204 { 205 GuiJMenu menu = new GuiJMenu(); // criar MenuFrame 206 menu.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 207 menu.setSize( 580, 200 ); // configura o tamanho do frame 208 menu.setVisible( true ); // exibe o frame 209 } // fim do main() 210 211} // fim da classe GuiJMenu

Acompanhe, a seguir, alguns comentrios pertinentes s linhas de programao do quadro anteriormente apresentado: Linha 21 - cria um array de objetos do tipo Color. Nesse array esto as cores disponveis para modicar a cor da fonte do texto. Linha 22 - cria um array para armazenar os itens de menu do tipo boto de rdio. Esse array do tipo JRadioButtonMenuItem. Esses itens de menu iro congurar a cor da fonte. Linha 23 - cria um array para armazenar os itens de menu do tipo boto de rdio. Esse array do tipo JRadioButtonMenuItem. Esses itens de menu iro congurar o tipo da fonte. Linha 24 - cria um array para armazenar os itens de menu do tipo checkbox. Esse array do tipo JCheckBoxMenuItem. Esses itens de menu iro congurar o estilo da fonte.

134

Linguagens de Programao II

Linhas 26 e 27 - criar os objetos do tipo ButtonGroup para agrupar os itens de menu JRadioButtonMenuItem que representam as cores e o tipo da fonte. Linha 34 - cria o menu Arquivo com o componente JMenu. Primeiramente, deve-se criar o menu com JMenu, depois deve criar os itens de menu com JMenuItem. Linha 35 - congura o caractere (mnemnico) que servir de tecla de atalho. O mtodo setMnemonic( A ). passado como argumento do caractere (deve estar em aspas simples) que servir como tecla de atalho para esse menu. Linhas 37 e 38 - cria o primeiro item de menu do menu Arquivo. Um item de menu deve ser criado com JMenuItem. Esse o item de menu Sobre.... Na linha 38 congurado o caractere que servir como tecla de atalho. Linha 41 - adiciona o item de menu Sobre.. ao menu Arquivo. Isso feito atravs do mtodo add() de arquivoMenu. passado, como argumento, o objeto item de menu sobreItem. Linha 42 - adiciona um objeto ouvinte de evento ao item de menu sobreItem recm- criado. Isso necessrio porque quando o usurio clicar nesse item de menu, queremos que uma caixa de dilogo com informaes sobre a aplicao aparea. A gura 5.6 ilustra o aparecimento dessa caixa.

FIGURA 5.6 CAIXA DE DILOGO DA APLICAO

Linha 43 - o objeto ouvinte de evento criado dentro do mtodo addActionListener( ) com a instruo new ActionListener(). Note que os parnteses do mtodo addActionListener comeam na linha 42 e terminam na linha 53. Ele deve ser um objeto do tipo ActionListener porque a interao do usurio com um item de menu gera um evento do tipo ActionEvent.
Unidade 5

135

Universidade do Sul de Santa Catarina

Voc lembra quais outras interaes com componentes GUI geram esse tipo de evento?

Clicar com o mouse em um JButton, pressionar a tecla Enter em um JTextField. Linhas 44 a 52 - a classe do objeto ouvinte de evento ActionListener comea a ser implementada na linha 44, a partir do smbolo de {. uma classe interna annima. Voc trabalhou com esse tipo de classe nas aplicaes anteriores. Ela termina da linha 52, no smbolo de }. Dentro dessa classe, est implementado o mtodo actionPerformed() e, dentro dele, programamos para uma caixa de dilogo aparecer. A instruo que faz aparecer a caixa de dilogo est na linha 48. Note que quando usamos essa caixa de dilogo nas aplicaes anteriores, o primeiro argumento sempre era null. Esse primeiro argumento especica a janela pai onde a caixa de dilogo ir aparecer. Nas aplicaes anteriores, no tnhamos essa janela pai, por isso o argumento era null e a caixa de dilogo aparecia no centro da tela. Nesse caso, especicamos que a janela pai a classe GuiJMenu.this (this faz referncia ao prprio objeto GuiJMenu), logo a caixa de dilogo aparecer centralizada nessa janela. Precisamos especicar this depois da classe porque estamos dentro de uma classe interna.

Esse tipo de caixa de dilogo conhecida como caixa de dilogo modal. Uma caixa de dilogo modal no permite acessar qualquer outra janela do aplicativo at que ela seja fechada.

- A partir desta explicao, tente fazer uma experincia com essa caixa de dilogo... Voc conseguiu acessar a janela pai?
Linhas 55 e 56 - cria o segundo item de menu sairItem. Na prxima linha, congurado o caractere que servir como tecla de atalho para o item de menu Sair.

136

Linguagens de Programao II

Linha 58 - adiciona o item de menu sairItem ao menu arquivoMenu atravs do mtodo add() de arquivoMenu. passado, como argumento, o item de menu que deve ser adicionado. Linha 59 - adiciona um objeto ouvinte de evento ao item de menu sairItem. Todos os objetos ouvintes de eventos que forem adicionados a objetos itens de menu sero feitos com o mtodo addActionListener(). Por isso, a explicao a mesma das linhas anteriores. A classe interna desse objeto ouvinte comea na linha 61 e termina na linha 67. Dentro do mtodo actionPerformed() foi programada a instruo System.exit(0), que faz com que aplicao GUI termine, pois isso que queremos que acontea quando o usurio clicar no item de menu Sair. Linha 70 - cria o componente barra de menus JMenuBar, onde sero inseridos os dois menus criados anteriormente com JMenu (Arquivo e Formatar). Linha 71 - a barra de menus deve ser adicionada ao JFrame com o mtodo setJMenuBar(). passado, como argumento, o componente JMenuBar bar criado na linha anterior. Linha 72 - O mtodo bar.add(arquivoMenu) adiciona barra de menu JMenuBar bar o primeiro menu arquivoMenu. Linha 74 e 75 - criado o segundo menu Formatar com o componente JMenu. congurado o caractere de atalho para esse menu. Linha 79 - array de String colors[] criado e inicializado com o nome das quatro cores que aparecero no menu Formatar. Linha 81 e 82 - criado um outro menu chamado Cor. Isso feito com o componente JMenu, porm esse menu aparecer dentro do menu Formatar, por isso, ele chamado de submenu. Na prxima linha, congurado o caractere de atalho para esse submenu. Linha 85 - os itens do submenu cor no so criados com JMenuItem. Como so itens de menu do tipo boto de rdio, eles so criados usando o componente JRadioButtonMenuItem. Como em vrios itens de menu desse tipo, criado um array chamado colorItems do tipo JRadioButtonMenuItem. O
Unidade 5

137

Universidade do Sul de Santa Catarina

tamanho do array determinado em funo do tamanho do array colors[], criado na linha 79. Linha 86 - criado um objeto agrupador dos itens de menu JRadioButtonMenuItem. Esse objeto chamado de colorButtonGroup e do tipo ButtonGroup(). Voc j usou o agrupador ButtonGroup quando foi apresentado ao componente JRadioButton nos captulos anteriores. Linha 88 - cria um objeto ouvinte de evento do tipo ActionListener. Esse objeto tem este tipo porque a classe TrataEventoBotao da linha 151 implementa a classe ActionListener e porque os eventos gerados pelos itens de menu JRadioButtonMenuItem so do tipo ActionEvent. Linhas 91 a 98 - incia o for com vrias instrues: 93 - cria o item de menu do tipo JRadioButtonMenuItem e armazena no array colorItems. 95 - adiciona o item de menu recm-criado ao JMenu corMenu (criado na linha 81). 96 - adiciona o item de menu recm-criado ao agrupador de itens de menu do tipo boto de rdio. 97 - adiciona o objeto ouvinte de evento criado na linha 88 a este item de menu criado. Quando o usurio clicar num item de menu desse tipo, o cdigo das linhas 156 a 176 ser executado. Nessas linhas, mais especicamente entre as linhas 157 e 164, vericado qual o componente JRadioButtonMenuItem foi selecionado (mtodo isSelected()). Conforme o componente selecionado, a cor ser aplicada no texto do componente JLabel, mudando, com isso, a cor da fonte desse texto.
Ateno! Esse for repetir o nmero de vezes correspondente ao nmero de elementos do array colors[]. Nesse caso, repetir quatro vezes, visto que so quatro botes itens de menu, cada um representando uma cor especfica.

138

Linguagens de Programao II

Linha 100 - congura para que o primeiro item de menu (o que est na posio 0 do array colorItems[ ]) seja selecionado. Linha 102 - adiciona o JMenu corMenu (que contm os itens de menu do tipo boto de rdio) ao JMenu formatMenu atravs do mtodo add(). Linha 103 - adiciona uma linha separadora de menus ao JMenu formatMenu. Isso feito com o mtodo addSeparator(); Linha 106 - cria array de String com o nome das fontes que sero utilizadas para congurao. Linha 107 - cria o submenu Fonte com o componente JMenu. Nesse submenu, sero adicionados outros itens de menu para congurao do tipo e estilo da fonte do texto. Logo aps, congurado o caractere de atalho para esse submenu. Linha 111 - cria o array para armazenar os itens de menu do tipo radiobutton que representaro os nomes de fonte que podero ser escolhidas. Esse array tem o mesmo tamanho que o array fontNames[], criado na linha 106. Linha 112 - criado um objeto agrupador desses itens de menu JRadioButtonMenuItem. Esse objeto chamado de fontButtonGroup e do tipo ButtonGroup(). Linhas 115 a 121 - inicia o for com vrias instrues: 117 - cria um item de menu do tipo JRadioButtonMenuItem e armazena no array fonts. 118 - adiciona o item de menu recm-criado ao JMenu fontMenu (criado na linha 107). 119 - adiciona o item de menu recm-criado ao agrupador de itens de menu do tipo boto de rdio. 120 - adiciona o objeto ouvinte de evento criado na linha 88 a esse item de menu criado. Quando o usurio clicar num item de menu desse tipo, o cdigo das linhas 156 a 176 ser executado. Nessas linhas, mais especicamente entre as linhas 167 e 174, vericado qual o componente JRadioButtonMenuItem foi selecionado (mtodo

Unidade 5

139

Universidade do Sul de Santa Catarina

isSelected()). Conforme o componente selecionado, um tipo de fonte ser aplicada no texto do componente JLabel, mudando, com isso, o tipo da fonte desse texto. Linha 123 - congura para que o primeiro item de menu (o que est na posio 0 do array fonts[ ]) seja selecionado. Linha 124 - adiciona uma linha separadora no JMenu fontMenu. Linha 126 - array de String styleNames [] criado e inicializado com o nome dos dois estilos de fontes que aparecero no submenu Fonte. Linha 127 - cria o array para armazenar os itens de menu do tipo checkbox que representaro os estilos de fonte que podero ser escolhidas. Esse array tem o mesmo tamanho que o array styleNames [], criado na linha 126. Linha 128 - cria um objeto ouvinte de evento do tipo ItemListener. Esse objeto desse tipo porque a classe TrataEventoCheckBox, da linha 181, implementa a classe ItemListener e porque os eventos gerados pelos itens de menu JCheckBoxMenuItem so do tipo ItemEvent. Linhas 131 a 136 - incio do for com vrias instrues: 133 - cria um item de menu do tipo JCheckBoxMenuItem e armazena no array styleItems. 134 - adiciona o item de menu recm-criado ao JMenu fontMenu (criado na linha 107). 135 - adiciona o objeto ouvinte de evento criado na linha 128 a esse item de menu criado. Quando o usurio clicar num item de menu desse tipo, os cdigos das linhas 186 a 198 sero executados. Nessas linhas, vericado qual o componente JCheckBoxMenuItem foi selecionado (mtodo isSelected()). Conforme o componente selecionado (componente que gera o evento), um estilo de fonte ser aplicada no texto do componente JLabel, mudando, com isso, o estilo da fonte desse texto.

140

Linguagens de Programao II

Linha 138 - adicionar o JMenu fontMenu ao JMenu formatMenu. Isso faz com que fontMenu se torne um submenu. Um JMenu adicionado a outro JMenu. Linha 139 - adicionar o JMenu formatMenu (de nvel mais alto) a barra de menus JMenuBar bar. Linha 142 - Cria o componente JLabel com o texto Texto de Exemplo . Linha 143 - congura a cor inicial do JLabel para a primeira cor do array colorValues[ 0 ], nesse caso, Color.BLACK (preto). Linha 144 - congure a fonte inicial do JLabel para Serif , sem estilo (Font.PLAIN) e tamanho 72. Linha 146 - recuperar o painel de contedo padro do frame e congurar a cor de fundo para Color.BLUE. Linha 147 - adicionar o componente JLabel displayJLabel ao frame, posicionando na regio CENTER. Lembre-se que o gerenciador de layout padro do frame BorderLayout. No caso dessa aplicao, o gerenciador esse, pois no especicamos nenhum outro. Observe que as linhas acima explicam o cdigo da aplicao GuiJMenu.

Sntese
Nesta unidade, voc aprendeu um pouco mais sobre a construo de GUI com layout mais complexo e conheceu mais alguns componentes que so bastante utilizados nas construes de GUIs. necessrio reforar que os tpicos referentes construo de GUIs no foram esgotados nesses cinco captulos apresentados at o momento. A inteno foi dar uma introduo ao assunto, abordando os principais conceitos e componentes.

Unidade 5

141

Universidade do Sul de Santa Catarina

Atividades de auto-avaliao
A partir de seus estudos, leia com ateno e resolva as atividades programadas para a sua auto-avaliao. 1) Construa uma GUI com o componente JTabbedPane. Esse componente deve possuir duas abas (guias) com os rtulos: Cadastro e Consulta. Ao clicar na aba Cadastro a GUI exibida na figura 5.1 deve aparecer. 2) Construa uma GUI com menus com essa aparncia.

Saiba mais
Aprofunde os contedos estudados nesta unidade, consultando os seguintes sites:
http://www.netbeans.org/ (IDE NetBeans Ferrramenta com recurso para criao de GUI) http://java.sun.com/docs//books/tutorial/uiswing/components/ tabbedpane.html (How to Use Tabbed Panes)

142

UNIDADE 6

Modelando o Banco de Dados


Objetivos de aprendizagem
Compreender o modelo de dados que ser implementado. Exportar o modelo de banco de dados para uma ferramenta de SGDB. Gerar um script de banco de dados. Criar o banco de dados no MYSQL.

Sees de estudo
Seo 1 Definio de problema. Seo 2 Apresentando o problema. Seo 3 Criando o modelo lgico do banco de dados. Seo 4 Gerando o modelo fsico de banco de dados. Seo 5 Criando o Script SQL do banco de dados.

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade, voc far a migrao de um problema real para uma ferramenta de gerenciamento de banco de dados. Os problemas que podem ser transportados para uma ferramenta de banco de dados, ou de forma resumida, um SGDB, so dos mais variados tipos e complexidades. Porm, nesta unidade, o problema a ser analisado e implementado est diretamente relacionado ao processo de criao e implementao de um software, a gerncia de projetos. O modelo apresentado uma representao simplicada do que a gerncia de um projeto e tem como principal nalidade permitir que voc possa criar um software em Java, que, por sua vez, permita o monitoramento de projetos, independentes da rea de atuao. Para formalizao do modelo fsico do banco de dados, ser usado o SGDB MySQL, mas a soluo pode ser adaptada para qualquer tipo de SGDB. Portanto, mos obra.

Seo 1 Denio de problema


Se voc buscar em alguns dicionrios da lngua portuguesa a palavra problema, encontrar algo como:
Problema: questo que se prope para ser resolvida; algo difcil de explicar; dvida; questo; mistrio; enigma, etc.

144

Linguagens de Programao II

- At a, no h nenhuma novidade nesta denio de problema, certo? Porm, qual a relao entre a palavra problema e as tarefas executadas por um prossional de informtica, em especial aqueles que possuem como principal objetivo a implementao de softwares?
Pois bem, o prossional de informtica envolvido com o desenvolvimento de sistemas computacionais, ou simplesmente softwares, precisa realizar uma tarefa muito complexa, que compreender as necessidades do cliente a partir do problema apresentado. Este prossional responsvel pelo desenvolvimento e manuteno de sistemas de informao para qualquer tipo de organizao, seja ela pblica ou privada, de grande porte ou no.

A anlise detalhada do problema fundamental para se levantar os requisitos necessrios para que o software a ser implementado atenda realmente s necessidades dos seus usurios ou, em outras palavras, solucione os seus problemas.

A anlise do problema tem como principais nalidades: o levantamento de requisitos; a modelagem e especicao das funcionalidades e delimitaes do sistema; a denio dos mdulos do sistema. A partir desta anlise das necessidades do cliente, possvel: denir em qual plataforma (sistema operacional, ferramenta de banco de dados e linguagem de programao) o sistema ser desenvolvido; apresentar um Projeto Lgico e um Projeto Fsico para implementao e funcionamento do sistema; prever o perodo de testes e treinamento dos usurios e, quando necessrio, indicar as melhores solues para a manuteno do sistema.
Unidade 6

145

Universidade do Sul de Santa Catarina

Uma observao importante que existe uma diferena muito clara entre projeto lgico e projeto fsico, conforme mostrado na tabela a seguir:
Quadro 1 - COMPARATIVO ENTRE PROJETO LGICO E PROJETO FSICO.

Projeto Lgico
O objetivo do projeto lgico a especicao detalhada dos elementos do software a nvel lgico, sem se preocupar com as ferramentas que sero utilizadas.

Projeto Fsico
Tendo como base o projeto lgico, o objetivo do projeto fsico detalhar os elementos do software a nvel fsico, preocupando-se com as ferramentas computacionais que sero utilizadas.

A nalidade do projeto lgico a captao das informaes, anlise e correes;

A nalidade do projeto fsico a especicao tcnica completa do software, visando sua implementao, como linguagem de programao e o sistema de banco de dados utilizado.

Veja que, com base na introduo acima, nesta unidade o processo de anlise do problema e construo do modelo de dados lgico no ser realizado por voc, pois a nalidade principal, agora, a construo do modelo numa ferramenta computacional, utilizando o MySQL e o Java. Por se tratar de uma unidade mais prtica do que terica, o processo de levantamento de requisitos foi realizado por ns, como se estivssemos trabalhando em uma equipe de desenvolvimento, na qual o nosso papel o de anlise de sistemas e o seu papel o de programador e especialista em banco de dados. Com certeza a sua anlise e, principalmente, a representao do problema, atravs de um modelo de dados, no seria a mesma que a nossa, pois cada um possui uma forma pessoal de analisar e compreender o problema. Na prxima seo, ser apresentado o problema de forma clara. At l.

146

Linguagens de Programao II

Seo 2 Apresentando o problema


At aqui, voc j estudou um pouco sobre a tarefa de levantamento de requisitos de um sistema. A partir desta seo, voc ter o primeiro contato com o problema sugerido para ser analisado, especicado e, principalmente, solucionado na forma de um sistema computacional, ou, simplesmente, um software. Acompanhe com ateno esse processo!

O problema
Um projeto, independente da rea de atuao, envolve um grande nmero de participantes que so monitorados pelos gerentes de projetos. Cada integrante da equipe de desenvolvimento do projeto funciona como uma pea importante para que se obtenha o resultado esperado.

Mas o que um projeto?

De uma forma bem geral, um projeto qualquer atividade exercida por uma ou vrias pessoas que possuam as seguintes propriedades: uma descrio; uma data de incio e uma previso de trmino; um controle de andamento; uma representao da situao do projeto. Desta forma, essencial que estas informaes sejam cadastradas e atualizadas periodicamente durante a execuo do projeto, para que este esteja sempre representando as realidades das atividades em execuo ou j executadas.

Unidade 6

147

Universidade do Sul de Santa Catarina

Um projeto pode conter mais de um Integrante?

Como apresentado na descrio do que um projeto, normalmente existem vrias pessoas envolvidas em um projeto, que precisam estar em total sintonia, de forma que cada um saiba como esto sendo realizadas as tarefas de cada integrante. Lembre-se que cada uma representa uma pea em um grande quebra-cabea em que, juntando-se as peas de forma correta, chegar-se- ao resultado esperado. Acreditamos que voc tenha chegado seguinte concluso:

A gerncia de um projeto envolve o projeto em si, os seus participantes e a relao entres eles.

Levantamento dos dados


Com base no problema anteriormente relatado, podem-se fazer alguns levantamentos importantes, como: o sistema dever ter um controle dos projetos cadastrados; o sistema dever permitir o cadastramento de dados dos projetos, dos participantes e a relao entre cada projeto e seus participantes; o sistema dever possibilitar a atualizao dos dados dos projetos, principalmente no que se refere ao cronograma de atividades, percentual concludo e a situao atual do projeto; alguns dados devem ser, obrigatoriamente, cadastrados;

148

Linguagens de Programao II

dados repetidos no podem ser cadastrados; o sistema deve possibilitar formas de pesquisas aos projetos, participantes e integrantes de cada projeto. Voltamos a relatar que esta uma anlise bem simples sobre o tema Gerncia de Projetos e, com certeza, voc faria uma anlise diferenciada da nossa, mas o importante aqui o levantamento dos requisitos que devero ser implementados.

Seo 3 Criando o modelo lgico de banco de dados


Neste primeiro passo, a modelagem de dados representar os conjuntos de dados apresentados pelo levantamento de dados da seo anterior, sem se preocupar com a ferramenta de SGDB que ser usada posteriormente. Veja que esta anlise ser dividida em: projeto; participantes; relao entre projetos e participantes.

Propriedades de um projeto
Com base no levantamento de dados, preciso denir quais as propriedades que precisam ser armazenadas no banco de dados para cada projeto. importante que o projeto possua um cdigo de identicao interna, como uma chave primria, que no permita a repetio deste campo nico. Como normalmente utilizamos um nome para identicar algo, o projeto tambm possuir um nome de identicao externa, chamado de Descrio.

Unidade 6

149

Universidade do Sul de Santa Catarina

Para concluir, o projeto dever possuir as seguintes caractersticas: data de incio e encerramento; situao; percentual concludo. Pois bem, convertendo estas propriedades para uma entidade de banco de dados, tem-se:

FIGURA 6.1 ENTIDADE PROJETOS

No se preocupe com os comandos SQL-DDL para denio desta tabela, pois isto ser feito na prxima seo, uma vez que necessria a representao de mais duas entidades, os participantes e a relao entre projetos e participantes.

Propriedades de um participante
Ainda com base no levantamento de dados, voc precisa denir quais as propriedades que precisam ser armazenadas no banco de dados para cada participante dos projetos. importante que o participante possua um cdigo de identicao interna, como uma chave primria, que no permita a repetio deste campo nico. Para uma identicao mais legvel e amigvel, um nome para identicar cada participante tambm se faz necessrio. Para concluir, o participante dever possuir tambm uma identicao do seu cargo funcional.

150

Linguagens de Programao II

Pois bem, convertendo estas propriedades para uma entidade de banco de dados, tem-se:

FIGURA 6.2 ENTIDADE PARTICIPANTE

Agora, s falta a representao da relao dos projetos e de seus participantes. Para tanto, necessria a criao de um relacionamento entre os projetos e seus participantes, a m de se garantir a integridade dos dados, pois um projeto s pode existir se estiver cadastrado na entidade de projetos e s pode ter como integrante um participante cadastrado na entidade de participantes. Com isto, evita-se a redundncia de dados (recadastramento) e garante-se a integridade dos mesmos. Veja como ca o relacionamento no modelo lgico completo:

FIGURA 6.3 MODELO LGICO COMPLETO

Unidade 6

151

Universidade do Sul de Santa Catarina

Agora sim, voc j pode ver como transformar este modelo lgico em um modelo fsico para o SGDB do MySQL, atravs dos comandos de denio de dados (SQL-DDL). Mas isso assunto para prxima seo.

Seo 4 Modelo de dados do sistema


Nesta seo, voc poder revisar os comandos de denio de dados do SQL, chamados de comandos de DDL (Data Denition Language), que compreendem os comandos: Create Database e Drop Database. Use. Create e Drop Table. Alter Table. Create Index e Drop Index. Entretanto, para esta unidade, os comandos utilizados sero o create table, drop table, create database e drop database. Para fazer uma reviso destes comandos, veja o quadro a seguir:
QUADRO 2 - LISTA DE COMANDOS SQL DDL

Comando
Create Database <Nome_Database>; Drop Database <Nome_Database>; Use <Nome_DataBase> Create Table <Nome_Tabela>( Coluna1 Tipo,...,CounaN Tipo ); Drop Table <Nome_Tabela>; Alter Table <Nome_Tabela> Modify/Add Coluna Tipo; Create Index <Nome_Indice> on Nome_Tabela(Coluna); Drop Index <Nome_Indice> on Tabela;

Funcionalidade
Cria um Database no MSQL Remove um Database no MySQL Acessa um Database no MySQL Cria uma tabela de banco de dados Remove uma tabela do banco de dados Altera as colunas de uma tabela Cria um ndice para tabela Remove o ndice de uma tabela

152

Linguagens de Programao II

Com base nas sintaxes apresentadas acima, j possvel voc comear a criar as tabelas do modelo de dados que implementa o sistema de gerncia de projetos.

Criao da tabela de projetos


Com base no modelo de dados lgico, apresentado na gura 3, da seo 4, o comando de criao da tabela de projetos car da seguinte forma:
CREATE TABLE Projetos ( idProjetos INTEGER NOT NULL AUTO_INCREMENT, vDescricao VARCHAR(30) NOT NULL, dDataInicio DATE NOT NULL, dDataFinal DATE NOT NULL, nPercConcluido INTEGER UNSIGNED NOT NULL, vSituacao VARCHAR(35) NOT NULL, PRIMARY KEY(idProjetos) );

Note que o campo idProjetos, alm de ser um campo chave primria (que no se repete), inteiro (Integer), tambm um campo do tipo auto-incremento e, desta forma, no precisa ser cadastrado, pois seu valor gerado de forma automtica.

Criao da tabela de participantes


Com base no mesmo modelo de dados lgico, o comando de criao da tabela de participantes car da seguinte forma:
CREATE TABLE Participantes ( idParticipantes INTEGER NOT NULL AUTO_INCREMENT, vNome VARCHAR(30) NOT NULL, vCargo VARCHAR(30) NOT NULL, PRIMARY KEY(idParticipantes) );

Unidade 6

153

Universidade do Sul de Santa Catarina

Note que o campo idParticipantes, alm de ser um campo chave primria (que no se repete), inteiro (Integer), tambm um campo do tipo auto-incremento e, desta forma, no precisa ser cadastrado, pois seu valor gerado de forma automtica. Para fechar a criao da tabela associativa Controles, que faz a relao entre os projetos e seus participantes. Veja, a seguir, o cdigo que cria esta tabela:
CREATE TABLE Controles ( Projetos_idProjetos INTEGER NOT NULL, Participantes_idParticipantes INTEGER NOT NULL, Primary ke(Projetos_idProjetos,Participantes_idParticipantes), Foreign Key(Participantes_idParticipantes) references Participantes(idParticipantes), Foreign key(Projetos_idProjetos) references Projetos (idProjetos) );

Essa tabela possui algumas propriedades importantes, como: os campos Projetos_idProjetos e Participantes_ idParticipantes formam uma chave primria composta; o campo Projetos_idProjetos uma chave estrangeira para tabela de projetos; o campo Participantes _id Participantes uma chave estrangeira para tabela de participantes. Como estas tabelas sero a base das implementaes que sero realizadas nas unidades que seguem, importante que seja criado um script de SQL, que implemente todo o modelo de banco de dados, inclusive o database que conter o banco de dados. Mas isto j nosso prximo tema.

154

Linguagens de Programao II

Seo 5 Criao do Script SQL do banco de dados


O script SQL um arquivo escrito em qualquer tipo de editor de texto, como, por exemplo, o Bloco de Notas do Windows. O ideal salvar este arquivo com a extenso .sql para indicar que se trata de um script SQL. Neste arquivo, so escritos os comandos em SQL que realizam as seguintes tarefas: criao das tabelas; denio das colunas de cada tabela (campos); denio dos tipos de dados de cada coluna (campo); denio das regras de chave primria e chave estrangeira de cada tabela. O script em SQL de criao do banco de dados est diretamente relacionado aos comandos de denio de dados da linguagem SQL, que so: Create Table, Drop Table e Alter Table.
O script geral, que ser apresentado aqui, pode ser baixado por voc na seo Midiateca do ambiente virtual da disciplina (EVA).

Veja como cou o script completo:


#criar o database chamado livro create database if not exists livro; #entrar no database livro use livro; #remove as tabelas para recri-las drop table if exists controles; drop table if exists participantes; drop table if exists projetos; #cria a tabela de Projetos CREATE TABLE Projetos ( idProjetos INTEGER NOT NULL AUTO_INCREMENT, vDescricao VARCHAR(30) NOT NULL, dDataInicio DATE NOT NULL, dDataFinal DATE NOT NULL, nPercConcluido INTEGER UNSIGNED NOT NULL, vSituacao VARCHAR(35) NOT NULL, PRIMARY KEY(idProjetos) );
Unidade 6

155

Universidade do Sul de Santa Catarina

#cria a tabela de Participantes CREATE TABLE Participantes ( idParticipantes INTEGER NOT NULL AUTO_INCREMENT, vNome VARCHAR(30) NOT NULL, vCargo VARCHAR(30) NOT NULL, PRIMARY KEY(idParticipantes) ); #cria a tabela de controles CREATE TABLE Controles ( Projetos_idProjetos INTEGER NOT NULL, Participantes_idParticipantes INTEGER NOT NULL, Primary key (Projetos_idProjetos,Participantes_idParticipantes), Foreign Key(Participantes_idParticipantes) references Participantes(idParticipantes), Foreign key(Projetos_idProjetos) references Projetos (idProjetos) ); #lista as tabelas criadas show tables;

Bem, com esse script, voc tem a modelagem do banco de dados em um formato que pode ser lido pela ferramenta de banco de dados e que ser utilizado para implementao do sistema e armazenamento dos dados. Para test-lo, basta que voc crie o arquivo de script ou baixe-o da midiateca, selecione todas as linhas do script e as copie. Depois, acesse o editor de comandos do MySQL (MySQL Command Line Client) e cole as linhas no editor. Todas as linhas sero executadas automaticamente e, ao nal, os nomes das tabelas criadas sero apresentadas na tela, conforme a tela a seguir:

FIGURA 6.4 RESULTADO DA EXECUO DO SCRIPT

156

Linguagens de Programao II

Esta uma entre vrias etapas para se criar um software. Na prxima unidade, voc aprender a etapa de criao das classes em Java, que faro a ligao entre este banco de dados criado e o software implementado. At a prxima unidade!

Sntese
Voc pde estudar, nesta unidade, que a tarefa de desenvolver software requer muita anlise por parte do prossional. A principal diculdade transformar um problema em uma soluo computacional, que atenda s necessidades do cliente e seus usurios. As tarefas de especicao do problema possuem uma cronologia e ordem formal, a inverso destas tarefas pode resultar em mais tempo de desenvolvimento e, conseqentemente, em maior custo. Na maioria das vezes, um sistema computacional est agregado a uma soluo de banco de dados, responsvel por armazenar e garantir a integridade dos mesmos. Para se chegar a um modelo de dados ideal e que atenda s necessidades do usurio importantssimo um levantamento de dados criterioso e organizado. A representao do modelo de dados feita pela modelagem de entidade e relacionamentos, que uma representao grca, para maior compreenso da soluo que esta sendo adotada. Para transformar esta soluo em uma ferramenta de banco de dados, necessria a criao de um conjunto de comandos em SQL que construa e altere as estruturas modeladas, e este conjunto de comandos chamado de Script. Um script pode mudar de acordo com a ferramenta computacional que se deseja adotar, por algum novo comando que seja
157

Unidade 6

Universidade do Sul de Santa Catarina

necessrio, porm a modelagem de entidade e relacionamento nica, independente da ferramenta computacional e a principal referncia para o sistema que ser implementado.

Atividades de auto-avaliao
Efetue as atividades de auto-avaliao e, a seguir, acompanhe as respostas e comentrios a respeito. Para melhor aproveitamento do seu estudo, realize a conferncia de suas respostas somente depois de fazer as atividades propostas. 1) Ao se modelar um problema, voc acha que o usurio realmente passa todos os dados necessrios ou alguns deles so omitidos, com medo que o sistema desenvolvido venha a substitu-lo no servio? 2) Quando se desenvolve um produto, como uma cadeira, uma casa, etc., durante o processo de criao possvel apresent-lo ao cliente, para seu acompanhamento. Porm, no caso de desenvolvimento de softwares no h um produto palpvel para ser apresentado. Como agir em uma situao como esta?

Saiba mais
Para aprofundar as questes abordadas nesta unidade, voc poder pesquisar em: DATE, C. J. Bancos de dados: fundamentos. Rio de Janeiro: Campus, 1985. DATE, C. J. Introduo ao sistema de banco de dados. 8 ed. Rio de Janeiro: Campus, 1990. SOARES, Walace. MySQL: conceitos e aplicaes. So Paulo: Erica, 2002.

158

UNIDADE 7

Conectando o Java ao Banco de Dados


Objetivos de aprendizagem
Entender o processo de conexo entre uma linguagem de programao e uma ferramenta de banco de dados. Compreender o funcionamento do driver JDBC. Instalar e configurar o driver de conexo do Java para MySQL. Criar uma classe de conexo ao banco de dados MySQL.

Sees de estudo
Seo 1 Driver de conexo Seo 2 Driver de conexo JDBC Seo 3 Criando uma classe de conexo ao MySQL

Universidade do Sul de Santa Catarina

Para incio de conversa


Nas unidades anteriores, voc pde conhecer o modelo de dados que ser usado para criao do sistema de gerncia de projetos. A partir de agora, necessrio que voc compreenda como fazer uma aplicao escrita em Java e se conectar a um banco de dados, de forma segura e convel. Sendo assim, seja bem-vindo ao mundo dos drivers de conexo!

Seo 1 Driver de conexo


Uma funcionalidade essencial em qualquer software a sua capacidade de se comunicar com um banco de dados, independentemente da linguagem de programao utilizada para implementao. A linguagem de programao possui uma sintaxe prpria e as ferramentas de banco de dados funcionam baseadas na linguagem SQL o que signica que estas duas tecnologias no conseguem conversar entre si. como se duas pessoas de idiomas diferentes comeassem a conversar, sem que um entendesse o outro. Seria um problema, no acha?

Sendo assim, necessrio que um interpretador faa o papel de converso entre eles, de forma que os dois possam se comunicar.

Veja a imagem a seguir:

Software

Driver

Banco de dados

FIGURA 7. 1 - FUNCIONAMENTO DE UM DRIVER

160

Linguagens de Programao II

No caso da computao, este interpretador recebe o nome de Driver de Conexo. Como cada ferramenta de banco de dados possui particularidades no seu funcionamento, normalmente o driver de conexo distribudo pelo prprio fabricante do banco de dados.
No caso do sistema operacional Windows, h um conjunto de drivers para conectividade a banco de dados, chamado de Open DataBase Connectivity (Padro Aberto de Conectividade), ou simplesmente ODBC.

A maioria dos drivers de conexo disponveis no ODBC para bancos de dados antigos, muitos at deixaram de ser usados, como: Dbase, Clipper. Sendo assim, para a maioria dos bancos de dados atuais necessrio que o usurio instale no seu computador o driver especco para a ferramenta que ele est utilizando. No caso do projeto de gerncia de projetos, o driver deve ser do banco de dados MySQL e voltado para plataforma Java... mas isto assunto para a seo a seguir!

Seo 2 Driver de conexo JDBC


No Java, os drivers ODBC recebem o nome de JDBC, ou seja, driver ODBC especco para Java. O driver JDBC o driver ODBC que permite a conexo entre um banco de dados e o programa escrito em Java. Seria o intrprete entre um sistema desenvolvido em Java e um banco de dados, possibilitando a comunicao entre eles.

Programa em Java

JDBC

Banco de dados

FIGURA 7.2 - PAPEL DO DRIVER DE CONEXO JDBC

Unidade 7

161

Universidade do Sul de Santa Catarina

O uso do JDBC apresenta algumas vantagens para a aplicao Java: maior portabilidade, facilidade de congurao e padronizao.

Como baixar e instalar um driver JDBC?

Com base na ferramenta que ser utilizada como banco de dados, acesse o site do fabricante e procure, na rea de download, pelo driver de conexo JDBC. Para facilitar, acesse o link: <http:// dev.mysql.com/downloads/connector/j/3.1.html>, para baixar o JDBC para MySQL. Esse driver ser usado por voc para conexo do software. Veja o site de download deste driver de conexo:

FIGURA 7.3 - SITE DE DOWNLOAD DO DRIVER DE CONEXO DO MYSQL

Para baixar o arquivo, clique no link Pick a Mirror, AO LADO DA OPO ZIP, conforme a imagem a seguir:

162

Linguagens de Programao II

FIGURA 7.4 - LINK PARA O DRIVER DE CONEXO DO MYSQL

Na pgina que se abre, procure um Mirror do Brasil e clique na palavra Http, conforme a imagem a seguir:

FIGURA 7.5 - LINK PARA INICIAR O DOWNLOAD DO ARQUIVO

Na janela que se abre, clique no boto salvar e direcione o salvamento do arquivo para um diretrio de sua escolha.

FIGURA 7.6 - JANELA DE SALVAMENTO DO ARQUIVO

Unidade 7

163

Universidade do Sul de Santa Catarina

Este arquivo no precisa ser instalado, apenas descompacte-o conforme os passos a seguir: 1) Clique no arquivo baixado anteriormente com o driver JODBC; 2) Descompacte-o para uma pasta de sua preferncia, pode ser a mesma pasta na qual voc o salvou durante o download do arquivo; 3) Na pasta ser criado um arquivo chamado mysqlconnector-java-5.0.3-bin.jar.Este nome pode mudar dependendo da verso que voc baixou. 4) Copie este arquivo para pasta \jre\lib\ext . Esta pasta ca dentro do diretrio em que voc instalou o Java na sua mquina. Algo como: C:\Arquivos de Programas\Java\jdkX. Y.Z_00\jre\lib\ext. Pronto, o driver est pronto para ser usado.

Seo 3 Criando uma classe em Java para conexo com Banco de Dados
A conexo com um banco de dados, atravs da linguagem Java pode ser dividida em trs processos distintos: conectar ao banco de dados; executar comandos com recuperao de dados Select; executar comandos sem recuperao de dados Insert, Update e Delete. Vale destacar que, se o primeiro processo no for efetivado com sucesso, os demais no podem ser realizados.

164

Linguagens de Programao II

Veja o diagrama a seguir:

Conectar ao Banco de Dados

CONECTOU ? sim Usurio tem acesso

no

Mensagem de ERRO

Encerra o programa

Banco de Dados

FIGURA 7.7 - FORMA DE ACESSO AO UM SOFTWARE COM CONEXO AO BANCO DE DADOS

A conexo com o banco de dados se d pela conexo JDBC, utilizando a classe chamada DriverManager, que poderia ser traduzido para administrador do driver. Esta classe pertence ao pacote java.sql e serve para: criar a conexo com o banco de dados; administrar o driver JDBC usado na conexo; controlar o acesso ao banco de dados via Login; controlar a troca de informao entre o driver e a ferramenta de banco de dados. Como o DriverManager pertence ao pacote Java.sql, sempre que voc for utiliz-lo dever incluir a linha import java.sql.* no cdigo fonte da sua classe, pois este no um pacote nativo do Java.

Unidade 7

165

Universidade do Sul de Santa Catarina

Lembre-se: a linguagem Java Case Sensitive, ou seja, maisculo diferente de minsculo. Sendo assim, a classe DriverManager reconhecida, j a classe drivermanager ser um comando no reconhecido pela linguagem.

Como usar a classe DriverManager?


A sintaxe do uso desta classe bem simples, assim como a nalidade dela especicamente a conexo com o banco de dados, os seus atributos se referem a dados como: nome do servidor de acesso, a porta de acesso (3306 mysql) e o nome do database; nome do usurio; senha de acesso ao banco de dados. Para que a classe DriverManager receba estes valores, necessria a utilizao do mtodo getConnection(), que ser melhor detalhado a seguir. Assim, a sintaxe de uso do DriverManager :
DriverManager.getConnection(URL, usurio, senha);

Onde: URL: String; Nome do Usurio: String; Senha: String;

166

Linguagens de Programao II

Os nomes do usurio e da senha de acesso seguem as regras da denio do banco de dados. No caso do banco de dados MySQL instalado por voc, ser a mesma senha e usurio que voc usa para se logar ao MySQL. O mtodo getConnection() retorna sempre um atributo do tipo Connection, que pode ser fechado por meio do mtodo close(). A partir do momento que o banco de dados foi fechado, ele no pode mais ser manipulado, a no ser que uma nova conexo seja aberta atravs do getConnection(). Sempre que voc encerrar a aplicao, feche o banco de dados. Os comandos do getConnection() so sempre os mesmos, o que pode mudar so os parmetros de nome da fonte, usurio e senha. Sendo assim, a conexo com banco de dados poderia ser representada por uma classe como:

FIGURA 7.8 - DIAGRAMA DA CLASSE DE CONEXO COM BANCO DE DADOS EM JAVA

O que signica cada um destes itens?

Unidade 7

167

Universidade do Sul de Santa Catarina

Bem, cada um destes itens possui uma caracterstica dentro da classe de conexo, que :

Ususrio nome do usurio que se conectar ao MySQL; Senha senha de acesso ao MySQL; Servidor servidor de onde o MySQL ser acessado; DataBase banco de dados que ser acessado; Con classe do tipo Connection do prprio Java que faz a conexo com o banco de dados; Conectado campo lgico que indica se a conexo foi realizada; Dados classe do tipo ResultSet, do Java, que armazena os resultados de um comando Select; Conexao() mtodo que instancia a classe Conexo; Conectar() mtodo que faz a conexo com o banco de dados; FecharConexao() mtodo que fecha a conexo com o banco de dados; ExpressaoSQL mtodo que executa um comando de SQL.

Agora que a estrutura da classe j conhecida, o prximo passo cri-la atravs dos comandos em Java. Abra o seu editor de Java preferido, crie um projeto com nome classes_livro. Crie uma nova classe chamada Conexao.java para este projeto e edite o seguinte cdigo-fonte:
import javax.swing.JOptionPane; import java.sql.*; public class Conexao { //Atributos da Classes private String Usuario,Senha,Servidor,DataBase; private Connection Con; private boolean Conectado; private ResultSet Dados;

168

Linguagens de Programao II

//Construtor da Classe public Conexao(){ setSenha(); setUsuario(); setServidor(); setConectado(false); setCon(null); setDados(null); setDataBase(); } public Conexao(String SERV,String DB,String USU,String SENHA){ setSenha(SENHA); setUsuario(USU); setServidor(SERV); setDataBase(DB); setConectado(false); setCon(null); setDados(null); } //Modificadores public void setCon(Connection con) {Con = con;} public void setConectado(boolean conectado) {Conectado = conectado;} public void setSenha(String senha) {Senha = senha;} public void setUsuario(String usuario) {Usuario = usuario;} public void setServidor(String servidor) {Servidor = servidor;} public void setDados(ResultSet dados) {Dados = dados;} public void setDataBase(String DB) {DataBase = DB;} //Recuperadores public String getUsuario() {return Usuario;} public String getSenha() {return Senha;} public boolean getConectado() {return Conectado;} public Connection getCon() {return Con;} public String getServidor() {return Servidor;} public ResultSet getDados() {return Dados;} public String getDataBase() {return DataBase;} public void Conectar() { try{ Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://+getServidor()+:3306+/+getDataBase(); setCon(DriverManager.getConnection(URL,getUsuario(),getSenha())); setConectado(true); } catch (Exception e){ JOptionPane.showMessageDialog(null,Conexo no foi realizada!,, JOptionPane. WARNING_MESSAGE); JOptionPane.showMessageDialog(null,Erro :+e.getMessage(),, JOptionPane. WARNING_MESSAGE); setConectado(false); return;

Unidade 7

169

Universidade do Sul de Santa Catarina

} JOptionPane.showMessageDialog(null,Conexo realizada com Sucesso!,, JOptionPane. WARNING_MESSAGE); } public void FecharConexao(){ try{ if(getConectado()) getCon().close(); } catch (Exception e ){ JOptionPane.showMessageDialog(null,Conexo no foi fechada!,, JOptionPane. WARNING_MESSAGE); JOptionPane.showMessageDialog(null,Erro :+e.getMessage(),, JOptionPane. WARNING_MESSAGE); } } public void ExpressaoSQL(String Comando){ if(getConectado()){ try{ Statement st = getCon().createStatement(); if(Comando.toUpperCase().indexOf(SELECT)!= -1) setDados(st.executeQuery(Comando)); else{ setDados(null); st.executeUpdate(Comando); if(Comando.toUpperCase().indexOf(UPDATE)!= -1) JOptionPane.showMessageDialog(null,Dados Atualizados!,, JOptionPane. WARNING_MESSAGE); else if(Comando.toUpperCase().indexOf(DELETE)!= -1) JOptionPane.showMessageDialog(null,Dados Removidos!,, JOptionPane. WARNING_MESSAGE); else if(Comando.toUpperCase().indexOf(INSERT)!= -1) JOptionPane.showMessageDialog(null,Dados Inseridos!,, JOptionPane. WARNING_MESSAGE); } } catch(SQLException sqle){ JOptionPane.showMessageDialog(null,SQL Invlido!,, JOptionPane. WARNING_MESSAGE); JOptionPane.showMessageDialog(null,Erro :+sqle.getMessage(),, JOptionPane. WARNING_MESSAGE); } } } }

170

Linguagens de Programao II

Compile a classe para que, mais frente, voc possa criar uma classe de teste para vericar a sua funcionalidade. Para detalhar o cdigo, utilizaremos a tabela a seguir:
Linha de Comando
import javax.swing.*;

Funcionalidade
Pacote importado para JOptionPane Pacote Java para manipulao de banco de dados. Nome da classe criada deve ter o mesmo nome do arquivo em Java.

import java.sql.*;
class Conexao private String Usuario,Senha, Servidor,DataBase; private Connection Con; private boolean Conectado; private ResultSet Dados; public Conexao(String SERV,String DB,String USU,String SENHA) String URL = jdbc:mysql:// +getServidor()+:3306+/+getDataBase();

Atributos da classe so sempre private.

Construtor da classe Conexao, recebendo como parmetro os valores do servidor, usurio e senha. O nome da URL em Java, identicada como jdbc: mysql: e, em seguida, o servidor, a porta de conexo e o nome do banco de dados que se deseja acessar. Carrega o driver que ser usado para conexo com o Java. Neste caso, ser uma conexo via JDBC. Tenta fazer a conexo com o banco de dados a partir da URL, usurio e senha fornecidos. O mtodo setCon () armazena no atributo Con o resultado da execuo do comando getConnection. Toda a operao de banco de dados em Java, obrigatoriamente, deve ser protegida com tratamento de exceo try.. catch. Fecha o banco de dados. Por ser uma operao de banco de dados, deve ser protegida por try e catch. Executa um comando em SQL e guarda o resultado do comando no atributo Dados, do tipo ReultSet.

Class.forName(com.mysql.jdbc.Driver);

DriverManager.getConnection(URL, getUsuario(),getSenha()) setCon(DriverManager.getConnection( URL,getUsuario(),getSenha())); try{ } catch(Exception e){ }

getConexao().close();

ExpressaoSQL(String Comando)

Unidade 7

171

Universidade do Sul de Santa Catarina

Qualquer dvida, baixe da Midiateca a fonte desta classe para ganhar tempo.

Para testar esta classe, crie uma nova classe no seu editor JAVA, com o nome de testeConexao, conforme o modelo a seguir:
public class testeConexao{ public static void main(String args[]){ Conexao C = new Conexao(localhost,nome do banco,usuario,senha); C.Conectar(); C.FecharConexao(); } }

Lembre-se de mudar o usurio e a senha para a forma pela qual voc conecta o MySQL na sua mquina, com a sua senha e o seu nome de usurio. importante que voc tenha copiado o driver JDBC para o diretrio \jre\lib\ext, caso contrrio, a aplicao em Java no conseguir se conectar ao MySQL. Se tudo correu bem, o resultado da execuo ser:

FIGURA 7.9 - RESULTADO DA EXECUO DA CLASSE TESTECONEXAO

O prximo passo realizar as operaes de insero, excluso e atualizao das tabelas do banco de dados.

172

Linguagens de Programao II

Sntese
Nesta unidade, voc pode revisar alguns conceitos da programao em Java, principalmente na estrutura de uma classe, assim como a mesma pode ser instanciada e usada. Junto a comandos que voc j conhecia e que so essenciais para programao em Java, algumas novas classes foram apresentadas a voc, como as DriverManager, Connection Statement e ResultSet. No momento, estas estruturas podem parecer complexas, mas lembre-se que se trata de um assunto novo, recm abordado. medida que voc for interagindo com estas classes, inclusive nas unidades que se seguem, o uso se tornar fcil e direto.

Atividades de auto-avaliao
1) Qual a finalidade do tratamento de exceo? 2) A definio das regras de conexo com banco de dados atravs de classes uma garantia de funcionamento dentro do esperado?

Unidade 7

173

Universidade do Sul de Santa Catarina

Saiba mais
Para aprofundar as questes abordadas nesta unidade, voc poder pesquisar em: THOMPSON, Marco Aurlio. Java 2 & banco de dados. So Paulo, rica: 2002. DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. SIERRA, Kathy; BATES, Bert. Java use a cabea. Alta Books: 2005.

174

UNIDADE 8

Criando as Classes de Representao


Objetivos de aprendizagem
Aplicar as tcnicas da Programao Orientada a Objetos do Java. Criar um conjunto de classes que representem as tabelas do banco de dados. Criar as regras de validao de entrada de dados das tabelas do banco de dados.

Sees de estudo
Seo 1 Estrutura da Classe de Projetos Seo 2 Estrutura da Classe de Participantes Seo 3 Estrutura da Classe de Controles

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade, voc atuar como um desenvolvedor de solues, criando um conjunto de classes em Java que permita a validao dos dados das tabelas do banco de dados, criado para o sistema de gerenciamento de projetos. Cada tabela do modelo de dados fsicos possui um conjunto particular de propriedades que devero ser validadas atravs destas classes, como entrada de valores invlidos, valores nulos ou, at mesmo, valores repetidos. A nalidade de se implementar estas regras nestas classes de garantir que as tabelas do banco de dados estaro trabalhando com dados conveis e ntegros. Portanto, Java j!

Seo 1 Estrutura da Classe de Projetos


Nas unidades anteriores, voc pde criar a tabela do banco de dados que dever representar os dados de cada projeto cadastrado no sistema. Entretanto, esta tabela no possui nenhum tipo de consistncia com relao aos valores que podero ser inseridos, listados ou removidos. Alm disso, tal tabela est formalizada dentro de uma outra ferramenta, que o MySQL, o qual, por sua vez, pode ser conectado atravs do driver JDBC. Com base nisto, nesta seo, voc agora ver como criar uma classe em Java que faa a integrao em aplicativo (software) e ferramenta de banco de dados (MySQL) de forma a garantir o total controle das atividades executadas pelo sistema, evitando-se que processos inesperados sejam executados ou valores invlidos sejam inseridos nas tabelas.

176

Linguagens de Programao II

Para comear, voc criar uma classe para representar a tabela Projetos dentro do Java. Mas antes, seria bom revisar a estrutura da tabela Projetos. Veja:

FIGURA 8.1 TABELA PROJETOS

Esta tabela possui uma estrutura bem simples, com campos numricos, alfa-numricos e do tipo data. Voc precisa criar, como ponto principal, uma estrutura que permita a validao dos dados inseridos na tabela, bem como a apresentao dos dados na tela. Veja, a seguir, a estrutura da classe Projetos que implementa estas regras. O cdigo completo pode ser baixado na midiateca.
import java.util.*; import java.text.*; import javax.swing.JOptionPane; public class Projetos { //Atributos da Classe private int idProjeto; private String vDescricao; private String dDataInicio,dDataFinal; private int nPercentual; private String vSituacao; private boolean bConsistencia; public Projetos(){ setIdProjeto(0); setDescricao(); setDataInicio(01/01/2000); setDataFinal(01/01/2000); setPercentual(0); setSituacao(Em aberto); setConsistencia(false); }

Unidade 8

177

Universidade do Sul de Santa Catarina

//Modificadores Mtodo setIdProjeto() - grava o public void setIdProjeto(int idProjeto){ cdigo do Projeto, desde que o if (idProjeto >= 0) valor seja positivo e maior que zero. this.idProjeto = idProjeto; else{ this.idProjeto = -1; JOptionPane.showMessageDialog(null,Cdigo Incorreto., ,JOptionPane. WARNING_MESSAGE); setConsistencia(false); return; } Armazena a situao da insero. Caso setConsistencia(true); algum problema ocorra, a consistncia } estar valendo como falso. public void setDescricao(String descricao){ if (descricao.length() > 0) Verica se o valor da descrio foi vDescricao = descricao; informado, caso contrrio, grava o else{ vDescricao = Annimo; valor Annimo. setConsistencia(false); return; } setConsistencia(true); } public void setDataInicio(String dataInicio){ if(DataCorreta(dataInicio)) dDataInicio = dataInicio; else{ DateFormat df = DateFormat.getDateInstance(); dDataInicio = df.format(new Date()); } }

public void setDataFinal(String dataFinal){ if(DataCorreta(dataFinal)) dDataFinal = dataFinal; else{ DateFormat df = DateFormat.getDateInstance(); dDataFinal = df.format(new Date()); } } public void setPercentual(int percentual){ Verica se o percentual if(percentual >=0) nPercentual = percentual; informado positivo e maior else ou igual a 0. { nPercentual = 0; JOptionPane.showMessageDialog(null,Percentual Invlido., ,JOptionPane. WARNING_MESSAGE); setConsistencia(false); return; }

Verica se a data informada est correta, caso contrrio, grava a data atual.

178

Linguagens de Programao II

setConsistencia(true); } public void setSituacao(String situacao) { Verica se o valor da situao if (SituacaoCorreta(situacao)) vSituacao = situacao; foi informado, caso contrrio, else{ grava o valor Em aberto. vSituacao = Em aberto; JOptionPane.showMessageDialog(null,Opo Invlida., ,JOptionPane. WARNING_MESSAGE); setConsistencia(false); return; } setConsistencia(true); } public void setConsistencia(boolean consistencia){ bConsistencia = consistencia; } //Recuperadores public String getDataFinal() {return dDataFinal;} public String getDataInicio() {return dDataInicio;} public int getIdProjeto() {return idProjeto;} public int getPercentual() {return nPercentual;} public String getDescricao() {return vDescricao;} public String getSituacao() {return vSituacao;} public boolean getConsistencia() {return bConsistencia;} //---- Regras de Negcio // Verifica se a data informada esta correta private boolean DataCorreta(String Data){ try { SimpleDateFormat sdf = new SimpleDateFormat(dd/MM/yyyy); sdf.setLenient false); Date d = sdf.parse(Data); } catch(ParseException e) { JOptionPane.showMessageDialog(null,Formato incorreto + Data,,JOptionPane. WARNING_MESSAGE); return false; } return true; }

Unidade 8

179

Universidade do Sul de Santa Catarina

// Verifica se a situao esta dentro das opes vlidas private boolean SituacaoCorreta(String opcao){ Vector opcoes = new Vector(); opcoes.add(FINALIZADO); opcoes.add(EM ABERTO); opcoes.add(EM EXECUO); return opcoes.contains(opcao.toUpperCase()); }

Verica se a situao uma das possveis.

// Realiza o cadastro dos dados do Projeto public void LeiaDados(){ setIdProjeto(Integer.parseInt(JOptionPane.showInputDialog(Cdigo do Projeto))); if (getConsistencia()) setDescricao(JOptionPane.showInputDialog(Descrio do Projeto)); if (getConsistencia()) setDataInicio(JOptionPane.showInputDialog(Data de Incio do Projeto)); if (getConsistencia()) setDataFinal(JOptionPane.showInputDialog(Data de Encerramento do Projeto)); if (getConsistencia()) setPercentual(Integer.parseInt(JOptionPane.showInputDialog(Percentual do Projeto))); if (getConsistencia()) setSituacao(JOptionPane.showInputDialog(Situao do Projeto)); if (!getConsistencia()) JOptionPane.showMessageDialog(null,Os dados no foram lidos!,, JOptionPane. WARNING_MESSAGE); } //Realiza o cadastro dos dados, exceto o cdigo do Projeto, que auto-incremento public void LeiaDados(boolean AUTO){ setDescricao(JOptionPane.showInputDialog(Descrio do Projeto)); if (getConsistencia()) setDataInicio(JOptionPane.showInputDialog(Data de Incio do Projeto)); if (getConsistencia()) setDataFinal(JOptionPane.showInputDialog(Data de Encerramento do Projeto)); if (getConsistencia()) setPercentual(Integer.parseInt(JOptionPane.showInputDialog(Percentual do Projeto))); if (getConsistencia()) setSituacao(JOptionPane.showInputDialog(Situao do Projeto)); if (!getConsistencia()) JOptionPane.showMessageDialog(null,Os dados no foram lidos!,, JOptionPane. WARNING_MESSAGE); } // Apresenta os dados cadastrados no Projeto public void ShowDados(){ String Saida = Projeto :+getIdProjeto()+ \n Descricao :+getDescricao()+ \n Iniciado em :+getDataInicio()+ \n Encerrado em:+getDataFinal()+ \n Concludos :+ getPercentual()+% + \n Situao :+getSituacao(); JOptionPane.showMessageDialog(null,Saida); }

180

Linguagens de Programao II

public Vector getCampos(){ Vector Campos = new Vector(); Campos.add(idProjetos); Campos.add(vDescricao); Campos.add(dDataInicio); Campos.add(dDataFinal); Campos.add(nPercConcluido); Campos.add(vSituacao); return Campos; } }

Retorna um Vector com os nomes dos campos da tabela Projetos.

No mtodo LeiaDados() foi implementado uma sobrecarga, sendo que, se este mtodo for chamado com o parmetro booleano, no ser solicitado o cdigo do projeto por se tratar de um campo de auto-incremento. Caso haja necessidade da solicitao de todos os dados, inclusive do cdigo do projeto, a chamada do mtodo LeiaDados() ser sem parmetros. Todo o processo de entrada de dados validado pelo mtodo getConsistencia(). Se este mtodo retornar um false, todo o processo de insero abortado, para evitar o cadastramento de dados invlidos. Veja que a classe Projetos se torna um tanto complexa. Porm, as regras de validao esto na classe e no no banco de dados MySQL, o que evitar que o banco de dados seja executado em demasia, uma vez que a validao dos dados j foi realizada antes que o mesmo receba os valores. Com isso, tira-se do SGDB uma carga de processamento alto, que responsvel por tratar os valores inseridos nas tabelas. Esta mesma metodologia ser implantada nas demais classes de representao do banco de dados.

Unidade 8

181

Universidade do Sul de Santa Catarina

Seo 2 Estrutura da Classe de Participantes


Nesta seo, voc continuar a criao das classes de representao. Comeamos pela classe Participantes que representar a seguinte estrutura de tabela:

FIGURA 8.2 TABELA PARTICIPANTES

Esta tabela possui uma estrutura bem simples, com campos numricos e alfa-numricos. Nosso objetivo criar uma estrutura que permita a validao dos dados manipulados por esta classe. Veja, a seguir, a estrutura da classe Participantes:
import java.util.*; import javax.swing.JOptionPane; public class Participantes { //Atributos da Classe private int idParticipante; private String vNome; private String vCargo; private boolean bConsistencia; public Participantes(){ setIdParticipante(1); setNome(); setCargo(Gerente); setConsistencia(false); } //Modificadores public void setIdParticipante(int idParticipante){ if (idParticipante > 0) this.idParticipante = idParticipante; else{ this.idParticipante = 1; JOptionPane.showMessageDialog(null,Cdigo Incorreto., ,JOptionPane. WARNING_MESSAGE); setConsistencia(false); return; }

182

Linguagens de Programao II

setConsistencia(true); } public void setNome(String nome){ if (nome.length() > 0) vNome = nome; else{ vNome = Annimo; setConsistencia(false); return; } setConsistencia(true); } public void setCargo(String cargo) { if (CargoCorreto(cargo)) vCargo = cargo; else{ vCargo = Invlido; JOptionPane.showMessageDialog(null,Cargo Invlido., ,JOptionPane. WARNING_MESSAGE); setConsistencia(false); return; } setConsistencia(true); } public void setConsistencia(boolean consistencia){ bConsistencia = consistencia; } //Recuperadores public String getCargo() {return vCargo;} public String getNome() {return vNome;} public int getIdParticipante() {return this.idParticipante;} public boolean getConsistencia() {return bConsistencia;} //---- Regras de Negcio // Verifica se a situao esta dentro das opes vlidas private boolean CargoCorreto(String cargo){ Vector cargos = new Vector(); cargos.add(GERENTE); cargos.add(PROGRAMADOR); cargos.add(ANALISTA DE SISTEMAS); cargos.add(DBA); return cargos.contains(cargo.toUpperCase()); } // Realiza o cadastro dos dados do Projeto public void LeiaDados(){

Unidade 8

183

Universidade do Sul de Santa Catarina

setIdParticipante(Integer.parseInt(JOptionPane.showInputDialog(Cdigo do Participante))); if (getConsistencia()) setNome(JOptionPane.showInputDialog(Nome)); if (getConsistencia()) setCargo(JOptionPane.showInputDialog(cargo)); if (!getConsistencia()) JOptionPane.showMessageDialog(null,Os dados no foram lidos!,, JOptionPane. WARNING_MESSAGE); } public void LeiaDados(boolean AUTO){ setNome(JOptionPane.showInputDialog(Nome)); if (getConsistencia()) setCargo(JOptionPane.showInputDialog(cargo)); if (!getConsistencia()) JOptionPane.showMessageDialog(null,Os dados no foram lidos!,, JOptionPane. WARNING_MESSAGE); } // Apresenta os dados cadastrados no Projeto public void ShowDados(){ String Saida = Projetista :+getIdParticipante()+ \n Nome :+getNome()+ \n Cargo :+getCargo(); JOptionPane.showMessageDialog(null,Saida); } public Vector getCampos(){ Vector Campos = new Vector(); Campos.add(idParticipantes); Campos.add(vNome); Campos.add(vCargo); return Campos; } }

No mtodo LeiaDados(), foi implementada uma sobrecarga para controlar a insero do cdigo do participante, que um campo auto-incremento. Todo o processo de entrada de dados continua sendo validado por um mtodo chamado getConsistencia(). Se este mtodo retornar um false, todo o processo de insero abortado, para evitar o cadastramento de dados invlidos. Para nalizar as classes de representao, falta apenas a classe Controle, que a mais simples das trs. Vamos l!
184

Linguagens de Programao II

Seo 3 Estrutura da Classe de Controles


Nesta seo, voc ter acesso ao cdigo fonte da ltima classe de representao. A classe Controles representar a seguinte estrutura de tabela:

FIGURA 8.3 TABELA CONTROLES

Esta tabela possui uma estrutura bem simples, com dois campos numricos. O objetivo aqui criar uma estrutura que represente a ligao entre os projetos e os seus participantes. Veja, a seguir, a estrutura da classe Controles:
import javax.swing.JOptionPane; import java.util.*; public class Controles { private int idProjeto; private int idParticipante; private boolean bConsistencia; public Controles(){ setIdProjeto(1); setIdParticipante(1); setConsistencia(false); } public void setIdProjeto(int idProjeto){ if (idProjeto > 0) this.idProjeto = idProjeto; else{ this.idProjeto = 1; JOptionPane.showMessageDialog(null,Cdigo Incorreto., ,JOptionPane.WARNING_MESSAGE); setConsistencia(false); return; }

Unidade 8

185

Universidade do Sul de Santa Catarina

setConsistencia(true); } public void setIdParticipante(int idParticipante){ if (idParticipante > 0) this.idParticipante = idParticipante; else{ this.idParticipante = 1; JOptionPane.showMessageDialog(null,Cdigo Incorreto., ,JOptionPane. WARNING_MESSAGE); setConsistencia(false); return; } setConsistencia(true); } public void setConsistencia(boolean consistencia){ bConsistencia = consistencia; } //Recuperadores public int getIdProjeto() {return this.idProjeto;} public int getIdParticipante() {return this.idParticipante;} public boolean getConsistencia() {return bConsistencia;} public Vector getCampos(){ Vector Campos = new Vector(); Campos.add(Projetos_idProjetos); Campos.add(Participantes_idParticipantes); return Campos; } }

Veja que, deste modo, as classes de representao das tabelas do modelo de banco de dados esto prontas. Agora, hora de criar uma especializao destas classes de forma que seja possvel a execuo dos comandos em SQL.

O primeiro passo ser criar a classe de manipulao de dados da classe Projetos, mas isto assunto para prxima unidade. At l!

186

Linguagens de Programao II

Sntese
Nesta unidade voc pde revisar alguns conceitos da programao orientada a objetos, implementados em Java, como: Mtodos construtores das classes, os mtodos modicadores, ou simplesmente sets e os mtodos recuperadores, ou gets. O principal objetivo do mtodo construtor inicializar os atributos das classes. Os mtodos modicadores permitem a alterao das propriedades de uma classe e os recuperadores permitem que os dados de uma classe possam ser visualizados por um processo externo classe. Para nalizar importante que se tenha em mente que os atributos das classes so sempre privados e os mtodos pblicos, de forma a garantir o total controle sobre os processos que uma classe possa executar.

Atividades de auto-avaliao
Efetue as atividades de auto-avaliao e, a seguir, acompanhe as respostas e comentrios a respeito. Para melhor aproveitamento do seu estudo, realize a conferncia de suas respostas somente depois de fazer as atividades propostas. Leia com ateno os enunciados e realize, a seguir, as atividades: 1) Uma classe de conexo de banco de dados em Java pode ser implementada de forma a atender qualquer tipo de banco de dados?

Unidade 8

187

Universidade do Sul de Santa Catarina

Saiba mais
Aprofunde os contedos estudados nesta unidade ao consultar as seguintes referncias: HORSTMANN, Cay S. Big Java. Porto Alegre: Artmed Bookman: 2004. THOMPSON, Marco Aurlio. Java 2 & banco de dados. So Paulo, rica: 2002.

188

UNIDADE 9

Criando as Classes de Controle


Objetivos de aprendizagem
Criar um conjunto de classes que permita a execuo de comandos em SQL. Implementar uma classe com conexo a banco de dados e manipulao de dados da tabela de projetos. Colocar em prtica a noo de abstrao em programao orientada a objetos.

Sees de estudo
Seo 1 Estrutura da Classe de Manipulao de Projetos Seo 2 Representao das Principais Funcionalidades Seo 3 Cdigo fontes da Classe de Manipulao dos
Projetos

Seo 4 Testando a Classe de Manipulao dos Projetos Seo 5 Estrutura das demais classes

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade, voc criar uma nova classe com a composio das j vistas anteriormente, permitindo a atualizao de dados da tabela de projetos. A classe de regras de banco de dados permitir a execuo de um conjunto de comandos em SQL, que, por sua vez, permite a insero, atualizao e remoo de dados. A nalidade de se implementar estas regras tornar o processo de manipulao de banco de dados o mais abstrato possvel para quem usa as classes e os mtodos implementados. Alm, claro, da padronizao das funcionalidades implementadas.

Seo 1 Estrutura da Classe de Manipulao de Projetos


A classe de manipulao de dados est voltada aos comandos em SQL, que permite o gerenciamento dos dados dos projetos cadastrados. Basicamente, esta classe deve admitir: Insero de dados. Remoo de dados. Atualizao de dados. Listagem dos dados cadastrados. A insero de dados realiza o cadastramento de todos os dados da tabela Projetos, com base na estrutura da classe Projetos e da tabela de dados Projetos.

190

Linguagens de Programao II

A remoo dos dados pode ser feita a partir de um cdigo informado ou uma descrio informada. Estas regras foram denidas por ns e, com certeza, voc as implementaria de formas diferentes, porm com as mesmas nalidades. Esta regra denida atravs de uma sobre-carga do mtodo RemoverDados(). A atualizao dos dados realizada solicitando ao usurio os valores dos campos que sero alterados e a partir do valor do parmetro de ltro, que pode ser o cdigo ou a descrio do projeto. A denio dos campos das tabelas foi feita atravs do mtodo getCampos() da classe Projetos, de forma que, ao se passar um nmero do campo desejado, o mtodo retornar o nome do campo. Veja que a idia principal tornar o processo de manipulao das tabelas simples e direto, sem que o programador tenha que recorrer a estruturas complexas e, principalmente, sintaxe dos comandos em SQL doMySQL. Para nalizar, a listagem de dados pode ser de trs formas diferentes: Listagem de todos os dados. Listagem dos dados a partir de um cdigo informado. Listagem dos dados a partir de uma descrio informada. Note que a classe de regras do banco de dados possui todas as funcionalidades necessrias para a manipulao dos projetos.

Seo 2 - Representao das Principais Funcionalidades


Para facilitar a compreenso dos principais mtodos executados na classe de banco de dados que manipula a tabela Projeto, acompanhe, agora, a apresentao de tarefas executadas, sem se prender s notaes padronizadas para esta representao.
191

Unidade 9

Universidade do Sul de Santa Catarina

Veja que o objetivo principal compreender o uxo de execuo destes mtodos.

Mtodo de Insero
O mtodo de insero possui o seguinte processo de execuo:

1) Instancia-se uma classe do tipo Projeto; 2) Preenchem-se os dados da classe Projeto atravs do mtodo LeiaDados(); 3) Se h consistncia dos dados, ento a) Gera-se uma String com os nomes das colunas, separados por vrgulas; b) Os nomes dos campos so recuperados atravs do mtodo getCampos(); c) Gera-se a estrutura com os valores de insero de campos; d) Os valores de campos que no so numricos, so colocados entre aspas () atravs do mtodo QuotedStr(), ou mudados para o formato de data aceita pelo MySQL; e) Os valores de cada campo so separados por vrgula; f) Gera-se um comando com a estrutura: Insert into Tabelas(coluna, coluna, ..., coluna) values (valor, valor, ..., valor); g) O comando executado atravs do mtodo ExpressaoSQL(); h) Se houver um erro de Exceo, ento; a) Aborta-se a insero; 4) Seno a) Aborta-se a insero;

192

Linguagens de Programao II

Mtodo de Remoo de Dados


O mtodo de remoo de dados possui o seguinte processo de execuo:

1) Verifica-se o tipo de remoo 2) Se parmetro Cdigo, ento a) Gera-se um comando com a estrututura: Delete from Projetos where idProjetos = + Codigo 3) Seno a) Gera-se um comando com a estrututura: Delete from Projetos where vDescricao = + QuotedStr(Descricao); 4) Se houver um erro de Exceo, ento a) Aborta-se a Remoo;

Mtodo de Listagem de Dados


O mtodo de listagem de dados possui o seguinte processo de execuo:

1) Verifica-se o tipo de Listagem 2) Se parmetro Cdigo, ento a) Gera-se um comando com a estrututura : Select * from Projetos where idProjetos = + Codigo 3) Seno Se parmetro Descrio, ento a) Gera-se um comando com a estrututura : Select * from Projetos where vDescricao = + QuotedStr(Descricao); Seno

Unidade 9

193

Universidade do Sul de Santa Catarina

a) Gera-se um comando com a estrututura : Select * from Projetos; 4) Se houver um erro de Exceo, ento a) Aborta-se a listagem;

Para nalizar, veja a representao de uxo de execuo do ltimo mtodo, o mtodo de atualizao de dados.

Mtodo de Atualizao de Dados


O mtodo de atualizao de dados possui o seguinte processo de execuo:

1) Solicita-se o campo que ser ou no atualizado; 2) Se a opo igual a S, ento a) Armazena-se o Nome da Coluna e solicita-se o valor de cadastramento para esta coluna; b) Separam-se as colunas e os valores por vrgula; c) Se o campo for data, converte-se para o formado de data do MySQL; d) Se o campo no for numrico, os valores sero colocados entre aspas; 3) Gera-se um comando com a estrututura: Update Tabela Set Coluna = valor, Coluna = valor, ..., Coluna = Valor; 4) Retira-se a vrgula do final do comando montado; 5) O comando executado atravs do mtodo ExpressaoSQL(); 6) Se houver um erro de Exceo, ento a) Aborta-se a atualizao;

194

Linguagens de Programao II

Seo 3 - Cdigo fontes da Classe de Manipulao dos Projetos


Nesta seo, as regras apresentadas acima so codicadas em Java, de forma que elas sejam mantidas durante a execuo do programa pelo computador, ou seja, as mesmas regras, porm formalizadas em cdigo-fonte. A estrutura da classe possui o seguinte cdigo fonte:
import javax.swing.*; import java.sql.*; import java.util.Vector; public class Manipula_Projeto { private Conexao MinhaConexao; public Manipula_Projeto(Conexao con){ setConexao(con); } public void setConexao(Conexao con){MinhaConexao = con;} public Conexao getConexao(){return MinhaConexao;} //Regras de Negcio private String QuotedStr(String Item) {return \+ Item + \;} private String DataSQL(String Data) { return Data.substring(6,10)+-+Data.substring(3,5)+-+Data.substring(0,2); } public void InsereDados(){ Projetos Proj = new Projetos(); Proj.LeiaDados(true); if (Proj.getConsistencia()){ String Colunas = (+ Proj.getCampos().get(1)+,+ Proj.getCampos().get(2)+,+ Proj.getCampos().get(3)+,+ Proj.getCampos().get(4)+,+ Proj.getCampos().get(5)+); String Valores = (+ QuotedStr(Proj.getDescricao())+,+ QuotedStr(DataSQL(Proj.getDataInicio()))+,+ QuotedStr(DataSQL(Proj.getDataFinal()))+,+ Proj.getPercentual()+,+ QuotedStr(Proj.getSituacao())+); String Comando = Insert into Projetos+Colunas + values +Valores; getConexao().ExpressaoSQL(Comando); } } public void RemoverDados(int Codigo){ try{ getConexao().ExpressaoSQL( Delete from Projetos where idProjetos = + Codigo); getConexao().getCon().commit(); }
Unidade 9

195

Universidade do Sul de Santa Catarina

catch(Exception sqle){ JOptionPane.showMessageDialog(null,Os dados no foram removidos!,, JOptionPane. WARNING_MESSAGE); } } public void RemoverDados(String Descricao){ try{ getConexao().ExpressaoSQL( Delete from Projetos where vDescricao = + QuotedStr(Descricao)); getConexao().getCon().commit(); } catch(Exception sqle){ JOptionPane.showMessageDialog(null,Os dados no foram removidos!,, JOptionPane. WARNING_MESSAGE); } } public void ListarDados(){ boolean Listou = false; try{ getConexao().ExpressaoSQL( Select * from Projetos ); ResultSet rs = getConexao().getDados(); if (rs != null){ while (rs.next()){ Listou = true; Projetos p = new Projetos(); int ID = rs.getInt(idProjetos), PERC = rs.getInt(nPercConcluido); String DESC = rs.getString(vDescricao), SIT =rs.getString(vSituacao); String DATAIN = rs.getString(dDataInicio), DATAFIN = rs.getString(dDataFinal); p.setIdProjeto(ID); p.setDescricao(DESC); p.setDataInicio(DATAIN); p.setDataFinal(DATAFIN); p.setPercentual(PERC); p.setSituacao(SIT); p.ShowDados(); } if(!Listou) JOptionPane.showMessageDialog(null,Nenhum registro selecionado!,, JOptionPane. WARNING_MESSAGE); } } catch(Exception sqle){ JOptionPane.showMessageDialog(null,Os dados no foram listados!,, JOptionPane. WARNING_MESSAGE); } }

196

Linguagens de Programao II

public void ListarDados(int Codigo){ boolean Listou = false; try{ getConexao().ExpressaoSQL( Select * from Projetos where IdProjetos = + Codigo); ResultSet rs = getConexao().getDados(); if (rs != null){ while (rs.next()){ Listou = true; Projetos p = new Projetos(); int ID = rs.getInt(idProjetos), PERC = rs.getInt(nPercConcluido); String DESC = rs.getString(vDescricao), SIT =rs.getString(vSituacao); String DATAIN = rs.getString(dDataInicio), DATAFIN = rs.getString(dDataFinal); p.setIdProjeto(ID); p.setDescricao(DESC); p.setDataInicio(DATAIN); p.setDataFinal(DATAFIN); p.setPercentual(PERC); p.setSituacao(SIT); p.ShowDados(); } if(!Listou) JOptionPane.showMessageDialog(null,Nenhum registro selecionado!,, JOptionPane. WARNING_MESSAGE); } } catch(Exception sqle){ JOptionPane.showMessageDialog(null,Os dados no foram listados!,, JOptionPane. WARNING_MESSAGE); } } public void ListarDados(String Descricao){ boolean Listou=false; try{ getConexao().ExpressaoSQL( Select * from Projetos where vDescricao = + QuotedStr(Descricao)); ResultSet rs = getConexao().getDados(); if (rs != null){ while (rs.next()){ Listou = true; Projetos p = new Projetos(); int ID = rs.getInt(idProjetos), PERC = rs.getInt(nPercConcluido); String DESC = rs.getString(vDescricao), SIT =rs.getString(vSituacao);

Unidade 9

197

Universidade do Sul de Santa Catarina

String DATAIN = rs.getString(dDataInicio), DATAFIN = rs.getString(dDataFinal); p.setIdProjeto(ID); p.setDescricao(DESC); p.setDataInicio(DATAIN); p.setDataFinal(DATAFIN); p.setPercentual(PERC); p.setSituacao(SIT); p.ShowDados(); } if(!Listou) JOptionPane.showMessageDialog(null,Nenhum registro selecionado!,, JOptionPane. WARNING_MESSAGE); } } catch(Exception sqle){ JOptionPane.showMessageDialog(null,Os dados no foram listados!,, JOptionPane. WARNING_MESSAGE); } } public void AtualizarDados(int Codigo){ Projetos P = new Projetos(); String Comando = Update Projetos set ; String Campos [] = {Descrio, Data de Incio, Data de Encerramento, Percentual, Situao}; for (int i=0;i<Campos.length;i++){ if ((JOptionPane.showInputDialog(Atualizar o Campo [ + Campos[i]+],S).toUpperCase()).charAt(0)==S){ String Valor = JOptionPane.showInputDialog(Novo Valor para + Campos[i]); switch (i){ case 0:Valor = QuotedStr(Valor);break; case 1:Valor = QuotedStr(DataSQL(Valor));break; case 2:Valor = QuotedStr(DataSQL(Valor));break; case 4:Valor = QuotedStr(Valor);break; } Comando+= ((String)P.getCampos().get(i+1))+=+Valor+,; } } if(Comando.length() > 0 && Comando.charAt(Comando.length()-1)==,){ Comando = Comando.substring(0,Comando.length()-1); } Comando += where idProjetos = + Codigo; try{ getConexao().ExpressaoSQL(Comando); }

198

Linguagens de Programao II

catch (Exception sqle) { JOptionPane.showMessageDialog(null,Os dados no foram atualizados!,, JOptionPane. WARNING_MESSAGE); } } public void AtualizarDados(String Descricao){ Projetos P = new Projetos(); String Comando = Update Projetos set ; String Campos [] = {Descrio, Data de Incio, Data de Encerramento, Percentual, Situao}; for (int i=0;i<Campos.length;i++){ if ((JOptionPane.showInputDialog(Atualizar o Campo [ + Campos[i]+],S).toUpperCase()).charAt(0)==S){ String Valor = JOptionPane.showInputDialog(Novo Valor para + Campos[i]); switch (i){ case 0:Valor = QuotedStr(Valor);break; case 1:Valor = QuotedStr(DataSQL(Valor));break; case 2:Valor = QuotedStr(DataSQL(Valor));break; case 4:Valor = QuotedStr(Valor);break; } Comando+= ((String)P.getCampos().get(i+1))+=+Valor+,; } } if(Comando.length() > 0 && Comando.charAt(Comando.length()-1)==,){ Comando = Comando.substring(0,Comando.length()-1); } Comando += where vDescricao = + QuotedStr(Descricao); try{ getConexao().ExpressaoSQL(Comando); } catch (Exception sqle) { JOptionPane.showMessageDialog(null,Os dados no foram atualizados!,, JOptionPane. WARNING_MESSAGE); } } }

Atente para algumas caractersticas importantes da classe acima: O mtodo QuotedStr(String Item) retorna um valor literal entre aspas duplas ().

Unidade 9

199

Universidade do Sul de Santa Catarina

O mtodo DataSQL(String Data) retorna a data no formato que o MySQL utililiza, que aaaa-mm-dd; O mtodo getCampos().get(ndice) retorna o nome do campo indexado pelo ndice informado; Os comandos gerados so passados como parmetro para o mtodo ExpressaoSQL(Comando); O ideal que voc edite e compile a classe acima, para se adequar aos conceitos e formas de programao apresentadas por ns.

Seo 4 Testando a Classe de Manipulao dos Projetos


Para testar a classe de manipulao de dados, necessrio que seja implementada uma nova classe, conforme o cdigo abaixo:

public class teste { public static void main(String[] args) { Conexao C = new Conexao(localhost,livro,root,root); C.Conectar(); if (C.getConectado()){ Manipula_Projeto MP = new Manipula_Projeto(C); //Insere dois Projetos MP.InsereDados(); MP.InsereDados(); //Remove o Projeto de Cdigo 1 MP.RemoverDados(1); //Lista os Projetos cadastrados MP.ListarDados(); //Atualiza o projeto de descrio chamada TESTE MP.AtualizarDados(TESTE); C.FecharConexao(); } } }

200

Linguagens de Programao II

Na classe teste, o usurio poder inserir, alterar, excluir e listar dados da tabela Projetos, criada no MySQL. Compile e execute a classe acima e veja o funcionamento da mesma.

Seo 5 Estrutura das demais classes


As classes de manipulao de participantes e controles de projetos possuem a mesma estrutura da classe de manipulao de projetos. As classes de regras de banco de dados possuem uma estrutura padronizada, cuja nalidade popular e manipular os dados das tabelas. No vamos apresentar aqui o cdigo-fonte das demais classes, pois seria repetitivo demais. Porm, os cdigos completos podem ser baixados na midiateca do espao UnisulVirtual de Aprendizagem (EVA), de forma que voc possa compil-las e execut-las por completo. O ideal, a partir de agora, voc agrupar os conhecimentos das unidades estudadas anteriormente e criar uma identidade visual para a aplicao, de forma que esta possua uma camada de interface grca e as regras de banco de dados, criando-se, assim, uma aplicao completa.

Unidade 9

201

Universidade do Sul de Santa Catarina

Sntese
Nesta unidade, voc pde colocar em prtica os ensinamentos adquiridos nas unidades anteriores. Porm, isto um pequeno passo rumo ao desenvolvimento de softwares. Com a unio dos conhecimentos de interfaces grcas (GUI) e regras de banco de dados, voc j poder criar aplicaes mais robustas e mais amigveis. Este o primeiro passo para a criao de classes que permitam a conexo com banco de dados e a implementao de aplicaes para o ambiente da internet, mas isto assunto para as prximas unidades. Boa sorte nesta nova caminhada.

Atividades de auto-avaliao
Efetue as atividades de auto-avaliao e, a seguir, acompanhe as respostas e comentrios a respeito. Para melhor aproveitamento do seu estudo, realize a conferncia de suas respostas somente depois de fazer as atividades propostas. Leia com ateno os enunciados e realize, a seguir, as atividades: 1) Uma aplicao Desktop pode ser migrada para um ambiente web sem muitas alteraes?

202

Linguagens de Programao II

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando as seguintes referncias: HORSTMANN, Cay S. Big Java. Porto Alegre: Artmed Bookman: 2004. THOMPSON, Marco Aurlio. Java 2 & banco de dados. So Paulo, rica: 2002.

Unidade 9

203

UNIDADE 10

Aplicao Exemplo: Controle de Projetos


Objetivos de aprendizagem
Entender como aplicar os conceitos de criao de GUI e manipulao de banco de dados, atravs visualizao do cdigo de uma aplicao de Controle de Projetos.

Sees de estudo
Seo 1 Elementos da aplicao de Controle de Projetos

Universidade do Sul de Santa Catarina

Para incio de conversa


Nesta unidade voc visualizar o cdigo completo de uma aplicao grca com acesso a banco de dados. Essa aplicao foi denominada de Controle de Projetos. uma aplicao que objetiva controlar de maneira simplicada dados de projetos e de pessoas que trabalham nos projetos. O objetivo dessa unidade fazer a integrao dos conhecimentos das unidades de GUI e das unidades de Banco de Dados. O banco de dados da aplicao j foi criado por voc nas unidades seis (6) a nove (9). A GUI da aplicao e a parte de controle dos dados sero exibidos no cdigo-fonte da aplicao, que est disponibilizada na Midiateca.

Seo 1 Elementos da aplicao de Controle de Projetos


A aplicao possuir uma tela inicial com um menu principal contendo as opes: Cadastro e Consulta. Na opo Cadastro ser possvel escolher as opes Projetos e Participantes. Na opo Consulta ser possvel escolher as opes Projetos e Participantes.

206

Linguagens de Programao II

Sntese
Nessa unidade voc aprendeu a construir uma aplicao completa, integrando os conceitos aprendidos nas unidades um (1) a cinco (5) (que abordam a GUI) e seis (6) a nove (9) (que tratam do Banco de Dados).

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando a seguinte referncia, principalmente os captulos 10, 11 e 22: DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. Tambm consulte: SILVA, Ivan Jos de Mecenas. Java 2: fundamentos Swing e JDBC. Rio de Janeiro: Editora Alta Books, 2003. Consulte, tambm, o seguinte site:
http://java.sun.com/docs/books/tutorial/uiswing/index.html (Creating a GUI with JFC/Swing)

Unidade 10

207

208

UNIDADE 11

Introduo ao desenvolvimento de aplicaes web


Objetivos de aprendizagem
Entender como funciona o protocolo http. Aprender o que so as aplicaes CGI. Entender o ambiente necessrio para o desenvolvimento de aplicaes Java na web.

1 1

Sees de estudo
Seo 1 HTTP Seo 2 CGI Seo 3 Java Servlets e Containers Seo 4 Preparando o Ambiente

Universidade do Sul de Santa Catarina

Para incio de conversa


No incio da Internet, todo o contedo era baseado em sites de contedo esttico. Ou seja, todas as pginas eram compostas por contedos pr-denidos e que s podiam ser alterados caso o seu autor zesse a alterao do contedo manualmente. Entretanto, com o passar do tempo houve a necessidade de uma maior interao entre os usurios e essas pginas estticas, fazendo com que surgissem as primeiras aplicaes web com pginas dinmicas, onde o contedo das pginas era gerado com base nas interaes do usurio com o sistema. Visando a atender essa necessidade, surgiu o Common Gateway Interface (CGI), uma das primeiras e mais proeminentes solues para o desenvolvimento de aplicaes geradoras de contedo dinmico, ou seja, aplicaes web. Compreender como o CGI funciona muito importante, uma vez que ele responde a muitas questes relacionadas ao desenvolvimento de aplicaes web em Java, como, por exemplo, por que as aplicaes web Java precisam de um ambiente prprio de execuo? Porm, antes de entendermos o que o CGI e como ele trabalha, iremos conhecer o protocolo de comunicao mais utilizado em aplicaes web hoje em dia, o HyperText Transfer Protocol ou, simplesmente, HTTP.

Um conjunto especco de regras ou padres relacionados s comunicaes entre computadores.

210

Linguagens de Programao II

Seo 1 - HTTP
O HTTP um protocolo que permite a servidores e browsers trocarem informaes sobre a Internet. A estrutura da comunicao utilizando o HTTP bem simples, pois se baseia na requisio/resposta. Um browser requisita um recurso e um servidor responde enviando o recurso. Veja na gura 11.1 como feita essa comunicao:

REQUISIO

RESPOSTA

Cliente

Servidor Web

FIGURA 11.1 - FIGURA BSICA SOBRE REQUEST E RESPONSE

Ambos os itens da comunicao, a requisio e a resposta, possuem um formato padro. Antes de falarmos destes formatos, preciso que voc entenda um pouco a respeito do mtodo em que as requisies podem ser feitas. O HTTP possibilita que uma requisio possa ser feita utilizando 8 mtodos. Porm, os mais utilizados so o GET e o POST. Qual seria a diferena entre os dois? Os dois mtodos tm o mesmo propsito, porm trabalham de forma diferente. O GET adiciona URL todas as informaes que voc envia ao servidor, como no exemplo abaixo:

http://www.google.com.br/search?hl=pt-BR&q=GET+vs+POST&meta=

Repare que, em uma pesquisa no Google, o nosso tema da busca (GET vs POST) foi adicionado URL quando essa requisio foi enviada ao servidor.

Unidade 11

211

Universidade do Sul de Santa Catarina

Se a mesma requisio fosse feita utilizando o mtodo POST, ela teria o seguinte formato:

http://www.google.com.br/search

Neste caso, as informaes a respeito da busca no seriam perdidas e, sim, seriam enviadas em uma outra rea destinada justamente aos dados de uma requisio. Mas por que, ento, devemos nos preocupar em estar utilizando um mtodo ou outro? Aqui vo algumas razes pelas quais voc deve estar escolhendo um mtodo ou outro: O total de caracteres numa requisio utilizando o GET limitado. Ou seja, alguns servidores podero cortar o contedo da URL, j que no mtodo GET toda a informao concatenada na URL, fazendo com que a requisio no funcione. Se algum dado sigiloso, uma senha, por exemplo, for enviado utilizando o mtodo GET ele car exposto, pois ser concatenado URL e mostrado no browser. Vendo esses pontos, voc deve perguntar-se por que, ento, existe o mtodo GET? Ora, em alguns cenrios o GET mais indicado que o POST, como, por exemplo, quando executamos apenas consultas no sistema que no iro alterar o estado da nossa aplicao. O prprio Google utiliza o mtodo GET para realizar as suas buscas. A seguir, no quadro 1, mostramos como os dois mtodos utilizam o HTTP para envio de requisio:

212

Linguagens de Programao II

GET /aplicacao/compra.do?valor=10 Host: www.endereco.com.br User-Agent: Mozilla 5.0 Accept: text/html, application/xml, . Accept-Language: pt-br . Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859, utf-8;. Keep-Alive: 300 Connection: keep-alive

POST /aplicacao/compra.do Host: www.endereco.com.br User-Agent: Mozilla 5.0 Accept: text/html, application/xml, . Accept-Language: pt-br . Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859, utf-8;. Keep-Alive: 300 Connection: keep-alive valor=10

Quadro 1 Anatomia dos mtodos GET e POST

Tendo visto os mtodos e o formato em que enviada uma requisio, falta voc vericar qual o formato de uma resposta HTTP. Ao contrrio da requisio, a resposta no tem mtodo e sim o tipo de contedo (pgina HTML, arquivo de som, vdeo, etc.) que est sendo retornado ao browser. O formato de uma resposta HTTP apresentado no quadro 2:
HTTP/1.1 200 OK Set-Cookie: JSESSIONID=0AAB6C8DEA415E2E5.; Path=/teste Content-Type: text/html Content-Length: 397 Date: Mon, 15 Ago 2005 12:45:55 GMT Server: Apache-Coyote/1.1 Connection: close <html> </html>

Quadro 2 - Anatomia de uma resposta HTTP

Agora que vimos o protocolo HTTP que utilizado nas aplicaes web, podemos comear a ver as tecnologias utilizadas para a construo de aplicaes web.

Unidade 11

213

Universidade do Sul de Santa Catarina

Seo 2 - CGI
O CGI geralmente referenciado como uma das primeiras tecnologias para a criao de contedo dinmico no lado do servidor. Apesar de ser referenciado desta forma, CGI no uma linguagem de programao e sim um protocolo de comunicao que possibilita a um servidor comunicar-se com uma aplicao externa. Essas aplicaes podem ser escritas em qualquer linguagem de programao, porm a linguagem mais utilizada o Perl. De forma simplicada, o processo de comunicao entre o servidor que recebe requisies e uma aplicao CGI ocorre da seguinte forma: o servidor web encaminha a requisio de um usurio a uma aplicao, esta aplicao executada, cria algum contedo e envia a resposta novamente ao servidor que, ento, encaminha ao cliente. O processo ilustrado na gura 11.2:

CGI
Cliente Servidor Web

Aplicao CGI

Banco de Dados

FIGURA 11.2 FLUXO DE UMA APLICAO CGI

O surgimento do CGI foi um grande avano perante o contedo esttico da Internet. Apesar de ter sido uma revoluo nas aplicaes web, o CGI apresentava algumas falhas, dentre elas se destaca o modo como era gerenciado o ciclo de vida de aplicaes CGI. De maneira simples, podemos pensar no ciclo de vida como sendo todo o processo, desde o recebimento de uma solicitao at a entrega do resultado da mesma. Quando um servidor web recebe uma requisio que ser encaminhada a uma aplicao CGI, um processo criado e para cada nova solicitao um novo processo ser criado. Como a criao, inicializao e nalizao de um processo possui um custo relativamente alto, dependendo do grau de utilizao do servidor, em pouco tempo o mesmo sofrer uma queda drstica de performance da aplicao e o servidor sofrer uma drstica reduo de performance.
214

Linguagens de Programao II

Uma analogia pode ser feita com o processo de ligar e desligar um computador. Imagine que o custo de criao, inicializao e nalizao de um novo processo seja semelhante ao custo de ligar o computador, utiliz-lo e deslig-lo. Ou seja, a cada requisio o computador seria ligado, efetuaria algum processamento e seria desligado. A gura 11.3 ilustra o ciclo de vida de uma aplicao CGI:

Servidor Web
Requisio Requisio Requisio Processo CGI Processo CGI Processo CGI

FIGURA 11.3 CICLO DE VIDA DE UMA APLICAO GCI

A popularidade do CGI fez com que nascesse a segunda gerao de aplicaes CGI, chamadas de aplicaes FastCGI, onde o problema apresentado pela primeira verso, relacionado criao de um processo para cada requisio, foi contornado, pois as requisies que tinham a mesma nalidade compartilhavam os mesmos processos. Isto tornou o CGI uma soluo muito mais prtica para as aplicaes web. A gura 11.4 apresenta o novo ciclo de vida proposto pelas aplicaes FastCGI.

Servidor Web
Requisio Requisio Requisio Processo CGI Processo CGI Processo CGI

FIGURA 11.4 CICLO DE VIDA DE APLICAES FASTCGI

Unidade 11

215

Universidade do Sul de Santa Catarina

Entretanto, apesar da questo relacionada criao de processos ter sido resolvida com o FastCGI, surgiram algumas outras questes que tornaram o CGI uma soluo no muito atrativa. Um exemplo a diculdade de compartilhar recursos entre as requisies como: utilitrios para a gerao de log da aplicao, objetos, entre outros. Uma nova soluo era demandada para aplicaes web corporativas, preferencialmente uma que no tivesse os problemas apresentados pelo CGI.

Seo 3 - Java Servlets e Containers


Para resolver os problemas apresentados pelas aplicaes CGI, a empresa Sun criou a especicao Java Servlets. Funcionando de maneira similar s aplicaes CGI, os Servlets recebem as requisies de um servidor web e geram um contedo dinmico. Porm, os Servlets denem um ciclo de vida mais eciente comparado ao ciclo de vida das aplicaes CGI, evitando, assim, o custo da criao de vrios processos para cada requisio. A gura 11.5 apresenta um servidor web com o suporte da Java Servlets.

Servidor Web
Processo
Requisio Requisio Requisio Servlet Servlet Servlet

FIGURA 11.5 AMBIENTE DE EXECUO DE SERVLETS

216

Linguagens de Programao II

A gura 11.5 semelhante gura 11.4, em que era apresentada a segunda gerao das aplicaes CGI ou FastCGI. Porm, note que, na gura 11.5, todos os Servlets esto sendo executados dentro do mesmo processo. Aliada s vantagens da plataforma Java, a tecnologia dos Servlets, especicada pela Sun, resolveu os problemas apresentados pelas aplicaes CGI e tornou-se uma das solues mais populares para a gerao de contedo dinmico no lado do servidor. Porm, para conseguir alcanar todos os seus objetivos, os Servlets precisam de um ambiente adequado para a sua execuo. Este ambiente se chama Servlet Container e responsvel por gerenciar todo o ciclo de vida dos servlets. Assim como a especicao dos Servlets, o Servlet Container tambm uma especicao. Ou seja, ela apenas dene caractersticas e itens que, para ser um Serlvet Container, precisam ser atendidas, dessa forma possibilitando a cada fornecedor implementar a especicao da maneira que achar mais conveniente. A seguir, ser apresentado um passo a passo para a instalao do ambiente onde sero executados os Servlets.

Seo 4 Preparando o Ambiente


A fundao Apache possui uma implementao da especicao do Servlet Container, e essa implementao chamada de Apache Tomcat, devido a sua grande utilizao e por essa implementao ter se tornada uma referncia entre as implementaes da especicao Java Servlets. Assim, ela ser a nossa escolha para ser o ambiente de execuo dos Java Servlets.

O Apache Tomcat est disponvel no endereo http://tomcat.apache.org/ Contudo, essa verso do Tomcat exige a utilizao do Java 5.

Unidade 11

217

Universidade do Sul de Santa Catarina

A seguir, a pgina inicial do projeto apresentada na gura 11.6:

FIGURA 11.6 PGINA DO PROJETO APACHE TOMCAT

Utilizaremos a verso 5.5.17 do Apache Tomcat. Portanto, no item Download, escolheremos a opo Tomcat 5.x. Na pgina seguinte - onde so apresentados os arquivos da verso 5.5.17: Core, Deployer, Embedded, Administration Web Application, JDK 1.4 Compability Package, Documentation - utilizaremos apenas o arquivo Core, pois ele contm o essencial da distribuio e os outros arquivos so mdulos adicionais que podem ser instalados no Tomcat posteriomente. Porm, necessria a instalao do pacote Core para que eles possam funcionar.

218

Linguagens de Programao II

Utilizaremos a verso executvel do arquivo Core. Aps o trmino do download, execute o instalador do Tomcat e siga os passos:

FIGURA 11.7 TELA INICIAL DA INSTALAO

Inicialmente, ser apresentada uma tela de boas vindas com algumas recomendaes. Seguidas as recomendaes, voc pode avanar na instalao clicando no boto Next e indo para a prxima tela apresentada na gura 11.8:

FIGURA 11.8 TERMOS DA LICENA DO TOMCAT

Unidade 11

219

Universidade do Sul de Santa Catarina

Nessa tela, so apresentados os termos da licena de utilizao do Tomcat. No algo com que voc deve se preocupar, pois o Tomcat uma aplicao Open Source, ou seja, voc pode utilizla sem ter que pagar nenhuma taxa. Tendo lido os termos da licena, voc pode concordar com eles e avanar para a prxima etapa clicando no boto I Agree apresentado na gura 11.9:

FIGURA 11.9 TIPO DE INSTALAO A SER FEITA

Na tela apresentada na gura 11.9, voc escolher que tipo de instalao ser feita. Para ns didticos, podemos selecionar a instalao Normal e avanar para a prxima etapa clicando no boto Next.

FIGURA 11.10 LOCAL DE INSTALAO

220

Linguagens de Programao II

Nesta tela, voc escolher onde o Tomcat ser instalado. Nessa etapa, recomendado que o Tomcat seja instalado em algum drive raiz para evitar problemas futuros de compilao. Porm, que vontade para instalar o Tomcat em qualquer diretrio. Tendo escolhido o diretrio, vamos para a prxima etapa, clicando no boto Next, onde veremos uma tela semelhante apresentada na gura 11.11.

FIGURA 11.11 CONFIGURAO DE ADMINISTRAO

A tela apresentada na gura 11.11 possibilita que sejam informadas: a porta em que o Tomcat ir rodar, o usurio e a senha de administrao. A porta de execuo do Tomcat geralmente no utilizada, podendo ser mantida a sugesto da porta 8080. Porm, caso ela esteja sendo utilizada por alguma aplicao, que vontade para mud-la.

FIGURA 11.12 LOCALIZAO DO JRE

Unidade 11

221

Universidade do Sul de Santa Catarina

Como veremos mais frente, os Servlets so classes Java e para serem executados devem rodar sobre uma mquina virtual Java. Por isso, na tela apresentada na gura 11.12, voc deve localizar onde est instalada a mquina virtual do java no seu computador para poder utilizar o Tomcat. Aps a localizao, podemos ir para a prxima etapa clicando no boto Next.

FIGURA 11.13 FINALIZAO DA INSTALAO DO TOMCAT

Pronto, a instalao do Tomcat foi concluda. Nessa tela h informaes sobre a nalizao do processo de instalao, as opes para iniciar o Tomcat e a leitura de um arquivo com algumas informaes. Podemos, ento, clicar no boto Finish. Logo aps, voc pode acessar o Tomcat pelo navegador utilizando o endereo http://localhost:8080/, que ir exibir uma pgina semelhante gura 11.14:

222

Linguagens de Programao II

FIGURA 11.14 PGINA INICIAL DO TOMCAT

Se voc visualizou uma pgina semelhante gura 11.14, a sua instalao foi efetuada com sucesso. . Note que, na barra de inicializao rpida, aparece o seguinte cone a partir deste cone que voc ir controlar o Tomcat para inicializ-lo e naliz-lo. Agora, com o ambiente instalado, estamos prontos para comearmos o prximo captulo em que iniciaremos o desenvolvimento de aplicaes web utilizando Servlets.

Unidade 11

223

Universidade do Sul de Santa Catarina

Sntese
Nessa unidade vimos os conceitos e algumas tecnologias relacionadas ao desenvolvimento de aplicaes web. importante lembrar que os conceitos do protocolo HTTP e como ele funciona fundamental, para que o desenvolvimento de aplicaes web possa ser feito da melhor forma. Outro ponto importante analisar o ciclo de vida das aplicaes que utilizam CGI, para voc ter uma base de comparao quando estudar a unidade sobre Java Servlets. Por ltimo, o ambiente de execuo dos Java Servlets, no nosso caso o Apache Tomcat, ser de grande importncia para que a execuo de aplicaes web que utilizem Java possa ser feita da melhor forma.

Atividades de auto-avaliao
A partir de seus estudos, leia com ateno e resolva as atividades programadas para a sua auto-avaliao. 1) Qual tecnologia permitiu que as pginas estticas da web pudessem ser tornar dinmicas? 2) Quais mtodos de requisio HTTP so os mais utilizados? 3) Qual o nome da estrutura necessria para a execuo dos Java Servlets?

224

Linguagens de Programao II

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando as seguintes referncias:
http://tomcat.apache.org/ (Site oficial do projeto Apache Tomcat) http://java.sun.com/products/servlet/ (Site oficial da Sun sobre a tecnologia Java Servlets) http://www.jcp.org/aboutJava/communityprocess/final/jsr154/index.html (Site da especificao dos Java Servlets) http://www.w3.org/CGI/ (Site do consrcio W3C sobre a tecnologia CGI) http://www.w3.org/Protocols/ (Site do consrcio W3C sobre o protocolo http)

Unidade 11

225

UNIDADE 12

Java Servlets
Objetivos de aprendizagem
Entender como funciona a tecnologia Java Servlets. Conhecer os recursos disponibilizados pela tecnologia Java Servlets. Desenvolver uma aplicao web utilizando a tecnologia Java Servlets.

Sees de estudo
Seo 1 Introduo aos Java Servlets Seo 2 Recuperando parmetros de um formulrio Seo 3 Navegando entre Servlets Seo 4 Sesses

Universidade do Sul de Santa Catarina

Para incio de conversa


Veremos, nesta unidade, o que so os Java Servlets, algumas funcionalidades que eles oferecem e como utilizar tais funcionalidades para desenvolver uma aplicao web. Ser discutido, tambm, a estruturao de aplicaes web.

Seo 1 Introduo aos Java Servlets


Na unidade anterior voc estudou como era a preparao do ambiente de execuo dos servlets, porm no viu alguns itens que fazem do Servlet Container algo crucial para a utilizao de Servlets. Dentre esses itens destacam-se: Suporte na utilizao de um protocolo - voc no precisa se preocupar como o Servlet Container ir receber as requisies feitas pelo browser, voc apenas implementa a sua lgica nos Servlets e os utiliza. Gerncia do ciclo de vida - o Servlet Container controla todo o ciclo de vida de um Servlet, desde a sua inicializao at a sua destruio, deixando mais uma vez voc livre para implementar apenas a sua lgica de negcio. Ambiente multithread - um Servlet Container deve ser um ambiente multithread, ou seja, ele deve ser capaz de receber vrias requisies e para cada requisio criar uma thread, que, por sua vez, ir processar a requisio. Os itens apresentados acima no so os nicos que um Servlet Container deve se preocupar. Existem outros, porm esses so os mais evidentes. At agora, voc sabe que um Servlet Container executa Servlets, gerencia o seu ciclo de vida e facilita algumas tarefas de infra-estrutura para o desenvolvedor de Servlets.

228

Linguagens de Programao II

Porm, voc ainda no viu como um Servlet Container trata uma requisio de um browser e como ele responde a essa requisio. Na gura 12.1, o processo ilustrado para um melhor entendimento.

FIGURA 12.1 - PROCESSAMENTO DE UMA REQUISIO PELO SERVLET CONTAINER

Agora que voc tem uma viso melhor do Servlet Container e como ele funciona torna-se mais fcil entender e trabalhar com Servlets.
229

Unidade 12

Universidade do Sul de Santa Catarina

Antes de mais nada, um Serlvet uma classe Java como outra qualquer. Porm, um Servlet precisa de alguns mtodos para poder lidar com o protocolo HTTP e tais mtodos so herdados da super classe javax.servlet.http.HttpServlet. Esta classe a base para todos os Servlets. Ela possui mtodos relacionados ao modo que as requisies podem ser feitas ao Servlet Container, ou seja, utilizando o get, post, head, etc. Para cada um desses modos o Servlet ir implementar um mtodo com o mesmo nome do modo, porm com o su xo do, ou seja, doGet, doPost, doHead, etc. Porm, a implementao de todos os mtodos no obrigatria, apenas o mtodo que ser utilizado. Talvez as seguintes dvidas venham a tona: O Servlet no tem construtor? Onde ca o mtodo main() para poder iniciar a aplicao? Quem cuida para que um Servlet esteja sempre pronto para receber requisies o Servlet Container, ou seja, as perguntas que foram feitas anteriormente so resolvidas pelo Servlet Container. A seguir, na gura 12.2, apresentado um diagrama de classes mostrando a estrutura de classes que um Servlet segue:

FIGURA 12.2 - DIAGRAMA DE CLASSE DO PACOTE JAVAX.SERVLET

230

Linguagens de Programao II

Voc pode perceber que alm de um Servlet ser uma subclasse da classe abstrata javax.servlet.http.HttpServlet, ele acaba tambm herdando caractersticas da classe javax.servlet.GenericServlet. Essa ltima classe dene a maioria do comportamento do Servlet: como ser instanciado, destrudo, entre outros. Apesar das classes possurem muitos mtodos, no momento preciso entender o funcionamento de apenas 3 mtodos fundamentais durante o ciclo de vida de uma Servlet, so eles: 1) O mtodo init() chamado pelo Servlet Container logo aps a criao de um Servlet. Porm, antes do mesmo ser executado, esse mtodo possibilita que voc inicialize o seu Servlet antes dele receber requisies. Voc s ir reescrever esse mtodo caso queira fazer uma inicializao especca no Servlet. 2) Quando chega uma requisio o mtodo service() chamado e o Servlet Container inicia uma nova thread. Esse mtodo analisa a solicitao, determinando que mtodo HTTP foi utilizado na requisio (GET, POST, etc.) e encaminha a requisio ao respectivo mtodo, doGet, doPost, etc. Dicilmente ser necessrio reescrever esse mtodo, pois o seu comportamento padro j faz o trabalho de maneira correta. 3) Neste momento ser executado justamente o mtodo onde estar a lgica da aplicao, que so geralmente os mtodos doGet e doPost. Quando se est desenvolvendo Servlets somente um desses mtodos reescrito. Veja agora um exemplo de uma aplicao simples onde utilizado Servlet. Alguns detalhes sero vistos mais a frente, por isso no se assuste com algum item novo.

Unidade 12

231

Universidade do Sul de Santa Catarina

Para a construo do exemplo, devem ser executados os seguintes passos: 1) Crie a seguinte estrutura de diretrios para a aplicao: aplicacao |-src |-WEB-INF |-classes
Cuide ao COPIAR E COLAR TRECHOS DE CDIGO direto do .PDF. Caso voc faa isso, cuide se caracteres especiais no foram juntos para o arquivo.

2) Dentro do diretrio src, crie um arquivo chamado MeuPrimeiroServlet.java com o seguinte contedo:

import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MeuPrimeiroServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter saida = response.getWriter(); java.util.Date hoje = new java.util.Date(); saida.println(<html>); saida.println(<body>); saida.println(Hoje : + hoje); saida.println(</body>); saida.println(</html>); } }

3) Crie um arquivo chamado web.xml. Esse arquivo ser o nosso deployment descriptor, dentro do diretrio WEB-INF com o seguinte contedo:
<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> <servlet> <servlet-name>Este eh meu primeiro Servlet</servlet-name> <servlet-class>MeuPrimeiroServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Este eh meu primeiro Servlet</servlet-name> <url-pattern>/servlet</url-pattern> </servlet-mapping> </web-app>

232

Linguagens de Programao II

4) Agora, compile o Servlet. Para isso, abra o console de windows e v at o diretrio da sua aplicao, ou seja, o diretrio aplicacao e digite o comando:
javac classpath $catalina_home/common/lib/servlet-api.jar d WEB-INF/classes src/ MeuPrimeiroServlet.java

Ateno! Lembre-se de dois pontos: o comando deve estar numa linha apenas e substitua $catalina_home pelo diretrio onde est localizado o Tomcat. O caminho inteiro do diretrio deve estar entre aspas duplas.

5) Copie a pasta da sua aplicao para o diretrio $catalina_home/webapps 6) Reinicie o Tomcat. 7) Abra o browser e digite: http://localhost:8080/ aplicacao/servlet e voc ver algo semelhante a gura 12.3:

FIGURA 12.3 - RESULTADO DA APLICAO DE EXEMPLO

Analisando esse exemplo, perceba que surgiram alguns itens novos: a estrutura de diretrios utilizada, as classes HttpServletRequest e HttpServletResponse no mtodo doGet e o descritor da aplicao (deployment descriptor). Voc agora estudar cada um desses itens, comeando pelas duas classes novas.

Unidade 12

233

Universidade do Sul de Santa Catarina

Classes HttpServletRequest e HttpServletResponse


As classes HttpServletRequest e HttpServletResponse sero sempre passadas como argumentos para qualquer um dos mtodos de um Servlet (doGet, doPost, doHead, etc.) referente ao mtodo HTTP (GET, POST, HEAD, etc.) utilizado no envio das informaes. Essas duas classes possibilitam que um Servlet tenha acesso tanto ao objeto de requisio quanto ao objeto de resposta. No exemplo anterior no foi utilizado o objeto de requisio HttpServletRequest, porm foi utilizado o objeto de resposta HttpServletResponse para escrever como seria apresentada a sada para o browser. O objeto de requisio geralmente utilizado quando se quer capturar informaes enviadas pelo browser, por exemplo os dados de um formulrio.

Descritor da aplicao
O descritor da aplicao um documento XML que distribudo com a aplicao web e tem a nalidade de informar ao Servlet Container dados sobre a aplicao, como por exemplo, os servlets que aplicao possui, questes de segurana que a aplicao deve ter, entre outros detalhes. Porm, interessante notar, no exemplo visto, que o descritor possua apenas informaes relacionadas ao Servlet que foi desenvolvido e que tais informaes bastaram para que o Servlet Container pudesse localizar o Servlet e encaminhar a ele a requisio feita pelo cliente. No descritor da aplicao, voc pode notar que foram informados dois elementos: servlet e servletmapping. No elemento servlet informado um nome qualquer que ser atribudo ao Servlet pelo sub-elemento servlet-name e a classe que implementa esse Servlet pelo sub-elemento servletclass. Neste caso, no so utilizados pacotes, porm, se fossem deveria ser informado todo o caminho do pacote. No elemento servlet-mapping feita uma ligao entre o Servlet informado anteriormente e uma URL, onde o sub-elemento servlet-name referencia o nome do Servet e o sub-elemento url-pattern informa o padro de URL que ser mapeada para esse Servlet. Dessa forma, quando o Servlet Container receber
234

Linguagens de Programao II

uma requisio que contenha a URL mapeada, ele saber que deve encaminhar essa requisio ao respectivo Servlet que est vinculado a essa URL.

Estrutura de diretrios
Por m, veja que foi utilizada a estrutura de diretrios no desenvolvimento da nossa primeira aplicao web. A Sun criou um padro de estrutura de diretrios para as aplicaes web. Esse padro apresentado a seguir, na gura 12.5:

FIGURA 12.4 ESTRUTURA DE APLICAO WEB

Unidade 12

235

Universidade do Sul de Santa Catarina

Apesar de ter uma variedade de diretrios, nesse momento preciso se preocupar apenas com alguns diretrios. A tabela abaixo mostra quais so e para que servem esses diretrios:

src web

Diretrio onde caro armazenados o cdigo fonte das nossas classes Java. Diretrio raiz da aplicao web. Diretrio que ir armazenar o descritor da aplicao web (web.xml) bem como outros arquivos de congurao. Lembre-se que esse diretrio no visvel ao cliente.

WEB-INF

WEB-INF/lib Diretrio onde caro armazenadas as bibliotecas necessrias para a execuo da aplicao, por exemplo drivers JDBC.

Agora que voc viu o que compe uma aplicao web e acompanhou o exemplo de uma aplicao que apresenta um contedo ao usurio, est na hora de incrementar um pouco mais esta aplicao, permitindo que o usurio informe alguns dados e o Servlet faa um processamento com base nos dados informados.

Seo 2 - Recuperando parmetros de um formulrio


Na aplicao anterior voc viu como se utilizam aplicaes que utilizem Servlets. Agora hora de aumentar a interatividade do usurio com a aplicao, fornecendo ao mesmo a possibilidade de informar dados tais que a aplicao seja capaz de recuper-los e utiliz-los para algum processamento. Voc desenvolver uma aplicao de forma semelhante ao exemplo anterior, seguindo os seguintes passos:

236

Linguagens de Programao II

1) Crie a seguinte estrutura de diretrios para a aplicao: aplicacaoWeb |-src |-WEB-INF |-classes 2) Dentro do diretrio src crie um arquivo chamado ParametrosServlet.java com o seguinte contedo:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class ParametrosServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter saida = response.getWriter(); String nome = request.getParameter(nome); String sexo = request.getParameter(sexo); String email = request.getParameter(email); saida.println(<html>); saida.println(<body>); saida.println(Seu nome : + nome + <br/>); saida.println(Seu sexo : + sexo+ <br/>); saida.println(Seu email : + email + <br/>); saida.println(</body>); saida.println(</html>); } }

3) Crie um arquivo chamado index.html com o contedo abaixo e o salve na pasta raiz da aplicao, ou seja, na pasta aplicacaoWeb:
<html> <body> <form action=parametros method=post> Nome: <input type=text name=nome /><p /> Email: <input type=text name=email /> <p /> Sexo: <select name=sexo> <option value=Masculino>Masculino</option> <option value=Feminino>Feminino</option> </select><p/> <input type=submit value=Enviar/> </form> </body> </html>

Unidade 12

237

Universidade do Sul de Santa Catarina

Ateno! Repare que na pgina HTML foi criada um formulrio e nesse formulrio so informados dois itens importantes: um atributo action que informa que Servlet ser utilizado para receber essa requisio. Note que no arquivo web.xml mapeamos um Servlet para receber requisies que obedeam o padro / parametros; o atributo method foi configurado com o tipo POST, ou seja, o Servlet ter que implementar o mtodo doPost para poder receber esse formulrio.

4) Crie um arquivo chamado web.xml. Esse arquivo ser o deployment descriptor, dentro do diretrio WEB-INF com o seguinte contedo:
<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> <servlet> <servlet-name>Recupera Parametros</servlet-name> <servlet-class>ParametrosServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Recupera Parametros</servlet-name> <url-pattern>/parametros</url-pattern> </servlet-mapping> </web-app>

5) Agora, compile o Servlet. Para isso, abra o console de windows e v at o diretrio da sua raiz aplicao e digite o comando:
javac classpath $catalina_home/common/lib/servlet-api.jar d WEB-INF/classes src/ ParametrosServlet.java

Ateno! Lembre-se de dois pontos: o comando deve estar numa linha apenas e substitua $catalina_home pelo diretrio onde est localizado o Tomcat. O caminho inteiro do diretrio deve estar entre aspas duplas.

238

Linguagens de Programao II

6) Copie o diretrio aplicacaoWeb para o diretrio $catalina_home/webapps 7) Reinicie o Tomcat. 8) Digite no browser o endereo http://localhost:8080/ aplicacaoWeb/index.html e voc ver uma tela como a gura abaixo:

FIGURA 12.5 FORMULRIO DE DADOS

Preenchendo as informaes e clicando no boto enviar voc ter um resultado semelhante gura 12.7 abaixo:

FIGURA 12.6 PGINA DE RESPOSTA

Agora que voc viu como enviar parmetros a um Serlvet e como gerar contedo para ser exibido ao cliente, voc ver como adicionar a essa aplicao a funcionalidade de navegao, ou seja, como poder adicionar links as pginas para se navegar por toda a aplicao e no se car somente com uma ou duas pginas.

Unidade 12

239

Universidade do Sul de Santa Catarina

Seo 3 - Navegando entre Servlets


Como todo Servlet gera uma sada HTML que ser exibida ao usurio, possvel a cada resposta do usurio criar um link para poder vincular vrios Servlets e dessa forma aumentar as funcionalidades da nossa aplicao. Pense no seguinte exemplo: um sistema simples de inscrio onde se tm 3 telas, uma para cadastrar os dados pessoais, outra tela para informar o curso desejado e uma tela apresentando o nal do processo: 1) Crie novamente a seguinte estrutura de diretrios para a aplicao: sistemaCadastro |-src |-WEB-INF |-classes 2) Dentro do diretrio src crie um arquivo chamado CadastraServlet.java com o seguinte contedo:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class CadastraServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter saida = response.getWriter(); String nome = request.getParameter(nome); String sexo = request.getParameter(sexo); String email = request.getParameter(email); saida.println(<html>); saida.println(<body>); saida.println(<form action=curso method=post> ); saida.println(Curso: <select name=curso>); saida.println(<option value=Violo>Violo</option>); saida.println( <option value=Piano>Piano</option>); saida.println( <option value=Baixo>Baixo</option>); saida.println( <option value=Bateria>Bateria</option>); saida.println(</select><p/>); saida.println(<input type=submit value=Enviar/> ); saida.println(</form> ); saida.println(</body>); saida.println(</html>); } }

240

Linguagens de Programao II

3) Dentro do diretrio src crie um novo arquivo chamado CursoServlet.java com o contedo abaixo:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class CursoServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter saida = response.getWriter(); String curso = request.getParameter(curso); saida.println(<html>); saida.println(<body>); saida.println(SUA INSCRIO NO CURSO FOI FINALIZADA <br/>); saida.println(<a href=index.html>Voltar a tela principal</a>); saida.println(</body>); saida.println(</html>); } }

4) Crie um arquivo chamado index.html com o contedo abaixo e o salve na pasta raiz da aplicao, ou seja, na pasta aplicacaoWeb:
<html> <body> <form action=cadastro method=post> Nome: <input type=text name=nome /><p /> Email: <input type=text name=email /> <p /> Sexo: <select name=sexo> <option value=Masculino>Masculino</option> <option value=Feminino>Feminino</option> </select><p/> <input type=submit value=Enviar/> </form> </body> </html>

Unidade 12

241

Universidade do Sul de Santa Catarina

5) Crie um arquivo chamado web.xml, esse arquivo ser o deployment descriptor, dentro do diretrio WEB-INF com o seguinte contedo:
<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> <servlet> <servlet-name>Cadastra Aluno</servlet-name> <servlet-class>CadastraServlet</servlet-class> </servlet> <servlet> <servlet-name>Curso Aluno</servlet-name> <servlet-class>CursoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Cadastra Aluno</servlet-name> <url-pattern>/cadastro</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Curso Aluno</servlet-name> <url-pattern>/curso</url-pattern> </servlet-mapping> </web-app>

6) Agora compile os Servlets. Para isso, abra o console de windows e v at o diretrio da sua raiz aplicao e digite o comando:
javac classpath $catalina_home/common/lib/servlet-api.jar d WEB-INF/classes src/*.java

Ateno! Lembre-se de dois pontos: o comando deve estar numa linha apenas e substitua $catalina_home pelo diretrio onde est localizado o Tomcat. O caminho inteiro do diretrio deve estar entre aspas duplas.

242

Linguagens de Programao II

7) Copie o diretrio aplicacaoWeb para o diretrio $catalina_home/webapps 8) Reinicie o Tomcat. Digite no browser o endereo http://localhost:8080/ sistemaCadastro/index.html e voc conseguir navegar entre as pginas de cadastro dos dados bsicos, a pgina de seleo do curso e a pgina de conrmao da inscrio em um determinado curso. Porm, note que em nenhum momento so guardadas as informaes do usurio. Na prxima seo, voc aprender a ver como contornar essa situao, ao se trabalhar com sesso. A seqncia de telas mostra a aplicao em execuo.

Figura 12.7 Primeiro formulrio de entrada de dados

Figura 12.8 Segundo formulrio de entrada de dados

Figura 12.9 Tela de finalizao da aplicao

Unidade 12

243

Universidade do Sul de Santa Catarina

Seo 4 - Sesses
No exemplo anterior, voc viu como estabelecer vnculos entre os Servlets. Porm, um novo problema foi enfrentado, pois no se conseguiu manter as informaes do aluno no sistema. No momento, a inteno manter essas informaes sem ter que armazenar em um banco de dados, at por que o aluno pode no querer nalizar a inscrio e dessa formar poderamos comear a inserir alunos, na base de dados, que no seriam alunos de fato. Agora, voc modicar o exemplo anterior para trabalhar com sesso e dessa forma conseguir manter o estado do candidato at o nal do processo de inscrio. Para modicar siga os seguintes passos: 1) Crie na pasta src do projeto sistemaCadastra uma classe Java chamada Candidato.java com o seguinte contedo:
public class Candidato { private String nome; private String email; private String sexo; private String curso; public Candidato() { } public void setNome(String nome){ this.nome = nome; } public void setEmail(String email){ this.email = email; } public void setSexo(String sexo){ this.sexo = sexo; } public void setCurso(String Curso){ this.curso = curso; } public String getNome (){ return this.nome; } public String getEmail (){ return this.email; } public String getSexo (){ return this.sexo; } public String getCurso (){ return this.curso; } }

244

Linguagens de Programao II

2) Dentro do diretrio src modique o arquivo chamado CadastroServlet.java com o seguinte contedo:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class CadastraServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter saida = response.getWriter(); String nome = request.getParameter(nome); String sexo = request.getParameter(sexo); String email = request.getParameter(email); Candidato candidato = new Candidato(); candidato.setNome(nome); candidato.setEmail(email); candidato.setSexo(sexo); HttpSession sessao = request.getSession(); sessao.setAttribute(candidato, candidato); saida.println(<html>); saida.println(<body>); saida.println(<form action=curso method=post> ); saida.println(Curso: <select name=curso>); saida.println(<option value=Violo>Violo</option>); saida.println( <option value=Piano>Piano</option>); saida.println( <option value=Baixo>Baixo</option>); saida.println( <option value=Bateria>Bateria</option>); saida.println(</select><p/>); saida.println(<input type=submit value=Enviar/> ); saida.println(</form> ); saida.println(</body>); saida.println(</html>); } }

Unidade 12

245

Universidade do Sul de Santa Catarina

3) Dentro do diretrio src modique o arquivo chamado CursoServlet.java com o contedo abaixo:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class CursoServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter saida = response.getWriter(); String curso = request.getParameter(curso); HttpSession sessao = request.getSession(); Candidato candidato = (Candidato) sessao.getAttribute(candidato); candidato.setCurso(curso); saida.println(<html>); saida.println(<body>); saida.println(SUA INSCRIO NO CURSO FOI FINALIZADA <br/>); saida.println(Os seus dados so <br/>); saida.println(Nome: + candidato.getNome() + <br/>); saida.println(Sexo: + candidato.getSexo()+ <br/>); saida.println(Email: + candidato.getEmail()+ <br/>); saida.println(Curso: + candidato.getCurso()+ <br/>); saida.println(<a href=index.html>Voltar a tela principal</a>); saida.println(</body>); saida.println(</html>); } }

4) Agora compile novamente os Servlets. Para isso, abra o console de windows e v at o diretrio da sua raiz aplicao e digite o comando:
javac classpath $catalina_home/common/lib/servlet-api.jar d WEB-INF/classes src/*.java

Ateno! Lembre-se de dois pontos: o comando deve estar numa linha apenas e substitua $catalina_home pelo diretrio onde est localizado o Tomcat.

246

Linguagens de Programao II

5) Copie o diretrio aplicacaoWeb para o diretrio $catalina_home/webapps 6) Reinicie o Tomcat. Abra o browser e digite o endereo http://localhost:8080/sistemaCadastro/index.html. Voc far o processo de inscrio normalmente como da primeira vez. Porm, na ltima pgina, em que ser mostrada a tela conrmando a sua inscrio, seus dados sero informados, como na gura 12.8 a seguir:

FIGURA 12.10 PGINA DE RESULTADO DO PROCESSO DE INSCRIO

Veja que possvel manter o estado de um usurio do sistema por meio da nova interface que apareceu no exemplo javax.servlet. http.HttpSession. Esta interface uma alternativa aos outros mtodos (cookies, reescrita de url, etc.) de armazenar informaes do usurio. Ela fornece uma API mais poderosa e fcil de trabalhar do que os outros mtodos. Perceba que uma sesso est sempre associada a uma requisio (request.getSession()), pois quem faz a requisio o usurio e como se quer manter o estado do usurio, no tem lugar melhor para encontrar informaes do usurio do que na requisio. De posse da sesso do usurio possvel manipul-la normalmente utilizando o mtodo setAttribute(nomeAtributo, valorAtributo) para poder adicionar na sesso os nossos objetos, sempre utilizando a dupla nome-valor, ou seja, adicionando na sesso um objeto com um determinado rtulo. No exemplo, isso foi feito com o candidato, pois adicionamos na sesso um candidato com o rtulo candidato.

Unidade 12

247

Universidade do Sul de Santa Catarina

No Servlet seguinte recuperamos a informao desse candidato apenas passando o rtulo do objeto que tnhamos informado anteriormente. Dessa forma, a recuperao de objetos na sesso ocorre por meio do mtodo getAttribute(nomeAtributo).

Ateno! Sempre que voc for recuperar algum objeto da sesso voc deve fazer o typecast para o determinado objeto, pois a sesso sempre retornar um Object caso voc no faa a converso.

A sesso uma funcionalidade muito importante da especicao dos Servlets e muito til no desenvolvimento de aplicaes web. Porm, deve ser utilizada com cuidado, pois para cada objeto que se adiciona na sesso, uma rea de memria ocupada com esse objeto. Dessa forma, se for adicionado tudo que objeto na sesso chagar um momento em que o consumo de memria ser alto devido a esse descuido. A interface javax.servlet.http. HttpSession possui uma srie de mtodos e recomendado que voc estude esses mtodos para a melhor utilizao desse recurso. Uma coisa neste captulo pode ter deixado voc preocupado: Mas eu vou ter sempre que escrever o contedo das minhas pginas dentro de um Servlet?. Desenvolver uma aplicao dessa forma no seria uma boa prtica, pois sua aplicao estaria toda amarrada dentro de alguns Servlets. Pensando nisso, foram criadas as Java Server Pages (JSP), com a proposta de retirar de dentro dos Servlets o contedo das pginas, que , justamente, o assunto que voc estudar na prxima unidade.

248

Linguagens de Programao II

Sntese
Nessa unidade vimos os conceitos que fazem parte da especicao dos Servlets, como deve ser a estrutura de uma aplicao web, as formas que uma aplicao web recebe dados enviados pelo usurio, por meio de formulrios, como a aplicao pode estar gerando informaes dinmicas e enviando-as ao usurio. Por m, voc viu um item importante nas especicao dos Servlets que utilizado em 99% das aplicaes web, as sesses que de uma forma simples como o Servlet Container mantm o estado do usurio no servidor. A tecnologia dos servlets fundamental para o desenvolvimento de aplicaes web que utilizam Java, pois ela a base para a maioria das solues, tanto comerciais quanto livres, que esto disponveis no mercado.

Atividades de auto-avaliao
Leia com ateno os enunciados seguintes e resolva as atividades programadas para a sua auto-avaliao. 1) Quais mtodos devem estar sendo implementados nos Servlets para que eles possam funcionar corretamente? 2) Como feito o mapeamento dos Servlets para que eles possam ser chamados a partir de uma requisio do nevagador? 3) Quais as classes so responsveis por enviar os dados do cliente ao servidor e enviar dados do servidor para o cliente? 4) Desenvolva uma aplicao web que funcione como uma agenda de contatos, ou seja, voc ir cadastrar: nome, email e telefone dos seus contatos.

Unidade 12

249

Universidade do Sul de Santa Catarina

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando as seguintes referncias: HALL, Marty. Core Servlets and JavaServer Pages. [S. l.]: Prentice Hall, [200?]. HALL, Marty. More Servlets and JavaServer Pages. [S. l.]: Pearson Education, [200?]. FIELDS, Duane; KOLB, Mark; Web development with Java Server Pages. [S. l.]: Manning Publications, 2000. SIERRA, Kathy; BASHMAN, Brian; BATES, Bert. Head rst Servlets and JSP. [S. l.]: OReilly, 2004. http://servlets.com/ (Site com muito material sobre a tecnologia Java Servlets)

250

UNIDADE 13

Java Server Pages (JSP)


Objetivos de aprendizagem
Entender como funcionam as pginas JSP. Conhecer os recursos oferecidos pela tecnologia JSP. Desenvolver aplicaes com pginas JSP dinmicas.

Sees de estudo
Seo 1 Java Server Pages Seo 2 Sintaxe e Semntica

Universidade do Sul de Santa Catarina

Para incio de conversa


Aps termos visto a tecnologia dos Java Servlets, veremos uma tecnologia complementar que ir tornar o desenvolvimento de aplicaes web em Java muito mais fcil e rpido. Esta tecnologia o Java Server Pages (JSP) e iremos vericar como so as pginas JSP, como elas funcionam, sua sintaxe e semntica alm de vericar exemplos de sua utilizao.

SEO 1 Java Server Pages


Aps vericar que o desenvolvimento de aplicaes web utilizando Servlets seria muito trabalhoso e no seria uma boa prtica - pois todo o contedo de apresentao estaria amarrado em Servles - a Sun criou a especicao Java Server Pages (JSP).

Os JSP so pginas dinmicas semelhantes a pginas PHP e ASP e elas permitem que seja inserido cdigo Java dentro delas, facilitando assim o desenvolvimento de aplicaes web.

Quando voc desenvolve uma aplicao utilizando JSP, no preciso se preocupar com a compilao como feito com Servlets. Apenas desenvolva o JSPs e coloque na aplicao, e o Servlet Container far todo o resto do trabalho. Veja seguir uma aplicao de exemplo onde ser exibida uma mensagem Hello World na tela, com uma pgina JSP: 1) Crie novamente a seguinte estrutura de diretrios para a aplicao: sistemaJSP |-src |-WEB-INF |-classes
252

Linguagens de Programao II

2) Dentro do diretrio sistemaJSP, crie um arquivo chamado helloWorld.jsp com o seguinte contedo:
<html> <head> <title>Hello World</title> </head> <body> Hello World <br/> O resultado da soma 2 + 2 <%=2 + 2%> </body> </html>

3) Crie dentro do diretrio WEB-INF o arquivo web.xml com o seguinte contedo:


<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> </web-app>

4) Copie o diretrio aplicacaoWeb para o diretrio $catalina_home/webapps 5) Reinicie o Tomcat, abra o browser e digitehttp:// localhost:8080/sistemaJSP/helloWorld.jsp. Voc ver algo semelhante a gura a seguir:

FIGURA 13.1 VISUALIZANDO A MENSAGEM HELLO WORLD

Voc pode ver, por esse exemplo, que no preciso utilizar algumas coisas que se utilizava com os Servlets: no preciso criar classes Java, o nosso descritor da aplicao estava vazio; no preciso car escrevendo cada uma dos nossos JSPs e a pgina JSP foi capaz de executar o cdigo que estava contido entre as

Unidade 13

253

Universidade do Sul de Santa Catarina

tags de abertura <% e de fechamento %>. Em outras palavras, desenvolvemos uma pequena aplicao de maneira muito rpida. Vamos agora incrementar uma pouco mais a nossa aplicao permitindo a ela exibir o dia corrente atravs de uma classe bastante conhecida nossa, a classe Date. Para podermos utilizar essa classe na nossa pgina JSP precisamos fazer algo semelhante ao que fazemos quando desenvolvemos uma classe Java normal: precisamos importar a classe para poder utiliz-la. No nosso caso a classe Date que dever ser importada. Modicando a nossa pgina JSP da seguinte forma, poderemos utilizar a classe Date sem problema:
<%@ page import=java.util.Date %> <html> <head> <title>Hello World</title> </head> <body> Hello World <br/> Hoje <%=new Date()%> </body> </html>

O que ns utilizamos, no exemplo anterior, para poder informar que iramos fazer um import da classe Date foi um recurso muito til do JSP, conhecido como diretiva.

A diretiva page possui vrios atributos, o import apenas uma deles, existem mais atributos que podem estar sendo utilizados na diretiva page.

254

Linguagens de Programao II

Verique no quadro a seguir alguns atributos da diretiva page:

Atributos
language extends import session buer autoFlush

Descrio
Dene a linguagem de script que ser utilizada no JSP. A nica lingaguem suportada Java. Dene o nome da classe que essa pgina JSP deve herdar. Geralmente esse atributo no informado, deixado a cargo do Servlet Container se preocupar com isso. Permite a pgina JSP fazer import de pacotes e classes que sero utilizadas. Dene se a pgina em questo deve fazer parte de uma sesso. O valor default true. Dene o tamanho do buer da pgina JSP em kilobytes, caso no seja denido a sada no ser buferizada. Se o valor desse atributo for true, o buer da pgina JSP ser nalizado caso ele tenha atingido o seu limite. Se o valor desse atributo for false, a pgina JSP no ir implementar a interface SingleThreadModel. O valor default true. Retorna o resultado do mtodo getServletInfo() da classe que implementa essa pgina JSP. Dene o caminho relativo a uma pgina de erro, caso uma exceo seja lanada. Informa o tipo de sada do documento. O valor default text/html. Informa se a pgina uma pgina de erro. Dene o caracter encoding da pgina.

isThreadSafe info errorPage contentType isErrorPage pageEncoding

Alm da diretiva page, existem outras duas diretivas: a taglib que estaremos vendo na prxima unidade sobre JSTL e a diretiva include, que permite incluir em uma pgina JSP textos e cdigos que sero utilizados no momento de execuo das pginas JSP. Isso permite construir pedaos de pginas reutilizveis (como cabealhos, rodaps, barra de navegao, etc).

Unidade 13

255

Universidade do Sul de Santa Catarina

A sintaxe da utilizao da diretiva include a seguinte:


<html> <head> <title>Hello World</title> </head> <body> <%@ include file=cabecalho.jsp %> Hello World <br/> Hoje <%=new Date()%> </body> </html>

No exemplo apresentado, quando o Servlet Container encontrar a diretiva include, ele ir colocar no ponto onde ele encontrou a diretiva o contedo da pgina cabecalho.jsp. A especicao JSP cobre muitas outras situaes atravs de mecanismos que possibilitam uma melhor utilizao das pginas JSP so eles: declaraes JSP, Expresses JSP e Scriptlets. Veremos cada um deles a seguir.

SEO 2 Sintaxe e Semntica


As declaraes JSP so utilizadas para fazer declaraes de mtodos e atributos em uma pgina JSP. Imagine um cenrio onde voc quer fazer uma contagem de acessos a uma determinada pgina JSP, ou seja, a cada acesso a uma determinada pgina incrementado o valor. Poderamos utilizar uma declarao JSP para fazer declarao de um atributo contador e increment-lo a cada acesso como no cdigo mostrado abaixo, lembrando que para utilizarmos uma declarao em JSP devemos utilizar a seguinte sintaxe:
<%! Contedo a ser declarado %>

256

Linguagens de Programao II

Exemplo:
<html> <head> <title>Contador</title> </head> <body> <%! int count=0; %> Esta pgina foi teve <%= ++count%> acessos. </body> </html>

Expresses JSP
No exemplo anterior utilizamos uma expresso aps termos incrementado o valor do contador. Fizemos isso, pois, alm de efetuarmos o incremento, ns queramos disponibilizar esse valor ao usurio. justamente essa a funo de uma expresso JSP: atribuir um determinado valor na pgina JSP. Utilizamos uma expresso JSP com a seguinte sintaxe:
<%= Contedo a ser expresso, ou seja, atribudo a pgina %>

Exemplo:
<html> <head> <title>Contador</title> </head> <body> <%! int count=0; %> Esta pgina foi teve <%= ++count%> acessos. </body> </html>

Unidade 13

257

Universidade do Sul de Santa Catarina

Scriptlet
Os scriptlets so um dos melhores recursos fornecidos pela especicao JSP, porm um dos mais perigosos de se utilizar, pois pode viciar o programador a sempre utilizar scriptlets. Um scriptlet uma funcionalidade que permite ao programador embutir cdigo Java dentro de uma pgina JSP, a sintaxe e um exemplo de utilizao sero mostrados a seguir:
<% Qualquer cdigo Java permitido entre essas marcaes %>

Exemplo:
<html> <head> <title>Scriptlet</title> </head> <body> <% String nome = Tom Jobim; int quantidade = nome.lenght(); %> O nome digitado foi <%= nome%> e ele possui <%= quantidade%> letras. </body> </html>

Voc viu que as pginas JSP podem utilizar os recursos de diretivas, declaraes, expresses e scriptlets, porm a especicao ainda possui mais um mecanismo que aumenta a funcionalidade das pginas JSP, so os chamados objetos implcitos. Esses objetos recebem o nome de implcitos pois no precisam ser instanciados para ser utilizados, e eles podem ser acessados diretamente. Os objetos implcitos que podem ser acessados em uma pgina JSP so:

258

Linguagens de Programao II

out request response session

Este objeto do tipo Writer, ou seja, tudo que for escrito nesse objeto, por meio do mtodo print, ser exibido na pgina. Este objeto permite que voc tenha acesso aos parmetros enviados pelo cliente, ao mtodo HTTP utilizado (GET ou POST), etc. Objeto que permite o acesso a resposta que ser enviada ao usurio. Objeto que possui uma referncia sesso associada com a requisio feita pelo usurio. Objeto que referencia a classe ServletContext e permite que sejam armazenados valores que sero compartilhados por toda aplicao, por meio dos mtodos setAttribute e getAttribute. Objeto utilizado para a leitura de parmetros de inicializao. Permite que pginas JSP sejam denidas como pginas de erro. Objeto que um ponto de acesso a muitos atributos da pgina em questo, ou seja, por meio dele voc poder ter acesso aos objetos out, request, response, etc. Objeto semelhante referncia this utilizada em classes Java comuns.

application

cong exception pageContext page

Veja agora o exemplo de uma aplicao onde ser utilizado a maioria dos recursos apresentados anteriormente. 1) Crie a seguinte estrutura de diretrios para a aplicao: sistemaExibe |-src |-paginas |-WEB-INF |-classes 2 )Dentro do diretrio paginas crie os seguintes arquivos:

Unidade 13

259

Universidade do Sul de Santa Catarina

cabecalho.jsp
<h1>Aplicao JSP</h1> Esta uma demonstrao da utilizao dos varios recursos que JSP possui<br/>

conteudo.jsp
<%@ page import=java.util.Date %> <%@ page import=java.text.SimpleDateFormat %> <html> <head> <title>Java Server Pages</title> </head> <body> <%@ include file=cabecalho.jsp %> <form action=recuperaInformacoes.jsp method=post> Nome: <input type=text name=nome/><br/> Data de Nascimento: <input type=text name=dtaNascimento/> <input type=submit value=Enviar/> </form> <%@ include file=rodape.jsp %> </body> </html>

recuperaInformacoes.jsp
<%@ page import=java.util.Date %> <%@ page import=java.text.SimpleDateFormat %> <html> <head> <title>Java Server Pages</title> </head> <body> <%@ include file=cabecalho.jsp %> Voc informou os seguintes dados: <br/> Nome : <%=request.getParameter(nome) %> <br/> Data de Nascimento: <%=request.getParameter(dtaNascimento) %> <br/> <%@ include file=rodape.jsp %> </body> </html>

260

Linguagens de Programao II

rodape.jsp
<h1>Hoje <%= new SimpleDateFormat(dd/mm/yyyy).format(new Date())%></h1>

3) Crie dentro do diretrio WEB-INF o arquivo web.xml com o seguinte contedo:


<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> </web-app>

4) Copie o diretrio sistemaExibe para o diretrio $catalina_home/webapps 5) Reinicie o Tomcat, abra o browser e digite http:// localhost:8080/sistemaExibe/paginas/conteudo.jsp. Voc ver algo semelhante a gura abaixo:

FIGURA 13.2 - PGINA PRINCIPAL

Aps preencher os dados e clicar no boto enviar voc ver algo semelhante tela a seguir:

FIGURA 13.3 - TELA DE RESULTADO

Unidade 13

261

Universidade do Sul de Santa Catarina

Voc pode perceber no exemplo que utilizamos o recurso das diretivas page e include que utilizamos o acesso a um dos objetos implcitos no momento em que recuperamos os parmetros chamando request.getParameter. Utilizamos tambm expresses quando criamos uma data, formatamos e a atribumos na pgina. Assim como esses recursos, todos os apresentados anteriormente podem ser utilizados no desenvolvimento de aplicaes que utilizem JSP. Por m, voc ver a utilizao de mais um recurso em pginas JSP. Para isso, visualize o seguinte exemplo: imagine que ns temos as classes do nosso sistema prontas, por exemplo a classe Pessoa. O que vimos at o momento no nos permite utilizar essa classe, portanto, a sada para isso a utilizao das Aes JSP, que permitem ter acesso a Java Beans que j desenvolvemos e utilizamos. Veja a seguir a sintaxe e utilizao da mesma:
<jsp:useBean id=nome scope=page | request | session | application class=className type=typeName | bean=beanName type=typeName | type=typeName />

Exemplo:
<jsp:useBean id=pessoa class=br.unisul.Pessoa scope=request /> <html> <head> <title>useBean</title> </head> <body> O nome da pessoa <%=pessoa.getNome()%>. </body> </html>

262

Linguagens de Programao II

Alm de poder estar referenciando um Java Bean em uma pgina JSP voc pode estar alterando o estado dele atravs das tags jsp: getProperty e jsp:setProperty, veja dois exemplos para o Java Bean utilizado anteriormente: Exemplo:
<jsp:useBean id=pessoa class=br.unisul.Pessoa scope=request /> <html> <head> <title>useBean</title> </head> <body> O nome da pessoa <jsp:getProperty name=pessoa property=nome/>. <br/> Alterando o nome da Pessoa <jsp:setProperty name=pessoa property=nome value=novoNome/> </br> O novo nome da pessoa <jsp:getProperty name=pessoa property=nome/>. </body> </html>

Tendo visto esses elementos, voc est apto a comear o desenvolvimento de aplicaes web utilizando a tecnologia Java Server Pages, a especicao possui ainda uma srie de itens que voc deve conhecer para se aprofundar na tecnologia. Java Server Pages utilizado hoje em muitos sistemas desenvolvidos em Java e com certeza o conhecimento desta tecnologia imprescindvel. Na prxima unidade veremos como estar melhorando ainda mais o desenvolvimento de aplicaes Java para web.

Unidade 13

263

Universidade do Sul de Santa Catarina

Sntese
Voc viu neste captulo como fcil desenvolver aplicaes web utilizando JSP. Porm essa facilidade apresentada pelo JSP pode acabar se tornando um pesadelo, caso utilizemos de forma errada os recursos oferecidos por ela. Quando programvamos utilizando Servlets, camos no ciclo de estarmos desenvolvendo pginas HTML dentro dos Servlets. Agora fomos pro lado oposto, ou seja, podemos correr o risco de trazer a programao dos Servlets para dentro de uma pgina JSP. O que no vimos ainda que na verdade uma pgina JSP um Servlet, pois mesmo ela sendo uma pgina, ela ser compilada e executada como um Servlet, porm essa tecnologia foi criada como o intuito de atuar na camada de viso, ou seja, ela deve apenas exibir e fornecer os dados para a aplicao. Voc ver no prximo captulo como estar aliando os dois mundos Servlets e JSP da melhor forma possvel utilizando o JSTL.

264

Linguagens de Programao II

Atividades de auto-avaliao
Leia com ateno os enunciados seguintes e resolva as atividades programadas para a sua auto-avaliao. 1) Qual a sintaxe de declaraes, expresses e scriptlets em JSP? 2) Qual a relao entre Servlets e JSP? 3) Como podemos utilizar em JavaBean nas pginas JSP?

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando as seguintes referncias: FALKNER, Jason. JONES, Kevin. Servlets and Java Server Pages: the J2EE technology web tier. [S. l.]: Addison-Wesley, 2003. KURNIAWAN, Budi. Java for web with Servlets, JSP and EJB: a developers guide to J2EE solutions. [S. l.]: New Riders, 2002
http://java.sun.com/products/jsp/

(Site da especicao Java Server Pages (JSP))

Unidade 13

265

UNIDADE 14

Java Standard Tag Library (JSTL)


Objetivos de aprendizagem
Criar pginas JSP de maneira mais fcil. Facilitar a interao entre desenvolvedores e designers. Permitir a reutilizao dos componentes da biblioteca JSTL.

Sees de estudo
Seo 1 JSTL Seo 2 Instalao Seo 3 Linguagem de Expresso JSTL Seo 4 Bibliotecas JSTL

Universidade do Sul de Santa Catarina

Para incio de conversa


Veremos nesta unidade como estar desenvolvendo aplicaes web de forma produtiva, pois iremos conhecer uma biblioteca que facilita o desenvolvimento de pginas JSP, permitindo que essa biblioteca seja reutilizada em todo o projeto e, conseqentemente, facilitando a interao entre a equipe de desenvolvimento e de designer.

Seo 1 - JSTL
A Java Standard Tag Library (JSTL), foi um movimento para a especicao de uma biblioteca padro de tags para: iterao, avaliao condicional e tags que utilizam linguagens de expresso, alm de prover acesso simplicado aos atributos dos objetos PageContext, HttpServletRequest, HttpSession e ServletContext. Mas por que isso? Na unidade anterior, voc viu que se pode inserir cdigo Java diretamente nas nossas pginas JSP. Porm, essa no uma prtica recomendvel, principalmente por dicultar uma posterior manuteno. Dessa forma, os desenvolvedores comearam a desenvolver bibliotecas prprias que executavam o cdigo Java, mas utilizavam uma notao HTML na pgina JSP. Assim eles reutilizavam bastante cdigo e no espalhavam o cdigo Java nas pginas JSP. Porm, notou-se que cada desenvolvedor desenvolvia a sua biblioteca prpria. Dessa forma, estabeleceu-se uma especicao para padronizar essas bibliotecas e ento surgiu o JSTL.

268

Linguagens de Programao II

Seo 2 - Instalao
Para poder utilizar as bibliotecas JSTL, preciso baix-las e instal-las.
Utilize a verso 1.1 das bibliotecas do projeto Apache Jakarta que est localizada no site: http://ftp.unicamp. br/pub/apache/jakarta/taglibs/standard/binaries/ jakarta-taglibs-standard-1.1.2.zip

Aps ter efetuado o download do arquivo, o descompacte em um diretrio qualquer (exemplo: C:/). Alguns arquivos e diretrios, do arquivo baixado, so apresentados abaixo:
README Arquivo que contm uma breve descrio de cada biblioteca inclusa na distribuio. Diretrio que contm todos os jars necessrios para utilizao do JSTL. Diretrio que contm uma cpia de cada arquivo TLD requerido para cada biblioteca JSTL. Arquivo que contm a documentao bsica do JSTL. Arquivo que contm exemplos de utilizao do JSTL.

lib

tld

standard-docs.war standard-examples.war

Para voc utilizar JSTL nas nossas aplicaes, o que se precisa fazer copiar os arquivos standard.jar e jstl.jar para o diretrio WEB-INF/lib das nossas aplicaes e adicionar a diretiva taglib no incio das pginas onde formos utilizar as tags da seguinte forma: <%@ taglib pre x=c uri=http://java.sun.com/jstl/core.

Unidade 14

269

Universidade do Sul de Santa Catarina

No caso, foi exemplicado com a biblioteca core, porm os valores de pre xo e uri podem ser:
Prexo
c sql x fmt

Uri
http://java.sun.com/jstl/core http://java.sun.com/jstl/sql http://java.sun.com/jstl/xml http://java.sun.com/jstl/fmt

Dessa forma, a instalao do JSTL est pronta e preciso apenas informar nas nossas pginas JSP que iremos utiliz-la, mas isso voc ver mais adiante. Agora voc estudar um pouco o que signica linguagem de expresso.

Seo 3 - Linguagem de Expresso JSTL


Uma das principais caractersticas do JSTL, quando foi lanada a verso 1.0, foi a adio das linguagens de expresso (EL), ou seja, era uma forma mais fcil de se referenciar objetos nas pginas JSP. Quando voc utilizar EL, os objetos sero acessados da seguinte forma ${nomeDoObjeto}. Voc tambm pode acessar os atributos do objeto, porm modicando um pouco a utilizao anterior, com a seguinte sintaxe ${nomeDoObjeto.nomeDoAtributo}. A utilizao de EL facilita muita o trabalho do desenvolvedor, pois quando se est acessando o atributo de um objeto, por exemplo, no preciso se preocupar se esse atributo ir retornar um valor nulo ou no, pois a EL trata isso. Assim, no se corre o risco de receber um NullPointerException na nossa pgina JSP, pois nesse caso ser retornado uma String com o valor vazio. A seguir voc estudar as bibliotecas JSTL.

270

Linguagens de Programao II

Seo 4 - Bibliotecas JSTL


As bibliotecas JSTL so divididas em quatro grupos, porm voc utilizar apenas a biblioteca Core. Abaixo so listadas todas as bibliotecas:
Core SQL XML
Fornece tags para a realizao de tarefas bsicas como manipulao de objetos, tratamento de excees, uxo condicional, iteraes e manipulao de URLs. Fornece tags para a manipulao bsica de banco de dados. Fornece tags para a manipulao de elementos XML, controle de uxo baseado em expresses Xpath e transformaes de documentos XML aplicando XSLT. Possui tags para internacionalizao de mensagens, alm da formatao de datas, horrios, valores monetrios.

FMT

Aprofunde seu estudo da JSTL com a tag mais bsica da biblioteca Core. <c:out> - Essa tag avalia uma expresso e exibe o resultado na pgina. A expresso que ser avaliada est denida no atributo value. Caso o resultado da avaliao seja null impresso uma String vazia. Pode-se tambm especicar um valor padro para evitar esses casos atravs do atributo default. Veja a seguir exemplos de utilizao e do resultado proporcionado pela tag:
Utilizao
<c:out value=texto/> <c:out value=${usuario.nome} default=convidado/> <html> <body> <c:out value=Texto a ser impresso/> </body> </html>

Resultado
Texto. Caso a expresso usuario.nome seja nula, ser impresso convidado.

Texto a ser impresso.

Unidade 14

271

Universidade do Sul de Santa Catarina

<c:set> - Permite denir um valor de uma varivel de um escopo ou de uma propriedade. Quando for utilizar variveis de escopo, deve-se utilizar o atributo var para o nome da varivel, scope para o escopo e value para o valor. Para denir propriedades de um objeto os seguintes atributos devem ser preenchidos: target para indicar o objeto, property para indicar a propriedade e value para especicar o valor. Veja os exemplos a seguir:

Utilizao
<c:set var=nome scope=request value=Monteiro Lobato/> <c:set target=pessoa property=nome value=Monteiro Lobato/> <html> <body> <c:set var=texto scope=request value=Texto a ser impresso/> <c:out value=${texto}/> </body> </html>

Resultado
Ser atribudo o valor Monteiro Lobato varivel nome. Ser atribudo ao atributo nome da pessoa o valor Monteiro Lobato.

Texto a ser impresso.

<c:remove> - Remove uma varivel de um determinado escopo. O nome da varivel a ser excluda especicado no atributo var e o escopo no atributo scope. Veja os exemplos:

Utilizao
<c:remove var=nome scope=request/> <html> <body> <c:remove var=nome scope=request/> </body> </html>

Resultado
Ser removida a varivel nome do request.

Varivel nome removida do escopo request.

272

Linguagens de Programao II

<c:catch> - Captura uma exceo ocorrida no corpo da tag e atribui o valor a exceo ao atributo var. Essa tag tem o objetivo de tratar erros menores, onde no necessrio um tratamento detalhado do erro. Acompanhe os exemplos:
Utilizao
<c:catch var=excecao/>

Resultado
Caso seja lanada uma exceo, ser colocada na varivel excecao.

<html> <body> <c:catch var=excecao> <!-- ir gerar uma exceo pois a classe pessoa no possui o atributo Identicador --> <c:set target=pessoa property=Identicador value=321654/> </c:catch> Exceo: <c:out value=${excecao}/> </body> </html>

Lanar uma exceo, colocar a exceo na varivel excecao e ir imprimir a exceo pela tag <c: out/>.

<c:if> - Executa o corpo da tag apenas se uma expresso for verdadeira. A expresso a ser avaliada denida pelo atributo test. Pode-se ainda atribuir o resultado da expresso a uma varivel informada no atributo var. Veja os exemplos:

Utilizao

Resultado
Verica se a idade da pessoa igual a 18 anos e atribui o resultado dessa vericao a varivel maior.

<c:if test=${pessoa.idade == 18} var=maior/>

<html> <body> <c:if test=${pessoa.id == 1} > Se for a pessoa com Id igual a 1 acessando essa pgina, ento ela ver esse texto </c:if> </body> </html>

Ir vericar o id da pessoa e caso ele seja igual a 1 a pessoa ver o texto inserido dentro da tag <c:if>.

Unidade 14

273

Universidade do Sul de Santa Catarina

<c:choose> - Executa um elemento interno quando este elemento interno for verdadeiro. Esta tag utilizada para vericar mltiplas condies. Cada condio deve ser vericada pela tag interna <c: when>, ela possui um atributo test onde ser feita a avaliao da expresso de forma semelhante a tag <c:if>. Pode-se tambm utilizar uma tag <c:otherwise> para ser o que ser executado caso nenhuma das condies das tags <c:when> for atendida. Veja os exemplos:
Utilizao
<c:choose> <c:when test=${pessoa.idade >= 18}> <c:out value=maior de idade/> </c:when> <c:otherwise> <c:out value=menor de idade/> </ c:otherwise> </c:choose> <html> <body> <c:choose> <c:when test=${cor == Azul}> <c:out value=a cor escolhida foi azul/> </c:when> <c:when test=${cor == Amarelo}> <c:out value=a cor escolhida foi amarelo/> </c:when> <c:otherwise> <c:out value=no foi escolhida nenhuma cor/> </ c:otherwise> </c:choose> </body> </html>

Resultado

Caso a idade da pessoa igual ou maior a 18 anos imprime o resultado maior de idade, seno imprime menor de idade.

Verica se a varivel cor azul ou amarelo, caso seja, a cor impressa na tela, caso contrrio impresso o texto no foi escolhida nenhuma cor.

274

Linguagens de Programao II

<c:forEach> - Executa o corpo da tag vrias vezes. Essa tag possui comportamento semelhante ao comando for de Java. Ela possui seis atributos: items que representa o conjunto de dados que ser percorrido, var que pode ser utilizado para denir a varivel que receber um item a cada iterao, begin, end e step que servem para delimitar os ndices de incio, m e a freqncia da iterao. Essa tag possui ainda o atributo varStatus onde possvel acessar o status de cada iterao. Observe os exemplos a seguir:

Utilizao
<c:forEach items=${requestScope.candidatos} var=candidato> <c:out value=${candidato.nome}/> </c:forEach>

Resultado
Ir recuperar a lista de candidatos que est no request e ir percorr-la imprimindo o nome de cada candidato.

<html> <body> <c:forEach items=${lista} var=elemento> <c:out value =${elemento}/> </c:forEach> </body> </html>

Verica se a varivel lista existe em algum escopo (page, request, session ou application) e ir iterar sobre esse elemento at que todos os itens tenham sido acessados, para que o contedos de cada item possa ser impresso pela tag <c:out>.

<c:forTokens> - Percorre uma String e interage com os tokens da mesma. Possui seis atributos: items que preenchido com a String que ser percorrida, delims onde so informados os tokens que sero buscados na String e como a tag <c:forEach> os atributos begin, end, step, var e varStatus. Veja os exemplos:

Unidade 14

275

Universidade do Sul de Santa Catarina

Utilizao
<c:forTokens items=um;dois;trs/quatro delims=;/ var=token> <c:out value=${token}/> </c:forTokens> <html> <body> <c:forTokens items=um;dois;trs/quatro delims=;/ var=token> <c:out value=${token}/><br/> </c:forTokens> </body> </html>

Resultado
Ser percorrida a String do atributo items e toda vez que for encontrado um dos tokens do atributo delims ser impresso o contedo da varivel token. Ser impresso o seguinte contedo: um dois trs quatro Lembrando que a quebra de linha ocorre devido ao elemento <br/> do HTML.

<c:url> - Cria uma String com uma determinada URL. O atributo value deve ser preenchido com o valor da URL, o resultado impresso na tela ou atribudo a uma varivel denida pelo atributo var. Os exemplos so os seguintes:

Utilizao
<c:url value=/hello.jsp var=url/> <c:out value=${url}/> <html> <body> <c:url value=/minhaPagina.jsp var=url/> <c:out value=${url}/> </body> </html>

Resultado
Cria uma String contendo a URL para a pgina hello.jsp e imprime a URL.

Cria uma String contendo a URL para a pgina minhaPagina.jsp e imprime a URL na pgina.

<c:param> - Permite passar parmetros para uma URL. Pode ser utilizada dentro das tags <c:url>, <c:import> e <c:redirect>. O atributo name preenchido com o nome do parmetro e o atributo value com o respectivo valor. Veja os exemplos:

276

Linguagens de Programao II

Utilizao
<c:url value=/hello.jsp var=url> <c:param name=id value=1/> </c:url> <html> <body> <c:url value=/hello.jsp var=url> <c:param name=id value=1/> </c:url> <a href=<c:out value=${url}/>> link </a> </body> </html>

Resultado
Cria uma String contendo a URL para a pgina hello. jsp e adiciona o parmetro id com o valor 1 para essa URL. Aps isso, criado um link para essa URL.

Cria uma String contendo a URL para a pgina hello. jsp e adiciona o parmetro id com o valor 1 para essa URL. Aps isso, criado um lin para essa URL.

<c:import> - Permite importar o contedo de uma URL para dentro da pgina. Possui um atributo chamado url onde preenchido o valor da URL de onde ser recuperado o contedo. Acompanhe os exemplos:

Utilizao
<c:import url=http://www.google.com/> <html> <body> <c:import url=http://www.terra.com.br/> </body> </html>

Resultado
Adiciona no ponto onde foi colocada a tag o contedo do site indicado no atributo URL.

Dentro do body da pgina importado o contedo da pgina do Terra.

<c:redirect> - Redireciona o cliente de uma aplicao web para uma outra URL. Possui na tag <c:import> um atributo url onde deve ser especicado a URL para onde ser feito o redirecionamento. Veja os exemplos:

Unidade 14

277

Universidade do Sul de Santa Catarina

Utilizao
<c:redirect url=http://www.google.com/>

Resultado
Redireciona automaticamente para o endereo informado no atributo url.

<html> <body> <c:redirect url=http://www.google.com/> </body> </html>

Quando for processada a tag <c:redirect> o usurio ser automaticamente redirecionado para o site do google.

Vamos agora reescrever o ltimo exemplo do captulo anterior para utilizar JSTL: 1) Crie a seguinte estrutura de diretrios para a aplicao: sistemaExibeJSTL |-src |-paginas |-WEB-INF |-classes |-lib 2) Dentro do diretrio pginas crie os seguintes arquivos: cabecalho.jsp
<h1>Aplicao JSP</h1> Esta uma demonstrao da utilizao dos vrios recursos que JSP e biblioteca JSTL possuem<br/>

278

Linguagens de Programao II

conteudo.jsp
<jsp:useBean id=data class=java.util.Date/> <html> <head> <title>Java Server Pages</title> </head> <body> <%@ include file=cabecalho.jsp %> <form action=recuperaInformacoes.jsp method=post> Nome: <input type=text name=nome/><br/> Data de Nascimento: <input type=text name=dtaNascimento/> <input type=submit value=Enviar/> </form> <%@ include file=rodape.jsp %> </body> </html>

recuperaInformacoes.jsp
<%@ taglib prefix=c uri=http://java.sun.com/jstl/core %> <html> <head> <title>Java Server Pages</title> </head> <body> <%@ include file=cabecalho.jsp %> Voc informou os seguintes dados: <br/> Nome : <c:out value=${param.nome}/> <br/> Data de Nascimento: <c:out value=${param.dtaNascimento}/><br/> <%@ include file=rodape.jsp %> </body> </html>

rodape.jsp
<h1>Hoje <c:out value=${data}/></h1>

3) Crie, dentro do diretrio WEB-INF, o arquivo web.xml com o seguinte contedo:


<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> </web-app>

Unidade 14

279

Universidade do Sul de Santa Catarina

4) Copie para o diretrio lib os arquivos: jstl.jar e standard.jar, localizados no pacote de distribuio do JSTL. 5) Copie o diretrio sistemaExibe para o diretrio $catalina_home/webapps. 6) Reinicie o Tomcat, abra o browser e digite http:// localhost:8080/sistemaExibe/paginas/conteudo.jsp. Voc ver algo semelhante gura a seguir:

FIGURA 14.1 - PGINA PRINCIPAL

Aps preencher os dados e clicar no boto enviar, voc ver algo semelhante tela a seguir:

FIGURA 14.2 - TELA DE RESULTADO

Apesar do exemplo ser pequeno, note que agora extramos o cdigo Java de dentro dos JSPs. Dessa forma, a manuteno em pginas JSPs car muito mais fcil e, alm do mais, a sintaxe utilizada nas pginas a mesma utilizada em HTML, ou seja, uma pessoa responsvel pelo design conseguir manutenir essa
280

Linguagens de Programao II

pgina muito mais fcil do que se estivesse escrito uma poro de cdigo Java dentro da pgina JSP. Na prxima unidade voc estudar uma aplicao completa, utilizando tudo que j foi visto at aqui e indo alm, pois ser adicionado a nossa aplicao um banco de dados.

Sntese
Nesta unidade voc pde ver que a utilizao da biblioteca JSTL simplica bastante o desenvolvimento de pginas JSP, pois retira das pginas todo o cdigo Java que geralmente utilizado, quando as aplicaes so desenvolvidas utilizando apenas JSP. Da mesma forma a utilizao de JSTL torna o processo de manuteno dessas pginas bem menos custoso. Aliado a esses pontos a biblioteca JSTL estabelece uma sintaxe comum entre os desenvolvedores e designers, pois o resultado sero pginas seguindo o padro HTML.

Atividades de auto-avaliao
Leia com ateno os enunciados seguintes e resolva as atividades programadas para a sua auto-avaliao. 1) Quais tags so utilizadas para fazer o controle de fluxo em pginas JSP? 2) Quais tags so responsveis por fazer um lao de repeticao em pginas JSP? 3) Qual a sintaxe para utilizar linguagem de expresso nas tags JSTL?

Unidade 14

281

Universidade do Sul de Santa Catarina

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando as seguintes referncias: GEARY, David. Core JSTL: mastering the JSP Standard Tag Library. [S. l.]: Prentice Hall, 2002. BAYERN, Shawn. JSTL in action. [S. l.]: Manning, 2003. http://java.sun.com/products/jsp/jstl/ (Site da especicao JSTL) http://jakarta.apache.org/taglibs/ (Site da implementao de referncia da especicao JSTL)

282

UNIDADE 15

Aplicao Web
Objetivos de aprendizagem
Desenvolver uma aplicao web Java. Utilizar as tecnologias de Servlets, JSP e JSTL. Utilizar como ambiente de execuo o Apache Tomcat.

Sees de estudo
Seo 1 Especificao Seo 2 Implementao

Universidade do Sul de Santa Catarina

Para incio de conversa


At agora, voc estudou as tecnologias Java para web e como elas funcionam. Nessa unidade construiremos uma aplicao que utilizar tudo o que vimos at agora. Ento, vamos a especicao da aplicao. Todo o cdigo fonte da aplicao est disponvel na midiateca.

Seo 1 - Especicao
O mesmo projeto desenvolvido no mdulo anterior ser utilizado nesse momento. Porm, migraremos esse projeto para web. Ou seja, desenvolveremos Servlets para receberem os dados enviados pelos usurios, assim como tambm desenvolveremos pginas JSP com JSTL para exibir ao usurio as informaes. Mas, o modelo de banco de dados estabelecido no mdulo anterior ser agora utilizado conforme a gura 15.1 a seguir:

FIGURA 15.1 - MODELO ENTIDADE RELACIONAMENTO DO PROJETO

284

Linguagens de Programao II

O Modelo de classes a ser utilizado na aplicao apresentado na gura 15.2. Na aplicao criamos duas classes DAO, seguindo o padro Data Access Object. Esse padro no ser explicado detalhadamente agora. O que voc precisa saber no momento que esse padro isola as classes de negcio das classes que vo executar comandos SQL em alguma base de dados. Dessa forma, nas classes ParticipanteDAO e ProjetoDAO contero mtodos para serem utilizados no banco de dados: inserir, apagar, atualizar, recuperar. Criamos tambm dois servlets que sero responsveis por recuperar as informaes fornecidas pelos usurios e preencher os objetos Participante e Projeto.

Participante Servlet

Participante

Projeto

Projeto Servlet

ParticipanteDAO

ProjetoDAO

FIGURA 15.2 -MODELO DE CLASSE DA APLICAO

Antes de comear a anlise da implementao das nossas classes e pginas, veja como est organizado o nosso projeto. O projeto ter a seguinte estrutura de diretrios:

Unidade 15

285

Universidade do Sul de Santa Catarina

aplicacaoWeb | src | - cdigo fonte da aplicao. | WEB-INF |- classes |- classes compiladas |- lib | - bibliotecas que sero utilizadas pela aplicao (driver JDBC, e jars do JSTL) | - web.xml | - pginas JSP. Aps a implementao da aplicao pode-se fazer a instalao da mesma no Servlet Container, apenas tomando cuidado de antes disso retirar o diretrio src da aplicao, pois, de outra forma, quem acessar a aplicao pode ter acesso ao cdigo fonte da mesma.

Seo 2 - Implementao
O cdigo fonte possui o script SQL, necessrio para a criao da base de dados. Esse script deve ser executado antes de se executar a aplicao, pois caso contrrio, no funcionar. O banco de dados utilizado foi o MySQL 5.0.24. Lembre-se, ainda, que foi utilizada a verso do Java 5. Acompanhe o cdigo do servlet ProjetoServlet:

286

Linguagens de Programao II

1 public class ProjetoServlet extends HttpServlet { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 } protected void salvaProjeto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ try{ Projeto projeto = preencheProjeto(request); dao.save(projeto); listaProjetos(request,response); }catch(ParseException e){ e.printStackTrace(); } } protected void apagaProjeto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ dao.delete(Integer.parseInt(request.getParameter(idProjeto))); listaProjetos(request,response); } protected void editaProjeto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ Projeto projeto = null; try { projeto = dao.retrieveByPk(Integer.parseInt(request.getParameter (idProjeto))); private ProjetoDAO dao = new ProjetoDAOMySQL(); private ParticipanteDAO daoParticipante = new ParticipanteDAOMySQL(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String acao = request.getParameter(acao); if (acao.equals(salva)) salvaProjeto(request,response); else if (acao.equals(apaga)) apagaProjeto(request,response); else if (acao.equals(lista)) listaProjetos(request,response); else editaProjeto(request,response);

Unidade 15

287

Universidade do Sul de Santa Catarina

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

} catch (NumberFormatException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } request.setAttribute(projeto, projeto); request.setAttribute(participantes, daoParticipante.retrieveAll()); request.getRequestDispatcher(/projeto.jsp).forward(request,response); } protected void listaProjetos(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setAttribute(projetos, dao.retrieveAll()); request.getRequestDispatcher(/projetos.jsp).forward(request,response); } private Projeto preencheProjeto(HttpServletRequest request) throws ParseException{ String id = request.getParameter(idProjeto); String descProjeto = request.getParameter(descProjeto); String dataInicio = request.getParameter(dataInicio); String dataFim = request.getParameter(dataFim); int percConcluido = Integer.parseInt(request.getParameter(percConcluido)); String situacao = request.getParameter(situacao); String[] participantes = request.getParameterValues(participantes); Projeto projeto = new Projeto(); projeto.addParticipante(daoParticipante.retrieveByPk(Integer.parseInt(participantes[0]))); projeto.setIdProjeto(Integer.parseInt(id)); projeto.setDescricao(descProjeto); projeto.setDataInicio(dataInicio); projeto.setDataFim(dataFim); projeto.setPercentualConcluido(percConcluido); projeto.setSituacao(situacao); return projeto; }

Veja a anlise do cdigo. Linha 1 - feita a declarao de que esta classe um servlet, pois herda de HttpServlet. Linha 2 e 3 - Repare tambm que o serlvet possui dois atributos para as classes DAO (ParticipanteDAO e ProjetoDAO). Como especicado no diagrama de classes, voc ver que essas classes sero chamadas apenas quando se quer realizar alguma operao na base de dados, isolando os servlets das classes que conectam na base de dados.

288

Linguagens de Programao II

Linha 4 - Um ponto interessante a ser analisado nesse cdigo fonte como foi reescrito o mtodo doGet, voc pode notar que na implementao dele feita uma chamada ao mtodo doPost, ou seja, foi implementada a lgica uma nica vez no mtodo doPost e est sendo reutilizada no mtodo doGet. Essa abordagem foi feita para que caso algum faa uma requisio utilizando o mtodo GET, o servlet no lane uma exceo e execute as suas funes normalmente. Linha 7 - No mtodo doPost recuperado um parmetro chamado acao. Esse parmetro contm justamente que ao deve ser feita no momento. Baseado nisso, o servlet delega a tarefa a um determinado mtodo. No servlet ProjetoServlet foram criados mtodos relacionados as operaes que poderiam ser feitas em um determinado projeto, ou seja, as operaes de listar projetos (listaProjeto), apagar projetos (apagaProjeto) e salvar modicaes em projetos (salvaProjeto). Linha 14 - No mtodo salvaProjeto criado um objeto Projeto por meio do mtodo preencheProjeto. Esse mtodo responsvel por capturar todos os parmetros informados na pgina a respeito do projeto, criar um novo projeto e devolvlo. Aps o recebimento desse novo objeto Projeto, o mtodo salvaProjeto chama o mtodo save da classe ProjetoDAO. Essa classe responsvel por efetuar as operaes do projeto no banco de dados. Por m, chamado o mtodo listaProjetos, pois justamente para onde o usurio ser direcionado aps ter salvo informaes de um projeto. Repare tambm que feito um tratamento de exceo, pois no mtodo preecheProjeto possvel ser lanada uma exceo. Linha 23 - No mtodo apagaProjeto o comportamento semelhante ao do salvaProjeto. Porm, ele ir recuperar o identicador do projeto que vir na requisio e com base nisso ir procurar o projeto na base de dados por meio do mtodo retrieveByPK da classe ProjetoDAO. Depois de ter apagado o projeto, o mtodo listaProjetos chamado, que para onde o usurio ser direcionado.

Unidade 15

289

Universidade do Sul de Santa Catarina

Linha 27 - No mtodo editaProjeto a grande novidade a utilizao de dois mtodos o setAttribute da classe HttpServletRequest. Esse mtodo permite que coloquemos dentro da requisio objetos. Dessa forma, pode-se acessar esse objetos nas nossas pginas JSP. Voc ver como acessar esse objetos colocados na requisio, mais a frente. O outro mtodo novo que voc ver o forward da classe RequestDispatcher. Essa classe RequestDispatcher que recuperada a partir de uma requisio (request. getRequestDispatcher) permite que os servlets encaminhem a requisio para algum recurso, geralmente uma pgina JSP. Dessa forma, possvel utilizar servlets em conjunto com JSPs. Nas linhas seguintes esto localizados os mtodos listaProjetos e preecheProjetos. Como eles j foram comentados acima, no sero abordados novamente. A seguir apresentado o servlet ParticipanteServlet que segue a mesma losoa do ProjetoServlet:
1 public class ParticipanteServlet extends HttpServlet { 2 private ParticipanteDAO dao = new ParticipanteDAOMySQL(); 3 private ProjetoDAO daoProjeto = new ProjetoDAOMySQL(); 4 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 5 doPost(request, response); 6 } 7 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 8 String acao = request.getParameter(acao); 9 10 11 12 13 14 15 16 17 } if (acao.equals(salva)) salvaParticipante(request,response); else if (acao.equals(apaga)) apagaParticipante(request,response); else if (acao.equals(lista)) listaParticipante(request, response); else editaParticipante(request,response);

18 protected void salvaParticipante(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 19 try{

290

Linguagens de Programao II

20 21 22 23 24 25 26 } 27 }

Participante participante = preencheParticipante(request); dao.save(participante); listaParticipante(request,response); }catch(ParseException e){ e.printStackTrace();

28 protected void apagaParticipante(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 29 dao.delete(Integer.parseInt(request.getParameter(idParticipante))); 30 listaParticipante(request, response); 31 } 32 protected void editaParticipante(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 33 Participante participante = dao.retrieveByPk(Integer.parseInt(request.getParameter(id Participante))); 34 request.setAttribute(participante, participante); 35 request.setAttribute(projetos, daoProjeto.retrieveAll()); 36 request.getRequestDispatcher(/participante.jsp).forward(request,response); 37 } 38 protected void listaParticipante(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 39 request.setAttribute(participantes, dao.retrieveAll()); 40 request.getRequestDispatcher(/participantes.jsp).forward(request,response); 41 } 42 private Participante preencheParticipante(HttpServletRequest request) throws ParseException{ 43 String id = request.getParameter(idParticipante); 44 String nome = request.getParameter(nome); 45 String cargo = request.getParameter(cargo); 46 String[] projetos = request.getParameterValues(projetos); 47 Participante participante = new Participante(); int posio = Integer.parseInt(projetos[0]); 48 participante.addProjeto(daoProjeto.retrieveByPk(posicao)); 49 participante.setIdParticipante(Integer.parseInt(id)); 50 participante.setNome(nome); 51 participante.setCargo(cargo); 52 return participante; 53 } 54 }

Unidade 15

291

Universidade do Sul de Santa Catarina

Verique que o servlet ParticipanteServlet semelhante ao servlet Projeto, porm ele trata uma unidade de informao diferente, no caso Participante. Veja, agora, como foi estruturada a parte que ir persistir as informaes no banco de dados. Como comentado anteriormente, foi informado a utilizao do padro DAO para separar a lgica de negcio da lgica de persistncia. A seguir so apresentadas as interfaces ParticipanteDAO e ProjetoDAO:

public interface ParticipanteDAO { public boolean save(Participante participante); public boolean delete(int primaryKey); public Participante retrieveByPk(int primaryKey); public Participante retrieveByNome(String nome); public List retrieveAll(); }

public interface ProjetoDAO { public boolean save(Projeto Projeto) throws ParseException; public boolean delete(int primaryKey); public Projeto retrieveByPk(int primaryKey) throws ParseException; public Projeto retrieveByDescricao(String nome); public List retrieveAll(); }

Verique que nas duas interfaces foram especicados apenas os mtodos que podero ser utilizados. Mas por que isso? Dessa forma, voc poder ter vrias implementaes que acessaro diferentes bancos de dados, porm respeitando os mtodos estabelecidos pela interface.

292

Linguagens de Programao II

Assim, possvel diminuir o nvel de amarrao da aplicao a um determinado banco de dados, ou seja, reduzir o acoplamento. Acompanhe, a seguir, as implementaes dessas interfaces, com as classes ParticipanteDAOMySQL e ProjetoDAOMySQL:
1 public class ParticipanteDAOMySQL implements ParticipanteDAO { 2 public boolean delete(int primaryKey) { 3 boolean resultado = false; 4 Connection conn = null; 5 PreparedStatement pstmt = null; 6 try { 7 Class.forName(com.mysql.jdbc.Driver); 8 String URL = jdbc:mysql://localhost:3306/livro; 9 conn = DriverManager.getConnection(URL,root,admin); 10 String sql = delete from participantes where idParticipantes = ?; 11 pstmt = conn.prepareStatement(sql); 12 pstmt.setInt(1,primaryKey); 13 pstmt.executeUpdate(); 14 resultado = true; 15 } catch (ClassNotFoundException e) { 16 e.printStackTrace(); 17 } catch (SQLException e) { 18 e.printStackTrace(); 19 }finally{ 20 if (pstmt != null){ 21 try{ 22 pstmt.close(); 23 }catch(SQLException e){ 24 e.printStackTrace(); 25 } 26 } 27 if(conn != null) { 28 try{ 29 conn.close(); 30 }catch(SQLException e){ 31 e.printStackTrace(); 32 } 33 } 34 } 35 return resultado; 36 } 37 public boolean save(Participante participante) { 38 boolean resultado = false; 39 Connection conn = null; 40 PreparedStatement pstmt = null; 41 try { 42 Class.forName(com.mysql.jdbc.Driver); 43 String URL = jdbc:mysql://localhost:3306/livro; 44 conn = DriverManager.getConnection(URL,root,admin); 45 String sql = null; 46 if (participante.getIdParticipante() != 0) 47 sql = update participantes set vNome = ?, vCargo = ? where idParticipantes = ?; 48 else

Unidade 15

293

Universidade do Sul de Santa Catarina

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 }

sql = insert into participantes (vNome, vCargo) values (?,?); pstmt = conn.prepareStatement(sql); pstmt.setString(1,participante.getNome()); pstmt.setString(2, participante.getCargo()); if (participante.getIdParticipante() != 0){ pstmt.setInt(3,participante.getIdParticipante()); saveProjetos(participante); } pstmt.executeUpdate(); resultado = true; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return resultado;

81 public boolean saveProjetos(Participante participante) { 82 boolean resultado = false; 83 Connection conn = null; 84 PreparedStatement pstmt = null; 85 try { 86 Class.forName(com.mysql.jdbc.Driver); 87 String URL = jdbc:mysql://localhost:3306/livro; 88 conn = DriverManager.getConnection(URL,root,admin); 89 String sql = insert into controles (Projetos_idProjetos, Participantes_idParticipantes) values (?,?); 90 pstmt = conn.prepareStatement(sql); 91 pstmt.setInt(1, participante.getProjetos().get(0).getIdProjeto()); 92 pstmt.setInt(2,participante.getIdParticipante()); 93 pstmt.executeUpdate(); 94 resultado = true; 95 } catch (ClassNotFoundException e) { 96 e.printStackTrace(); 97 } catch (SQLException e) { 98 e.printStackTrace(); 99 }finally{ 100 if (pstmt != null){

294

Linguagens de Programao II

101 try{ 102 pstmt.close(); 103 }catch(SQLException e){ 104 e.printStackTrace(); 105 } 106 } 107 if(conn != null) { 108 try{ 109 conn.close(); 110 }catch(SQLException e){ 111 e.printStackTrace(); 112 } 113 } 114 } 115 return resultado; 116 } 117 public Participante retrieveByPk(int primaryKey) { 118 Participante participante = null; 119 Connection conn = null; 120 PreparedStatement pstmt = null; 121 ResultSet rs = null; 122 try { 123 Class.forName(com.mysql.jdbc.Driver); 124 String URL = jdbc:mysql://localhost:3306/livro; 125 conn = DriverManager.getConnection(URL,root,admin); 126 String sql = select * from participantes where idParticipantes = ?; 127 pstmt = conn.prepareStatement(sql); 128 pstmt.setInt(1,primaryKey); 129 rs = pstmt.executeQuery(); 130 while (rs.next()) { 131 participante = new Participante(); 132 participante.setIdParticipante(rs.getInt(idParticipantes)); 133 participante.setNome(rs.getString(vNome)); 134 participante.setCargo(rs.getString(vCargo)); 135 } 136 } catch (ClassNotFoundException e) { 137 e.printStackTrace(); 138 } catch (SQLException e) { 139 e.printStackTrace(); 140 }finally{ 141 if (rs != null){ 142 try{ 143 rs.close(); 144 }catch(SQLException e){ 145 e.printStackTrace(); 146 } 147 } 148 if (pstmt != null){ 149 try{ 150 pstmt.close(); 151 }catch(SQLException e){ 152 e.printStackTrace(); 153 }

Unidade 15

295

Universidade do Sul de Santa Catarina

154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208

} if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return participante; } public Participante retrieveByNome(String nome) { Participante participante = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = select * from participantes where vNome = ?; pstmt = conn.prepareStatement(sql); pstmt.setString(1,nome); rs = pstmt.executeQuery(); while (rs.next()) { participante = new Participante(); participante.setIdParticipante(rs.getInt(idParticipantes)); participante.setNome(rs.getString(vNome)); participante.setCargo(rs.getString(vCargo)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (rs != null){ try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); } } if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace();

296

Linguagens de Programao II

209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 }

} } } return participante; } public List retrieveAll() { Participante participante = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; ArrayList<Participante> lista = new ArrayList<Participante>(); try { Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = select * from participantes; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); while (rs.next()) { participante = new Participante(); participante.setIdParticipante(rs.getInt(idParticipantes)); participante.setNome(rs.getString(vNome)); participante.setCargo(rs.getString(vCargo)); lista.add(participante); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (rs != null){ try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); } } if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return lista; }

Unidade 15

297

Universidade do Sul de Santa Catarina

Linha 1 Veja, na primeira linha, que a nossa classe se chama ParticipanteDAOMySQL e ela implementa a interface ParticipanteDAO. Por que isso? Imagine que voc tem mais de um banco de dados, e assim, voc ter algumas sintaxes proprietrias de cada banco, o que tornar invivel voc colocar toda a lgica de acesso aos dados em uma nica classe. Dessa forma, estabeleceu-se uma interface para especicar os mtodos que todos que a implementarem devem possuir e, a partir da, pode ser implementada uma classe para cada banco utilizado. No nosso caso foi utilizado o MySQL. Linha 2 a 35 - implementado o mtodo delete, que ir remover da base de dados um determinado participante, baseado no identicador desse participante. A partir da, o processo normal de conexo com banco de dados e a execuo de comando SQL feita. Linha 37 a 80 - Nesse trecho implementado o mtodo saveParticipante, em que as informaes do participante sero salvas. Perceba que na linha 46 feita uma vericao justamente para saber se o comando a ser executado no MySQL ser uma atualizao ou uma insero do participante na base de dados. Linha 81 a 116 - Os projetos vinculados a um participante so salvos na base de dados nesse momento. Linha 117 a 164 - A recuperao de um participante da base de dados feita nesse momento. Repare que nesse mtodo a recuperao feita com base no identicador do participante. Linha 165 a 213 - Nesse trecho de cdigo, feita a mesma lgica do mtodo anterior. Porm, agora a busca feita pelo nome do participante e no pelo identicador do participante. Linha 214 a 262 - Neste mtodo feita uma busca para retornar todos os participantes cadastrados no sistema.

298

Linguagens de Programao II

A seguir apresentado a listagem do cdigo relativo ao ProjetoDAOMySQL:


001 package br.unisul.persistence.mysql; 002 003 import java.sql.Connection; 004 import java.sql.DriverManager; 005 import java.sql.PreparedStatement; 006 import java.sql.ResultSet; 007 import java.sql.SQLException; 008 import java.text.ParseException; 009 import java.text.SimpleDateFormat; 010 import java.util.ArrayList; 011 import java.util.Date; 012 import java.util.List; 013 import br.unisul.model.Projeto; 014 import br.unisul.persistence.ProjetoDAO; 015 016 public class ProjetoDAOMySQL implements ProjetoDAO { 017 018 public boolean save(Projeto projeto) throws ParseException { 019 boolean resultado = false; 020 Connection conn = null; 021 PreparedStatement pstmt = null; 022 try { 023 Class.forName(com.mysql.jdbc.Driver); 024 String URL = jdbc:mysql://localhost:3306/livro; 025 conn = DriverManager.getConnection(URL,root,admin); 026 String sql = null; 027 if (projeto.getIdProjeto() != 0) 028 sql = update projetos set vDescricao = ?, dDataInicio = ?, dDataFinal = ?, nPercConcluido = ?, vSituacao = ? where idProjetos = ?; 029 else 030 sql = insert into projetos (vDescricao, dDataInicio, dDataFinal, nPercConcluido, vSituacao) values (?,?,?,?,?); 031 SimpleDateFormat formatador = new SimpleDateFormat(dd/MM/yyyy); 032 pstmt = conn.prepareStatement(sql); 033 pstmt.setString(1,projeto.getDescricao()); 034 pstmt.setDate(2,new java.sql.Date(formatador.parse(projeto.getDataInicio()).getTime())); 035 pstmt.setDate(3,new java.sql.Date(formatador.parse(projeto.getDataFim()).getTime())); 036 pstmt.setInt(4, projeto.getPercentualConcluido()); 037 pstmt.setString(5, projeto.getSituacao()); 038 if (projeto.getIdProjeto() != 0){ 039 pstmt.setInt(6,projeto.getIdProjeto()); 040 saveParticipantes(projeto); 041 } 042 pstmt.executeUpdate(); 043 resultado = true; 044 } catch (ClassNotFoundException e) { 045 e.printStackTrace(); 046 } catch (SQLException e) { 047 e.printStackTrace(); 048 }finally{ 049 if (pstmt != null){ 050 try{

Unidade 15

299

Universidade do Sul de Santa Catarina

051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100

pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return resultado; } public boolean saveParticipantes(Projeto projeto) { boolean resultado = false; Connection conn = null; PreparedStatement pstmt = null; try { Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = insert into controles (Projetos_idProjetos, Participantes_idParticipantes) values (?,?); pstmt = conn.prepareStatement(sql); pstmt.setInt(1,projeto.getIdProjeto()); pstmt.setInt(2, projeto.getParticipantes().get(0).getIdParticipante()); pstmt.executeUpdate(); resultado = true; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } }

300

Linguagens de Programao II

101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

return resultado; } public boolean delete(int primaryKey) { boolean resultado = false; Connection conn = null; PreparedStatement pstmt = null; try { Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = delete from projetos where idProjetos = ?; pstmt = conn.prepareStatement(sql); pstmt.setInt(1,primaryKey); pstmt.executeUpdate(); resultado = true; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return resultado; } public Projeto retrieveByPk(int primaryKey) throws ParseException { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; Projeto projeto = null; try { Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = select idProjetos, vDescricao, + DATE_FORMAT(dDataInicio, %d/%m/%y) as dDataInicio, + DATE_FORMAT(dDataFinal, %d/%m/%y) as dDataFinal, + nPercConcluido, vSituacao from projetos where idProjetos = ?;

Unidade 15

301

Universidade do Sul de Santa Catarina

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201

pstmt = conn.prepareStatement(sql); pstmt.setInt(1,primaryKey); rs = pstmt.executeQuery(); while (rs.next()) { projeto = new Projeto(); projeto.setIdProjeto(rs.getInt(idProjetos)); projeto.setDescricao(rs.getString(vDescricao)); projeto.setDataInicio(rs.getString(dDataInicio)); projeto.setDataFim(rs.getString(dDataFinal)); projeto.setPercentualConcluido(rs.getInt(nPercConcluido)); projeto.setSituacao(rs.getString(vSituacao)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (rs != null){ try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); } } if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return projeto; } public Projeto retrieveByDescricao(String nome) { Projeto projeto = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = select idProjetos, vDescricao, +

302

Linguagens de Programao II

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 } 243 244 public List retrieveAll() { 245 Projeto projeto = null; 246 ArrayList<Projeto> lista = new ArrayList<Projeto>(); 247 Connection conn = null; 248 PreparedStatement pstmt = null; 249 ResultSet rs = null; 250 try {

DATE_FORMAT(dDataInicio, %d/%m/%y) as dDataInicio, + DATE_FORMAT(dDataFinal, %d/%m/%y) as dDataFinal, + nPercConcluido, vSituacao from projetos where vDescricao = ?; pstmt = conn.prepareStatement(sql); pstmt.setString(1,nome); rs = pstmt.executeQuery(); while (rs.next()) { projeto = new Projeto(); projeto.setIdProjeto(rs.getInt(idProjetos)); projeto.setDescricao(rs.getString(vDescricao)); projeto.setDataInicio(rs.getString(dDataInicio)); projeto.setDataFim(rs.getString(dDataFinal)); projeto.setPercentualConcluido(rs.getInt(nPercConcluido)); projeto.setSituacao(rs.getString(vSituacao)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ if (rs != null){ try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); } } if (pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return projeto;

Unidade 15

303

Universidade do Sul de Santa Catarina

251 252 253 254

Class.forName(com.mysql.jdbc.Driver); String URL = jdbc:mysql://localhost:3306/livro; conn = DriverManager.getConnection(URL,root,admin); String sql = select idProjetos, vDescricao, + DATE_FORMAT(dDataInicio, %d/%m/%y) as dDataInicio, + DATE_FORMAT(dDataFinal, %d/%m/%y) as dDataFinal, + nPercConcluido, vSituacao from projetos; 255 pstmt = conn.prepareStatement(sql); 256 rs = pstmt.executeQuery(); 257 while (rs.next()) { 258 projeto = new Projeto(); 259 projeto.setIdProjeto(rs.getInt(idProjetos)); 260 projeto.setDescricao(rs.getString(vDescricao)); 261 projeto.setDataInicio(rs.getString(dDataInicio)); 262 projeto.setDataFim(rs.getString(dDataFinal)); 263 projeto.setPercentualConcluido(rs.getInt(nPercConcluido)); 264 projeto.setSituacao(rs.getString(vSituacao)); 265 lista.add(projeto); 266 } 267 } catch (ClassNotFoundException e) { 268 e.printStackTrace(); 269 } catch (SQLException e) { 270 e.printStackTrace(); 271 }finally{ 272 if (rs != null){ 273 try{ 274 rs.close(); 275 }catch(SQLException e){ 276 e.printStackTrace(); 277 } 278 } 279 if (pstmt != null){ 280 try{ 281 pstmt.close(); 282 }catch(SQLException e){ 283 e.printStackTrace(); 284 } 285 } 286 if(conn != null) { 287 try{ 288 conn.close(); 289 }catch(SQLException e){ 290 e.printStackTrace(); 291 } 292 } 293 } 294 return lista; 295 } 296 297 }

Perceba que o cdigo muito semelhante ao ParticipanteDAOMysQL. Porm, agora tratada a unidade de informao Projeto.
304

Linguagens de Programao II

A seguir veremos a pgina JSP de cadastro de participante no projeto:


1 2 3 4 5 6 7 8 9 10 11 12 13 <%@ taglib prefix=c uri=http://java.sun.com/jstl/core%> <html> <body> <h1>Novo Participante</h1><br/> <form action=participanteServlet method=POST> <input type=hidden name=acao value=salva/> <input type=hidden name=idParticipante value=<c:out value=${param.idParticipante}/>/> Nome: <input type=text name=nome value=<c:out value=${participante.nome}/>/> <br/> Cargo: <input type=text name=cargo size=8 value=<c:out value=${participante.cargo}/>/> <br/> <c:if test=${participante.idParticipante != null}> Projetos <select name=projetos> <c:forEach items=${projetos} var=projeto> <option value=<c:out value=${projeto.idProjeto}/>><c:out value=${projeto. descricao}/></option> 14 </c:forEach> 15 </select><br> 16 </c:if> 17 <p/>&nbsp; 18 <input type=submit value=Salvar> 19 </form> 20 </body> 21 </html>

Linha 1 foi feita a declarao para utilizar a biblioteca Core do JSTL. Linha 6 foi criado um campo escondido para informar qual ao ser executada no servlet ParticipanteServlet, no caso, a ao ser salva. Linha 7 foi recuperado o identicador do participante, pois esta pgina utilizada tanto para cadastrar um novo participante quanto um editar um j existente. Caso se esteja editando, voc precisa desse campo para poder atualizar o registro desse participante na base de dados. Perceba que estamos utilizando JSTL para recuperar o identicador do participante. Linhas 7, 8 e 9 - Verique que estamos utilizando JSTL para preencher os 3 campos dos formulrio apresentados nessas linhas. Porm, se quando forem analisadas as expresses da tag <c:out> for vericado que no possui valor nenhum, ento retornada uma String vazia. Dessa forma, os nossos campos no caro com caracteres estranhos ou mesmo com o texto <c:out value=${participante.nome}/>.

Unidade 15

305

Universidade do Sul de Santa Catarina

Linha 10 - utilizado JSTL novamente para fazer uma deciso se o combo de projetos deve aparecer na pgina nesse momento ou no. Caso esteja sendo editado o cadastro do participante habilitado o combo com os projetos para serem selecionados. A seguir apresentada a pgina de listagem dos participantes:
1 <%@ taglib prefix=c uri=http://java.sun.com/jstl/core%> 2 <html> 3 <body> 4 <table> 5 <td><h1>Projetos cadastrados</h1></td> 6 <c:forEach items=${participantes} var=participante varStatus=status> 7 <tr> 8 <td>Participante#<c:out value=${status.count}/>: <c:out value=${participante.nome}/> | 9 <a href=participanteServlet?acao=edita&idParticipante=<c:out value=${participante. idParticipante}/>>Editar</a> | 10 <a href=participanteServlet?acao=apaga&idParticipante=<c:out 11 value=${participante.idParticipante}/>>Apagar</a> 12 </td> 13 </tr> 14 </c:forEach> 15 </table> 16 </body> 17 </html>

Linha 1 - novamente feita a declarao para utilizao da biblioteca Core do JSTL. Linha 6 - utilizada a tag <c:forEach> para se percorrer a lista de participantes para poder imprimi-los na pgina. Essa lista aquele objeto que foi colocado no request por meio do mtodo setAttribute quando estvamos analisando o cdigo do ProjetoServlet. Linha 9 - construdo um link para acessar um determinado participante, para poder edit-lo ou apag-lo. Note que a referncia desse link diretamente para o servlet e j passamos a ao que ser executada com o identicador do participante. Por exemplo, <a href=participanteServlet?acao=apaga&idP articipante=<c:out value=${participante.idParticipante}/ >>Apagar</a> est informando que o link para poder apagar um participante ser: participanteSerlvet com o parmetro acao

306

Linguagens de Programao II

sendo apaga e que o idParticipante ser o valor do resultado da execuo da tag <c:out> As pginas relacionadas ao projeto seguem o mesmo princpio das pginas dos participantes e podem ser encontradas no arquivo que contm o cdigo fonte. Como acontece com os participantes, o projeto tambm possui uma pgina de cadastro dos projetos e uma para listar os projetos existentes. O cdigo das duas pginas apresentado a seguir:

projeto.jsp
1 2 3 4 5 6 7 8 <%@ taglib prefix=c uri=http://java.sun.com/jstl/core%> <html> <body> <h1>Novo Projeto</h1><br/> <form action=projetoServlet method=POST> <input type=hidden name=acao value=salva/> <input type=hidden name=idProjeto value=<c:out value=${param.idProjeto}/>/> Descrio: <input type=text name=descProjeto value=<c:out value=${projeto. descricao}/>/> <br/> 9 Data de Incio: <input type=text name=dataInicio size=8 value=<c:out value=${projeto.dataInicio}/>/> 10 <br/> 11 Data de Fim: <input type=text name=dataFim size=8 value=<c:out value=${projeto. dataFim}/>/> <br/> 12 Percentual Concludo: <input type=text name=percConcluido size=3 value=<c:out value=${projeto.percentualConcluido}/>/> <br/> 13 Situao: <input type=text name=situacao value=<c:out value=${projeto. situacao}/>/> <br/> 14 <c:if test=${projeto.idProjeto != null}> 15 Participante <select name=participantes> 16 <c:forEach items=${participantes} var=part> 17 <option value=<c:out value=${part.idParticipante}/>><c:out value=${part. nome}/></option> 18 </c:forEach> 19 </select><br> 20 </c:if> 21 <p/>&nbsp; 22 <input type=submit value=Salvar> 23 </form> 24 </body> 25 </html>

Unidade 15

307

Universidade do Sul de Santa Catarina

projetos.jsp
1 <%@ taglib prefix=c uri=http://java.sun.com/jstl/core%> 2 <html> 3 <body> 4 <table> 5 <td><h1>Projetos cadastrados</h1></td> 6 <c:forEach items=${projetos} var=projeto varStatus=status> 7 <tr> 8 <td>Projeto#<c:out value=${status.count}/>: <c:out value=${projeto.descricao}/> | 9 <a href=projetoServlet?acao=edita&idProjeto=<c:out value=${projeto.idProjeto}/>>Editar</a> | 10 <a href=projetoServlet?acao=apaga&idProjeto=<c:out value=${projeto.idProjeto}/>>Apagar</a> 11 </td> 12 </tr> 13 </c:forEach> 14 </table> 15 </body> 16 </html>

A seguir veja o contedo do descritor da aplicao web.xml:


1 <?xml version=1.0 encoding=UTF-8?> 2 <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> 3 <web-app> 4 <servlet> 5 <servlet-name>projetoServlet</servlet-name> 6 <servlet-class>br.unisul.control.ProjetoServlet</servlet-class> 7 </servlet> 8 <servlet> 9 <servlet-name>participanteServlet</servlet-name> 10 <servlet-class>br.unisul.control.ParticipanteServlet</servlet-class> 11 </servlet> 12 <servlet-mapping> 13 <servlet-name>projetoServlet</servlet-name> 14 <url-pattern>/projetoServlet</url-pattern> 15 </servlet-mapping> 16 <servlet-mapping> 17 <servlet-name>participanteServlet</servlet-name> 18 <url-pattern>/participanteServlet</url-pattern> 19 </servlet-mapping> 20 </web-app>

Acompanhe a anlise do cdigo. Linha 1 e 2 - cabealho padro dos descritores de aplicao. Linha 5 e 6 - atribudo um identicador ao servlet ProjetoServlet. Dentro do nosso descritor ele ser referenciado como projetoSerlvet.

308

Linguagens de Programao II

Linha 9 e 10 - o mesmo propsito da explicao anterior, porm agora o identicador para um servlet direfente e o prprio identicar diferente, no caso, participanteServlet. Linha 13 e 14 - vinculao do servlet projetoServlet ao padro de url /projetoServlet, ou seja, toda vez que chegar uma requisio que no seu endereo contenha o contedo ../projetoServlet..., essa requisio ser encaminhada ao servlet projetoServlet. Linha 17 e 18 - o mesmo princpio explicado anteiormente, porm para o servlet do participante. Lembre-se que para essa aplicao o processo de compilao dos Servlets deve ser o mesmo utilizado nos exemplos dos captulos anteriores, ou seja:

javac classpath $catalina_home/common/lib/servlet-api.jar d WEB-INF/classes src/ MeuPrimeiroServlet.java

Ateno! Lembre-se de dois pontos: o comando deve estar numa linha apenas e substitua $catalina_home pelo diretrio onde est localizado o Tomcat.

Unidade 15

309

Universidade do Sul de Santa Catarina

Sntese
Ao longo dessa unidade, voc viu como unir o estudado at agora em uma aplicao web. Essa foi apenas a primeira parte, pois existe muitas tecnologias da Sun que do suporte ao desenvolvimento de aplicaes web. Procure, sempre que desenvolver aplicaes web, utilizar tecnologias que auxiliem no desenvolvimento e principalmente facilitem a manuteno do sistema. Porm, voc deve utilizar as tecnologias em conjunto com a orientao a objetos. Dessa forma, voc conseguir desenvolver aplicaes possveis de sofrerem manuteno, seja ela corretiva, adaptativa ou evolutiva.

Atividades de auto-avaliao
Leia com ateno os enunciados seguintes e resolva as atividades programadas para a sua auto-avaliao. 1) Como foi feito o mapeamento dos Servlets da aplicao de exemplo? 2) Qual o padro de projeto que procura isolar o cdigo relacionado a banco de dados em classes especficas?

310

Linguagens de Programao II

Saiba mais
Voc pode saber mais sobre o assunto estudado nesta unidade consultando as seguintes referncias: GEARY, David. Core JSTL: mastering the JSP Standard Tag Library. [S. l.]: Prentice Hall, 2002. BAYERN, Shawn. JSTL in action. [S. l.]: Manning, 2003. HALL, Marty. Core Servlets and JavaServer Pages. [S. l.]: Prentice Hall, [200?]. HALL, Marty. More Servlets and JavaServer Pages. [S. l.]: Pearson Education, [200?]. FIELDS, Duane; KOLB, Mark; Web development with Java Server Pages. [S. l.]: Manning Publications, 2000. SIERRA, Kathy; BASHMAN, Brian; BATES, Bert. Head rst Servlets and JSP. [S. l.]: OReilly, 2004.
http://java.sun.com/products/jsp/jstl/ (Site da especificao JSTL) http://jakarta.apache.org/taglibs/ (Site da implementao de referncia da especificao JSTL) http://servlets.com/ (Site com muito material sobre a tecnologia Java Servlets) http://tomcat.apache.org/ (Site oficial do projeto Apache Tomcat) http://java.sun.com/products/servlet/ (Site oficial da Sun sobre a tecnologia Java Servlets) http://www.jcp.org/aboutJava/communityprocess/final/jsr154/index. html (Site da especificao dos Java Servlets) http://www.w3.org/CGI/ (Site do consrcio W3C sobre a tecnologia CGI) http://www.w3.org/Protocols/ (Site do consrcio W3C sobre o protocolo http)

Unidade 15

311

Para concluir o estudo


Caro aluno! Conclumos mais uma etapa do curso. A disciplina de Linguagem de Programao II chegou ao m. Nessa disciplina voc aprendeu trs tpicos muito importantes exigidos no desenvolvimento de sistemas mais prossionais. O desenvolvimento de interfaces grcas vital para a usabilidade de um sistema. Sistemas que manipulam dados em um banco de dados tambm. E o desenvolvimento de aplicaes que rodem na web , nos dias de hoje, um requisito primordial no desenvolvimento de sistemas. A inteno nesse livro foi destacar os itens mais importantes desses trs tpicos. Procuramos dividir o livro de forma que os trs tpicos tivessem o mesmo nmero de unidades visto que os trs assuntos so importantes. No se pretende esgotar o assunto referente a eles nesse livro. Uma prova disto que voc ter mais uma disciplina de programao que abordar com mais profundidade o tpico de desenvolvimento de aplicaes para web. Foi um trabalho longo e de um nvel tcnico mais elevado, que exigiu de voc o conhecimento de todas as disciplinas de programao cursadas at o momento. importante destacar que a tendncia que o nvel tcnico das disciplinas de programao aumente com a aproximao do trmino do curso. Porm, acreditamos que se voc est lendo essas pginas nais muito provvel que esse desao tenha sido vencido. Esperamos que voc tenha gostado da disciplina.

Referncias
BAYERN, Shawn. JSTL in action. [S. l.]: Manning, 2003. DATE, C. J. Bancos de dados: fundamentos. Rio de Janeiro: Campus, 1985. DATE, C. J. Introduo ao sistema de banco de dados. 8 ed. Rio de Janeiro: Campus, 1990. DEITEL, H. M.; DEITEL, P. J. Java como programar. 6 ed. Porto Alegre: Person, 2005. FALKNER, Jason. JONES, Kevin. Servlets and Java Server Pages: the J2EE technology web tier. [S. l.]: Addison-Wesley, 2003. FIELDS, Duane; KOLB, Mark; Web development with Java Server Pages. [S. l.]: Manning Publications, 2000. GEARY, David. Core JSTL: mastering the JSP Standard Tag Library. [S. l.]: Prentice Hall, 2002. HALL, Marty. Core Servlets and JavaServer Pages. [S. l.]: Prentice Hall, [200?]. HALL, Marty. More Servlets and JavaServer Pages. [S. l.]: Pearson Education, [200?]. HORSTMANN, Cay S. Big Java. Porto Alegre: Artmed Bookman: 2004. HORSTMANN, Cay; CORNELL, Gary. Core JAVA 2. Volume I Fundamentos. 7 ed. Editora Alta Books, 2005. KURNIAWAN, Budi. Java for web with Servlets, JSP and EJB: a developers guide to J2EE solutions. [S. l.]: New Riders, 2002.

Universidade do Sul de Santa Catarina

SIERRA, Kathy; BASHMAN, Brian; BATES, Bert. Head rst Servlets and JSP. [S. l.]: OReilly, 2004. SIERRA, Kathy; BATES, Bert. Java use a cabea. Alta Books: 2005. SILVA, Ivan Jos de Mecenas. Java 2: fundamentos Swing e JDBC. Rio de Janeiro: Editora Alta Books, 2003. SOARES, Walace. MySQL: conceitos e aplicaes. So Paulo: Erica, 2002. THOMPSON, Marco Aurlio. Java 2 & banco de dados. So Paulo, rica: 2002.

Sites de Referncia
http://jakarta.apache.org/taglibs/ (Site da implementao de referncia da especicao JSTL) http://java.sun.com/docs//books/tutorial/uiswing/components/tabbedpane.html (How to Use Tabbed Panes) http://java.sun.com/docs/books/tutorial/uiswing/components/button.html (How to Use Buttons, CheckBoxes and Radio Buttons) http://java.sun.com/docs/books/tutorial/uiswing/components/panel.html (Como usar Panels) http://java.sun.com/docs/books/tutorial/uiswing/index.html (Creating a GUI with JFC/Swing) http://java.sun.com/products/jsp/ (Site da especicao Java Server Pages (JSP)) http://java.sun.com/products/jsp/jstl/ (Site da especicao JSTL) http://java.sun.com/products/servlet/ (Site ocial da Sun sobre a tecnologia Java Servlets) http://servlets.com/ (Site com muito material sobre a tecnologia Java Servlets) http://tomcat.apache.org/ (Site ocial do projeto Apache Tomcat) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/ (Swing The Book) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/Chapter10html/ (List) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/Chapter3html/ (Frames, Panels, and Borders) http://www.csie.ntu.edu.tw/~piaip/docs/Swing/Chapter9html/ (ComboBox) http://www.inf.pucrs.br/~ash/lapro2/lapro2_eventos.pdf (Tratamento de eventos) http://www.jcp.org/aboutJava/communityprocess/nal/jsr154/index.html (Site da especicao dos Java Servlets) http://www.netbeans.org/ (IDE NetBeans Ferramenta com recurso para criao de GUI) http://www.w3.org/CGI/ (Site do consrcio W3C sobre a tecnologia CGI) http://www.w3.org/Protocols/ (Site do consrcio W3C sobre o protocolo http)

316

Sobre os professores conteudistas


Andra Sabedra Bordin graduada em Anlise de Sistemas pela UCPel, Especialista em Sistemas de Informao, Mestre em Cincia da Computao e Doutoranda em Engenharia e Gesto do Conhecimentos pela UFSC. Professora dos cursos de Sistemas de Informao, Cincia da Computao e de Tecnlogo em Web Design e Programao da Unisul. Tambm analista de Sistemas do Instituto Stela. Andrik Dimitrii Braga de Albuquerque nasceu em Rio Branco, AC. Formado em Cincia da Computao pela Universidade do Vale do Itaja. Atualmente Programador Junior no Instituto Stela e atua como instrutor no curso seqencial de Desenvolvimento de aplicao web utilizando a tecnologia Java na Universidade do Sul de Santa Catarina Unidade Tubaro. Marcelo Medeiros formado em Cincias da Computao pela Universidade Regional de Blumenau, leciona na Unisul, nos cursos de Cincia da Computao, Sistemas de Informao e Engenharia Eltrica, desde 1995. Desenvolve junto a Unisul o projeto de pr-incubadora tecnolgica, na qual os alunos recebem um acompanhamento tcnico de dois anos na criao da sua empresa, funcionando desta forma como uma extenso ao aluno na sua formao de empreendedor. Na rea especca de computao, desenvolve projetos nas reas de banco de dados e apresentao de produtos em 3D e monitoramento de imagens atravs de cmeras e sistemas de vdeo por rede, chamados de NVS. mestrando no curso de Cincia da Linguagem da referida universidade (UNISUL), na qual desenvolve um projeto de anlise da fundamentao dos cursos de Cincias da Computao, como cursos de formao humana, e no apenas exatas.

Respostas e comentrios das atividades de auto-avaliao


UNIDADE 1
1) Resposta Pessoal. 2) Cdigo da aplicao:

public interface CalculoFiguras{ public abstract double calculaArea(); //os modicadores public abstract no so obrigatrios } //superclasse Quadriltero implementa a interface CalculoFiguras public abstract class Quadrilatero implements CalculoFiguras { private int base, altura; //atributos e mtodos public Quadrilatero(){ base=0; altura=0; } public void setBase(int base){ this.base = base; } public void setAltura(int altura){ this.altura = altura; } public int getBase(){ return this.base; } public int getAltura(){ return this.altura; } } //subclasse Trapzio estende a classe Quadriltero public class Trapezio extends Quadrilatero{ private int basem; //atributos e mtodos

Universidade do Sul de Santa Catarina

public Trapezio(){ basem=0; } public void setBaseM(int basem){ this.basem = basem; } public int getBaseM(){ return this.basem; } public double calculaArea(){ return ((getBase()+this.basem)/2)*getAltura(); } } //subclasse Retngulo estende a classe Quadriltero public class Retangulo extends Quadrilatero{ public double calculaArea(){ return getBase()*getAltura(); } } public class TestaInterface{ public static void main(String args[]){ Trapezio t = new Trapezio(); t.setBase(4); t.setBaseM(2); t.setAltura(3); System.out.println(Area do Trapezio + t.calculaArea()); Retangulo r = new Retangulo(); r.setBase(5); r.setAltura(6); System.out.println(Area do Retangulo + r.calculaArea()); } }

320

Linguagens de Programao II

UNIDADE 2
Cdigo da aplicao: import java.awt.FlowLayout; import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JLabel; //classe do componente de rtulo (label). Exibe texto e imagem import javax.swing.JTextField; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JButton; public class GuiJAtivUnid2 extends JFrame{ private JLabel labelNu1; private JLabel labelNu2, labelNu3; private JTextField textfieldNu1; private JTextField textfieldNu2,textfieldNu3; private JLabel labelResultado,labelSituacao; private JButton buttonResultado; public GuiJAtivUnid2(){ super(Exemplo JTextField); setLayout(new FlowLayout()); labelNu1 = new JLabel(Nota 1); labelNu1.setToolTipText(Digite a primeira nota); add(labelNu1); textfieldNu1 = new JTextField(5); add(textfieldNu1); labelNu2 = new JLabel(Nota 2); labelNu2.setToolTipText(Digite a segunda nota); add(labelNu2); textfieldNu2 = new JTextField(5); add(textfieldNu2); labelNu3 = new JLabel(Nota 3); labelNu3.setToolTipText(Digite a terceira nota); add(labelNu3); textfieldNu3 = new JTextField(5); add(textfieldNu3); buttonResultado = new JButton(Media); add(buttonResultado); TrataEventoBotao trataevento = new TrataEventoBotao(); buttonResultado.addActionListener(trataevento); labelResultado = new JLabel(); add(labelResultado);

321

Universidade do Sul de Santa Catarina

labelSituacao = new JLabel(); add(labelSituacao); } private class TrataEventoBotao implements ActionListener{ public void actionPerformed(ActionEvent event){ labelResultado.setText(Double.toString((Double.parseDouble(textfieldNu1.getText())+Double. parseDouble(textfieldNu2.getText())+Double.parseDouble(textfieldNu3.getText()))/3)); if (Double.parseDouble(labelResultado.getText()) >= 7.0) labelSituacao.setText(Aprovado); else if ((Double.parseDouble(labelResultado.getText()) >= 2.0) && (Double.parseDouble( labelResultado.getText()) < 7.0)) labelSituacao.setText(Exame); else labelSituacao.setText(Reprovado); } } public static void main(String arg[]){ GuiJAtivUnid2 guiativ = new GuiJAtivUnid2(); guiativ.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiativ.setSize(275,280); guiativ.setVisible(true); } }

322

Linguagens de Programao II

UNIDADE 3
Cdigo da atividade: import java.awt.FlowLayout; //classe do gerenciador de layout import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JTextField; //classe do componente de texto import javax.swing.JLabel; //classe do componente de texto import javax.swing.JRadioButton; //classe do componente boto de rdio import javax.swing.ButtonGroup; //classe do agrupador de botes de rdio import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.ItemListener; //interface que trato o evento do componente JRadioButton import java.awt.event.ItemEvent; //classe do evento gerado pelo componente JRadioButton import java.awt.Font; public class GuiJAtivUnid3 extends JFrame{ private JLabel label1; private JLabel label2; private JLabel label3; private JLabel label4; private JTextField textfield1; private JTextField textfield2; private JTextField textfield3;; private JRadioButton radioVis; private JRadioButton radioPra; private ButtonGroup grupoRadio; public GuiJAtivUnid3(){ super(Calculo de Desconto); setLayout(new FlowLayout()); //configura o layout do frame label1 = new JLabel(Total Bruto da Compra); textfield1 = new JTextField(20); add(label1); add(textfield1); //adiciona textfield ao frame label2 = new JLabel(Forma de Pagamento); radioVis = new JRadioButton(A vista);//cria o primeiro componente JRadioButton radioPra = new JRadioButton(A prazo);//cria o segundo componente TrataEventoRadio trataradio = new TrataEventoRadio(); radioVis.addItemListener(trataradio); radioPra.addItemListener(trataradio); add(label2); //adiciona ao frame add(radioVis); add(radioPra); grupoRadio = new ButtonGroup(); //cria ButtonGroup - componente agrupador dos botes de radio grupoRadio.add(radioVis); //adiciona cada JRadioButton ao ButtonGroup grupoRadio.add(radioPra);

323

Universidade do Sul de Santa Catarina

label3 = new JLabel(Desconto); textfield2 = new JTextField(20); label3.setVisible(false); textfield2.setVisible(false); add(label3); add(textfield2); //adiciona textfield ao frame label4 = new JLabel(Total Liquido da Compra); textfield3 = new JTextField(20); add(label4); add(textfield3); //adiciona textfield ao frame textfield2.addActionListener(new TrataEventoTextField());

} //fim do construtor private class TrataEventoRadio implements ItemListener{ public void itemStateChanged(ItemEvent event){ if (event.getSource() == radioVis){ label3.setVisible(true); textfield2.setVisible(true); } else textfield3.setText(textfield1.getText()) ; } } //fim da classe interna private class TrataEventoTextField implements ActionListener{ public void actionPerformed(ActionEvent event){ if (radioVis.isSelected()) textfield3.setText(Double.toString(Double.parseDouble(textfield1. getText()) - ( Double.parseDouble(textfield1.getText())*Double.parseDouble(textfield2. getText())/100))); } } //fim da classe interna public static void main(String arg[]){ GuiJAtivUnid3 guiativ = new GuiJAtivUnid3(); guiativ.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiativ.setSize(275,280); guiativ.setVisible(true); } } //fim da classe de primeiro nvel

324

Linguagens de Programao II

UNIDADE 4
1) Cdigo da atividade: import java.awt.FlowLayout; //classe do gerenciador de layout import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JTextField; //classe do componente de texto import javax.swing.JLabel; //classe do componente de texto import javax.swing.JRadioButton; //classe do componente boto de rdio import javax.swing.ButtonGroup; //classe do agrupador de botes de rdio import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.ItemListener; //interface que trato o evento do componente JRadioButton import java.awt.event.ItemEvent; //classe do evento gerado pelo componente JRadioButton import java.awt.Font; public class GuiJAtivUnid4 extends JFrame{ private JLabel label1; private JLabel label2; private JLabel label3; private JLabel label4; private JTextField textfield1; private JTextField textfield2; private JTextField textfield3;; private JRadioButton radioVis; private JRadioButton radioPra; private ButtonGroup grupoRadio; public GuiJAtivUnid4(){ super(Calculo de Desconto); setLayout(new FlowLayout()); //configura o layout do frame label1 = new JLabel(Total Bruto da Compra); textfield1 = new JTextField(20); add(label1); add(textfield1); //adiciona textfield ao frame label2 = new JLabel(Forma de Pagamento); radioVis = new JRadioButton(A vista);//cria o primeiro componente JRadioButton radioPra = new JRadioButton(A prazo);//cria o segundo componente TrataEventoRadio trataradio = new TrataEventoRadio(); radioVis.addItemListener(trataradio); radioPra.addItemListener(trataradio); add(label2); //adiciona ao frame add(radioVis); add(radioPra); grupoRadio = new ButtonGroup(); //cria ButtonGroup - componente agrupador dos botes de radio grupoRadio.add(radioVis); //adiciona cada JRadioButton ao ButtonGroup grupoRadio.add(radioPra);

325

Universidade do Sul de Santa Catarina

label3 = new JLabel(Desconto); textfield2 = new JTextField(20); label3.setVisible(false); textfield2.setVisible(false); add(label3); add(textfield2); //adiciona textfield ao frame label4 = new JLabel(Total Liquido da Compra); textfield3 = new JTextField(20); add(label4); add(textfield3); //adiciona textfield ao frame textfield2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (radioVis.isSelected()) textfield3.setText(Double.toString(Double.parseDouble(textfield1.getText()) - ( Double. parseDouble(textfield1.getText())*Double.parseDouble(textfield2.getText())/100))); } }); } //fim do construtor private class TrataEventoRadio implements ItemListener{ public void itemStateChanged(ItemEvent event){ if (event.getSource() == radioVis){ label3.setVisible(true); textfield2.setVisible(true); } else textfield3.setText(textfield1.getText()) ; } } //fim da classe interna public static void main(String arg[]){ GuiJAtivUnid4 guiativ = new GuiJAtivUnid4(); guiativ.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiativ.setSize(275,280); guiativ.setVisible(true); } } //fim da classe de primeiro nvel

326

Linguagens de Programao II

2) Cdigo da atividade: import java.awt.GridLayout; //classe do gerenciador de layout import javax.swing.JFrame; //classe que fornece os recursos bsicos de uma janela import javax.swing.JTextField; //classe do componente de texto import javax.swing.JLabel; //classe do componente de texto import javax.swing.JRadioButton; //classe do componente boto de rdio import javax.swing.ButtonGroup; //classe do agrupador de botes de rdio import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.ItemListener; //interface que trato o evento do componente JRadioButton import java.awt.event.ItemEvent; //classe do evento gerado pelo componente JRadioButton import java.awt.Font; import java.awt.Container; public class GuiJAtiv2Unid4 extends JFrame{ private JLabel private JLabel private JLabel private JLabel label1; label2; label3; label4, label9, label10;// label 9 e 10 existem somente para serem inseridos nas celulas vazias private JTextField textfield1; private JTextField textfield2; private JTextField textfield3; private JRadioButton radioVis; private JRadioButton radioPra; private ButtonGroup grupoRadio; private Container container; public GuiJAtiv2Unid4(){ super(Calculo de Desconto); container = getContentPane(); // obtm painel de contedo container.setLayout( new GridLayout(4,3,1,1) ); // configura o layout JFrame label1 = new JLabel(Total Bruto da Compra); textfield1 = new JTextField(20); container.add(label1); container.add(textfield1); //adiciona textfield ao frame label9 = new JLabel(); container.add(label9); label2 = new JLabel(Forma de Pagamento); radioVis = new JRadioButton(A vista);//cria o primeiro componente JRadioButton radioPra = new JRadioButton(A prazo);//cria o segundo componente TrataEventoRadio trataradio = new TrataEventoRadio(); radioVis.addItemListener(trataradio); radioPra.addItemListener(trataradio); container.add(label2); //adiciona ao frame container.add(radioVis); container.add(radioPra);

327

Universidade do Sul de Santa Catarina

grupoRadio = new ButtonGroup(); //cria ButtonGroup - componente agrupador dos botes de radio grupoRadio.add(radioVis); //adiciona cada JRadioButton ao ButtonGroup grupoRadio.add(radioPra); label3 = new JLabel(Desconto); textfield2 = new JTextField(20); label10 = new JLabel(); label3.setVisible(false); textfield2.setVisible(false); container.add(label3); container.add(textfield2); //adiciona textfield ao frame container.add(label10); label4 = new JLabel(Total Liquido da Compra); textfield3 = new JTextField(20); container.add(label4); container.add(textfield3); //adiciona textfield ao frame textfield2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (radioVis.isSelected()) textfield3.setText(Double.toString(Double.parseDouble(textfield1.getText()) - ( Double. parseDouble(textfield1.getText())*Double.parseDouble(textfield2.getText())/100))); } }); } //fim do construtor private class TrataEventoRadio implements ItemListener{ public void itemStateChanged(ItemEvent event){ if (event.getSource() == radioVis){ label3.setVisible(true); textfield2.setVisible(true); } else textfield3.setText(textfield1.getText()) ; } } //fim da classe interna public static void main(String arg[]){ GuiJAtiv2Unid4 guiativ = new GuiJAtiv2Unid4(); guiativ.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiativ.setSize(450,160); guiativ.setVisible(true); } } //fim da classe de primeiro nvel

328

Linguagens de Programao II

UNIDADE 5
1) Cdigo da atividade: 1) Cdigo da atividade: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class GuiJTabbedPaneAtiv1Unid5 extends JFrame { private JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.BOTTOM); private JPanel cadastroPanel = new JPanel(); private JPanel consultaPanel = new JPanel(); private JLabel labelNome,labelEndereco,labelCidade; private JTextField textfieldNome,textfieldEndereco,textfieldCidade; private JButton buttons[] = new JButton[ 4 ]; // array de botes private final String names[] = { Salvar, Editar, Deletar, Sair}; public GuiJTabbedPaneAtiv1Unid5() { tabbedPane.setTabPlacement(JTabbedPane.TOP); // local das abas cadastroPanel.setLayout(new BorderLayout()); labelNome = new JLabel(Nome); labelEndereco = new JLabel(Endereo); labelCidade = new JLabel(Cidade); textfieldNome = new JTextField(30); textfieldEndereco = new JTextField(30); textfieldCidade = new JTextField(30); JPanel buttonJPanel = new JPanel(new GridLayout( 0, 4)); // cria JPanel dos botoes // cria e adiciona botes ao panel for ( int count = 0; count < buttons.length; count++ ) { buttons[ count ] = new JButton( names [ count ] ) ; buttonJPanel.add( buttons[ count ] ); // adiciona boto ao painel } JPanel labelPane = new JPanel(new GridLayout(0,1)); // cria JPanel dos labels labelPane.add(labelNome); //adiciona labels ao panel labelPane.add(labelEndereco); labelPane.add(labelCidade); JPanel fieldPane = new JPanel(new GridLayout(0,1));// cria JPanel dos textedit fieldPane.add(textfieldNome); //adiciona textfields ao panel fieldPane.add(textfieldEndereco); fieldPane.add(textfieldCidade); cadastroPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); cadastroPanel.add(labelPane, BorderLayout.CENTER);// adiciona painel na regio central cadastroPanel.add(fieldPane, BorderLayout.EAST);// adiciona painel na regio Oeste cadastroPanel.add( buttonJPanel, BorderLayout.SOUTH ); // adiciona painel na regio Sul

329

Universidade do Sul de Santa Catarina

tabbedPane.add(cadastroPanel, CADASTRO); // adiciona o painel na orelha tabbedPane.add(consultaPanel, CONSULTA); // adiciona o painel na orelha this.getContentPane().add(tabbedPane); } public static void main(String[] args) { GuiJTabbedPaneAtiv1Unid5 testTabbedPane = new GuiJTabbedPaneAtiv1Unid5(); testTabbedPane.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); testTabbedPane.setSize( 580, 200 ); // configura o tamanho do frame testTabbedPane.setVisible( true ); // exibe o frame } }

2) Cdigo da atividade:
import java.awt.Color; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JMenuBar; public class GuiJMenuAtiv2Unid5 extends JFrame { // construtor sem argumento para configurar a GUI public GuiJMenuAtiv2Unid5() { super( Atividade 2 da Unidade 5 ); JMenu cadastrarMenu = new JMenu( Cadastrar ); // cria o menu Cadastrar cadastrarMenu.setMnemonic( C ); // configura o mnemnico como C JMenuItem projetoItem = new JMenuItem( Projeto ); // cria o item de menu Projeto projetoItem.setMnemonic( P ); // configura o mnemnico com P cadastrarMenu.add( projetoItem ); // adiciona o item Projeto ao menu Cadastrar JMenuItem particItem = new JMenuItem( Participante ); // cria o item Participante particItem.setMnemonic( A ); // configura o mnemnico como A cadastrarMenu.add( particItem ); // adiciona o item Participante ao menu Cadastrar JMenuItem sairItem = new JMenuItem( Sair ); // cria o item Sair sairItem.setMnemonic( S ); // configura o mnemnico como S cadastrarMenu.add( sairItem ); // adiciona o Sair exit ao menu Cadastrar

330

Linguagens de Programao II

JMenu ajudaMenu = new JMenu( Ajuda ); // cria o menu Ajuda ajudaMenu.setMnemonic( A ); // configura o mnemnico como A JMenuItem sobreItem = new JMenuItem( Sobre ); // cria o item Sobre sobreItem.setMnemonic( S ); // configura o mnemnico como S ajudaMenu.add( sobreItem ); // adiciona o item Sobre ao menu Ajuda JMenuBar bar = new JMenuBar(); // cria a barra de menus setJMenuBar( bar ); // adiciona uma barra de menus ao aplicativo bar.add( cadastrarMenu ); // adiciona o menu Cadastrar barra de menus bar.add( ajudaMenu ); // adiciona o menu Ajuda barra de menus getContentPane().setBackground( Color.BLUE ); // configura o fundo } // fim do construtor public static void main( String args[] ) { GuiJMenuAtiv2Unid5 menu = new GuiJMenuAtiv2Unid5(); menu.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); menu.setSize( 580, 200 ); // configura o tamanho do frame menu.setVisible( true ); // exibe o frame } // fim de main } // fim da classe

UNIDADE 6
1) Esse tema vem sendo discutido h muito tempo por especialistas da rea e tem se tornado um tema polmico. O processo de criao de um sistema computacional em alguns momentos pode assustar o cliente final, dando a impresso de que a ferramenta possa vir a substitu-lo, representando para ele uma forma de desemprego. Para que isso no ocorra, necessrio que o especialista em informtica deixe claro ao usurio que a informtica uma ferramenta auxiliar para ajud-lo nas tarefas do dia-a-dia, mas nunca uma ferramenta que possa vir a substitu-lo. 2) O desenvolvimento de software possui muitas particularidades, principalmente porque no existe um produto que possa ser apresentado ao cliente. O desenvolvimento possui etapas bem definidas e, at que se chegue implementao, no h o que se apresentar ao cliente. Desta forma, a relao entre os desenvolvedores e o cliente deve ser de transparncia, confiana e cordialidade. Ele deve se sentir seguro com relao ao que ele contratou e com o que ele ter como produto final. Durante a fase de implementao muito comum que se apresente ao cliente pequenas verses do produto final para sua prvia aprovao. Estas pequenas verses so chamadas de prottipos, que alm de verificar se o projeto est no rumo certo, permitem que o cliente tenha um contato mais direto com o produto esperado.

331

Universidade do Sul de Santa Catarina

UNIDADE 7
1) O tratamento de erro no Java atravs do try-catch uma ferramenta essencial e, em muitos casos, obrigatria. Diferentemente de algumas linguagens em que o tratamento de exceo uma opo do programador, no Java isto no existe. A finalidade do tratamento de exceo evitar que o sistema gere um erro fatal que venha a travar por completo o software ou, at mesmo, o sistema operacional do computador. 2) No. A classe apenas representa as regras que o programador ou analista de sistemas determinaram ao fazer o levantamento de dados. Se a anlise for realizada de forma inconsistente, a classe representar esta inconsistncia. Por isso, o ponto principal de qualquer projeto computacional o levantamento de requisitos, para fundamentar o que a implementao dever fazer e de que forma ser codificado.

UNIDADE 8
1) Sim. Como a conexo com o banco de dados em Java esta relacionada ao driver de conexo usado, possvel que uma classe seja a mais genrica possvel, permitindo que o driver de conexo e a forma de conexo sejam definidas na construo da classe.

UNIDADE 9
Sim. A base de qualquer aplicao em Java so as classes de representao e de regras de negcio. Porm, estas classes podem ser utilizadas na criao de aplicaes Java para web ou Java Server Page.

UNIDADE 10
No apresenta atividades de auto-avaliao.

UNIDADE 11
1) GCI (Commom Gateway Interface). 2) GET e POST. 3) Servlet Container.

332

Linguagens de Programao II

UNIDADE 12
1) Deve ser implementado no mnimo um dos seguintes mtodos: doGet, doPost, doPut, doDelete, doTrace, doOptions, sempre se tomando o cuidado para implementar o mtodo que especificado nas pginas que iro enviar a requisio. 2) Por meio do elemento servlet-mapping no arquivo web.xml 3) javax.servlet.http.HttpServletRequest e javax.servlet.http.HttpServletResponse, respectivamente. 4) Esse exerccio seguir a mesma filosofia do exemplo apresentado na seo Sesses. Voc deve criar uma classe contato com os seguintes campos: nome, email e telefone. O passo seguinte desenvolver dois servlets: um ficar responsvel por salvar os contatos banco de dados e o outro ir ter a funo de listar todos os contatos cadastrados. Para finalizar a aplicao voc deve criar um projeto com a estrutura de diretrios de aplicaes web e efetuar a instalao da aplicao no servidor (diretrio webapps do tomcat).

UNIDADE 13
1) <%! Contedo da declarao %>, <%= contedo da expresso %>, <% contedo do scriptlet %>. 2) As pginas JSP antes de serem executadas, so compiladas e transformadas em Servlets, ou seja, uma pgina JSP um Servlet. 3) Utilizando a ao <jsp:useBean>, essa ao permite que voc utilize em JavaBean nas suas pginas JSP.

UNIDADE 14
1) <c:if>, <c:choose>, <c:when> e <c:otherwise>. 2) <c:foEach> e <c:forTokens>. 3) ${nomeDoObjeto}.

UNIDADE 15
1) No arquivo web.xml foi inserido para cada Servlet o elemento <servletmapping> que possui dois sub-elementos <servlet-name> e <url-pattern> que so os responsveis por estar realizando o mapeamento dos Servlets da aplicao. 2) O padro Data Access Object (DAO) isola em classes especficas todo cdigo relacionado ao acesso a banco de dados.

333

Você também pode gostar