Você está na página 1de 95

1

Sumrio
Introduo .......................................................................................................................................... 5 Conhecendo o Java Server Pages ................................................................................................ 5 Ambiente JSP ................................................................................................................................... 6 Instalando o JDK .......................................................................................................................... 6 Varivel ambiente ......................................................................................................................... 8 Instalao do TOMCAT ............................................................................................................. 13 Estrutura de Pastas .................................................................................................................... 13 Tag(s) ............................................................................................................................................... 15 Tag(s) orientadas a criao de script ...................................................................................... 15 Tag(s) baseadas em XML ......................................................................................................... 15 Primeiro cdigo ............................................................................................................................... 15 Formulrio........................................................................................................................................ 19 Declaraes..................................................................................................................................... 21 Declaraes de varivel ............................................................................................................ 21 Declarao de mtodos............................................................................................................. 22 Estrutura condicional ..................................................................................................................... 23 Estrutura condicional IF ............................................................................................................. 23 IF com ELSE ........................................................................................................................... 23 IF com ELSE IF e ELSE ........................................................................................................ 24 Estrutura condicional Switch..................................................................................................... 25 Interao .......................................................................................................................................... 29 Loop usando o for....................................................................................................................... 29 Loop usando while ..................................................................................................................... 31 Loop com do while ..................................................................................................................... 32 Tratamento de excees ............................................................................................................... 33 Varivel Composta ......................................................................................................................... 35 Array unidimensional ................................................................................................................. 35 Array multidimensionais ............................................................................................................ 36 Escopo de varivel ......................................................................................................................... 37 Modularizao ................................................................................................................................. 38 Funo (mtodos) ...................................................................................................................... 39 2

Funo que no retorna valor .............................................................................................. 40 Passagem de parmetro ....................................................................................................... 40 Orientao ao Objeto ..................................................................................................................... 41 Class ............................................................................................................................................. 42 Atributos ................................................................................................................................... 42 Mtodos ................................................................................................................................... 43 Herana........................................................................................................................................ 43 Encapsulamento ......................................................................................................................... 43 Polimorfismo................................................................................................................................ 43 Arquivo ............................................................................................................................................. 45 Escrevendo em Arquivo ............................................................................................................ 45 Leitura de Arquivo ...................................................................................................................... 47 Diretrios.......................................................................................................................................... 48 Criar diretrio............................................................................................................................... 48 Testar se o diretrio existe ........................................................................................................ 49 Exibir contedo do diretrio ...................................................................................................... 50 Excluir ........................................................................................................................................... 51 Excluir arquivo......................................................................................................................... 51 Excluindo diretrio .................................................................................................................. 53 Include ............................................................................................................................................... 54 Include Esttico ............................................................................................................................. 55 Include dinmico ........................................................................................................................... 57 Session............................................................................................................................................... 58 Criar Sesso ................................................................................................................................... 58 Exibir Sesso .................................................................................................................................. 61 Tempo de vida da sesso .............................................................................................................. 63 Remover ........................................................................................................................................ 63 Outras operaes com sesso....................................................................................................... 64 Administrao de e-mails .................................................................................................................. 64 Enviando e-mail............................................................................................................................. 65 Banco de Dados ................................................................................................................................. 65 Modelos de Dados......................................................................................................................... 66 3

Modelo Relacional..................................................................................................................... 66 Modelo Orientado ao Objeto .................................................................................................... 66 Instalando o Banco de Dados ........................................................................................................ 67 Instalando o MYSQL .................................................................................................................. 67 Configurando MYSQL ................................................................................................................ 70 Conectividade com o Banco de Dados .......................................................................................... 74 Linguagem SQL .............................................................................................................................. 75 Criando Bando de dados ............................................................................................................... 75 Criando tabela ............................................................................................................................... 78 Inserir dados .................................................................................................................................. 79 Recuperando Dados ...................................................................................................................... 81 Alterar Campo ............................................................................................................................... 83 Excluir ............................................................................................................................................ 84 Finalizando banco de dados .......................................................................................................... 85 XML.................................................................................................................................................... 85 Estrutura de um documento XML ................................................................................................. 86 Sintaxe XML ................................................................................................................................... 87 Todo elemento XML deve ter um tag de fechamento .............................................................. 88 As tags XML so case sensitives ................................................................................................ 88 Elementos XML devem estar aninhados ................................................................................... 89 Documentos XML precisam ter um elemento Raiz ................................................................... 89 Valores do atributo em aspa ..................................................................................................... 90 Declarao do Tipo de Documento ............................................................................................... 91 Tipos de declaraes ................................................................................................................. 91 Concluso .......................................................................................................................................... 95

Introduo O incio da internet em nada lembra a internet como conhecemos. Na dcada de 1960 a internet surgiu como uma rede hbrida e descentralizada. No entanto, foi na dcada de 1990 que Tim Berners-Lee criou o protocolo HTTP e a linguagem de marcao HTML, possibilitando, assim, a criao de Home Page com interface de visual agradvel semelhante s Home Pages atuais. Contudo o HTML no foi planejado como linguagem de programao e sim apenas para apresentao de contedo. Desta forma, as primeiras Home Pages eram totalmente estticas no podendoarmazenar informao ou realizar alguma atividade de programao. Essas home pages nada mais eram do que documentos HTML ligados entre si. Com o passar dosanos a internet cresceu e ganhou fora comercial com isso surgiu a necessidade de maior interao com o usurio. Foi nesta poca que surgiram as linguagens scripts e a pgina web deixou de ser apenas esttica. Nascem as pginas dinmicas. Pginas dinmicas so pginas desenvolvidas utilizando a linguagem de marcao HTML e alguma linguagem de programao. Desta forma, possvel realizar tratamento de dados eacessar base de dados entre outras funcionalidades. Atualmente existem diversas linguagens que podem ser utilizadas para tornar a Home Page dinmica. Dentre elas pode-se citar o ASP, PHP, JSP e outras mais. Para nosso estudo utilizaremos a linguagem JSP ou Java server pages. Conhecendo o Java Server Pages O JavaServer Pages (JSP) uma tecnologia baseada na linguagem de programa Java trazendo com si as principais vantagens da Java. Dentre elas pode-se destacar a portabilidade. Sendo assim, possvel executararquivosJSP em diversas plataformas sem que haja a necessidade de alterar o cdigo, em outras palavras, qualquer sistema operacional que disponha de um servidor para linguagem JSP poder interpretar pginas webs feitas nesta linguagem.O JSP funciona como um compartimento (container) que incorpora elementos dinmicos. No se deve confundir JSP com Javascritp. O JSP uma linguagem interpretada no servidor e o cliente s ir receber o resultado desta interpretao que ser cdigo HTML. J o javascritp depende do navegador do cliente para sua interpretao. Caso a API do java no esteja habilitado no navegador o cdigo javascript no funcionar. Por ser uma linguagem que trabalha no lado do servidor, o JSP tem algumas vantagens em relao ao javascript. Uma delas o fato do cdigo no ser visto pelo usurio. Como toda interpretao feita no servidor o cliente s recebe o cdigo final que em HTML. Desta forma, o cdigo JSP fica protegido. Uma segunda vantagem a garantia da interpretao do cdigo. Por ser do lado do servidor no necessrio que o cliente autorizea interpretao do cdigo. Diferentemente o javascript tem a necessidade de ser autorizado. Fato que pode no ocorrer pelo cliente relutar em autorizar por medo de ativar um malware.
5

O desenvolvedor de aplicaes JSP deve ter um conhecimento mnimo de algumas especificaes J2EE. Ambiente JSP Para que o JSP possa funcionar necessrio que exista um ambiente preparado para a linguagem. No caso, a primeira coisa a ser feita instalar um servidor que interprete o cdigo JSP. No nosso estudo utilizaremos o servidor TOMCAT que pode ser baixado no endereo http://tomcat.apache.org. Escolha a verso mais adequada para seu uso. Contudo no basta apenas ter o tomcat na mquina. Para utilizar o servidor necessrio que tenha o JDK instalado. O JDK um kit de desenvolvimento Java fornecido livremente pela Sun. Constitui um conjunto de programas que engloba compilador, interpretador e utilitrios, fornecendo um pacote de ferramentas bsicas para o desenvolvimento de aplicaes Java. Pode ser encontrado no site http://www.oracle.com/technetwork/java/index.html. Instalando o JDK Para iniciar a instalao do JDK no Windows XP d dois cliques no arquivo JDK que foi baixo do site http://www.oracle.com/technetwork/java/index.html. Aps iniciar a instalao uma tela semelhante Figura 1 ir surgir.

Figura1 - Tela inicial da instalao do JDK

Basta clicar no boto Next para que a instalao possa seguir at chegar na tela da Figura 2. Nela ser apresentado o boto Change... que a opo para escolher a pasta onde o JDK ser instalado. Caso nada seja escolhido a instalao ser na pasta padro.

Figura2 - Escolhendo onde instalar

Ao concluir a instalao uma tela semelhante Figura 3 ser apresentada. Clique em Finish e sua instalao ser concluda.

Figura3 - Final da instalao do JDK

Varivel ambiente Terminada a instalao ainda necessrio conFigurar as variveis ambientes para que o JDK funcione adequadamente na mquina. Para isso, clique com o boto direito em Meu Computador depois em propriedade e por fim na aba avanados (no Windows 7, escolha conFiguraes avanada do sistema). Veja a Figura 4.

Figura4 - Variveis de Ambiente

Ao chegar na tela de propriedades avanadas clique no boto variveis de ambiente. Neste ponto ser aberto a tela para criao de variveis ambientes semelhante Figura 5. Neste ponto permitido escolher que tipo de varivel se deseja criar. As opes so variveis de usurio e variveis de sistema. No primeiro caso um tipo de varivel que est acessvel apenas para um usurio, j no segundo a varivel estar acessvel para qualquer usurio do sistema. Para nosso estudo iremos utilizar a opo VARIVEIS DO SISTEMA. Sendo assim, clique no boto nova para criar uma nova varivel de sistema. Aps o clique uma nova tela ir surgir semelhante Figura 6. Na parte do nome digite o nome da sua varivel de sistema. Para o nosso exemplo ser JAVA_HOME e na parte de valor da varivel digite o caminho onde o JDK foi instalado. Por fim, para terminar, ainda necessrio alterar a varivel de sistema PATH. Selecione a varivel e clique em editar (Figura 7). Acrescente ao final do valor da varivel o seguinte valor: ;%JAVA_HOME%in conforme apresentando na Figura 8. Pronto, termina a configurao das variveis de ambiente. Agora hora de testar para saber se tudo est funcionando. Abra o prompt de comando e digite o java version. Se tudo estiver correto ser apresentado uma tela semelhante Figura 9. Outras variveis poderiam ser criadas, mas para nosso estudo no ser necessrio.
9

Figura5 - Tela para criao de variveis ambientes

Figura6 - Nova varivel de sistema

10

Figura7 - Varivel de Sistema PATH

11

Figura8 - Adicional JAVA a varivel PATH

Figura9 - Teste do funcionamento da varivel

12

Instalao do TOMCAT A ltima etapa da configurao a instalao do servidor Tomcat. Para isso,ative o arquivo executvel para iniciar a instalao do Tomcat. Siga a configurao padro at finalizar a instalao.Caso o servidor no inicie automaticamente clique no arquivo startup.bat localizado na pasta bin do tomcat. Pronto, a instalao foi concluda. Para testar se o servidor est funcionando, abra o navegador e digite o endereo: http://localhost:8080 . Caso esteja funcionando ser apresentado uma tela semelhante Figura 10.

Figura10 - Teste do tomcat

Estrutura de Pastas Para que as aplicaes JSP funcionem de maneira satisfatria necessrio respeitar a seguinte estrutura de pastas: Todos os arquivos JSP devem ser inseridos dentro da pasta webapps que se encontra dentro da pasta tomcat. Alm dos arquivos JSP ainda deve existir uma pasta de nome WEB-INF que ser usada pelo projeto para armazenar o arquivo de controle XML e duas pastasjava e lib. Na pasta java ficaro armazenados todos os arquivos class que sero utilizados na aplicao. Por fim, na pasta lib devem ser colocados todos os arquivos jar. Seguindo a estrutura de pasta o seu servidor jsp deve ficar semelhante Figura 11.

13

Figura11 - Estrutura de pastas

Ateno fundamental que o nome da pasta seja exatamente como apresentando na Figura 11. Desta forma, a pasta WEB-INF deve ser escrita usando letra maiscula e as pastas classes e lib escritas usando letra minscula. Boa prtica Como uma forma de organizar suas aplicaes possvel criar uma pasta para cada projeto. Desta forma, seu ambiente de trabalho ter maior organizao. Veja a Figura 12.

Figura12 - Estrutura de pastas

14

Tag(s) A tag(s) ou etiquetas tem a funo de aplicar algum tipo de ao ou formatao ao cdigo. O JSP trabalhar basicamente com dois tipos de tag(s) as orientadas a criao de scripts e as baseadas em XML. Tag(s) orientadas a criao de script Toda tag de script JSP delimitada por <% %>, podendo existir um caracter adicional que vem logo aps o <% e tem a funo de isolar ainda mais o significado da tag. Alguns desses caracteres so !, =, @. Afrente estudaremos melhor o uso desses caracteres. Outro aspecto relevante que, embora lembrea estrutura de tag(s) HTML, as tag(s) JSP so isoladas de coisas externas. Sendo assim, toda ao realizada pela tag deve estar entre o <% e o %>. Diferente do HTML que possui tag(s) em pares onde a zona de ao est entre a tag de abertura e a de fechamento. Veja abaixo alguns exemplos de tag(s) orientadas criao de script. <%! int idade = 18%> <%= idade * 2%> Tag(s) baseadas em XML As tag(s) baseadas em XML surgem para melhor organizar o cdigo, eliminando qualquer dubiedade que possa existir. Um bom exemplo seria as tag(s) HTML. O HTML no case sensitive e sendo assim tanto faz letra maiscula e letra minscula. Para o HTML <body>, <BODY>, <Body>so iguais e todas funcionam da mesma forma. J o XML compreende como tag(s) distintas. No caso, para o XML a nica tag que ser aceita com abertura do corpo ser a <body>. <jsp:forward page=admin.jsp /> O cdigo acima encaminha uma solicitao do usurio para o arquivo admin.jsp.

Primeiro cdigo Chego o momento de testarmos nosso primeiro cdigo JSP. Abra o bloco de notas ou editor de sua preferencia e digite o cdigo abaixo. <html> <body> Al, mundo!
15

</body> </html> Salva com o nome exemplo.jsp no endereo \Tomcat 7.0\webapps\examples. Esse o endereo dos arquivos de exemplo que so padres do TOMCAT. Ao salvar nosso cdigo neste endereo podemos aproveitar a estrutura WEB-INF que j existe. Aps salvar o cdigo chegou o momento de testar. Abra o seu navegador e digite o endereohttp://localhost:8080/examples/exemplo.jsp. A Figura 13 mostra o site resultante.

Figura13 - Al, Mundo!

Observe que o site resultante um pouco frustrante. Tudo que foi feito foi utilizar cdigo HTML para escrever uma mensagem. No entanto, se esse arquivo fosse aberto diretamente no navegador iria apresentar uma mensagem de erro. Isso ocorre pelo fato do arquivo ter sido salvo com a extenso .jsp. Todo arquivo JSP deve ser interpretado pelo servidor e o resultado dessa interpretao ser enviado para o navegador exibindo assim a home page. O cdigo acima poderia ser escrito usando apenas JSP. Veja abaixo: <% out.println("Al, mundo!"); %> A Figura 14 mostra o resultado deste cdigo. Observe que visualmente no existe diferena do que foi apresentado na Figura 12, contudo, esse cdigo utilizou apenas codificao JSP. Vamos analisar:

16

As linhas1 e 3 so as tags de abertura e fechamento do cdigo. Toda codificao JSP deve estar entre essas duas tags. Na linha dois conhecemos o mtodo out.println() ele usado para enviar para o navegador o que est no seu argumento. No cdigo acima o argumento enviado foi a string Al, mundo.

Figura14 - Al, mundo usando apenas JSP

Que tal melhorar o cdigo? Veja o exemplo abaixo.

<html> <body> <% String visitante = request.getParameter ("name"); if (visitante == null) visitante = "Mundo"; %> Al, <%= visitante %>! </body>
17

</html> O cdigo acima j apresenta detalhes mais interessantes. Este cdigo recebe um nome qualquer e exibe a mensagem Al, <nome>!. Caso nenhum nome tenha sido digitado ir apresentar a mensagem padro Al Mundo!. possvel observar que neste cdigo utilizamos variveis e estrutura de deciso IF. Um pouco mais a frente iremos falar detalhadamente sobre esses dois componentes. No momento basta escrever esse cdigo e analisar o resultado. A Figura 15 apresenta o resultado do cdigo acima.

Figura15 - Oi Mundo com IF

No mudou nada no visual da pgina!

Realmente no houve mudana visvel. Lembra o que foi dito acima? A pgina recebe um nome que ser digitado pelo usurio, mas se nada for digitado uma mensagem padro ser exibida. No entanto, no existe campo de digitao no cdigo anterior. Essa informao deve ser extrada via formulrio HTML e enviada

18

para a pgina via varivel super global. Lembra como fazer o formulrio? Veja o cdigo:

Formulrio <html> <head> <style type="text/css"> <!-.conteudo { width:350px; /*height:275px;*/ border:4px solid #909090; background:#D0D0D0; } .moldura-dois { width: 358px; border:4px inset #663300; padding:15px; background: #000000; } .moldura-um { width: 404px; /*358+8+8(bordas)+15+15(paddings)*/ border:8px inset #2F1700; padding:25px; background-image: url('fundo7.JPG'); } --> </style> </head> <body> <div class="moldura-um"> <div class="moldura-dois"> <font class = "entrada" size = "5" face = "Blackadder ITC" color = "white">Digite seu nome: </font><BR><BR> <div class="conteudo"> <form method="POST" action="exemplo2.jsp"> <br>&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="nome" size="20"> &nbsp;&nbsp;&nbsp;&nbsp; <input type="SUBMIT" value="Enviar" name="B1"> &nbsp;&nbsp;
19

<input type="RESET" value="Limpar" name="B2"> </form> </div> </div> </div> </body> </html> O cdigo acima cria um formulrio HTML que ir receber um nome e enviar para a nossa pgina JSP via varivel super global. Vamos analis-lo rapidamente para lembrar alguns conceitos. As linhas1 e 2 so tags de abertura para documentos web escritos em HTML. Da linha 3 a 27 so cdigos de formatao CSS. Da linha 28 a 33 codificao HTML que inicia o corpo do documento web e diviso para aplicao da formatao CSS. A linha 34 merece um pouco mais de ateno. Nela criado um formulrio onde a forma de enviar dados ser a POST e o arquivo que receber ser o exemplo2.jsp. Desta forma possvel coletar dados do usurio e enviar para um arquivo jsp onde podemos manipular os dados que foram coletados. A linha 36 outra linha que merece destaque. Nela criada uma caixa de texto denominada nome a qual receber o nome digitado pelo usurio. A linha 38 cria um boto para enviar a informao coletada pela caixa de texto. O restante das linhas so codificaes HTML que no necessitamos debater pelo fato de j ter sido trabalhado na disciplina de HTML. A Figura 16 mostra o resultado da nossa codificao. Salve este arquivo com a extenso .htm ou .html na mesma pasta que estiver o arquivo exemplo2.jsp.

20

Figura16: Formulrio para leitura de nome

Ateno Embora o arquivo HTML possa ser aberto diretamente no navegador recomendado que seja abertoda mesma forma que se abre o arquivo JSP, ou seja, digitando o endereo completo na barra de endereo do navegador. Isso importante para o servidor TOMCAT no perder a informao que ser enviada para o arquivo exemplo2.jsp.

Declaraes Utilizam-se as declaraes para criar variveis e mtodos especficos que podero ser referenciados por outros elementos JSP. A sintaxe para declaraes : <%! Declarao %>. Declaraes de varivel Variveis so espaos reservados na memria que possuem nome, tipo e seu tamanho definido de acordo com o tipo de dado que ser armazenado. As variveis definidas como declaraes so variveis de instncia. Sendo assim, seu valor especfico ao objeto e no classe. Veja os exemplos: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Varivel</title>
21

</head> <body> <h1>Teste de varivel</h1> <%! public int idade = 18 ;%> <font color = "red" size = "5"> <%out.print(idade); %><br> <%= idade * 2%> </font> </body> </html> Este exemplo simples e de pouca utilidade, mas serve para nosso estudo sobre varivel. Na linha 8 feita uma declarao de varivel pblica do tipo inteiro e atribuido o valor 18. A linha 10 exibe o valor dessa varivel. Por fim, a linha 11 exibe o dobro do valor da varivel. Modifique esse cdigo e faa novos testes. Use outros tipos de variveis. O JSP segue os mesmo tipos de variveis do JAVA, boolean, byte, char, short, int, long, float, double... Declarao de mtodos Os mtodos so instrues que realizam alguma atividade a qual lhe foi programada. Para outras linguagens os mtodos seriam a mesma coisa que funes. Uma vez declarado o mtodo esse pode ser acessado por qualquer elemento do script. Veja o exemplo abaixo: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Teste de varivel</h1> <%! public String voto (int idade){ if (idade>= 16) return "J pode votar"; else return "Ainda no pode votar"; } %> <% out.print(voto(15)); %> </body> </html> A linha 8 do cdigo acima inicia o mtodo pblico do tipo string voto. Ele recebe em seu argumento um valor inteiro referente a idade de um indivduo e retorna se o mesmo j tem idade para votar ou no. A linha 15 a chamada do mtodo voto
22

passando para seu argumento a idade de 15 e exibindo a mensagem de retorno da funo.

Estrutura condicional As estruturas condicionais realizam operaes lgicas para decidir se um determinado cdigo ser ou no executado. Nesta apostila falaremos de duas estruturas os IF e os CASE. Estrutura condicional IF O IF testa uma determinada condio e recebe um valor lgico desse teste. As instrues presentes no bloco de instrues do IF sero executadas apenas se o resultado do teste for verdade. Veja o cdigo: <% String visitante = request.getParameter ("name"); if (visitante == null) visitante = "Mundo"; %> Al, <%= visitante %>! Esse cdigo j conhecemos. No entanto, agora podemos analisar o papel do if. Ele testa se a varivel visitante tem valor nulo. Caso tenha ela receber o valor Mundo. IF com ELSE Uma variao do if o if com else. Assim como o IF simples, o IF com ELSE testa uma determinada condio. A diferena que se o resultado do teste for verdade executar um conjunto de instrues e se o resultado for falso executar outro conjunto de instrues diferentes do primeiro. Assim, embora existam dois conjuntos de instrues apenas um ser executado. Veja o cdigo: ... if (idade>= 16) out.print("J pode votar"); else out.print("Ainda no pode votar"); } ... Esse um trecho de cdigo que tambm j conhecemos. Nele o if testa se o contedo da varivel idade maior que 16. Caso seja o output receber a mensagem de que j pode votar e caso no seja o output receber a mensagem

23

de que ainda no pode votar. Note que impossvel executar uma das duas instrues. IF com ELSE IF e ELSE A ltima variao do IF seria o IF com ELSE IF e ELSE. Neste caso executado um ou mais testes lgicos. Se o primeiro teste lgico for verdadeiro ser executado as instrues do primeiro bloco de comando do IF e no ser executado mais testes lgicos. Caso o resultado do primeiro teste lgico seja falso o primeiro bloco de instrues desprezado e um segundo teste lgico realizado. Se o resultado do teste for verdade o bloco de instrues que fica logo abaixo do teste ser executado. Caso seja falso ser realizado o terceiro teste lgico e assim por diante at que seja encontrado o comando ELSE. Quando o ELSE encontrado o procedimento adotado no IF com ELSE ser usado novamente. Vamos fazer um exemplo? Imagine que existiu uma eleio entre trs candidatos. Para que um dos candidatos seja declarado como vencedor ser necessrio que este possua mais de 50% dos votos. Caso nenhum dos trs candidatos obtenha a quantidade de votos necessrios uma mensagem informando que haver segundo turno ser exibida. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Exemplo de IF</h1> <%! public int Votos_de_A = 10; public int Votos_de_B = 20; public int Votos_de_C = 15; public int Total_de_Votos = 0;%> <% Total_de_Votos = Votos_de_A + Votos_de_B + Votos_de_C; if(Votos_de_A > ( Total_de_Votos/2)){ out.println("O candidato A foi o vencedor"); } else if(Votos_de_B > ( Total_de_Votos/2)){ out.println("O candidato B foi o vencedor"); } else if(Votos_de_C > ( Total_de_Votos/2)){ out.println("O candidato C foi o vencedor"); } else{ out.println("No existem vencedores. Haver segundo turno"); } %> </body>
24

</html> Estrutura condicional Switch Assim como o IF o Switch realiza teste lgico para escolher qual bloco de instruo ser executado. No entanto, sua funcionalidade um pouco diferente. Veja abaixo a estrutura: switch(argumento_de_teste){ casevalor_0: out.print("Sada 0"); break; casevalor_1: out.print("Sada 1"); break; casevalor_2: out.println("Sada 2"); break; } Vamos analisar cada etapa: A primeira linha switch(argumento_de_teste) o inicio da estrutura. Nele tem a chamada do switch e o argumento_de_teste que ser testado com cada um dos casos at encontrar um caso que seja igual ao argumento. Quando o caso encontrado as instrues presentes no bloco de instrues desse caso sero executadas. Os demais casos sero desprezados. J os case valor_0: o cabealho de cada caso. Nele fica o valor que ser comparado ao argumento_de_teste no nosso caso seriam osvalor_0, valor_1, valor_2. Lembrando que apenas um dos casos ser executado. Isso porque ao final de cada bloco de instrues existe a instruo break. Quando o comando break ativado ele faz com que o fluxo de execuo saia da estrutura para a prxima linha aps a estrutura. Vamos fazer um exemplo? Veja abaixo: Que tal aprender um pouco de ingls? No nosso exemplo iremos ler do usurio um nmero que pode ser de 0 a 9 e informaremos como esse nmero escrito em ingls. Vejamos o cdigo. Formulrio para escolha do nmero <html> <head> <style type="text/css"> <!-.conteudo {
25

width:350px; /*height:275px;*/ border:4px solid #909090; background:#D0D0D0; } .moldura-dois { width: 358px; border:4px inset #663300; padding:15px; background: #000000; } .moldura-um { width: 404px; /*358+8+8(bordas)+15+15(paddings)*/ border:8px inset #2F1700; padding:25px; background-image: url('fundo7.JPG'); }

} --> </style> </head> <body> <div class="moldura-um"> <div class="moldura-dois"> <font class = "entrada" size = "5" face = "Blackadder ITC" color = "white"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Escrito em ingls * </font><BR><BR> <div class="conteudo"> <form method="POST" action="switch.jsp"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size = "4">Escolha um nmero:</font>&nbsp; <select name = "numeros" size="1" value="0"> <option>01</option> <option>02</option> <option>03</option> <option>04</option> <option>05</option> <option>06</option> <option>07</option> <option>08</option>
26

<option>09</option> <option>10</option> </select> &nbsp;&nbsp;&nbsp;&nbsp; <input type="SUBMIT" value="Enviar" name="botao_1"> </form> </div> </div> </div> </body> </html> O cdigo acima cria um formulrio para que o usurio escolha um nmero entre 0 e 9 para que seja escrito em ingls. Veja a Figura 17:

Figura17 - Coleta do nmero escolhido

Aps selecionar o nmero ele ser enviado para o arquivo switch.jsp. O cdigo do arquivo o apresentado abaixo: <h1>Exemplo de Switch</h1> <% String valor = request.getParameter ("numeros"); // switch statement with some value int numero = Integer.parseInt(valor); switch(numero){ case 0:
27

out.print("ZERO"); break; case 1: out.print("ONE"); break; case 2: out.println("TWO"); break; case 3: out.println("THREE"); break; case 4: out.println("FOUR"); break; case 5: out.println("FIVE"); break; case 6: out.println("SIX"); break; case 7: out.println("SEVEN"); break; case 8: out.println("EIGHT"); break; case 9: out.println("NINE"); break; } %> No caso, a sada seria a apresentada na Figura 18.

28

Que tal trabalhar um pouco? Invente um novo aplicativo usando o switch. No vale ser a dos nmeros em ingls. Bom trabalho

Interao Muitas vezes ao logo do desenvolvimento do sistema encontramos a necessidade de repetir a ao realizando interaes com o mesmo cdigo. O JSP apresenta trs tipos de estrutura para iteraes ou loop. So o for, o while e o do while. Abaixo iremos conhecer cada uma delas. Loop usando o for O for uma estrutura que deve ser utilizada quando existe um conhecimento prvio do nmero de interaes que necessitam ser feitas. Sua estrutura padro apresentada abaixo: for (Inicializao; condio; incremento){
29

comandos; }

Onde: Inicializao ser o espao onde a varivel utilizada para ser o contador receber o valor inicial. Condio a condio de parada do loop. Incremento a operao que ser feita na varivel que serve como contador. Todos os comandos presentes no bloco de comandos do for iro ser repetidos a quantidade de vezes que for definida na condio de parada. Vamos fazer um exemplo prtico do for para ajudar na nossa compreenso. Veja abaixo: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page - for</title> </head> <body> <h1>Tamanho da Letra</h1> <% for (int contador = 1; contador < 8; contador++){ out.println("<font size = "); out.println(contador); out.println("> Letra de tamanho"); out.println(contador); out.println("</font><br>"); } %> </body> </html> Analisando o cdigo acima podemos notar que a varivel contador do for foi inicializada com o valor 1 e a condio de parada que essa varivel seja menor que 8. Como o incremento de uma unidade por iterao ento o cdigo presente no bloco de comando do for ser repetido por 7 vezes. A Figura 18 mostra o resultado desse cdigo.

30

Figura18 - Utilizando o for

possvel fazer interao decrescente. Veja o cdigo: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page - for</title> </head> <body> <h1>Tamanho da Letra</h1>

<% for (int contador = 7; contador > 0; contador--){ out.println("<font size = "); out.println(contador); out.println("> Letra de tamanho"); out.println(contador); out.println("</font><br>"); } %> </body> </html> Loop usando while

31

O while utilizado quando no existe conhecimento prvio de quantas interaes sero necessrias para finalizar o cdigo. Veja abaixo a estrutura bsica do while: while(condio){ comandos; } Onde: Condio a condio de parada do loop. importante que exista no bloco de comandos alguma ao que possa mudar o argumento da condio de parada. Do contrrio seria criado um loop infinito. Vamos fazer um exemplo de while? <%! int numero = 200; %> <% while(numero > 10){ out.println(numero); numero = numero/2; } out.println(<br>Fora do while); %> Embora simples esse exemplo mostra a utilizao do while. Inicialmente a varivel nmero recebe o valor 200. Como a condio do inicial que o nmero seja maior que 10 ento o bloco de comandos do while ser executado. Caso o valor inicial da varivel nmero fosse menor ou igual a 10 o bloco de comando do while no seria executado. Desta forma, podemos notar que no existe garantia de que o cdigo dentro do while seja executado. Para isso, necessrio satisfazer o argumento. Loop com do while A interao usando do while semelhante interao utilizando o while. A diferena que o bloco de comandos executado e s depois testa-se o argumento da instruo. Desta forma, fica garantido ao menos uma vez a execuo do bloco de comandos. Sua estrutura : do{ bloco de comandos; }while(condio)

32

Observe que a condio ser testada no final do while. Caso ela seja verdade continua a interao. Se for falsa o foco segue para a prxima linha aps o do while. Veja um exemplo: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page - for</title> </head> <body> <h1>Tamanho de do while</h1>

<%! public float numero = 200; %> <% do{ out.println(numero); numero = numero/2; } while(numero < 10); out.println("<br>Fora do while"); %> </body> </html> No exemplo acima possvel observar que o loop s funcionar uma vez, pois o nmero no menor que 10.
Vamos fazer exerccio? Crie um sistema que utilize as trs opes de loop presentes no JSP.

Tratamento de excees Durante a programao possvel encontrarmos falhas ou excees no nosso cdigo que se no forem tratadas podem simplesmente travar sua pgina e fechar tudo. Imaginemos um caso simples para esse tipo de erro. Suponhamos que o
33

usurio ir informar dois nmeros inteiros e o sistema dever exibir o resultado da diviso do primeiro pelo segundo. Realmente um sistema simples, mas tem um detalhe em especial. Se o segundo numero for zero o sistema ir travar ou fechar. Afinal, no existe diviso por zero. Essa questo poderia ser solucionada de vrias maneiras, mas para nosso exemplo vamos testar a estrutura try. A forma geral do try a apresentada abaixo: try{ Comando; } catch(Exception ex) { excesso; } No bloco de comando do try inserido o cdigo que se deseja para execuo normal. Caso exista uma falha no cdigo em tempo de execuo ser apresentado o que estiver no bloco de comando do catch. Agora que compreendemos a estrutura bsica do try vamos voltar para o exemplo da diviso. Veja abaixo como seria o cdigo: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Tratamento de excesso</h1> <% String Numero = request.getParameter ("Numero_1"); int dividendo = Integer.parseInt(Numero); String Numeros = request.getParameter ("Numero_2"); int divisor = Integer.parseInt(Numeros); try{ out.println(dividendo/divisor); } catch(Exception ex) { out.println("Erro na diviso"); } %> </body> </html> Caso o divisor tenha o valor 0 ser mostrado a mensagem Erro na diviso. Voc pode comentar: Por que no diz uma mensagem tipo No existe diviso por 0? A
34

resposta simples:embora o erro esperado seja o de diviso por 0, o try tratar qualquer exceo em tempo de execuo.

Varivel Composta Variveis so espaos reservados na memria RAM que possuem nome e tipo. Como o prprio nome j diz elas so variveis e, sendo assim, podem ter o contedo modificado ao longo do programa. No entanto, s vezes desejamos armazenar novos valores sem que haja perda do contedo anterior. Tarefa que seria impossvel para variveis simples, mas algo fcil para variveis compostas. Grosso modo podemos dizer que a varivel composta tem as mesmas caractersticas de uma varivel s que podemos armazenar mais de uma informao, ou seja, varivel composta pode ser considerada um conjunto de variveis simples. Existem dois tipos de variveis compostas que so array unidimensional e array multidimensional. Array unidimensional Array unidimensional nada mais do que vetores, ou seja, possui uma linha e variveis colunas. O espao definido para armazenar dados ser o indicado no ndice do vetor. Em JSP o array pode ser criado usando duas metodologias. A primeira seria criar o array j cadastrando seus elementos e a segunda seria criar o array adicionando elementos quando necessrio. Veja os exemplos abaixo: Exemplo 1: <% String[] Nomes={"Renata","Fernanda","Mayla","Thais"}; %> <% for(int i = 0; i <=3; i++){ out.println(Nomes[i]); out.println("<br>"); } %> No exemplo 1 criado um array unidimensional denominado Nomes e do tipo String. No momento da sua criao j so inseridos os elementos do array. Neste caso em especial quatro nomes de pessoas. Aps a criaoutiliza-se um for para exibir o contedo do array. Exemplo 2 <% String[] Pessoas =new String[4];
35

Pessoas[0]="Renata"; Pessoas[1]="Fernanda"; Pessoas[2]="Mayla"; Pessoas[3]="Thais"; %> <% for(int i = 0; i <=3; i++){ out.println(Pessoas[i]); out.println("<br>"); } %> O exemplo 2 tambm tem a funcionalidade de armazenar nome de pessoas. No entanto, primeiro criado o array Pessoas com a capacidade de armazenar 4 elementos. Posteriormente os elementos so atribudos uma a um. Array multidimensionais Os array multidimensionais so semelhantes ao unidimensional. Sua maior diferena que seu crescimento no apenas no nmero de colunas, mas em linha, pginas e assim por diante. O caso mais comum de array multidimensional a matriz. Vejamos o cdigo abaixo: <% String[][] Pessoas =new String[4][4]; Pessoas[0][0]="Nomes"; Pessoas[0][1]="Maria"; Pessoas[0][2]="Mayla"; Pessoas[0][3]="Taisa"; Pessoas[1][0]="Notas"; Pessoas[1][1]="7,9"; Pessoas[1][2]="9,0"; Pessoas[1][3]="4,5"; Pessoas[2][0]="Cidade"; Pessoas[2][1]="Caruaru"; Pessoas[2][2]="Garanhuns"; Pessoas[2][3]="Petrolina"; %> <% /*for(int linha = 0; linha <= 2; linha++){*/ for(int i = 0; i <=3; i++){ out.println(Pessoas[0][i]); out.println("&nbsp;&nbsp;&nbsp;&nbsp;"); out.println(Pessoas[1][i]); out.println("&nbsp;&nbsp;&nbsp;&nbsp;");
36

out.println(Pessoas[2][i]); out.println("<br>"); } %> O cdigo acima cria um array multidimensional de quatro linhas e quatro colunas do tipo string. Nele armazenamos os dados pessoais de uma determinada pessoa. O primeiro ndice do array representa a linha e o segundo representa a coluna. Veja a Figura 19.

Figura19 - Array multidimensional

Escopo de varivel Como bem sabemos variveis so espaos reservados na memria que possuem nome e tipo. No entanto, agora podemos aprender um novo conceito para complementar o que j sabemos. Seria o escopo da varivel ou a zona de atuao da mesma. Existem variveis onde seu escopo todo o programa, ou seja, so variveis visveis em todo o sistema e, sendo assim, podem ser acessadas em qualquer lugar do cdigo. Essas variveis so conhecidas como globais. Em contrapartida existem variveis que s podem ser utilizadas em um determinado local ou ponto do cdigo. So as variveis locais. Para compreendermos melhor observe o cdigo abaixo: <html> <head> <title>Teste Global</title> <head> <body> <% int cont = 1; %> Nmero
37

<%= ++cont %> </body> </html> Analisando-o vemos que na linha 6 foi criada uma varivel do tipo inteiro e atribudo o valor 1. J na linha 8 acrescido uma unidade varivel cont cada vez que a pgina atualizada. Antes de continuarmos teste o cdigo. Vou esperar voc testar... ... testou? Notou algo de estranho? Por mais que atualize a pgina sempre ser exibido o valor um. Isso ocorre pelo fato da varivel cont ser reiniciada todas as vezes que a pgina for atualizada. Toda varivel declarada entre <% %> ou mais conhecido por scriptlet so variveis locais por padro. J variveis declaradas em declarao sero globais. Veja o cdigo abaixo: <html> <head> <title>Teste Global</title> <head> <body> <%!int cont = 1; %> Nmero <%= ++cont %> </body> </html> Veja que apenas mudamos a declarao da varivel de um scriptlet para uma declarao. Teste novamente o cdigo e veja que a varivel cresce em uma unidade por cada vez que atualizar a pgina. Modifique o cdigo e faa novos testes. Explore o uso da varivel global e a varivel local. Quando fizer novos testes me diga qual o melhor. Usar varivel local ou global.

Modularizao Dividir para conquistar. Dificilmente algum da rea de T.I. no ouviu esta frase. Embora tenha sido uma prtica adotada em guerra, para os profissionais de computao essa a frase inicial para falarmos de subprogramao ou modularizao. A modularizao consiste em criar um modulo dentro do programa. Ok, realmente minha explicao no ajudou. Mdulo seria pedao de programa que podeexecutar determinadas tarefas. A idia fazer um pequeno cdigo para solucionar uma determinada tarefa. Assim, solucionando pequenas tarefas do projeto no final voc pode chamar todos os mdulos e ter todo seu sistema concludo. Um exemplo desta prtica seria o clculo do fatorial. Imagine calcular o fatorial de um determinado nmero. Creio que voc j tenha feito ou visto um cdigo para calcular o fatorial de um nmero inteiro positivo. J viu? Ainda no? Ento antes de seguir no nosso curso use seu conhecimento de JSP e
38

faa uma pgina web que leia um nmero inteiro positivo e informe seu fatorial. Fico esperando voc terminar. Pronto, j fez o cdigo? Embora seja simples um cdigo que voc escreve algumas linhas. No verdade? Agora imagine que seja preciso calcular o fatorial de vrios nmeros ao longo do seu sistema. Sem o uso da modularizao voc teria que repetir o mesmo cdigo em todos os locais que necessitassem calcular o fatorial. O que no seria nada produtivo e aumentaria a quantidade de linhas de cdigo sem necessidade. Comeou a compreender a vantagens de usar modularizao? Criando um mdulo para calcular o fatorial de um numero voc no mais precisaria refazer o cdigo. Basta chamar o mdulo sempre que desejar calcular o fatorial. Funo (mtodos) Quando estudamos lgica computacional aprendemos que subprogramas podem ser procedimentos e funes. A diferena entre eles que funo possui um tipo e retorna valor. J procedimento executa uma determinada tarefa sem retornar informao ao concluir a execuo da tarefa. Assim como o C a linguagem JSP no utiliza procedimento. Ele pode ser emulado utilizando uma funo que retorna void (no retorna valor). Agora que compreendemos sobre funo e procedimento, vamos conhecer abaixo a estrutura bsica para criao de uma funo em JSP. Inicialmente preciso lembrar que toda funo deve ser declarada dentro da tag <%! %>. <%! viso tipo nome(){ return ; } %> Onde: Viso ser a zona de atuao da funo. Tipo o tipo da funo. O tipo de retorno. Nome ser o nome dado a funo. Return ser a informao que a funo retornar para quem a chamou. Agora que conhecemos a estrutura de uma funo vamos fazer um exemplo simples? Vamos reescrever o cdigo do oi mundo, usando uma funo. Veja como ficaria: <%! public String Oi(){ String Frase = "Oi, mundo!"; return Frase; } %> <%
39

out.print(Oi()); %> No cdigo acima criamos a funo do tipo String e de nome Oi. Ela ter sua zona de ao pblica, ou seja, qualquer um pode ter acesso. No corpo da funo criamos uma varivel do tipo String e atribumos a frase Oi, mundo!; Por fim, informamos que o retorno da funo ser a varivel Frase. A chamada da funo feita em outro momento. Lembrando que como a funo retorna valor necessrio utilizar o valor de retorno. No nosso caso o valor de retorno foi apresentando no output do sistema. J foi dito, mas no custa repetir que a funo pode ser chamada N vezes. Embora s precise ser codificada apenas uma vez. Funo que no retorna valor Como j foi dito um pouco acima o JSP emula as caractersticas de um procedimento utilizando uma funo que no retorna valor, ou seja, void. Veja o cdigo abaixo: <%! public int Soma, Num1, Num2;%> <%! public void add(){ Soma = Num1 + Num2; }%> <% Num1 = 2; Num2 = 5; add(); out.print(Soma); %> Observando o cdigo vemos que foi criada uma funo de zona de ao pblica do tipo void e nome add. Essa funo realiza a soma de duas variveis globais e atribui o resultado a uma terceira varivel global (variveis globais so aquelas visveis em todo o sistema. A frente falaremos detalhadamente sobre elas). Ainda possvel notar que no exista nem tipo de tratamento para a chamada da funo. Por ser uma funo do tipo void ela pode ser chamada de forma isolada sem a necessidade de que um componente fique esperando o resultado da operao da funo. Passagem de parmetro Como foi visto no cdigo acima os dados que alimentaram a funo foram enviados atravs de variveis globais. As trs variveis em questo Num1, Num2 e Soma foram declaradas como globais. Por conseqncia podem ser utilizadas dentro e fora da funo. Contudo esta no seria a melhor forma de se trabalhar
40

com funo, pois gera dependncia das variveis globais. Para solucionar esse problema pode-se utilizar argumentos. Veja como ficaria o cdigo acima: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body bgcolor = "#FFFF99" text = "#0000FF"> <h1>Parametro</h1> <%! public int Soma;%> <%! public void add( int Num1, int Num2){ Soma = Num1 + Num2; }%> <% add(3,6); out.print(Soma); %> </body> </html> Analisando o cdigo acima podemos notar que no argumento da funo (mtodo) foram definidos dois parmetros de entrada do tipo inteiro, Num1 e Num2. Esses parmetros tornam-se variveis locais dentro da funo. Observe que na chamada da funo so passados valores inteiros e esses valores sero atribudos aos parmetros e utilizados na funo. Desta forma a funo no depende de variveis externas.

Antes de seguir com nosso estudo sobre JSP que tal pararmos um pouco para relembrar alguns conceitos?

Orientao ao Objeto Ser que existe algum desenvolvedor que nunca tenha ouvido falar de orientao ao objeto? O conceito da orientao ao objeto bem antigo. Foi criado por Alan Kay na dcada de 60 do sculo passado (Voc sabia?).A primeira linguagem a
41

utilizar a orientao ao objeto foi Simula, criada por Ole Johan e Kristen Nygaard. No entanto, a programao orientada ao objeto ficou popular na dcada de 90 com a linguagem C++. Hoje diversas linguagens j trabalham com esse conceito.

Legal! O papo est bom, mas o que significa programao orientada a objetos?

A programao orientada a objeto tenta trazer o mundo real para o mundo virtual. A idia simular o mundo real no virtual. Como nosso mundo composto por objetos ento nada melhor do que usar a programao orientada a objeto. Sendo um pouco redundante podemos falar que o objetivo da programao orientada a objeto imitar o mundo real. Levar caracterstica de objetos reais para o mundo virtual. Class Falamos que a programao orientada ao objeto retira caractersticas do mundo real e usa no virtual. No entanto, ser que todos os objetos so necessrios para construir um sistema? Obviamente que no. Precisamos de caractersticas especficas. Algo que apenas um tipo de objeto teria e o diferenciaria dos demais. Essa a idia das classes. Uma classe faz esse papel. Ela rene as caractersticas de um objeto. Complicado? Vamos estudar um pouco de biologia. Na biologia temos as classes dos animais entre elas os mamferos e asaves. Fazendo uma rpida anlise sobre elas podemos encontrar as caractersticas que formam e diferenciam uma ave de um mamfero. Essa a idia da classe. Simplificando, para a informtica a classe seria uma estrutura que rene atributos e mtodos de um objeto. Lembra muito a idia de struct da linguagem C. Atributos Os atributos armazenam informaes. Assim como as variveis em programao procedural.

42

Mtodos Os mtodos definem as aes dos objetos. Eles especificam a forma como os dados do objeto sero manipulados. Semelhante s funes na programao procedural. Herana Herana a capacidade de construir novas classes a partir de classes existentes. A classe construda herda caractersticas da classe existente. Assim como um filho herda caractersticas do pai. Encapsulamento Encapsulamento consiste em ocultar partes independentes da implementao. A idia envolver a classe isolando do restante do programa. Polimorfismo Basicamente polimorfismo um nico nome de classe que representa aes diferentes que so selecionadas automaticamente dependendo da entrada. Agora que revisamos um pouco da teoria da programao orientada a objeto chegou o momento de por em prtica. Vamos comear?

Primeiramente iremos criar a classe que ter quatro mtodos. Veja o cdigo: matemtica.java package matematicas; public class matematica{ public int soma( int Num1, int Num2){
43

return (Num1 + Num2); } public int sub( int Num1, int Num2){ return (Num1 - Num2); } public int Mult( int Num1, int Num2){ return (Num1 + Num2); } public int Div( int Num1, int Num2){ return (Num1 + Num2); } } Analisando o cdigo acima podemos notar que na primeira linha criamos um pacote chamado matematicas. Pacotes so utilizados para organizao das classes. Para ajudar na compreenso podemos dizer que pacotes so diretrios onde ficam armazenados os arquivos fontes. No nosso caso ser a classe matematica que nada mais do que o cdigo acima compilado pelo javac ou qualquer outro compilador Java. Ainda observando o cdigo podemos notar a criao da class matematica e que ela possui quatro mtodos. Salve esse cdigo em um arquivo com o nome matematica.java e depois compile para criar o arquivo matematica.class. O arquivo matematica.class deve ser armazenado no seguinte endereo: ..\WEB-INF\classes\matematicas Agora que criamos nossa classe devemos criar uma pgina JSP que utilize nossa classe. Veja o cdigo: <%@ page language="java" import="matematicas.matematica"%> <% matematica calculo = new matematica(); int resultado = calculo.soma(3,4); out.println("Resultado = " + resultado); %> Analisando o cdigo acima podemos notar: A linha 1,<%@ page language="java" import="matematicas.matematica"%>, importa a classe matematica que est armazenada no diretrio (pasta) matematicas. No preciso escrever WEB-INF\classes, pois o TOMCAT j tem esse caminho como padro. Lembra que criamos a estrutura de diretrios na instalao do TOMCAT? A linha 3,matematica calculo = new matematica();, criamos o objeto calculo que a classe matematica instanciada, ou seja, um objeto nada mais do que uma classe instanciada. Para instanciar uma classe no JSP usando a palavra reservada new. A linha 4,int resultado = calculo.soma(3,4);, cria a varivel resultado do tipo inteiro e atribui a essa varivel o resultado do mtodo soma do objeto calculo. Os nmeros 3 e 4 foram valores que escolhemos para esse exemplo. Eles so os
44

atributos do mtodo soma. Lembramos que qualquer outro mtodo do objeto clculo poderia ter sido chamado. Escolhemos utilizar apenas um para evitar redundncia. A linha 5,out.println("Resultado = " + resultado);, exibe a mensagem resultado = concatenada com a varivel resultado. Alm de classes criadas pelo usurio tambm podemos utilizar classes que j existem no sistema. Veja o exemplo: <%@ page import="java.io.*" %> <% FileWriter NovoArquivo = new FileWriter("c:/CursoJSP.txt"); PrintWriter saida = new PrintWriter(NovoArquivo); saida.println("Programao para Internet"); saida.println("Curso Java Server Pages"); out.println("Programao para Internet<br>"); out.println("Curso Java Server Pages"); saida.close(); %> O cdigo acima importa a classe io do pacote java. Maiores detalhes sobre o cdigo ser mostrado quando falarmos de arquivos. Arquivo Todos os dados armazenados em variveis ou arrays so perdidos quando o sistema encerrado. Desta forma, toda informao que no possa ser perdida aps o termino do sistema deve ser armazenada em algum dispositivo permanente. Entre as opes de armazenamento de dados permanente encontram-se os arquivos. Os arquivos texto so o tipo mais simples de armazenamento de dados. Ideal para quem tem a necessidade de guardar informaes que no necessitam de segurana ou regras de manipulao avanada como o banco de dados. Para manipular arquivo texto no JSP necessrio fazer a importao do pacote java.io. No JSP a importao feita utilizando a diretiva <%@ page import="nome" %>onde o nome seria o nome do pacote que ser importado. Para o nosso caso o cdigo ficaria desta forma: <%@ page import="java.io.*" %>. A diretiva import pode ser utilizada para importao de qualquer pacote java que seja necessrio no cdigo. Agora que j conhecemos como importar o pacote java.io vamos iniciar nossa codificao sobre arquivos. Escrevendo em Arquivo <%@ page import="java.io.*" %>
45

<% FileWriter NovoArquivo = new FileWriter("c:/CursoJSP.txt"); PrintWriter saida = new PrintWriter(NovoArquivo); saida.println("Programao para Internet"); saida.println("Curso Java Server Pages"); out.println("Programao para Internet<br>"); out.println("Curso Java Server Pages"); saida.close(); %> O cdigo acima cria um arquivo de nome arquivo.txt e escreve em seu interior a mensagem Curso de Java Server Pages. Vamos analisar cada linha para compreendermos melhor. Na primeira linha, <%@ page import="java.io.*" %>, feita a importao do pacote java.io. Sem ele no teramos como fazer a manipulao do arquivo. A terceira linha, File NovoArquivo = new File("c:/CursoJSP.txt");,cria o objeto de nome NovoArquivo do tipo file (arquivo) com o caminho do arquivo definido pelo usurio. Caso no exista um arquivo no caminho especificado esse ser criado e caso j exista o arquivo antigo ser substitudo por um novo. Para adicionar dados a um arquivo existentes utilize true aps o nome do arquivo. Veja como ficaria a linha: FileWriter NovoArquivo = new FileWriter("c:/CursoJSP.txt",true); A quarta linha, PrintWriter saida = new PrintWriter(NovoArquivo);,cria o objeto de nome salvar que ser utilizado para escrever no arquivo texto. Observe que o argumento do objeto salvar ser o objeto NovoArquivo. Desta forma, possvel informar qual arquivo desejamos manipular. Uma possvel variao para a essa linha seria utilizar a palavra true aps o nome do objeto que iremos manipular. Veja a linha: PrintWriter saida = new PrintWriter(NovoArquivo,true); desta forma os dados sero enviados para o arquivo sempre que for chamado o mtodo print ou println. Se utilizar o true os dados s sero enviandos quando o arquivo for fechado, atualizado ou quando enviar uma quebra de linha. Na quinta e sexta linhas estamos escrevendo no arquivo. possvel variar entre o println e o print. No primeiro caso escreve-se no arquivo e pula uma linha. J no segundo escreve-se no arquivo e o cursor permanece na mesma linha. A stima e a oitava tem o mesmo efeito da linha cinco e seis respectivamente. A diferena que os dados so enviados para o navegador e no para um arquivo. O motivo de utiliz-las para que o usurio receba alguma informao do sistema. Sem elas o arquivo receberia a informao normalmente, mas o usurio apenas iria visualizar o navegador como uma pgina em branco. A nona linha, saida.close();, o fechamento do arquivo. importante fechar o arquivo quando no mais utiliz-lo.

46

Leitura de Arquivo Agora que j criamos um arquivo e escrevemos dados nele, chegou o momento de aprendermos a ler um arquivo.Veja o cdigo: <%@ page import="java.io.*" %> <% FileReader leitura = new FileReader(new File("c:/CursoJSP.txt")); BufferedReader leitor = new BufferedReader(leitura); String linha = ""; while(linha != null){ linha = leitor.readLine(); if (linha != null){ out.println(linha + "<BR>"); } } leitor.close(); reader.close(); %> O cdigo acima l linha a linha at chegar ao final do arquivo. Veja que a codificao semelhante a escrita no arquivo. Vamos analis-lo: A primeira linha faz a importao do pacote java.io. A terceira linha cria o objeto leitura que armazenar o endereo fsico do arquivo que ser lido. A quarta linha cria o objeto leitor que ser usado para manipular o arquivo na codificao. Na quinta linha criada uma varivel do tipo string que receber cada linha que for lida do arquivo. A stima linha merece um pouco mais de ateno. Nela extrada a linha corrente do arquivo e atribuda a varivel string linha. Por fim, a dcima segunda linha e a dcima terceira so linhas para fechar o arquivo aberto. As demais linhas j so conhecidas nossa e por isso no voltei a falar sobre o que cada uma faz. Agora que aprendemos a criar e ler arquivos em JSP procure praticar. Receba informaes do usurio e escreva para um arquivo. Uso seu conhecimento acumulado para essa tarefa.

47

O cdigo para leitura de um arquivo funciona perfeitamente. No entanto, ser o mais otimizado? Se voc acha que sim no precisa fazer nada. Se achar que no use seu conhecimento para mostrar outra maneira para ler um arquivo.

Diretrios Diretrios so pastas utilizadas para separar arquivos ou at mesmo sistemas. A grande vantagem de se utilizar diretrios garantir uma melhor organizao dos seus projetos. Criar diretrio O processo de se criar um diretrio utilizando JSP bastante simples. Veja o cdigo abaixo: <%@ page import="java.io.*" %> <% String endereco = "c:/JSP"; File diretorio = new File(endereco); diretorio.mkdir(); %> O cdigo acima cria um diretrio (pasta) na raiz da unidade C denominado JSP. Vamos analisar algumas linhas para melhor compreender a codificao. A primeira linha importa o pacote java.oi. A terceira linha cria uma varivel do tipo string denominada endereo e atribui-se a ela o endereo onde se deseja criar o diretrio. A quarta linha cria um objeto do tipo arquivo que ser manipulado no sistema para criar o diretrio. Por fim, a quinta linha cria o diretrio desejado. importante lembrar que o usurio precisa ter permisso de criar diretrios no sistema operacional para que esse cdigo funcione adequadamente. O mtodo mkdir();retorna o valor booleano true quando o diretrio for criado e falso quando houver uma falha na criao do diretrio. possvel utilizar esse valor de retorno para informar ao usurio se o diretrio foi criado com sucesso. Embora o cdigo acima funcione perfeitamente, nenhuma mensagem enviada ao usurio. Sendo assim, o usurio apenas ir visualizar uma pgina em branco no navegador. Algo que pode ser frustrante para o usurio. Uma boa prtica seria informar se o
48

diretrio foi ou no criado. Vamos reescrever o cdigo assim para que o usurio possa receber a mensagem.

<%@ page import="java.io.*" %> <% String dir = "c:/JSP"; File diretorio = new File(dir); if(diretorio.mkdir()){ out.println("Diretrio criado com sucesso"); } else { out.println("Falha na criao do diretrio"); } %> Desta forma, o usurio saber se o diretrio foi ou no criado. Testar se o diretrio existe Agora que aprendemos a criar um diretrio vamos testar se ele existe mesmo. Para isso utilizaremos o mtodo exists(). Esse testa se o arquivo ou diretrio existe. Veja a codificao: <%@ page import="java.io.*" %> <% String caminho = "c:/JSP"; File diretorio = new File(caminho); if(diretorio.exists()){ out.println("O diretrio existe!<br>"); } else { out.println("O diretrio no existe!"); } %> Para no ficarmos redundantes iremos comentar apenas as linhas de maior importncia ou que ainda desconhecemos. Vamos a elas: A terceira linha cria uma varivel do tipo string de nome caminho que receber o endereo do diretrio para teste. A quinta linha testa se o diretrio existe. Caso positivo o mtodo exists() retornar true caso no exista o valor de retorno ser false.
49

Exibir contedo do diretrio Criamos o diretrio e testamos se ele existe. Chegou a hora de exibir o contedo de um diretrio. Para o nosso exemplo utilizaremos o diretrio JSP que se encontra na raiz da unidade C. Veja a Figura 20.

Figura20 - Diretrio exemplo

Nossa funo ser exibir todo o contedo do diretrio. Para isso veja o cdigo abaixo: <%@ page import="java.io.*" %> <html> <head><title>Aprendendo JSP</title></head> <body bgcolor = "#0000FF" text = "#FFFF99"> <% String caminho = "c:/JSP"; File diretorio = new File(caminho); if(diretorio.exists()){ out.println("O diretrio existe!<br><br>"); String arquivos[] = diretorio.list(); for(int i = 0; i < arquivos.length; i++){ out.println(arquivos[i] + "<br>"); } } else { out.println("O diretrio no existe!"); } %>
50

</body> </html> O resultado da codificao ser uma pgina com a lista de cada arquivo e diretrios presentes no interior do diretrio JSP. Veja a Figura 21.

Agora que j vimos o diretrio e o resultado da codificao chegou a hora de fazermos uma anlise das principais linhas dessa codificao. Vamos comear? A linha 10 cria um array do tipo string e de nome arquivos onde cada campo ir armazenar o nome de um arquivo ou diretrio presente no interior do diretrio informado. O mtodo list() retorna um array com o nome dos arquivos e diretrio do diretrio indicado. As linhas 11 e 12 so as responsveis por exibir o array arquivo na pgina web. O que no novidade para a gente. Apenas o mtodo length merece comentrio. Ele retorna o tamanho do arquivo indicado. Para o nosso caso esta retornando o tamanho do array arquivos. Excluir Depois de criar tantos arquivos e diretrios chegou o momento de aprendermos a excluir. Afinal no podemos deixar nosso computador cheio de arquivos desnecessrios. Utilizaremos o mtodo delete() para excluirmos arquivos ou diretrio da unidade fsica. Excluir arquivo
51

Para excluir arquivo de um diretrio basta criar o cdigo abaixo: <%@ page import="java.io.*" %> <html> <head><title>Excluindo arquivos usando JSP</title></head> <body bgcolor = "#0000FF" text = "#FFFF99"> <% String caminho = "c:/JSP/array.jsp"; File diretorio = new File(caminho); if(diretorio.delete()){ out.println("Arquivo Excluido"); } else { out.println("No foi possvel excluir"); } %> </body> </html> A nica novidade do cdigo acima est na linha 8. Nela tenta-se excluir o arquivo indicado na string caminho. O mtodo delete retornar true se o arquivo tiver sido excludo com sucesso ou retornar false em caso de falha. A Figura 21 apresenta o diretrio original e a Figura 22 apresenta o diretrio aps o uso da codificao acima. Observem que o arquivo array.jsp foi excludo.

Figura21 - Diretrio original

52

Figura22 - Diretrio com arquivo excludo

Excluindo diretrio Para excluir um diretrio qualquer se utiliza o mesmo cdigo de excluso de arquivos. Apenas um detalhe deve ser observado. S ser possvel excluir diretrios que estejam vazios.Veja o cdigo: <%@ page import="java.io.*" %> <html> <head><title>Aprendendo JSP</title></head> <body bgcolor = "#0000FF" text = "#FFFF99"> <% String caminho = "c:/JSP/exemplo"; File diretorio = new File(caminho); if(diretorio.delete()){ out.println("Arquivo Excluido"); } else { out.println("No foi possvel excluir"); } %> </body> </html> O cdigo acima exclui o diretrio exemplo que se encontra no diretrio JSP. A Figura23 mostra o diretrio original e a Figura 24 mostra o diretrio aps a excluso. Observe na Figura 24 que o subdiretrio exemplo no existe mais.
53

Figura23 - Diretrio original

Figura24 - Diretrio aps excluso de pasta

Include
A linguagem JSP oferece a possibilidade de incluir arquivo em uma pgina. Isso possvel utilizando a diretiva include que ter a seguinte estrutura:
54

<%@ include file="nome do arquivo" %> Onde o nome do arquivo ser o arquivo que deseja-se incluir na codificao. possvel incluir arquivosestticos ou dinmicos em uma pgina JSP. No entanto, o resultado da incluso ser especfico para o tipo de arquivo includo.

Include Esttico
Quando a incluso de um arquivo esttico o resultado s ser visualizado na apresentao da pgina JSP. Veja o exemplo: Inicialmente temos uma pgina esttica com o seguinte cdigo: <html> <head> <title>IFPE</title> </head> <body background = "ifpe.jpg"> </body> </html> A nica coisa que esse cdigo faz colocar a Figura ifpe.jpg como plano de fundo da pgina. Veja a Figura 25.

Figura25 - Pgina com plano de fundo do IFPE

55

O segundo cdigo de uma pgina JSP. A funo do cdigo ser apenas apresentar a mensagem Al, mundo!. Veja o cdigo: <html> <body> <% out.println("Al, mundo!");%> </body> </html> Observe que um cdigo simples que j temos familiaridade. O resultado deste cdigo o apresentado na Figura 26.

Figura26 - Pgina exemplo para o include esttico

Agora que j conhecemos as duas codificaes que usaremos neste exemplo, iremos incluir o arquivo htm na pgina JSP. Veja como ficaria o cdigo: <html> <body> <%@ include file="ifpe.htm" %> <% out.println("Al, mundo!");%> </body> </html>
56

A linha 3 mostra que um arquivo est sendo includo no cdigo. No caso em especial o arquivo includo o ifpe.htm. Veja na Figura 27 como fica o resultado desta incluso.

Figura27 - Pgina JSP com arquivo esttico includo.

Embora no exista nenhuma referncia ao background na codificao JSP esse foi includo no momento que usamos a codificao da pgina ifpe.htm.

Include dinmico
A forma de incluir arquivo dinmico em pginas JSP idntica incluso de arquivos estticos, mas o efeito ser diferente. Quando o arquivo dinmico includo este realiza todas as aes previstas no arquivo devolvendo o controle para o a pgina JSP que o incluiu. Funciona semelhante a chamada de uma funo. Veja o exemplo: metodo.jsp <%! public int soma( int numero_1, int numero_2){ return (numero_1 + numero_2); } %>

57

O cdigo acima apresenta a codificao presente no arquivo metodo.jsp. Observe que um cdigo simples para criar um mtodo que ir receber em seu argumento dois nmeros inteiros e retorna a soma destes nmeros. Include_dinamico.jsp <%@ include file="metodo.jsp" %> <% int resposta = soma(2,4); out.println(resposta); %> J o segundo cdigo extrado do arquivo Include_dinamico.jsp este arquivo faz a incluso do arquivo dinmico metodo.jsp e apartir deste momento pode utilizar todas as funcionalidades do cdigo que foi includo. No caso, o arquivo Include_dinamico.jsp utiliza o mtodo soma mesmo sem ter o mtodo declarado em sua pgina. Isso foi possvel pelo fato do mtodo ter sido includo no momento da incluso do arquivo metodo.jsp.

Session
Uma sesso um objeto associado ao usurio. Informaes do usurio podem ser armazenadas em uma sesso e resgatadas posteriormente. Diferente do cookie nas sesses, as informaes armazenadas permanecem no servidor. Basicamente podemos imaginar que sessesso variveis criadas na primeira vez que o usurio acessa a pgina e podem ou no serem atualizadas nos demais acessos. Desta forma existir uma sesso para cada usurio.

Criar Sesso
Bom, chega de papo! Vamos criar uma sesso.Neste primeiro cdigo iremos fazer uma sesso para armazenar o nome de um time de futebol. Veja abaixo: escolher_Time.htm <html> <head> <style type="text/css"> <!-.conteudo { width:350px; /*height:275px;*/ border:4px solid #909090; background:#D0D0D0;
58

} .moldura-dois { width: 358px; border:4px inset #663300; padding:15px; background: #000000; } .moldura-um { width: 404px; /*358+8+8(bordas)+15+15(paddings)*/ border:8px inset #2F1700; padding:25px; } } --> </style> <title>Time de Futebol</title> </head> <body> <div class="moldura-um"> <div class="moldura-dois"> <font class = "entrada" size = "5" face = "Blackadder ITC" color = "white"> Digite o nome do seu time de futebol favorito: </font><BR><BR> <div class="conteudo"> <form method="POST" action="criar_sessao.jsp"> <br>&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="time" size="20"> &nbsp;&nbsp;&nbsp;&nbsp; <input type="SUBMIT" value="Enviar" name="B1"> &nbsp;&nbsp; <input type="RESET" value="Limpar" name="B2"> </form> </div> </div> </div> </body> </html> Esse primeiro cdigo cria apenas uma formulrio, em HTML, que ser usado para receber o nome do time de futebol favorito do usurio e enviar para a pgina criar_sessao.jsp. A Figura 28 apresenta a pgina resultante desse cdigo.

59

Figura28 - Escolher time para sesso

criar_sessao.jsp <% try{ String nome = request.getParameter ("time"); session.setAttribute ("sessaotime", nome); out.println("Sesso Criada!"); } catch(Exception ex) { out.println("Falha na criao da sesso"); } %> A novidade que encontramos no cdigo da pgina criar_sessao.jsp a linha 4, session.setAttribute ("sessaotime", nome);, nela criamos verdadeiramente uma sesso de nome sessaotime e que ir armazenar o contedo da varivel nome. Caso a sesso seja criada a mensagem Sesso Criada ser apresentada. Caso exista erro a mensagem Falha na criao da sesso ser apresentada. Veja a Figura 29.

60

Figura29 - Sesso criada com sucesso

Exibir Sesso
Criamos nossa sesso mais no tem sentido criar sem que se possa resgatar o valor atribudo. Est a funo do cdigo da pgina exibir_sessao.jsp. Veja abaixo: exibir_sessao.jsp <html> <head> <style type="text/css"> <!-.conteudo { width:350px; border:4px solid #909090; background:#D0D0D0; } .moldura-dois { width: 358px; border:4px inset #663300; padding:15px; background: #000000; } .moldura-um { width: 404px; border:8px inset #2F1700; padding:25px; } }
61

--> </style> <title>Time de Futebol</title> </head> <body> <div class="moldura-um"> <div class="moldura-dois"> <font class = "entrada" size = "5" face = "Blackadder ITC" color = "white"> <center>Time Escolhido</center> </font><BR><BR> <div class="conteudo"> <center> <font face = "Arial" size = "6" color = "#993300"><b><br> <%= session.getAttribute( "sessaotime" ) %> <br><br></b></font> </center> </div> </div> </div> </body> </html> J um cdigo bem conhecido. A exceo seria a linha 37, <%= session.getAttribute( "sessaotime" ) %>. Nesta linha resgatado o contedo da sesso sessaotime e posteriormente exibido na tela. Veja a Figura 30.

Figura30 - Exibir sesso

Da mesma forma que a informao foi exibida na tela ela poderia ter sido armazenada em uma varivel para que fosse possvel realizar manipulaes. No foi to complicado criar uma sesso simples, foi? Modifique o cdigo acima e crie sua prpria sesso.
62

Tempo de vida da sesso


As sesses que criamos at agora no tinham um prazo de validade, ou seja, no existia limite de tempo para que elas estivessem ativas. Contudo ser que desejamos manter uma sesso infinitamente? Uma alternativa para esse problema seria utilizar o mtodo session.setMaxInactiveInterval(tempo). Ele define o tempo de vida da sesso, ou seja, quanto tempo a sesso estar ativa. Seu argumento ser sempre um valor inteiro que representar o tempo (em segundos) de durao da sesso. Veja o exemplo: Sessao.jsp <% String nome = "Teste de sesso"; session.setAttribute ("dados", nome); session.setMaxInactiveInterval(60); out.println("Sesso criada"); %> PginaSessao.jsp criar uma sesso de nome dados que ir armazenar as informaes presentes na varivel nome. Algo que j aprendemos a fazer no cdigo anterior. A diferena neste cdigo est na linha 4, session.setMaxInactiveInterval(60);, nela chamado o mtodo session.setMaxInactiveIntervaldefinindo que o tempo de vida da sesso ser de 60 segundos, ou seja, um minuto. Exibir.jsp <%= session.getAttribute( "dados" ) %> A pgina Exibir.jsp ir exibir o contedo da sesso dados. Rodo a pgina Exibir.jsp antes de completar um minuto de ter atualizado a pgina Sessao.jsp. Observe que o valor apresentado ser Teste de sesso. Espere um minuto e atualize a pgina Exibir.jsp e note que o valor apresentado ser null, ou seja, no existe a sesso dados.

Remover
Existem momentos que no desejamos esperar o tempo necessrio para que o tempo de vida da sesso seja concludo. Seja para liberar espao na memria ou simplesmente porque a sesso deixou de ter utilidade. Para remover a sesso podemos utilizar o mtodo session.removeAttribute("nome da sesso"). Vamos testar? Lembra da nossa sesso de nome dados? Vamos remover? Veja o cdigo:

63

<% session.removeAttribute("dados"); %> Aps chamar uma pgina com o cdigo acima pea para visualizar a sesso dados. Voc ver que o valor resultante ser null. Isso porque a sesso no mais existe.

Outras operaes com sesso


Antes de concluirmos nosso assunto sobre sesso gostaria de apresentar trs mtodos. So eles:

out.println("A sesso foi criada em: " + session.getCreationTime()); out.println("O ultimo acesso a sesso foi em: " + session.getLastAccessedTime()); out.println("O id da sesso : " + session.getId()); O mtodo session.getCreationTime()informa (em milissegundos) quando a sesso foi criada. J o mtodo session.getLastAccessedTime()informa (em milissegundos) quando foi o ltimo acesso a sesso. Por fim, o mtodo session.getId()informa o identificador nico da sesso. Cada sesso possui seu identificador. Vamos fazer um exerccio? Que tal converter o valor de retorno dos mtodos para hora, minuto e segundo? Desta forma, pode trabalhar todo seu conhecimento de JSP.

Administrao de e-mails
Dificilmente uma empresa pode dizer que sobrevive no mercado atual sem utilizar e-mail. O correio eletrnico uma importante ferramenta de comunicao on-line. Alm de ser um bom meio de troca de arquivos. Para trabalhar com e-mails no JSP necessrio que utilizar a API javamail. Essa API pode ser baixada no site
64

http://javamail.kenai.com/nonav/javadocs/index.htmlque tambm contm dicas para sua instalao.

Enviando e-mail
Para enviar qualquer e-mail necessrio ter um servidor de e-mails. Como ser mostrado no cdigo abaixo: <%@ page import="java.util.*, javax.mail.*, javax.mail.internet.*" %> <% Properties propriedade = new Properties(); propriedade.put("mail.smtp.host", "smtp.seuservidor.com.br"); Session sessao = Session.getInstance(propriedade,null); MimeMessage message = new MimeMessage(sessao); InternetAddress from = new InternetAddress("suaemail@email.com"); message.setFrom(from); InternetAddress to = new InternetAddress("emaildestino@email.com"); message.addRecipient(Message.RecipientType.TO, to); message.setSubject("Assunto do email"); message.setText("Corpo do email"); Transport.send(message); out.print(E-Mail enviado com sucesso!); %> Analisando o cdigo podemos notar que: A linha 4, propriedade.put("mail.smtp.host", "smtp.seuservidor.com.br"); , recebe o servidor de e-mail que ser usado para transmisso do e-mail. A linha 7, InternetAddress from = new InternetAddress("suaemail@email.com");, cria o objeto from atribuindo o endereo de e-mail de quem est enviando. A linha 9, InternetAddress to = new InternetAddress("emaildestino@email.com");, cria o objeto to atribuindo o endereo de quem receber o e-mail. As linhas 11 e 12 recebem o assunto do e-mail e o texto do corpo. A linha 13,Transport.send(message);, responsvel pela transmisso do e-mail. Teste esse cdigo no seu servidor de e-mail. Envie um e-mail para seu colega de turma falando como legal estudar JSP. S no crie SPAMs.

Banco de Dados
Assim como os arquivos o banco de dados uma forma de armazenamento de dados permanentes, ou seja, que no sero perdidos quando a mquina for desligada. No entanto, o banco de dados oferece diversas vantagens em relao aos arquivos. Dentre elas podemos citar a segurana, organizao, velocidade de
65

acesso entre tantas outras. Nesta etapa do nosso estudo vamos conhecer um pouco sobre banco de dados e como utiliz-lo no JSP.

Modelos de Dados
Podemos compreender como modelos de dados um conjunto de conceitos que descrevem a estrutura do banco. Dentre os modelos podemos destacar o modelo relacional e o modelo orientado ao objeto.
Modelo Relacional

O modelo relacional foi criado tendo como base a teoria dos conjuntos e a lgebra relacional. til na soluo de problemas no nvel de concepo e implementao do banco de dados. Sua estrutura a tabela que pode se relacionar com outras tabelas atravs dos seus campos. Veja o exemplo: Tabela Pessoa Cod_Pessoa 1 2 3 Tabela Produto Produto 1 2 3 Tabela Venda Cod_Venda 1 2 3 Cod_produto 2 3 2 Cod_Pessoa 1 1 3 Quantidade 2 5 1 Nome Mouse Teclado Cabo Quantidade 21 33 50 Nome Pedro Paulo Joo Cidade Recife Caruaru Garanhuns

Observem que as tabelas se relacionam. Veja vendas. Para a venda ser feita necessrio o cdigo do produto que foi vendido e o cdigo do vendedor. Essas informaes chegam tabela vendas como chaves estrangeiras.
Modelo Orientado ao Objeto

66

O modelo relacional pode tornar-se complicado de utilizar quando os dados so muito complexos. Como alternativa a esse modelo surge o modelo orientado a objeto. Que a unio dos modelos de dados tradicionais e a orientao a objeto. Este modelo passou a ter identidade de objeto, herana, encapsulamento e polimorfismo. A manipulao do bando de dados orientado a objeto atravs de mtodos presentes nas classes que estejam o objeto. Sua modelagem feita utilizando a linguagem UML.

Instalando o Banco de Dados


Existem diversas bases de dados que podem ser utilizadas por aplicaes JSP. Seria pouco produtivo citar aqui, pois cada um pode ter sua preferncia. No entanto, para o nosso curso utilizaremos o sistema de gerenciamento de banco de dados (SGBD) MYSQL. Dentre os fatores que levaram a sua escolha est o fato de ser um software livre e de fcil utilizao. Esse SGBD pode ser baixado no site
http://www.mysql.com/downloads/ Instalando o MYSQL

Aqui iremos apresentar como instalar o MYSQL no Windows XP. Os demais sistemas seguem o mesmo princpio dessa instalao. 1 Baixe o arquivo mysql-essential-5.1.45-win32.msi ou semelhante para seu sistema operacional. Aps baixar execute o arquivo e siga as opes padres conforme apresentado nas Figuras de 31 a 36.

Figura31 - Inicio da instalao do MYSQL

67

Figura32 - Instalao Typical

Figura33 - Seguindo a configurao padro

68

Figura34 - Instalando o MYSQL

Figura35 - Instalando o MYSQL

69

Figura36 - Final da instalao do MYSQL

Configurando MYSQL

Concluda a instalao do banco de dados chega o momento de configurar. Escolha a opo Standard. Veja Figura 37.

Figura37 - Escolhendo a configurao Standard

Nas prximas etapas basta seguir a configurao padro. Conforme apresentado nas Figuras 38 e 39.

70

Figura38 - Configurando MYSQL

Figura39 - Configurando MYSQL

Seguindo todos os passos apresentados acima chega o momento de inserir a senha do banco. Escolha uma senha adequada. Para nossos estudos utilizarei a senha 12345.

71

Figura40 - Definindo senha do MYSQL

Aps insero da senha e clicado na tela prximo ser aberta a tela que ir testar toda a configurao. Caso toda configurao esteja correta ser apresentada uma tela semelhante Figura 41, mas se existir alguma falha no processo ser apresentada uma tela semelhante aFigura 42. Caso exista falha leia onde foi encontrado o erro e repita o processo.

72

Figura41 - Configurao concluda com sucesso

73

Figura42 - Falha na configurao

Conectividade com o Banco de Dados


Concluda toda instalao e configurao do banco chegou o momento de conectar ao sistema. Para utilizar o banco de dados no JSP preciso instalar o drive que far a ligao entre o MYSQL e o JSP. Esse drive o mysqlconnector-java que se encontra no site http://dev.mysql.com/downloads/connector/j/ Quando baixar o drive copie o arquivo mysql-connector-java-5.1.18-bin.jar para a pasta ...Tomcat 7.0\lib Feito isto feche a pasta e crie o cdigo abaixo para saber se o conector est funcionando. <%@ page language="java" import="java.sql.*" errorPage="" %> <html> <head><title>Teste do Driver</title> </head> <body>

74

<% try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); out.write("Driver Funcionando!"); } catch( Exception ex ){ out.write("Erro no funcionamento do drive: " + ex.toString()); } %> </body> </html> Se o drive estiver funcionando a mensagem Driver Funcionando!serapresentada. Caso no esteja funcionando a mensagem Erro no funcionamento do drive e o motivo do erro ser exibido. Est a ultima etapa para instalao e configurao da base de dados. Nos prximos tpicos iremos aprender como manipular a base de dados.

Linguagem SQL
A linguagem SQL (Structured Query Language) surgiu no final dos anos 70. Hoje em dia praticamente todos os SGBD aceitam o SQL. Toda manipulao de dados feita atravs de consultas declarativas.Nossos cdigos JSP sero todos construdos utilizando o SQL para manipulao dos dados.

Criando Bando de dados


A primeira tarefa para nosso estudo de banco de dados em JSP ser criar um banco de dados. Afinal como manipular o banco se ele no existir? Para nosso estudo criaremos o banco JSP. O comando SQL para criao de um bando de dados CREATE DATABASE`JSP` ; onde JSP o nome da base de dados que desejamos criar. Apenas esse cdigo seria perfeitamente aceitvel se estivssemos trabalhando dentro do MYSQL (Command Line Client), mas no nosso caso. Estamos trabalhando o MYSQL atravs do JSP e por isso necessrio conectar ao SGBD e s depois utilizar o cdigo SQL. Veja como ficaria o cdigo: <%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{
75

Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o SGBD"); } if(conn != null){ Statement query = conn.createStatement(); query.executeUpdate("CREATE DATABASE `JSP` ;"); out.println("Banco criada com sucesso!"); } %> O cdigo acima tenta conectar-se ao SGBD e caso no haja falha na conexo ser criado um banco de dados chamado JSP. Vamos analis-lo: A linha 1, <%@ page language="java" import="java.sql.*" %>, importa o pacote sql. Ela necessria para utilizar todo cdigo de manipulao do banco de dados. A linha 3, String url = "jdbc:mysql://localhost";, cria uma varivel do tipo String de nome url que ir armazenar o endereo do SGBD o qual desejamos manipular. A linha 4, String usuario = "root";, cria uma varivel do tipo String de nome usurio que ir armazenar o login do usurio que est tentando acessar o SGBD. A linha 5, String senha = "12345";, cria uma varivel do tipo String de nome senha que ir armazenar a senha do usurio que est tentando acessar o SGBD. A linha 6, Connection conn = null;, cria uma varivel do tipo Connection de nome conn. Essa varivel ser utilizada para conexo ao SGBD. A linha 8, Class.forName("com.mysql.jdbc.Driver").newInstance();, carrega os drives de manipulao do MYSQL. Os mesmo drives que instalamos no TOMCAT para manipulao do SGBD MYSQL. A linha 9, conn = DriverManager.getConnection(url, usuario, senha);, tenta conectar-se ao SGBD e os dados da conexo so atribudos a varivel conn. A linha 11,catch(SQLException ex), realiza o tratamento para excees no cdigo SQL. A linha 12, out.println("SQLException: " + ex.getMessage() + "<br>");, exibe uma mensagem com o erro encontrado ao se tentar executar a instruo SQL. A linha 13, out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>");, exibe o cdigo do erro encontrado ao se tentar executar a instruo SQL. A linha 16,out.println("Problemas ao tentar conectar com o SGBD");, exibe uma mensagem de erro para falhas em geral. A linha 18,if(conn != null), testa se a varivel conn contm os dados de conexo do SGBD.
76

A linha 19, Statement query = conn.createStatement();, cria um objeto para receber comandos SQL. A linha 20,query.executeUpdate("CREATE DATABASE `JSP` ;");, executa o comando SQL que o argumento do mtodo executeUpdate do objeto query. As demais linhas no foram citadas por j serem conhecidas nossa. Execute esse cdigo e um banco de dados de nome JSP ser criado. Acesse o MYSQL via Command Line Client e digite Show databases;. Observe que ir exibir a lista de todos os bancos de dados presentes no SGBD. Se tudo deu certo voc dever encontrar o banco JSP nesta lista. Veja a Figura 43.

Figura43 - Lista de todos os bancos presente no SGBD

Agora que voc aprendeu a criar um banco de dados vamos executar o cdigo novamente. Veja que dessa vez ser exibido uma mensagem de erro. Isso ocorre pelo fato do banco de dados que desejamos criar j existir. Como no inserimos nenhum tipo de tratamento para erro a pgina no exibida. Reescreva seu cdigo como o apresentando abaixo: <%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>");
77

out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o SGBD"); } try{ if(conn != null){ // procedimentos para criar um banco Statement query = conn.createStatement(); query.executeUpdate("CREATE DATABASE `JSP` ;"); out.println("Banco criada com sucesso!"); // fim criao banco } } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o banco de dados"); } %> Observe que desta vez nossa tentativa de criar um banco de dados est dentro de um try. Sendo assim, se no for possvel criar o banco ser exibida uma mensagem informando que no foi possvel e o cdigo de erro.

Criando tabela
Um banco de dados sem tabelas teria pouco ou nenhuma utilidade, no verdade? O processo para criar tabelas semelhante criao de um banco de dados. A diferena que iremos informar cada campo da tabela. Para o nosso exemplo iremos criar uma tabela com trs campos: ID, Nome e Idade. Utilizando apenas instruo do SQL o cdigo seria este: create table pessoa(id int(3) unsigned not null auto_increment, nome varchar (200), idade int(3), primary key (id));Observem que o campo id no permite dado nulo, auto incremento e foi definido como chave primria. No entanto, vamos inserir esse cdigo em uma pgina JSP. Veja como ficaria: <%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost/JSP"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{
78

Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o banco de dados"); } if(conn != null){ Statement query = conn.createStatement(); query.executeUpdate("create table pessoa(id int(3) unsigned auto_increment, nome varchar (200), idade int(3), primary key (id));"); out.println("Tabela criada com sucesso!"); } %>

not

null

O cdigo acima criou um de nome Pessoa com os campos cdigo do tipo inteiro, nome do tipo varchar(string) de tamanho 200 e idade do tipo inteiro. Observe que o cdigo idntico ao cdigo de criao de um banco de dados. Apenas duas diferenas nas linhas 3 e 20. A primeira informa que iremos manipular a base de dados JSP e no o SGBD como feito anteriormente. J a segundo mostra a alterao do cdigo SQL.

Inserir dados
Agora que j criamos nossa base de dados e nossa tabela chegou o momento de inserirmos informaes (dados). Essa a funo do INSERT no SQL. Para o nosso caso iremos inserir um nome e a idade no nosso campo. INSERT INTO Pessoa (id, nome, idade) VALUES (1, 'Joo', 15);. Observem que para cada campo criado existe um dado para ser inserido. No caso, id recebe 1, nome recebe Joo e idade recebe 15. Veja como ficaria utilizando esse cdigo no JSP: <%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost/JSP"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>");
79

out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o banco de dados"); } if(conn != null){ Statement query = conn.createStatement(); query.executeUpdate("INSERT INTO Pessoa (id, nome, idade) VALUES (1, 'Joo', 15);"); } %> Execute o cdigo acima e veja que ele funciona perfeitamente, mas s uma vez. Isso pelo fato do campo id ser nico, ou seja, no devem existir dois campos com o mesmo valor no id. Como no nosso cdigo o id sempre recebe 1 isso torna o cdigo invlido na segunda vez que utilizamos. Reescreva o cdigo conforme apresentado abaixo: <%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost/JSP"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o banco de dados"); } if(conn != null){ Statement query = conn.createStatement(); query.executeUpdate("INSERT INTO Pessoa (nome, idade) VALUES ('Joo', 15);"); } %>

80

Analisando o cdigo podemos notar que o INSERT da linha 21 no apresenta dados para o campo id. Realmente no necessrio informar qual o valor do campo id. Isso pelo fato do campo ter sido definido como auto incremento. Desta forma ele adiciona uma unidade no seu valor cada vez que for inserido dado nos demais campos. Execute o cdigo anterior e ver que pode adicionar dados vontade na tabela, no importando quantos Joo de 15 anos existam. Todos tero id diferente das demais, fato que permite utilizarmos o campo id como chave primria.

Recuperando Dados
Todas as operaes que fizemos at o momento s puderam ser confirmadas atravs de meio externo de acesso ao banco, ou seja, para visualizar todas as modificaes que eram feitas na base de dados precisamos utilizar o Command Line Client do MYSQL para visualizar o resultado. Vamos mudar isso? O objeto ResultSet. quando executa uma instruo de consulta ao banco de dados o resultadoda consulta ser uma tabela, deixando um apontador posicionado na primeira linha desta tabela.O mtodo Next() move o apontador para as demais linhas da tabela retornando false quando no existir mais linhas. Para ajudar na nossa compreenso modifiquei a tabela pessoa do banco JSP. Vejam como ela ficou: ID 1 2 3 4 5 6 7 8 9 Nome Joana Maria Paulo Rafael Lucia Taisa Flvia Pedro Lucas Idade 15 30 10 1 45 20 29 18 9

Agora que temos uma tabela completa vamos criar um cdigo que permita visualizar seus elementos. Veja abaixo:

<%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost/JSP"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance();
81

conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o SGBD"); } String query = "SELECT nome, idade FROM pessoa"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()){ String nomes = rs.getString("nome"); intidades = rs.getInt("idade"); out.println(" " + nomes + " Idade: " + idades + "<br>"); } %> O resultado do cdigo acima pode ser visto na Figura44. Conforme foi dito, esse cdigo exibe todos os nomes e suas respectivas idades da tabela pessoa. Vamos analis-lo: A linha 18, String query = "SELECT nome, idade FROM pessoa";, cria uma varivel do tipo string de nome query que ir armazenar nossa consulta SQL. Neste caso em especial feito a seleo dos campos nome e idade da tabela pessoa. A linha 19, Statement stmt = conn.createStatement();, cria o objeto stmt do tipo Statement. Dela so tirados os mtodos para consultar a tabela. A linha 20, ResultSet rs = stmt.executeQuery(query);, executa a consulta SQL com o mtodo executeQuery. O resultado da consulta armazenado na varivel rs. A linha 21, while (rs.next()), inicia um lao que ir executar enquanto existir linhas para serem lidas na tabela pessoa. A linha 22, String nomes = rs.getString("nome");, utiliza o mtodo getString para retirar a informao do campo nome convertendo em uma string aceita pelo JSP e armazenando na varivel nomes. A linha 23, int idades = rs.getInt("idade");, tem ao semelhante a linha 22. A diferena que a informao ser retirada do campo idade e convertida no tipo inteiro aceito pelo JSP. Seria possvel converter em outros tipos vlidos como o getFloat ou at mesmo o getString. As demais linhas do cdigo j fazem parte de tudo que aprendemos no JSP e por isso no irei comentar. A consulta tabela pessoa pode ser modificada apenas modificando a instruo SQL. Teste mudar. Por exemplo, tente realizar uma consulta para exibir apenas o nome e a idade da pessoa que possui o cdigo 3. Para isso, basta escreve a consulta SQL: SELECT nome, idade FROM pessoa where id = 3.
82

Figura44 - Tabela pessoa

Alterar Campo
Outra importante ao a ser realizada em uma base de dados a opo de alterar um determinado campo ou toda uma tabela. Para realizar a alterao de qualquer campo na tabela utilizamos o mesmo cdigo que foi visto na opo de inserir dados. A nica mudana a escrita do SQL. Veja o cdigo abaixo: <%@ page language="java" import="java.sql.*" %> <% String url = "jdbc:mysql://localhost/JSP"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o banco de dados"); } if(conn != null){
83

Statement query = conn.createStatement(); String sql = "UPDATE `jsp`.`pessoa` SET `nome` = 'Renata',`idade` = '40' WHERE `pessoa`.`id` = 2;"; query.executeUpdate(sql); } %> Comparando com o cdigo que insere dados em uma tabela a nica mudana est na linha 21 onde o SQL deixou de ser a instruo INSERT para utilizarmos a instruo UPDATE. Observe que o cdigo acima modifica o nome e a idade da pessoa que possui cdigo 2. Conforme pode ser visto na Figura 45 em comparao com a Figura 44.

Figura45 - Tabela atualizada

Excluir
Por fim, podemos encontrar situao em que alguma informao deixou de ser necessria e por isso no necessitamos mais armazen-la na nossa base de dados. Para deletar uma linha no nosso banco iremos utilizar a instruo DELETE do SQL. Veja o cdigo abaixo: <%@ page language="java" import="java.sql.*" %> <%
84

String url = "jdbc:mysql://localhost/JSP"; String usuario = "root"; String senha = "12345"; Connection conn = null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, usuario, senha); } catch(SQLException ex){ out.println("SQLException: " + ex.getMessage() + "<br>"); out.println("Cdigo do Erro: " + ex.getErrorCode() + "<br>"); } catch(Exception e){ out.println("Problemas ao tentar conectar com o banco de dados"); } if(conn != null){ Statement query = conn.createStatement(); String sql = "DELETE FROM `jsp`.`pessoa` WHERE `pessoa`.`id` = 5"; out.print(sql); query.executeUpdate(sql); } %> O cdigo acima exclui a linha que tem id = 5 da nossa tabela. Mais uma vez observe que no existe mudana no cdigo JSP. Toda modificao feita na linguagem SQL.

Finalizando banco de dados


Concluindo a etapa do nosso estudo sobre banco de dados em JSP gostaria de deixar uma dica. Embora seja possvel manipular dados dentro da base de dados deixamos como sugesto que toda manipulao seja feita usando a linguagem de programao. Essa ao facilitar seu domnio sobre qualquer tipo de dado. Por fim, voc conheceu como manipular sua base de dados. Chegou o momento de utilizar seu conhecimento para criar um pequeno sistema que utilize todo conceito aprendido. Faa formulrios de cadastro, atualizao, excluso e consulta.

XML
A internet foi um marco na comunicao mundial. No entanto, da sua criao at os dias atuais muita coisa mudou. Surgiu a banda larga e com ela o aumento da
85

transmisso de dados. Alm da transmisso de texto hoje j se envia vdeo, som, fotos entre outros formatos. Muita coisa, no mesmo? Contudo existe um problema neste grande volume de transmisso de dados. a falta de padro para comunicao neste mundo cada vez mais globalizado. Como resposta a essa necessidade de padro surge a linguagem XML (Extensible Markup Language). Assim como o HTML o XML uma linguagem de marcao derivada do SGML (Standard Generalized Markup Language). Recomendada pela W3C para criao de documentos com dados organizados hierarquicamente.O XML no descreve nem aparncia nem aes, mas sim o que cada trecho de dados ou representa, ou seja, ele descreve o contedo do documento.Seu propsito principal a facilidade de compartilhamento de informaes atravs da internet. No entanto, pode ser utilizada para padres fora da rede mundial.

Estrutura de um documento XML


Como foi dito acima o XML usado para criar estruturas para formatao de dados. Desta forma a comunicao entre quem envia e quem recebe passa a seguir o padro definido no XML. Veja o cdigo abaixo: <?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro> <titulo>Estudo sobre XML</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> </livro> <livro> <titulo>Estudo sobre JSP</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> </livro> <livro> <titulo>Clculo</titulo> <autor>Desconhecido</autor> <categoria>Matemtica</categoria> </livro> </Biblioteca> O cdigo mostra uma estrutura XML para envio de informaes de livros para uma biblioteca. Vamos analis-lo: A linha 1, <?xml version="1.0" encoding="ISO-8859-1"?>, informa qual a verso da linguagem XML. Todo documento XML deve comear por essa linha. O segundo atributo, encoding, informa que sero usados caracteres especiais. No caso esses caracteres so presentes no isso-8859-1. Utilizamos para que possamos trabalhar com acentuao no idioma portugus. Seria possvel escrever
86

a linha sem o encoding: <?xml version="1.0">, contudo no seria possvel trabalhar com caracteres no ASCII. A linha 2 a raiz da estrutura. Todo documento XML possui uma raiz. Dela podemos saber qual o tema do documento. No caso, estamos escrevendo um documento XML para enviar informaes de uma biblioteca. A linha 3 inicia o elemento livro. E as prximas trs linhas (4,5 e 6) passam informao do livro. A linha 7 fecha o elemento livro. Da linha 8 em diante repete-se o elemento livro com informaes de outros livros. Concluindo com o final do documento na linha 18 onde fechamos a raiz. A estrutura do XML ficaria semelhante a apresentada na Figura 46.

Figura46 - Documento XML

Essa seria a idia bsica para uma estrutura XML. Observe que o objetivo no criar um efeito visual, mas apenas organizar e padronizar os dados.

Sintaxe XML
Como qualquer linguagem, o XML possui regras que precisam ser obedecidas para funcionar. Diferente do HTML o XML no tolerante a falhas, sendo assim, se existir falhas na estrutura o XML simplesmente no funcionar.

87

Todo elemento XML deve ter um tag de fechamento

Diferentemente do HTML, no XML no existe tag sem seu par. Veja o cdigo abaixo: <?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro> <titulo>Estudo sobre XML</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> <br> </livro> </Biblioteca> Observe que na linha 7 a tag <br> no foi fechada. Quando tentamos ativar o documento XML encontramos a mensagem de erro semelhante aFigura 47.

Figura47 - Falta tag de fechamento

Para enviar o erro ocorrido no cdigo acima basta inserir uma tag de fechamento para tag <br></br>. No entanto, como a tag <br> uma tag vazia de informao poderamos escrever desta forma <br />. Modifique o cdigo acima com qualquer uma das duas formas de se escrever e veja o resultado.
As tags XML so case sensitives

As tag XML so case sensitives, logo diferenciam caracteres maisculos de caracteres minsculos. Veja o cdigo:
88

<?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro> <Titulo>Estudo sobre XML</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> </livro> </Biblioteca> Observe que na linha 4,<Titulo>Estudo sobre XML</titulo>, Titulo diferente de titulo e por isso esse cdigo no funciona. Teste e veja o resultado.
Elementos XML devem estar aninhados

Os elementos XML devem respeitar a ordem de abertura. Sendo assim, tags mais internas devem ser finalizadas antes que as tags mais externas. Veja o cdigo: <?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro> <titulo>Estudo sobre XML</titulo> <autor><i><b>Desconhecido</i></b></autor> <categoria>Informtica</categoria> </livro> </Biblioteca> Observe a linha 5, <autor><i><b>Desconhecido</i></b></autor>, veja que a tag <i> mais externa que a tag <b>, logo no poderia ser finalizada antes. Em HTML no existiria problema, mas o XML no aceita essa desordem no alinhamento. A linha ficar correta se for escrita desta forma: <autor><i><b>Desconhecido</b></i></autor>.
Documentos XML precisam ter um elemento Raiz

Todo documento XML necessita possuir um elemento raiz que indica seu comeo e fim. Veja o cdigo: <?xml version="1.0" encoding="ISO-8859-1"?> <livro> <titulo>Estudo sobre XML</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> <br></br> </livro> <livro>
89

<titulo>Estudo sobre JSP</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> </livro> <livro> <titulo>Clculo</titulo> <autor>Desconhecido</autor> <categoria>Matemtica</categoria> </livro> No cdigo no encontramos um elemento raiz. Tente executar e veja a mensagem de erro. Esse cdigo ficaria correto escrito da seguinte forma: <?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro> <titulo>Estudo sobre XML</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> <br></br> </livro> <livro> <titulo>Estudo sobre JSP</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> </livro> <livro> <titulo>Clculo</titulo> <autor>Desconhecido</autor> <categoria>Matemtica</categoria> </livro> </Biblioteca> Observe que no cdigo acima o elemento raiz a tag Biblioteca.
Valores do atributo em aspa

Na linguagem HTML as aspas para o valor do atributo eram opcionais. J na linguagem XML obrigatrio as aspas para o valor do atributo. Pode-se utilizar aspas simples ou duplas sem nenhum problema ou diferena no resultado. Veja o cdigo: <?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro preo = R$250,00> <titulo>Estudo sobre XML</titulo>
90

<autor>Desconhecido</autor> <categoria>Informtica</categoria> <br></br> </livro> </Biblioteca> No cdigo acima a linha 3 apresenta o atributo preo sem aspas. Isso gera um erro na hora de executar esse arquivo XML. Para solucionar basta reescrever a linha usando aspas simples ou aspas duplas para o atributo preo. Veja abaixo: <?xml version="1.0" encoding="ISO-8859-1"?> <Biblioteca> <livro preo = "R$250,00"> <titulo>Estudo sobre XML</titulo> <autor>Desconhecido</autor> <categoria>Informtica</categoria> <br></br> </livro> </Biblioteca> Siga as regras de sintaxe apresentadas acima para garantir que seu documento XML est well-formed (bem formatado). Caso uma dessas regras seja ignorada seu documento no poder ser utilizado.

Declarao do Tipo de Documento


O DTD (declarao do tipo de documento) define as regras de um documento XML. Essas regras ajudam a validar os dados quando a aplicao que os recebe no possui descrio do dado interno. Sendo assim, o DTD um conjunto de regras que define a estrutura do documento indicando os elementos que podem ser usados e onde podem ser aplicados. O documento XML construdo em conformidade com sua DTD conhecido como documento vlido.
Tipos de declaraes

Como dito anteriormente as declaraes do tipo de documento definem as regras de um documento XML. Existem quatro tipos de declaraes: declaraes de tipo de elementos, declaraes de entidades, declaraes de notaes e declaraes de atributo. A seguir vamos conhecer cada uma delas.
Declaraes de tipo de elementos

As declaraes de tipo de elemento identificam o nome do elemento e especificao o contedo permitido. Veja o exemplo:
91

<!ELEMENT capitulo (titulo,secao+,ler?)> No cdigo acima definido o elemento captulo e deve conter no seu contedo titulo e seo deixando ler como opcional. As vrgulas entre os contedos indicam que eles devem ocorrer em seqncia. O + indica em que secao pode ocorrer uma ou mais vezes. A ?indica que ler opcional. Sendo assim, ele pode ocorrer uma vez ou nenhuma. J titulo no possui pontuao o que significa que ele ir ocorrer apenas uma vez. Tambm podemos utilizar a string reservada #PCDATA para indicar dados de caracter. PCDATA tem como significado dado de caracter analisvel. Elementos que possuem apenas outros elementos so conhecidos por contedo de elementos. J elementos que possuem outros elementos e #PCDATA so conhecidos por contedo misturado. Veja abaixo: <!ELEMENT Pedro (#PCDATA | citao)*> O smbolo | indica que o relacionamento opcional. J o * indica que o contedo opcional. Pode no ocorrer ou ocorrer uma ou mais vezes. Em qualquer elemento misturado o #PCDATA deve ser o primeiro, todos os elementos devem ter uma relao opcional ( | )e o grupo inteiro deve ser opcional ( * ). Alm dos modelos apresentados acima ainda podemos utilizar EMPTY para indicar que o elemento no possui contedo e ANY para indicar que qualquer contedo aceito. Veja o exemplo: <!ELEMENT complemento EMPTY> <!ELEMENT complemento ANY> O modelo ANY deve ser evitado, pois desabilita toda a verificao do contedo deste elemento. til durante a converso de documentos.
Declaraes de atributo

Como o prprio nome j diz as declaraes de atributos indicam que elementos podem ter atributos, quais atributos eles podem ter, o valor do atributo e o valor padro. Veja o exemplo: <!ATTLIST pessoa NomeID#REQUIRED email CDATA #IMPLIED Sexo (Masculino|Feminino) 'Masculino'> No cdigo acima nome um atributo do tipo ID e obrigatrio (#REQUIRED). J email uma cadeia de caracteres e no obrigatrio (#IMPLIED) e Sexo que pode ser Masculino ou Feminino, mas se nada for informado o padro ser Masculino. Note que cada atributo tem trs partes: nome, tipo e valor.
92

Tipos de atributos

Existem seis tipos de atributos possveis. Vamos conhec-los?


CDATA

Atributos CDATA so strings (cadeias de caracteres).


ID

Cada elemento pode ter apenas um atributo ID. Seu valor deve ser um nome diferente de qualquer outro ID. Lembra a idia de chave primaria do banco de dados.
IDREF

IDREF ou IDREF semelhante do ID. Pode conter valores mltiplos separados por espaos em branco. Deve ser o valor de um nico atributo ID.
ENTITY

ENTITY ou ENTITIES deve ser o nome de uma nica entidade. Pode ter valores de entidades mltiplos em seu atributo, todos separados por espaos em branco.
NMTOKEN

NMTOKEN ou NMTOKENS deve ser uma nica palavra. O valor do atributo pode ter valores mltiplos separados por espao em branco.
Lista de nomes

possvel definir que o valor de um atributo deve ser pego de uma lista de nomes.
Valores Padro

Ainda possvel utilizar quatro valores padro. Vamos conhec-los?

93

#REQUIRED

Define que o atributo deve ter um valor especificado para cada ocorrncia do elemento no documento.
#IMPLIED

No necessita de valor para o atributo. Nenhum valor padro fornecido.


"valor"

possvel informar qualquer valor vlido para um atributo como padro. O valor do atributo no solicitado em cada elemento no documento. Caso exista ser dado a ele o valor padro.
#FIXED

"value" Pode definir um valor fixo. O atributo no requerido, porm se ele ocorrer ter o valor especificado. Caso no esteja presente receber uma valor padro.
Declaraes de entidades

Permitem associar um nome com algumoutro fragmento de contedo. Pode ser uma parte de texto normal, uma parte de declarao de tipo de documento ou uma referncia a arquivo externo. Veja o exemplo: <!ENTITY ATIlogo SYSTEM "/imagem/marca.gif" NDATA GIF87A> H trs tipos de entidades: Internas, Externas e ATIlogo. Vejamos cada uma:
Entidades Internas

Associam um nome a uma seqncia de caracter. Permitemdefinir atalhos para textos digitados com freqncia ouque se espera que sejam alterados.

94

Entidades Externas

Basicamente as entidades externas fazem a ligao de um nome a contedo de outro arquivo. Criam referncias.
Entidade ATIlogo

uma entidade externa, contudo seu contedo apenas binrio. Pode ser usada apenas como o valor de um atributo ENTIRY(S).
Declaraes de notaes

Identificam tipos de dados binrios externos. Veja o exemplo: <!NOTATION GIF87A SYSTEM "GIF"> Agora voc tem a base do conhecimento XML para criar seus prprios arquivos e valid-los. Teste com seus colegas de turma.

Concluso
Conclumos aqui o nosso estudo sobre JSP. Lembramos que a busca pelo conhecimento constante. Aqui voc recebeu a base para seguir em frente. No entanto, as pessoas que param de pesquisar so facilmente ultrapassadas no mundo da tecnologia. Procure sempre aprender mais. Um professor pode ensinar o caminho do conhecimento, mas o aluno quem deve caminhar.

95

Você também pode gostar