Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagens de Programao II
Disciplina na modalidade a distncia
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.
Linguagens de Programao II
Livro didtico
2 Edio revista e atualizada
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
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 . . . . . . . . . . . . . . .
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.
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
12
Linguagens de Programao I
13
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.
14
Linguagens de Programao I
15
Atividades
Avaliao a Distncia 1 Avaliao a Distncia 2 Avaliao Presencial 1 Avaliao Presencial 2 (2 chamada) Avaliao Final
16
UNIDADE 1
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
Barra de rolagem
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.
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
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:
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)
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);
//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
//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.
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
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
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
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.
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
JButton
JRadioButton JCheckBox
JFrame
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
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.
28
Linguagens de Programao II
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
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
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
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.
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
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.
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:
Observe que CalculoFiguras uma interface e que Quadriltero uma classe que implementa CalculoFiguras e mais outras interfaces, se houver necessidade.
Unidade 1
37
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
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.
Unidade 1
41
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
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
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.
Unidade 2
47
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.
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:
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
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
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
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.
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
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.
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
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.
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
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:
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
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.
Unidade 2
61
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
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
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.
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.
Objeto TrataEventoBotao
public void actionPerformed(ActionEvent event){ //tratamento do evento
Objeto EventListenerList
Essa referncia criada pela instruo buttonSoma.addActionListener(trataevento)
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
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.
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
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
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
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
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
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
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.
Unidade 3
77
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
Unidade 3
79
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
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.
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
Unidade 3
83
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
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); } }
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
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
Unidade 3
87
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
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.
90
Linguagens de Programao II
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
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
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
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
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
98
Linguagens de Programao II
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
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
Unidade 4
101
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
Unidade 4
103
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.
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
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
107
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
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
Unidade 4
111
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.
Unidade 4
113
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
Unidade 4
115
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
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
Sees de estudo
Seo 1 Construindo GUI com Layout mais
Complexo II
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
// 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.
Unidade 5
125
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.
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
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.
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
Unidade 5
129
JRadioButtonMenuItem
JCheckBoxMenuItem
FIGURA 5.5 GUI DA APLICAO GUIJMENU
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
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
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.
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
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
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
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
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
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.
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
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 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
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.
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
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.
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.
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
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:
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:
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:
Unidade 6
151
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.
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.
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.
Unidade 6
153
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
155
#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:
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
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
Sees de estudo
Seo 1 Driver de conexo Seo 2 Driver de conexo JDBC Seo 3 Criando uma classe de conexo ao MySQL
Sendo assim, necessrio que um interpretador faa o papel de converso entre eles, de forma que os dois possam se comunicar.
Software
Driver
Banco de dados
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!
Programa em Java
JDBC
Banco de dados
Unidade 7
161
O uso do JDBC apresenta algumas vantagens para a aplicao Java: maior portabilidade, facilidade de congurao e padronizao.
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:
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
Na pgina que se abre, procure um Mirror do Brasil e clique na palavra Http, conforme a imagem a seguir:
Na janela que se abre, clique no boto salvar e direcione o salvamento do arquivo para um diretrio de sua escolha.
Unidade 7
163
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
no
Mensagem de ERRO
Encerra o programa
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
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.
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:
Unidade 7
167
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
} 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();
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);
getConexao().close();
ExpressaoSQL(String Comando)
Unidade 7
171
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:
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
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
Sees de estudo
Seo 1 Estrutura da Classe de Projetos Seo 2 Estrutura da Classe de Participantes Seo 3 Estrutura da Classe de Controles
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:
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
//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
// 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()); }
// 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; } }
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
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
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
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
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
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
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
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.
Unidade 9
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
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;
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
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.
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
195
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
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
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.
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.
Unidade 9
201
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
Sees de estudo
Seo 1 Elementos da aplicao de Controle de Projetos
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
1 1
Sees de estudo
Seo 1 HTTP Seo 2 CGI Seo 3 Java Servlets e Containers Seo 4 Preparando o Ambiente
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
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
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
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>
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
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
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
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
Unidade 11
215
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.
Servidor Web
Processo
Requisio Requisio Requisio Servlet Servlet Servlet
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.
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
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:
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:
Unidade 11
219
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:
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.
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.
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.
Unidade 11
221
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.
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
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
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
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.
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
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:
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
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:
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
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:
Unidade 12
235
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.
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
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:
Preenchendo as informaes e clicando no boto enviar voc ter um resultado semelhante gura 12.7 abaixo:
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
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
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.
Unidade 12
243
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
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:
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
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
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
Sees de estudo
Seo 1 Java Server Pages Seo 2 Sintaxe e Semntica
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>
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:
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
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
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.
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
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.
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
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
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
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
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>
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:
Aps preencher os dados e clicar no boto enviar voc ver algo semelhante tela a seguir:
Unidade 13
261
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
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/
Unidade 13
265
UNIDADE 14
Sees de estudo
Seo 1 JSTL Seo 2 Instalao Seo 3 Linguagem de Expresso JSTL Seo 4 Bibliotecas JSTL
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
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.
270
Linguagens de Programao II
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.
Unidade 14
271
<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.
<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.
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.
<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
<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
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.
<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
Utilizao
<c:redirect url=http://www.google.com/>
Resultado
Redireciona automaticamente para o endereo informado no atributo url.
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>
Unidade 14
279
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:
Aps preencher os dados e clicar no boto enviar, voc ver algo semelhante tela a seguir:
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
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
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:
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
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
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
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
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 }
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
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
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
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
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
Unidade 15
299
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
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
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
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
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/> 22 <input type=submit value=Salvar> 23 </form> 24 </body> 25 </html>
Unidade 15
307
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>
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:
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
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
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.
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
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
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
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
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
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
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
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
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