jsp

March 22, 2018 | Author: fer_cerveja | Category: Java Server Pages, Java Servlet, Http Cookie, Java Platform, Oracle Acquisitions


Comments



Description

UNIVERSIDADE FEDERAL DE SANTA CATARINA PROGRAMA ESPECIAL DE TREINAMENTO ˆ CIENCIAS DA COMPUTACAO ¸˜Curso de JSP Roberto Hartke Neto Vers˜o 1.0 a Florian´polis, Outubro de 2002 o Sum´rio a 1 Introdu¸˜o ca 1.1 O que ´ JSP? . . . . . . . . . . . . . . . . . . . . . . e 1.1.1 Por que usar JSP se j´ existe PHP, ASP, etc? a 1.2 Como JSPs funcionam . . . . . . . . . . . . . . . . . 1.3 Instalando e configurando o Tomcat . . . . . . . . . . 1.3.1 Obtendo o Tomcat . . . . . . . . . . . . . . . 1.3.2 Instalando o Tomcat . . . . . . . . . . . . . . 1.3.3 Executando o Tomcat . . . . . . . . . . . . . 1.3.4 Disponibilizando a aplica¸˜o . . . . . . . . . . ca 1.3.5 Estrutura de diret´rios da aplica¸˜o . . . . . . o ca 2 Release 1 2.1 Java Beans . . . . . . . . . . . . . . . . 2.1.1 O que faz de um Bean um Bean? 2.1.2 Conven¸˜es de um Bean . . . . . co 2.2 JSP Tags . . . . . . . . . . . . . . . . . 2.2.1 A¸˜es JSP . . . . . . . . . . . . . co 2.2.2 Diretivas . . . . . . . . . . . . . . 2.2.3 Declara¸oes . . . . . . . . . . . . c˜ 2.2.4 Express˜es . . . . . . . . . . . . . o 2.2.5 Scriptlets . . . . . . . . . . . . . 2.2.6 Coment´rios . . . . . . . . . . . . a 2.3 Objetos impl´ ıcitos . . . . . . . . . . . . . 2.4 Construindo a aplica¸˜o . . . . . . . . . ca 2.4.1 Construindo o formul´rio . . . . . a 2.4.2 Criando um JavaBean . . . . . . 2.4.3 Primeiro arquivo JSP . . . . . . . 2.4.4 Formul´rio para tratar erros . . . a 2.4.5 P´gina de sucesso . . . . . . . . . a 2.4.6 Disponibilizando a aplica¸˜o . . . ca 3 3 3 4 4 4 4 5 5 5 6 6 6 6 7 7 10 11 11 11 11 12 14 14 15 18 19 21 21 22 22 22 23 23 23 23 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Release 2 3.1 Servlets . . . . . . . . . . . . . . . . . . . 3.1.1 O que s˜o servlets? . . . . . . . . . a 3.2 Usando Java JDBC . . . . . . . . . . . . . 3.2.1 Acesso ao banco de dados . . . . . 3.2.2 Especificando o driver JDBC . . . . 3.2.3 Estabelecendo a conex˜o . . . . . . a 3.2.4 Encontrando dados em uma tabela 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 3.4 3.2.5 Fazendo consultas com JDBC . . . . . . . . . . . . . . Interface RequestDispatcher . . . . . . . . . . . . . . . . . . . Construindo a aplica¸˜o . . . . . . . . . . . . . . . . . . . . . ca 3.4.1 Escrevendo uma classe que conecta a um banco de dados 3.4.2 Criando tabelas . . . . . . . . . . . . . . . . . . . . . . 3.4.3 Cadastrando os dados no banco de dados . . . . . . . . 3.4.4 P´gina de erro . . . . . . . . . . . . . . . . . . . . . . . a 24 24 25 25 28 29 29 31 31 31 31 32 33 33 33 36 36 37 39 39 39 39 41 41 44 45 45 45 46 4 Release 3 4.1 Tag Libraries . . . . . . . . . . . 4.1.1 O que ´ uma Tag Library? e 4.1.2 O que ´ uma Tag? . . . . e 4.1.3 Tag Handlers? . . . . . . 4.1.4 Descritor de Tag Libraries 4.2 Construindo a aplica¸˜o . . . . . ca 4.2.1 Escrevendo uma BodyTag 4.2.2 TagExtraInfo . . . . . . . 4.2.3 Descritor . . . . . . . . . . 4.2.4 P´gina JSP . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Release 4 5.1 Tags com parˆmetros . . . . . . . . . . . . . a 5.2 Construindo a aplica¸˜o . . . . . . . . . . . ca 5.2.1 P´gina de pesquisa . . . . . . . . . . a 5.2.2 Descritor das Tags . . . . . . . . . . 5.2.3 Modificando o arquivo TagMidia.java 5.2.4 Passando parˆmetros pela URL . . . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Descritor da aplica¸˜o ca 6.1 Construindo a aplica¸˜o . . . . . . . . . . . . . . . . . . . . . ca 6.1.1 Web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 P´gina de erro . . . . . . . . . . . . . . . . . . . . . . . a 7 Release 6 48 7.1 Construindo a aplica¸˜o . . . . . . . . . . . . . . . . . . . . . 48 ca 8 Release 7 56 8.1 Passando objetos para outras partes da aplica¸˜o . . . . . . . 56 ca 8.2 Construindo a aplica¸˜o . . . . . . . . . . . . . . . . . . . . . 56 ca 9 Release 8 59 9.1 Carrinho de compras . . . . . . . . . . . . . . . . . . . . . . . 59 9.2 P´gina JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 a 10 Release 9 Referˆncias Bibliogr´ficas e a 64 66 2 1 Por que usar JSP se j´ existe PHP. e a ca Oracle.1 O que ´ JSP? e JSP significa “Java Server Pages”. feito pela e a e Sun. Esta tecnologia ´ usada para servir e conte´do dinˆmico para o usu´rio. escal´veis e seguras rapidamente. Sun. ColdFusion e Perl. u a a o JSP faz parte da plataforma J2EE (Java 2 Enterprise Edition) e juntamente com os Java Servlets e Java Beans pode ser usada para desenvolver aplica¸˜es co web eficientes. a 1. e tem v´rios softwares gratuitos para disponibilizar a aplica¸˜o a ca (Tomcat por exemplo). 3 . ASP. JSP. e tamb´m todo software necess´rio ´ pago. Por que usar JSP ent˜o? a • JSP usa Java. e ´ suportado por v´rias gigantes da computa¸˜o como IBM. etc. • Programa¸˜o em rede ´ inerente a Java ca e O suporte inerente de Java para a ´rea de redes faz dela uma ´tima a o linguagem para a Internet. etc? a Existem v´rias linguagens usadas para criar aplica¸˜es web. usando l´gica e dados no lado do servidor. Java ´ uma das linguagens mais populares atualmente e ´ interpretada. • JSP x ASP Uma das diferen¸as que pode ser fundamental para a escolha entre c estas duas tecnologias ´ que ASP ´ da Microsoft e s´ roda em ambiente e e o Windows. Entre elas a co ASP. PHP. e e portanto o c´digo escrito em uma arquitetura pode ser portado para o qualquer outra. • JSP ´ parte do pacote J2EE e J2EE ´ um dos modelos mais usados para contruir aplica¸˜es de grande e co porte. roda em qualquer plataforma que tenha a m´quina virtual de a Java.Cap´ ıtulo 1 Introdu¸˜o ca 1.1. org.3.3 Instalando e configurando o Tomcat Primeiro vocˆ precisa ter a m´quina virtual java (JDK 1.sun. a a Tipicamente. a a co 1.3 ou mais atual) e a instalada na sua m´quina. seu c´digo ´ aberto e o programa ´ ca o e e gratuito. jspService(). a Uma vez que a classe ´ carregada no recipiente. o m´todo jspService() ´ e e e respons´vel por responder `s requisi¸˜es do cliente. A classe que implementa uma p´gina JSP estende a classe HttpJspBase. como e a co ca a localiza¸˜o de onde ´ armazenado o p´gina JSP j´ compilada (portanto o ca e a a servlet correspondente a esta p´gina) s˜o dependentes da implementa¸˜o da a a ca engine JSP. Ainda que o m´todo u a e jspService() n˜o pode ser sobrescrito. Esta pode ser obtida gratuitamente no endere¸o a c http://java. Isto pode ser util para evitar a demora para carregar a p´gina JSP na ´ a primeira vez que ela ´ acessada. Pode ser obtido em http://jakarta. O m´todo de servi¸o desta classe.1 tamb´m permite que p´ginas JSP sejam pr´-compiladas em arquivos e a e class. Conseq¨entemente. CATALINA HOME e a a e JAVA HOME. 1. estas vari´veis devem ser: a a 4 . ca ca e a menos que a p´gina JSP mude. Desenvolvido pela e a funda¸˜o Apache. se o Tomcat foi instalado em c:\tomcat e a JVM (Java Virtual Machine) est´ em c:\java. A especifica¸˜o ca a ca JSP 1. e o Por exemplo. V´rias informa¸˜es da fase de tradu¸˜o. e o Depois vocˆ ter´ que criar duas vari´veis de ambiente. Supondo a e que n˜o houve nenhum erro de sintaxe na p´gina. e no caso ´ traduzida novamente. A fase de tradu¸˜o ´ feita apenas uma vez. quando ela ca e recebe uma requisi¸˜o para a p´gina JSP pela primeira vez. A fase de tradu¸˜o ´ tipicamente realizada pela engine JSP. e c essencialmente encapsula o conte´do da p´gina JSP.2 Como JSPs funcionam A finalidade de JSP ´ fornecer um m´todo de desenvolvimento de servlets e e declarativo e centrado na apresenta¸˜o.3.1 Obtendo o Tomcat Tomcat ´ um servidor de p´ginas JSP e Servlets. A especifica¸˜o de JSP ´ definida ca ca e como uma extens˜o da API de Servlets. n˜o ´ de se a u a e admirar que por tr´s dos panos. no projeto Jakarta. o desenvolvedor pode descrever evena tos de inicializa¸˜o e destrui¸˜o fornecendo implementa¸˜es dos m´todos jsca ca co e pInit() e jspDestroy dentro da p´gina JSP. servlets e p´ginas JSP tem muito em comum.com.2 Instalando o Tomcat Instale ou descompacte o arquivo que vocˆ baixou em algum diret´rio. p´ginas JSP est˜o sujeitas a uma fase de tradu¸˜o e outra a a ca de processamento da requisi¸˜o.apache. o resultado ´ uma p´gina a a e a JSP que implementa a interface Servlet. onde CATALINA HOME ´ o diret´rio base do Tomcat e e o JAVA HOME ´ o diret´rio base da plataforma Java.1. 1. a que implementa a interface Servlet. 5 Estrutura de diret´rios da aplica¸˜o o ca As aplica¸˜es JSP seguem um padr˜o. Dentro desse. 1. Os arquivos JSP podem ser o postos no diret´rio raiz ou em qualquer outro diret´rio.jar) ca podem ser colocados no diret´rio WEB-INF/lib/. Neste vocˆ deve colocar todos as classes que vocˆ usa na u e e aplica¸˜o (arquivos .3 Executando o Tomcat V´ no diret´rio CATALINA HOME\bin (onde CATALINA HOME ´ o a o e diret´rio base do Tomcat). Avan¸ado. crie outro diret´rio chamado classes u o (letras min´sculas)./tomcat4 stop para finaliz´-lo. ou o o coloque o arquivo da sua aplica¸˜o (.bat para iniciar o o Tomcat e shutdown.3. c a 1./tomcat4 start para a o iniciar e .3. use o comando export (ou set. Sistema. Para ver a ca o aplica¸˜o acesse a URL http://localhost:8080/(nome do diret´rio ou arquivo ca o da aplica¸˜o)/ no navegador. menos no WEB-INF o o e sub-diret´rios! o 5 . v´ no mesmo diret´rio e digite .4 Disponibilizando a aplica¸˜o ca Crie um diret´rio dentro do diret´rio CATALINA HOME/webapps. ca acesse http://localhost:8080/app. inclusive servlets e beans.bat para encerr´-lo.3. a co No caso do UNIX. e execute o arquivo startup.class). a c Vari´veis de Ambiente e entre com as informa¸˜es. Devem ter um diret´rio WEBco a o INF (letras mai´sculas). a No caso dos UNIX. Pacotes (arquivos . a Para visualizar as p´ginas acesse http://localhost:8080/ (localhost ou o ena dere¸o da m´quina). ca Exemplo: Para acessar a aplica¸˜o localizada em CATALINA HOME/webapps/app.• CATALINA HOME = c:\tomcat • JAVA HOME = c:\java Nos Windows 95/98 adicione os comandos SET CATALINA HOME = c:\tomcat e SET JAVA HOME = c:\java no arquivo c:\autoexec. No Windows 2000 v´ em Painel de Controle. dependendo da sua distribui¸˜o).WAR) neste diret´rio.bat. ca 1. Cap´ ıtulo 2 Release 1 2.1 2.1.1 Java Beans O que faz de um Bean um Bean? Um Bean ´ simplesmente uma classe de Java que segue um conjunto e de conven¸˜es simples de design e nomea¸˜o delineado pela especifica¸˜o de co ca ca JavaBeans. Os Beans n˜o precisam estender uma determinada classe ou a implementar uma determinada interface. 2.1.2 Conven¸˜es de um Bean co As conven¸˜es de JavaBean s˜o o que nos permitem desenvolver Beans, co a porque elas permitem que o container Bean analise um arquivo de classe Java e interprete seus m´todos como propriedades, designando a classe como e um Bean de Java. • Beans s˜o simplesmente objetos Java. Mas como seguem um padr˜o a a fica mais f´cil trabalhar com eles. a • Uma boa pr´tica ´ colocar Bean no nome de uma classe que ´ um Bean, a e e para que seja melhor identificado. Assim uma classe que representa uma pessoa ficaria PessoaBean ou BeanPessoa. O construtor Bean A primeira regra da cria¸˜o do Bean JSP ´ que vocˆ tem que implemenca e e tar um construtor que n˜o tenha argumentos. Este construtor ´ usado por a e exemplo para instanciar um Bean atrav´s da tag <jsp:useBean> visto mais e adiante. Se a classe n˜o especificar um construtor sem argumentos, ent˜o a a um construtor sem argumentos e sem c´digo ser´ assumido. o a public Bean() { } Propriedades de um Bean Coloque os atributos como privados, e fa¸a m´todos get e set para acess´c e a los, e este m´todos ent˜o ser˜o p´blicos. e a a u 6 private String nome; public String getNome() { return nome;} public void setNome(String novo) { nome = novo; } Uma boa conven¸˜o de nome de propriedades, ´ come¸ar com letra min´scula ca e c u e colocar em mai´scula a primeira letra de cada palavra subseq¨ente. Assim u u como nos m´todos de ajuste, a palavra set ou get come¸a em min´scula e a e c u primeira letra da propriedade ser´ mai´scula. a u private String corCarro; public String getCorCarro();" Propriedades indexadas Caso a propriedade seja um conjunto de valores (array), ´ uma boa pr´tica e a criar m´todos para acessar o conjunto inteiro de valores e para acessar uma e posi¸˜o espec´ ca ıfica. private String[] telefone; public String[] getTelefone() { return telefone; } public String getTelefone(int index) { return telefone[index]; } Propriedades booleanas Para propriedades booleanas, vocˆ pode substituir a palavra get por is. e private boolean enabled; public boolean isEnabled() { return enabled; } 2.2 JSP Tags Numa olhada r´pida, JSP parece com HTML (ou XML), ambos cont´m a e texto encapsulado entre tags, que s˜o definidas entre os s´ a ımbolos < e >. Mas enquanto as tags HTML s˜o processadas pelo navegador do cliente para a mostrar a p´gina, as tags de JSP s˜o usadas pelo servidor web para gerar a a conte´do dinˆmico. u a A seguir est˜o os tipos de tags v´lidos em JSP: a a 2.2.1 A¸˜es JSP co Executam diversas fun¸˜es e estendem a capacidade de JSP. Usam sintaxe co parecida com XML, e s˜o usadas (entre outras coisas) para manipular Java a Beans. Existem seis tipos de a¸˜es: co 7 <jsp:forward> Este elemento transfere o objeto request contendo informa¸˜o da reca quisi¸˜o do cliente de uma p´gina JSP para outro arquivo. Este pode ser um ca a arquivo HTML, outro arquivo JSP ou um servlet, desde que fa¸a parte da c mesma aplica¸˜o. ca Sintaxe: <jsp:forward page="(URL relativa | <%= express~o %>)" /> a ou <jsp:forward page="(URL relativa | <%= express~o %>)" > a <jsp:param name="nome do par^metro" a value="(valor do par^metro| <%= express~o %>)" /> a a </jsp:forward> <jsp:getProperty> Este elemento captura o valor da propriedade de um bean usando o ´ m´todo get da propriedade e mostra o valor na p´gina JSP. E necess´rio criar e a a ou localizar o bean com <jsp:useBean> antes de usar <jsp:getProperty>. Sintaxe: <jsp:getProperty name="nome do objeto (bean)" property="nome da propriedade" /> <jsp:include> Este elemento permite incluir um arquivo est´tico ou dinˆmico numa a a p´gina JSP. Os resultados de incluir um ou outro s˜o diferentes. Se o arquivo a a ´ est´tico, seu conte´do ´ inclu´ quando a p´gina ´ compilada num servlet. e a u e ıdo a e Se for dinˆmico, funciona como uma requisi¸˜o para o arquivo e manda o a ca resultado de volta para a p´gina. Quando estiver terminada a a¸˜o do include a ca continua-se processando o restante da p´gina. a Sintaxe: <jsp:include page="{URL relativa | <%= express~o %>}" a flush="true" /> ou <jsp:include page="{URL relativa | <%= express~o %>}" a flush="true" > <jsp:param name="nome do par^metro" a value="{nome do par^metro | <%= express~o %>}" /> a a </jsp:include> 8 Para localizar ou instanciar o bean.<jsp:plugin> Executa ou mostra um objeto (tipicamente um applet ou um bean) no navegador do cliente. usando os m´todos de ajuste (set) dele.class" | type="package. e a 5. Sintaxe: <jsp:useBean id="nome da instancia" scope="page|request|session|application" { class="package.class" | beanName="{package. executa estas tags. e ele tem tags e de corpo (entre <jsp:useBean> e </jsp:useBean>).class | <%= express~o %>}" a type="package. Se n˜o encontrar. E necess´rio e a declarar o bean com <jsp:useBean> antes de ajustar uma propriedade. 4. <jsp:useBean> Localiza ou instancia um componente. Se o bean for encontrado. instancia-o pela classe especificada. e a Se foi especificado o tipo. s˜o seguidos os seguintes passos. Primeiro tenta localizar uma instˆncia do bean. 2. Se n˜o existe. instancia ele a partir da classe especifia a cada.class" } { /> | > outros elementos (tags de corpo) </jsp:useBean> } <jsp:setProperty> O elemento <jsp:setProperty> ajusta o valor de uma ou mais proprie´ dades em um bean. Sintaxe: 9 . armazena uma referˆncia ao objeto na vari´vel.class" type="package.class" | class="package. Estas duas a¸˜es trabalham juntas. Define uma vari´vel de referˆncia ao objeto com o nome especificado. Se o bean tiver sido instanciado (ao inv´s de localizado). portanto o nome de instˆncia usada nas co a duas deve ser igual. armazenando a uma referˆncia ao objeto na nova vari´vel. Tenta localizar o bean com o escopo e o nome especificados. N˜o ser´ explicado o funcionamento deste elemento a a a no curso. a nesta ordem: 1. usando o plug-in Java que est´ embutido no navegador a ou instalado na m´quina. converte o bean para este tipo. a e 3. Sintaxe: <%@ page [ language="java" ] [ extends="package. Diretivas s˜o a definidas entre <%@ e %>.*}. e a todos os seus a arquivos inclu´ ıdos estaticamente.2. a a Sintaxe: <%@ include file="relativeURL" %> Page Define atributos que s˜o aplicados a todo o arquivo JSP. e especificar tag libraries.<jsp:setProperty name="nome de inst^ncia do bean" a { property="*" | property="nome da propriedade" [ param="nome do par^metro" ] | a property="nome da propriedade" value="{string | <%= express~o %>}" a } /> 2." ] [ session="true|false" ] [ buffer="none|8kb|sizekb" ] [ autoFlush="true|false" ] [ isThreadSafe="true|false" ] [ info="text" ] [ errorPage="URL relativa" ] [ contentType="mimeType [ . a Sintaxe: 10 .2 Diretivas S˜o instru¸˜es processadas quando a p´gina JSP ´ compilada em um a co a e servlet. Existem trˆs tipos de diretivas: e Include Inclui um arquivo est´tico em uma p´gina JSP.. Diretivas s˜o usadas para ajustar instru¸˜es no n´ a co ıvel da p´gina..class" ] [ import="{package. . charset=ISO-8859-1" ] [ isErrorPage="true|false" ] %> Taglib Define uma tag library e seu prefixo a ser usado na p´gina JSP. a inserir dados de arquivos externos.class | package.charset=characterSet ]" | "text/html . S˜o definidas entre <%! e u o a %>. enquanto a a a coment´rios em JSP s˜o entre <%– e –%>.6 Coment´rios a S˜o similares aos coment´rios HTML. %> 2. convertido e a e para um String. a a 11 .3 Declara¸˜es co S˜o similares com as declara¸˜es de vari´veis em Java. Isto significa que os coment´rios e a JSP n˜o aparecem no c´digo fonte da p´gina visualizada pelo navegador a o a do usu´rio. e s´ pode haver uma entre a o <%= e %>.. e inserido onde a express˜o aparece no arquivo JSP. N˜o ´ a a e usado ponte e v´ ırgula para terminar a express˜o. String str = "PET". e definem vari´veis a co a a para uso subseq¨ente em express˜es ou scriptlets.2.getNome() %> 2. declara¸~o. Sintaxe: <%! int x = 0.5 Scriptlets S˜o blocos de c´digo Java embutidos numa p´gina JSP. O c´digo do a o a o ´ definido scriptlet ´ inserido literalmente no servlet gerado pela p´gina. mas s˜o tirados da p´gina quando a a a a o arquivo JSP ´ compilado em servlet. x = 4 * 9.<%@ taglib uri="localiza¸~o do descritor da tag" ca prefix="prefixo da tag" %> 2. %> 2.. Coment´rios em HTML s˜o feitos entre <!– e –>. .2..2. ca . Sintaxe: <% int x = 0..4 Express˜es o Cont´m um comando v´lido da linguagem Java que ´ avaliado. Sintaxe: <%= pessoa. E e a entre <% e %>.2. servlet.JspWriter Fluxo de sa´ para o ıda conte´do da p´gina u a Dados de sess˜o esa pec´ ıficos de usu´rio a Dados compartilhados por todas as p´ginas a da aplica¸˜o ca Dados de contexto para execu¸˜o da ca p´gina a Erros n˜o pegos ou a exce¸˜o ca session javax.3 Objetos impl´ ıcitos Como uma caracter´ ıstica conveniente.servlet.Throwable Objeto page O objeto page representa a pr´pria p´gina JSP ou.jsp.1: Objetos Impl´ ıcitos Objeto page Classe ou Interface javax.ServletConfig request javax. sem que o o autor tenha que cri´-los.HttpServletRequest response out javax.http.lang.HttpSession application javax. mais especificamente.HttpJspPage Descri¸˜o ca Instˆncia de servlet da a p´gina a Dados de configura¸˜o ca do Servlet Dados de solicita¸˜o ca incluindo parˆmetros a config javax.servlet.servlet.servlet.2.http.HttpServletResponse Dados da resposta javax.jsp.jsp.servlet. o container JSP deixa dispon´ ıvel objetos impl´ ıcitos que podem ser usados nos scriptlets e express˜es.servlet. a a Objeto config O objeto config armazena dados de configura¸˜o de servlet — na forma ca de parˆmetros de inicializa¸˜o — para o servlet no qual uma p´gina JSP ´ a ca a e 12 . S˜o nove objetos: a Tabela 2.servlet.PageContext exception javax. Estes objetos instanciam classes definidas na API a (application program interface) de Servlets.http. o a uma instˆncia da classe de servlet na qual a p´gina foi traduzida.ServletContext pageContext javax. no entanto.servlet. a URL co ca solicitada e quaisquer cabe¸alhos. a Objeto response O objeto response representa a resposta que ser´ enviada de volta para o a usu´rio como resultado do processamento da p´gina JSP. este objeto fornece acesso a todas a co as informa¸˜es associadas com uma solicita¸˜o. Se o atributo estiver a a definido para false. Se. o objeto n˜o estar´ dispon´ e seu uso resultar´ em um a a ıvel a erro de compila¸˜o quando o recipiente JSP tentar traduzir a p´gina para ca a um servlet.compilada. Todas as solicita¸˜es feitas por um usu´rio.ServletContext. um certo a per´ ıodo de tempo passar sem que qualquer nova solicita¸˜o do usu´rio seja ca a recebida. Pelo fato das p´ginas JSP raramente serem escritas para interagir a com parˆmetros de inicializa¸˜o. seu uso a a ıvel a ´ restrito `s p´ginas que participam do gerenciamento da sess˜o. a co Este objeto permite acessar informa¸˜es do container. usando os m´todos da interface javax. que s˜o parte de co a a uma unica s´rie de intera¸˜es com o servidor da web. Dentre os usos mais comuns para o objeto request. cookies ou parˆmetros associados com a c a solicita¸˜o. incluindo sua fonte.http. a a Objeto out Este objeto impl´ ıcito representa o fluxo de sa´ para a p´gina. Isto ´ e a a a e indicado atrav´s do atributo session da diretiva page. e O objeto session n˜o est´ dispon´ para todas as p´ginas JSP. Os a co a dados espec´ ıficos de aplica¸˜o s˜o tipicamente adicionados ` sess˜o atrav´s de ca a a a e atributos. Para solicita¸˜es de HTTP. s˜o consideradas parte ´ e co a de uma sess˜o. As p´ginas JSP e a a est˜o agrupadas em aplica¸˜es de acordo com suas URLs. O padr˜o ´ que todas e a e as p´ginas participem do gerenciamento de sess˜o. interagir com o co servidor e fornece suporte para logs.servlet. cujo ıda a conte´do ser´ enviado para o navegador como o corpo de sua resposta. ca a a Ela ´ uma instˆncia da interface javax. u a Objeto session Este objeto impl´ ıcito de JSP representa a sess˜o atual de um usu´rio a a individual. Desde que novas solicita¸˜es por aqueles usu´rios continuem a co a a ser recebidas pelo servidor. a Objeto request O objeto request representa a solicita¸˜o que acionou o processamento da ca p´gina atual. Objeto application Este objeto impl´ ıcito representa a aplica¸˜o ` qual a p´gina JSP pertence. ent˜o armazena informa¸˜es a respeito da sess˜o.HttpSession. a O objeto session. este objeto impl´ a ca ıcito raramente ´ usado na e pr´tica. a sess˜o expira. a sess˜o persiste. 13 . encontra-se ca a procura por valores de parˆmetros e cookies. td { font-family:Tahoma. usando o atributo isErrorPage a da diretiva page. n˜o tem c´digo jsp. ou permanentemente para transferir todo o controle.Objeto pageContext O objeto pageContext ´ uma instˆncia da classe javax. a a 2. 2.PageContext. E por ultimo.jsp. ´ uma p´gina HTML simples que indica se o cadastro foi realizado ou n˜o.Sans-Serif.. o objeto pageCone e text implementa m´todos para transferir controle da p´gina atual para uma e a outra p´gina. Ao inv´s disso.Throwable.4 Construindo a aplica¸˜o ca Iniciando a constru¸˜o da aplica¸˜o. Para os objetos impl´ ıcitos que aceitam atributos. Ele ´ puramente a e feito em HTML. Criaremos tamb´m um formul´rio idˆntico ao pria e a e meiro mas que mostra poss´ ıveis erros ocorridos no cadastro. para gerar output a ser inclu´ no output a ıdo da p´gina atual. } </style> <title>Cadastro de M&iacute.1 Construindo o formul´rio a Aqui iremos criar o formul´rio para o cadastro de fitas. font-size:11pt.dias</font> 14 . Al´m disso. e um arquivo JSP que processa o formul´rio.dia</title> </head> <body bgcolor="#FFFFFF" text="#000000"> Especificamos o arquivo que processar´ o formul´rio no atributo action a a da tag form: <form action=”ProcessarMidia. O e a objeto exception n˜o est´ automaticamente dispon´ em todas as p´ginas a a ıvel a JSP.4. e a e fornece acesso program´tico a todos os outros objetos impl´ a ıcitos. este objeto est´ dispon´ apenas nas p´ginas que tee a ıvel a nham sido designadas como p´ginas de erro.. vamos criar um formul´rio de cadasca ca a tro para a m´ ıdia. o objeto pageContext tamb´m fore nece m´todos para acessar aqueles atributos. padding-left:15.jsp”. a o <html> <head> <style> p. temporariamente. > <form action="ProcessarMidia. um bean que representa a m´ ıdia. a Objeto exception O objeto exception ´ uma instˆncia da classe java.lang.servlet.jsp" method=post name="midias"> <center> <table cellpadding=4 cellspacing=2 border=0> <th bgcolor="#CCDDEE" colspan=2> <font size=5>Cadastro de M&iacute. Al´m disso. teremos outro atributo.&nbsp. para controle a e 15 .2 Criando um JavaBean Vamos criar nosso bean que ter´ as informa¸˜es da M´ a co ıdia. c˜ a <input type="text" name="titulo" value="" size=30 maxlength=40></td> <td valign=top> <b>Ano<sup>*</sup></b> <br> <input type="text" name="ano" value="" size=8 maxlength=8> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Descri¸~o ca <br> <TEXTAREA NAME="descricao" ROWS="6" COLS="30"> </textarea> </td> <td valign=top> <b>Tipo<sup>*</sup></b></b> <br> <input type="radio" name="tipo" value="VHS" checked> VHS &nbsp. e todos os m´todos set e e get para acess´-los.rios</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>T&iacute.<br> <font size=1><sup>*</sup> Campos necess&aacute.tulo<sup>*</sup></b> <br> O atributo name dos campos do formul´rio devem preferencialmente ter o a mesmo nome que seu atributo correspondente no bean usado para armazenar as informa¸oes do formul´rio. Ele deve ter todos os atributos do formul´rio que constru´ a ımos. <br> <input type="radio" name="tipo" value="DVD"> DVD &nbsp.4. </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma"> <input type="reset" value="Limpar"> </td> </tr> </table> </center> </form> </body> </html> 2.&nbsp. veja os coment´rios para maia o a ores detalhes. 16 . erros = new Hashtable(). Chamaremos a Hashtable de erros. ca a a c */ public class BeanMidia implements java. criaremos um m´todo para verificar se todos os dados necess´rios e a foram digitados. Um objeto de uma classe que implementa * esta interface pode ser escrito em disco ou enviado pela rede. } public String getTipo() { return tipo.Serializable { /** * Nomes dos atributos preferencialmente iguais aos usados * no formul´rio a */ private String titulo.io. package beans. * Na aplica¸~o do curso n~o far´ diferen¸a. } public String getAno() { return ano. private String descricao. public BeanMidia() { /* Iniciamos os atributos com o String nulo */ titulo = "". /* Este atributo serve para o controle de erros no formul´rio */ a private Hashtable erros. a a Abaixo est´ o c´digo fonte do BeanMidia. Usaremos uma tabela de hash (java. import java. descricao = "".util. validando ou n˜o o formul´rio. /** * Implementar a classe Serializable ´ requisito para ser um e * Enterprise Bean. e ela tamb´m ter´ seus e a m´todos set e get. } /** * M´todos para acessar os atributos. e setNome() para ajustar seu valor */ public String getTitulo() { return titulo. ano = "".Hashtable) que ter´ como chave o nome do atributo e como valor a mensagem de erro a que desejarmos.Hashtable. e Por fim. private String tipo.util. private String ano. tipo = "".de eventuais erros no processamento do formul´rio (dados necess´rios n˜o a a a digitados por exemplo). e * getNome() para ver ser valor. get(s). ı volta = false.").equals("") ) { erros. ı volta = false. ı volta = false.put("titulo".").put("tipo".equals("")) { erros. e co */ public boolean ehValido() { boolean volta = true. } public void setDescricao(String valor) { descricao = valor. selecione o tipo da m´dia .equals("") ) { erros. "Por favor. "Por favor. } /** * Verifica se todos os dados exigidos foram digitados. "Por favor. } return volta. } if ((ano == null) || ano. } /** *Usado para ver as mensagens de erro armazenados na tabela de Hash */ public String getErros (String s) { String msg = (String) erros."). } public void setAno(String valor) { ano = valor.put("ano". } public void setTipo(String valor) { tipo = valor. if ((titulo == null) || titulo. } public void setTitulo(String valor) { titulo = valor. return (msg == null) ? "" : msg.} public String getDescricao() { return descricao. digite o ano da m´dia . digite um t´tulo. * al´m de outras condi¸~es desejadas. } if ((tipo == null) || tipo. } 17 . A e primeira diz-se o nome do atributo do bean no parˆmetro property e ent˜o a a especifica-se o valor no parˆmetro value. a • O atributo id especifica um nome para o Bean. Pode-se tamb´m ajustar os valores dos atributos usando os m´todos set e e do bean. } } 2. para quem e quanto tempo ele permanecer´ dispon´ a ıvel. %> </jsp:useBean> 18 .getParameter("tipo")).4. at´ que a e enfim.getParameter("titulo")%>’ /> <jsp:setProperty name="midia" property="ano" /> <jsp:setProperty name="midia" property="descricao" /> <% midia. a ca • O atributo class especifica o nome de classe do pr´prio Bean.put(chave. o • O atributo scope controla o escopo do Bean.3 Primeiro arquivo JSP Agora vamos construir o arquivo que processa o formul´rio. a Nas outras duas o atributo do bean tem o mesmo nome do valor colocado em property. String msg) { erros. ou seja.BeanMidia" scope="request"> Mostramos abaixo trˆs maneiras de ajustar os atributos de um bean. <jsp:useBean id="midia" class="beans.setTipo(request. request. que ser´ o nome usado a para referenciar o Bean ao longo da p´gina e de sua vida na aplica¸˜o.BeanMidia" %> A tag <jsp:useBean> diz ` p´gina que vocˆ quer disponibilizar um Bean a a e para a p´gina. este. usando o ambiente dos scriptlets. <%@ page import="beans./** * Usado para colocar algum erro na tabela */ public void setErros (String chave. O atributo import da diretiva page estende o conjunto de classes Java que podem ser referenciadas um uma p´gina JSP sem ter que explicitamente a especificar os nomes de pacote de classes. <jsp:setProperty name="midia" property="titulo" value=’<%=request.msg). Os valores podem ser page. session e application. feito em JSP. ProcessarMidia.BeanMidia" %> <jsp:useBean id="midia" class="beans.ehValido()) { %> <jsp:forward page="/sucesso.4.Sans-Serif. <%@ page import="beans.Verifica-se se todos os atributos necess´rios foram digitados e ent˜o redirecionaa a se para a p´gina de sucesso ou para o formul´rio que trata erros.4 Formul´rio para tratar erros a Este arquivo ´ visualmente idˆntico ao formul´rio anterior.tulo<sup>*</sup></b> <br> Colocamos em value o que tem no atributo titulo do BeanMidia. mas ele ´ um e e a e arquivo JSP que mostra poss´ ıveis erros ocorridos durante o cadastro. a a <% if (midia.jsp" /> <% } %> 2.jsp" method=post name="midias"> <center> <table cellpadding=4 cellspacing=2 border=0> <th bgcolor="#CCDDEE" colspan=2> <font size=5>Cadastro de M&iacute. Isto poupa a trabalho ao usu´rio que n˜o precisa digitar tudo novamente.jsp"/> <% } else { %> <jsp:forward page="RetryMidia. ´ Declaramos o bean usado no arquivo nas primeiras linhas.BeanMidia" scope="request"/> <html> <head> <style> p.dias</font> <br> <font size=1><sup>*</sup> Campos necess&aacute.rios</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>T&iacute. padding-left:15. font-size:11pt. E necess´rio a que ele tenha o mesmo nome dos arquivos antecessores (no caso. a a 19 . para que o formul´rio fique igual ao que foi digitado anteriormente.dia</title> </head> <body bgcolor="#FFFFFF" text="#000000"> <form action="ProcessarMidia.jsp). } </style> <title>Cadastro de M&iacute. td { font-family:Tahoma. a a <input type="radio" name="tipo" value="VHS" <% if (midia.equals("VHS")) out.getTipo() != null && midia.getTipo().getErros("titulo")%></font> </td> <td valign=top> <b>Ano<sup>*</sup></b> <br> <input type="text" name="ano" value=’<%= midia.&nbsp.getErros(“titulo”) retornar´ o String de erro que colocamos na tabela de hash associado a chave a “titulo”.print("checked").getAno() %>’ size=8 maxlength=8><br> <font color=#FF0000><%=midia.getTitulo() %>’ size=30 maxlength=40><br> Se houve algum erro na digita¸˜o do t´ ca ıtulo. %> > DVD &nbsp.print("checked"). para deixar o formul´rio como o usu´rio digitou anteriormente.getDescricao() %> </textarea><br> <font color=#FF0000><%=midia.getErros("descricao")%></font> </td> <td valign=top> <b>Tipo<sup>*</sup></b></b> <br> O comando midia. novamente. a a a a a a <font color=#FF0000><%=midia. <br> <input type="radio" name="tipo" value="DVD" <% if (midia. e o a fazendo com que o checkbox fique marcado. caso contr´rio n˜o retornar´ nada e n˜o aparecer´ nada na p´gina.equals(String) verifica se o valor do atributo tipo ´ igual ao String.<input type="text" name="titulo" value=’<%= midia. %> > VHS &nbsp.getTipo(). o comando midia.&nbsp. Se for. Isto serve.getTipo() != null && midia.getErros("ano")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Descri¸~o ca <br> <TEXTAREA NAME="descricao" ROWS="6" COLS="30"> <%= midia.equals("DVD")) out.<br> <font color=#FF0000><%=midia. ele imprime checked no c´digo fonte da p´gina.getTipo().getErros("tipo")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma"> 20 . td { font-family:Tahoma.5 P´gina de sucesso a Vamos fazer uma p´gina que nos indica se a opera¸˜o foi realizada com a ca sucesso.4. </td> </tr> <td> </table> </body> </html> 2. } </style> </head> <body bgcolor="#FFFFFF" text="#000000"> <table align="center" border="0" cellspacing="2" cellpadding="2"> <tr> <td bgcolor="#CCDDEE" align=center> <h3>Sucesso</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> Opera&ccedil. No diret´rio raiz da aplica¸˜o (.jsp.&atilde.o realizada com sucesso.6 Disponibilizando a aplica¸˜o ca Crie um diret´rio chamado locadora no diret´rio webapps do Tomcat.<input type="reset" value="Limpar"> </td> </tr> </table> </center> </form> </body> </html> 2. inicie o Tomcat. a <html> <head> <title>Sucesso</title> <style> p. ca 21 .Sans-Serif. font-size:11pt.jsp.java o e BeanMidia. acesse no navegador a URL http://localhost:8080/locadora e teste a aplica¸˜o./locadora) coloque o arquivo sucesso. redirecionaremos a aplica¸˜o para esta e ca p´gina.4. crie um diret´rio cadastro e coloque os arquivos o o ProcessarMidia. CadastroMidia. o o Dentro do diret´rio locadora. Sempre que houve ˆxito.html e RetryMidia. padding-left:15.jsp..class Agora. o ca e no diret´rio WEB-INF/classes/beans coloque os arquivos BeanMidia. e ca Servlets uma vez iniciados s˜o mantidos na mem´ria. O Recipiente Servlet ´ respons´vel e a por manter o ciclo de vida do Servlet. Recipiente Servlet co a ´ diferente de Servidor Web porque ele ´ feito somente para Servlets e n˜o e e a para outros arquivos (como . Servlets s˜o na verdade simples classes Java as quais necessitam implea mentar a interface javax.Servlet. Exemplo de Recipiente Servlet ´ o e Tomcat.1.Servlet e fornece apenas funcionalidades b´sicas.Cap´ ıtulo 3 Release 2 3. Esta interface cont´m cinco m´todos e e que precisam ser implementados.servlet.http. a a 22 . GenericServlet ´ uma e e e classe muito simples que somente implementa a interface javax. Na maioria das vezes vocˆ n˜o precisa ime a plementar esta interface.html etc). Por quˆ? Porque o pacote javax.servlet.1 3. Um Recipiente (Container) Servlet ´ como um servidor e Web que trata requisi¸˜es do usu´rio e gera respostas. ca o Esta caracter´ ıstica de “manter na mem´ria” faz com que usar Java Servlets o seja um m´todo extremamente r´pido e eficiente para construir aplica¸˜es e a co Web.servlet.HttpServlet para a construir um servlet e isto ´ o que faremos na nossa aplica¸˜o. Enquanto HttpServlet ´ uma classe a e mais util que fornece m´todos para trabalhar com o protocolo HTTP. Ent˜o tudo que vocˆ precisa fazer ´ estender uma dessas classes e soa e e brescrever o m´todo que vocˆ precisa para seu Servlet. N˜o ser´ escrito nenhum Servlet neste curso.e. Ent˜o toda rea o a quisi¸˜o que chega.servlet j´ provˆ e a e duas classes que implementam esta interface i. GenericServlet e HttpServlet. e de servidor Web o Apache. As´ e sim se seu servlet usa o protocolo HTTP (o que ocorrer´ na maioria dos a casos) ent˜o ele deveria estender a classe javax. vai para o Servlet na mem´ria e este gera uma resposta. Pode ser usado sozinho (standalone) ou conjugado com um servidor Web.1 Servlets O que s˜o servlets? a Servlets s˜o programas simples feitos em Java os quais rodam em um a Servlet Container. e As classes JDBC est˜o no pacote java.forName() faz com que a JVM carregue o driver na e mem´ria. mas JDBC n˜o funciona desta e a maneira. Quando o driver ´ carregado na mem´ria da JVM. e interpretar resultados. password ). que ent˜o e a fornecer´ acesso ao banco de dados. c 3. Este driver ´ e fornecido pelo vendedor do banco de dados ou por outro provedor de servi¸o.2. 3.sql. Vocˆ pode pensar que tem que instanciar a classe do driver e usar a o e referˆncia a ele para acessar o banco de dados. user .gjt. } finally { 23 .println("N~o foi poss´vel encontrar a ı a classe do Driver do MySQL").2 Especificando o driver JDBC No seu programa. Ent˜o vocˆ usa m´todos est´ticos da a e e a classe DriverManager para obter referˆncia ao objeto Connection.2.forName("org. a O acesso ´ fornecido por um driver JDBC. connection = DriverManager. Mas normalmente a URL segue um formato parecido com este: jdbc:driver-id://host/database ou jdbc:driver-id:database-id Exemplo de como conectar a um banco de dados MySQL (usado no curso): Connection connection. Esta interface ´ independente do banco de dados e da plataforma.1 Acesso ao banco de dados A API JDBC n˜o pode comunicar-se diretamente com o banco de dados.mm. vocˆ tem que especificar o driver JDBC que vai usar. JDBC especifica a interface necess´ria para conectar a um a banco de dados.out.getConnection( "jdbc:mysql://servidor/database".forName(JDBC-driver-class-name) O m´todo Class.DriverManager. ele se registra e o com a classe java.sql. que precisa ser importado para a a classe Java que faz uso de alguma classe desta API.Driver"). } catch (ClassNotFoundException ex) { System. O exato formato da URL depende do driver usado.mysql. e Faz-se isso com uma simples.3. executar comandos SQL e queries. que ´ uma classe espec´ e e ıfica para o banco de dados e implementa a interface definida pela API.2 Usando Java JDBC JDBC (Java DataBase Connectivity) ´ a API Java para comunica¸˜o com e ca bancos de dados. try { Class.3 Estabelecendo a conex˜o a JDBC segue o paradigma de usar uma URL para conectar a um recurso.2.println("N~o foi poss´vel conectar a ı ao servidor"). a 3. } catch (SQLException ex) { System. opera¸˜o: ca Class.out. talvez estranha. 4 Encontrando dados em uma tabela Antes de poder fazer consultas ao banco de dados com JDBC. 3.servlet e cont´m dois m´todos: a e e 24 .out.println ("Mais uma linha!"). Por exemplo. Quando o ResultSet ´ criado. Um objeto Statement pode ser reutilizado atrav´s e ´ criado pelo objeto Connection e ´ portanto de m´ltiplas requisi¸˜es SQL. O objeto ResultSet revela o conte´do da tabela uma linha por vez e foru nece m´todos para acessar dados de cada coluna da tabela da linha corrente.createStatement(). Abaixo est´ um exemplo de a a consulta: String query = ‘‘SELECT * FROM TABELA’’. vocˆ pode chamar v´rios m´todos suportados pelo objeto ResultSet e a e para restaurar dados das colunas e obter informa¸˜es sobre os resultados.try { if (connection != null) connection.2. E u co e dependente do driver que vocˆ est´ usando para conectar ao banco de dados. ResultSet resultset = statement. e a ´ E muito simples. A tabela de resultados ´ retornada pelo m´todo como uma e e instˆncia da classe ResultSet da API de JDBC.next()) { System.3 Interface RequestDispatcher Esta interface est´ presente no pacote javax. o ResultSet avan¸a o cursor em uma linha.5 Fazendo consultas com JDBC Fazer uma consulta com JDBC ´ f´cil uma vez que vocˆ tenha o objeto e a e Statement: vocˆ simplesmente passa a consulta como parˆmetro do m´todo e a e executeQuery(). Estes m´todos lan¸am exce¸˜es. co 3. vocˆ precisa e criar um objeto Statement.2. mas sim antes dela. } Quando o cursor est´ posicionado em uma linha que vocˆ gostaria de a e examinar. para passar por todas linhas do ResultSet far´ ıamos o seguinte: while (resultset. e indicada por um cursor interno. o cursor de e linha n˜o est´ na primeira linha. } catch (SQLException e) { } } 3.close().executeQuery(query). Chamando o m´todo a a e next(). portanto no seu programa deve estar e c co dentro de um bloco try/catch. como vocˆ pode ver: e Statement statement = connection. retornando valor verdade c se a chamada foi bem sucedida. Se n˜o for subclasse. rd = request. • include(ServletRequest request.getRequestDispatcher(String resource) Se o servlet ´ subclasse de HttpServletRequest. J´ no construtor da classe faremos a conex˜o usando os m´todos descritos a a e na parte de JDBC desta apostila. a Para obter uma referˆncia a interface RequestDispatcher temos duas fore mas: • ServletContext. response). e tem m´todos e para acess´-lo.4. leia os coment´rios do arquivo para maiores e a detalhes. Assim para fazer a conex˜o bastar´ instanciar um objeto a a a desta classe. rd.1 Construindo a aplica¸˜o ca Escrevendo uma classe que conecta a um banco de dados Na aplica¸˜o que estamos construindo neste curso. response). p´gina JSP ou HTML) dentro da resposta de quem chamou o recurso. 3.getRequestDispatcher(String resource) • ServletRequest.• forward(ServletRequest request.4 3. rd. Este c˜ recurso pode ser um servlet. simplesmente chama-se o e m´todo getRequestDispatcher(String resource) para pegar uma referˆncia ao e e objeto RequestDispatcher. RequestDispatcher rd.getRequestDispatcher("caminho do recurso"). import java.forward(request.sql. uma p´gina JSP ou uma simples p´gina a a HTML.forward(request. ServletResponse response) transfere uma requisi¸ao para outro recurso no mesmo servidor. utilize a outra maneira. teremos que inserir e ca restaurar dados do bancos de dados diversas vezes. a rd = getServletContext(). inclui a resposta do recurso dado (Servlet. Para simplificar nossa vida.*. Para os outros m´todos. package conexao. ServletResponse response) atua no lado do servidor. 25 . criaremos uma classe que conecta ao banco de dados.getRequestDispatcher("caminho do recurso"). println("N~o foi poss´vel conectar ao servidor").user.out. } catch (SQLException ex) { System.createStatement().println("N~o foi poss´vel encontrar a classe "+ a ı "do Driver do MySQL").gjt.mm.String database.out.mysql. ""). } catch (SQLException ex) { System. a ı throw ex.gjt. } catch (SQLException ex) { System. "".getConnection("jdbc:mysql://"+ "/locadora".Driver").println("N~o foi poss´vel encontrar a classe do "+ a ı "Driver do MySQL").getConnection( "jdbc:mysql://"+servidor+"/"+database.out. } catch (SQLException ex) { System. String password) throws SQLException { try { Class.out. } catch (ClassNotFoundException ex) { System.println("N~o foi poss´vel criar a statement").public class Conexao { private Connection connection. a ı } } /** * Executa um update na base de dados * @param update String SQL a ser executado * @throws SQLException se n~o for poss´vel executar a ı 26 . private Statement statement.out.println("N~o foi poss´vel conectar ao servidor").mysql.createStatement(). } catch (ClassNotFoundException ex) { System.out. connection = DriverManager. } } public Conexao() { try { Class. a ı } try { statement = connection.String user. connection = DriverManager.Driver").forName("org.forName("org. a ı throw ex.password).mm.println("N~o foi poss´vel criar a statement"). public Conexao (String servidor. } try { statement = connection. Assim. } catch (SQLException ex) { System.out. se ele igual a outro. a 27 . } } /** * Fecha a conexao com a base de dados. } catch (SQLException ex) { ex. } } /** * Retorna o maior n´mero de um campo da tabela u * for um inteiro.* o update (Erro de SQL). } catch (SQLException e) { System. return rs.out. ID M´ximo").printStackTrace().getInt("contador")+1. a ı throw ex. } } /** * Executa uma consulta na base de dados * @param query String SQL a ser executado * @return Um objeto do tipo ResultSet contendo o * resultado da query * @throws SQLException se n~o for poss´vel executar a query a ı * (Erro de SQL). FROM "+tabela. n~o teremos nenhum ID a */ public int retornaIDMax(String tabela) { try { String sql="SELECT max(ID) as contador ResultSet rs = this.println("Erro na sele¸~o do ca e.close(). } catch (SQLException ex) { System.printStackTrace().out. */ public synchronized ResultSet executeQuery(String query) throws SQLException { try { return statement. */ public synchronized void executeUpdate(String update) throws SQLException { try { statement.next().executeQuery(query).executeUpdate(update).println("N~o foi poss´vel executar o update"). */ public void fecharConexao() { try { statement. rs. a ı throw ex.println("N~o foi poss´vel executar a query").executeQuery(sql). que vai ser usada no curso. "+ "unique(Titulo))"). ’DVD’) not null.println("Erro: nao foi possivel criar tabela "+ Midias. e ent˜o executar um comando SQL usando o m´todo executeUpa e date(String).executeUpdate("create table Midias "+ "(ID int primary key not null. Cidade varchar(30) not null.*. basta executar a classe CriaTabelas. Tipo enum (’VHS’ . conecta a um banco de dados e cria a tabela Midias. criando uma instˆncia da classe Coa nexao. 28 .2 Criando tabelas Vamos escrever uma classe que quando executada. Telefone varchar(15).executeUpdate("create table Pessoas "+ "(ID int primary key not null. ResultSet rs = null. } catch (SQLException e) { System.\n "+ e. "+ "Descricao text. Email varchar(50) not null. try { con. "+ "Endereco text. "+ "Nome varchar(50) not null. import java.out.sql. } } } Para criar as tabelas.4. } } } 3. public class CriaTabelas { public static void main(String[] args) { Conexao con = new Conexao(). "+ "Titulo varchar(50) not null. Basta conectar no banco de dados. "+ "RG varchar(20) not null.return 0. unique(Email))"). Ano char(4) not null. package conexao. con. "+ "Bairro varchar(40) not null.getMessage()). getTitulo()+"’ . ’"+midia. Modifique o arquivo ProcessarMidia.getTipo()+"’)").getErrorCode() == 1062) { midia. "T´tulo j´ existe.").jsp.BeanMidia.*" %> <%! String pagina = null. ’"+midia. } if (pagina == null) pagina = "/erro.jsp". } finally { if (con != null) con. try { con = new Conexao().getAttribute("midia").getDescricao()+"’ .jsp". ’"+ midia. con.4.getAno()+ "’ .4. ’"+midia. h´ referˆncia a p´gina /erro. ı a pagina = "/cadastro/RetryMidia. con = null.jsp.4 P´gina de erro a No arquivo CadMidia.println(ex).retornaIDMax("Midias")+ ". } catch (SQLException ex) { if (ex.jsp". vamos redirecionar a aplica¸˜o para um arquivo que vai ca cadastrar a m´ no banco de dados e redirecionar a aplica¸˜o para a p´gina ıdia ca a de sucesso.sql.out. Conexao con = null.3 Cadastrando os dados no banco de dados Ap´s verificar se o formul´rio foi digitado corretamente (no arquivo Proo a cessarMidia.setErros("titulo". java.jsp). } System.fecharConexao().jsp dando um forward para o arquivo CadMidia. <%@ page import="beans.3. %> <jsp:forward page=’<%= pagina %>’ /> 3. pagina = "/sucesso.jsp.*. conexao.executeUpdate("insert into Midias values ("+con. Veja o c´digo: o 29 . Vamos cri´-la a e a a agora. %> <% BeanMidia midia = (BeanMidia) request.jsp em vez de sucesso. &atilde. J´ que a maioria das p´ginas JSP n˜o serve como p´ginas de erro.o do erro.</li> </td> </tr> </table> </body> </html> 30 .o.O atributo isErrorPage da diretiva page ´ usado para marcar uma p´gina e a JSP que serve como a p´gina de erro para uma ou mais p´ginas. tente novamente mais tarde</li> <li>Contate o administrador para depura&ccedil. o valor a a a a padr˜o para este atributo ´ false. a e <%@ page isErrorPage="true" %> <html> <head> <title>Erro!</title> </head> <body> <table align="center" border="0" cellspacing="2" cellpadding="2" width="70%"> <tr> <td bgcolor="#CCDDEE" align=center> <h3>Erro</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> Algum erro inesperado aconteceu.<br> </td> </tr> <tr> <td bgcolor="#F0F0F0" align=left> <li>Pode haver algum erro de conex&atilde. Como a a resultado disso. a p´gina pode acessar o objeto impl´ a ıcito exception. co a o a chamados de a¸˜es personalizadas (custom actions). ca • Tem acesso a todos os objetos impl´ ıcitos.tagext.1. e ca Alguns exemplos de tarefas que podem ser feitas por custom actions incluem processamento de formul´rios. A vantagem de usar Tag Libraries em vez de outros m´todos.jsp. a Uma Tag Library ´ uma cole¸˜o de custom tags. criar vari´veis que referenciam o bean em uma tag.1 Tag Libraries O que ´ uma Tag Library ? e Na tecnologia JSP.Cap´ ıtulo 4 Release 3 4. como c e JavaBeans associados a scriptlets. a¸˜es s˜o elementos que podem criar e acessar objetos co a da linguagem de programa¸˜o e afetar a sa´ de dados. • Podem modificar a resposta gerada pela p´gina que solicitou a a¸˜o. Uma custom action ´ co e invocada usando uma tag personalizada (custom tag) em uma p´gina JSP.1. a a Algumas caracter´ ısticas das custom tags s˜o: a • Podem ser personalizadas atrav´s de atributos passados pela p´gina e a que solicitou a a¸˜o.Tag.1 4. permitindo intera¸˜es comco plexas dentro de uma p´gina JSP. e ent˜o usar a a o bean em outra tag. acesso a banco de dados e outros a servi¸os. ´ que as Tags tornam-se mais simples de e utilizar (principalmente para programadores HTML que n˜o conhecem Java) a e s˜o reutiliz´veis. JSP permite desenvolver m´dulos reutiliz´veis. A especifica¸˜o de ca ıda ca JSP define seis a¸˜es padr˜o. a ca • Podem se comunicar com outras tags. Pode-se criar e inicializar JavaBeans. a 4. e ´ E usada para encapsular funcionalidades que podem ser usadas em uma p´gina JSP. a 31 .2 O que ´ uma Tag ? e Uma Tag ´ uma classe que implementa a interface javax.servlet. • Podem estar aninhadas dentro de outras. 2 de JSP): a a BodyTag ou Tag. setParent(): para ajustar alguma superclasse (null se nenhuma). M´todos do tag handler s˜o chamados pela a e a classe que implementa a p´gina JSP nos v´rios pontos que a tag ´ encontrada. a Para criar uma BodyTag. S˜o eles (na seq¨ˆncia de execu¸˜o): a ue ca 1. executando os m´todos set de cada um. 9. 6. A diferen¸a b´sica ´ que o corpo de uma Tag ´ avaliado c a e e apenas uma vez enquanto o corpo da BodyTag pode ser avaliado v´rias vezes. release(): para liberar quaisquer recursos necess´rios. setPageContext(): para ajustar o atributo PageContext. e 4. e se for EVAL BODY BUFFERED ou EVAL BODY AGAIN ele faz outra itera¸˜o. 7. 2. doAfterBody() ´ executada ap´s a avalia¸˜o do corpo. a Quando uma Tag ´ encontrada. setBodyContent(): ajusta a conte´do do corpo da tag. 5. 3. que implementa a interface Tag. ca 8. release(): para liberar quaisquer recursos necess´rios. a Existe a classe TagSupport. 5. Ajustar os atributos. e pode ser estendida para criar-se uma Tag. e 4. s˜o executados os seguintes m´todos na e a e seq¨ˆncia: ue 1. A interface BodyTag estende a interface Tag e nos fornece alguns m´todos e novos.3 Tag Handlers? Um tratador de tags (tag handler ) ´ o objeto invocado por um recipiente e JSP (JSP Container ) para avaliar uma custom tag durante a execu¸˜o da ca p´gina JSP que referencia a tag. executando os m´todos set de cada um. 4. 2. doEndTag(): termina a tag. setPageContext(): para ajustar o atributo PageContext. u 6. Se for SKIP BODY ele n˜o avalia o corpo novae mente. basta que a classe implemente a interface BodyTag. a a e 32 .1. Seu valor de e o ca a retorno ´ importante. setParent(): para ajustar alguma superclasse (null se nenhuma). Ajustar os atributos. doEndTag(): termina a tag. doInitTag() aqui colocam-se instru¸˜es que devem ser executadas anco tes de avaliar o corpo da tag. doStartTag(): que inicia a tag. doStartTag(): que inicia a tag.Uma Tag pode ser de dois tipos (h´ uma terceira na vers˜o 1. 3. Bodytag. Estas informa¸˜es s˜o poss´ co a ıveis com a classe javax. package tags. javax. javax...jsp.*.util.servlet.io.jsp.1 Escrevendo uma BodyTag Abaixo est´ a classe TagMidia.jsp. Um TLD cont´m informa¸˜es sobre a biblioteca (library) como e co um todo e sobre cada tag contida na biblioteca. public final class TagMidia implements BodyTag { 33 .*. vamos fazer uma consulta e depois restaurar cada linha do resultado em uma linha de uma tabela HTML na p´gina JSP.tagext. </taglib> 4. Os seguintes elementos s˜o necess´rios para definir uma Tag Library: a a <taglib> <tlibversion>A vers~o da biblioteca </tlibversion> a <jspversion> A vers~o da especifica¸~o JSP usada </jspversion> a ca <shortname> Um nome para a tag library </shortname> <uri> Uma URI que identifica unicamente a tag library </uri> <info> Informa¸~es sobre a tag library </info> co <tag> . 4. java.*..1.servlet.*.Conexao.*.tagext.2. TLDs s˜o usados pelo a recipiente JSP para validar as tags e por ferramentas de desenvolvimento JSP. que implementa a interface a javax.jsp.4 Descritor de Tag Libraries Um tag library descriptor (TLD) ´ um documento XML que descreve a e tag library.TagExtraInfo. java.sql. import import import import import import conexao. Para isso.4. o Recipiente a ca a a permite especificar quais elementos e quanto tempo eles estar˜o dispon´ a ıveis.servlet.2 Construindo a aplica¸˜o ca Vamos escrever uma tag que mostra todas as m´ ıdias contidas no banco de dados.servlet. Para adicioa nar novos elementos dinamicamente e torn´-los dispon´ a ıveis para outras a¸˜es co (an´logo a defini¸˜o de v´riaveis de script) na mesma p´gina.. </tag> . java.tagext. BodyContent body = null. ResultSet rs = null. A partir da´ a ı.private private private private private PageContext pc = null.out. StringBuffer sb = new StringBuffer().println(e).executeQuery("SELECT * FROM Midias order by Titulo"). public int doStartTag() throws JspException { try { con = new Conexao(). public void setPageContext(PageContext p) { pc = p. } public void doInitBody() throws JspException {} private boolean setVariaveis() throws JspTagException { try { if (rs. rs = con. } public void setBodyContent(BodyContent b) { body = b.next()) { Aqui vamos ajustar as vari´veis que vamos definir na classe TagExtraInfo.getAttribute("titulo") == null) return SKIP_BODY. setVariaveis(). quem vai renovar os valores das vari´veis ´ o m´todo doAfterBody(). return EVAL_BODY_BUFFERED. } if (pc. } No m´todo doStartTag() faremos a consulta no banco de dados e armazee naremos o resultado no objeto rs e chamaremos o m´todo setVariaveis para e ajustar as vari´veis para a primeira passada pelo corpo da tag. } public void setParent(Tag t) {} public Tag getParent() { return null. Conexao con = null. a 34 . } catch (SQLException e) { System. que vai a e e ser executado tantas vezes quantas forem o n´mero de linhas obtidos com a u consulta SQL. toString()).setAttribute("tipo". no caso desta classe) estas vari´veis que ser˜o usadas na p´gina JSP. pc. } public void release() { pc = null. } } public int doAfterBody() throws JspException { try { sb. rs. return true. } } catch (SQLException e) {} return EVAL_PAGE. } if(setVariaveis()) { return EVAL_BODY_AGAIN.close().write(sb.clear(). rs.append(body.getString("Ano")). } else { return false. return false.setAttribute("descricao".setAttribute("titulo". } } 35 . } try { body.getString("Tipo")). rs. rs. a a a pc. body.out. pc.setAttribute("ano". body = null. } } catch (SQLException e) { System.Armazena-se no objeto impl´ ıcito page (PageContext pc.getString("Titulo")).println(e).getString("ID")).setAttribute("ID".getString("Descricao")).getEnclosingWriter(). rs. con = null. } if (con != null) { con. rs = null. } return SKIP_BODY. } public int doEndTag() throws JspException { try { if(rs != null) { rs.getString()).fecharConexao(). } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"). pc. pc. } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"). sb = null. lang. true.String". "java.tagext. O nome do atributo. new VariableInfo("ano". "java.NESTED). true.String".NESTED). new VariableInfo("ID". true. Crie o diret´rio tld dentro do o diret´rio WEB-INF e nele crie o arquivo TagLib. "java.//DTD JSP Tag Library 1. tipo e ID).String". VariableInfo. import javax. VariableInfo.NESTED).2. 2.NESTED) }.tld com o seguinte conte´do: o u <?xml version="1. est´ entre aspas).4. public class TagTEIMidia extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData data) { return new VariableInfo[] { O construtor da classe VariableInfo aceita quatro argumentos: 1. package tags.lang. descricao.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems.2. Inc.lang.*. new VariableInfo("tipo". O escopo da vari´vel. } } 4.lang. VariableInfo.3 Descritor Vamos agora criar o TagLib Descriptor.1//EN" 36 .lang. onde: NESTED vale da tag de in´ a tag final. e a new VariableInfo("titulo". VariableInfo. a ano. true.String". true. new VariableInfo("descricao". e a 3.servlet.2 TagExtraInfo Precisamos definir as vari´veis que colocamos na classe TagMidia (titulo. Se ´ uma nova vari´vel (valor verdade) ou uma j´ existente na p´gina e a a a (valor falso). "java. VariableInfo.String".NESTED). a ıcio ıcio e a AT BEGIN vale da tag de in´ at´ o fim da p´gina JSP e AT END vale da tag final at´ o fim da p´gina JSP. 4. A classe do atributo (repare que ´ um String.jsp. "java. com/j2ee/dtds/web-jsptaglibrary_1_1.tld" prefix="todos" %> <html> <head> <title>Todos os t´tulos</title> ı </head> <body bgcolor="#FFFFFF" text="#000000"> <table align="center" border="0" width="90%" cellspacing="2" cellpadding="4"> <tr> <th bgcolor="#CCDDEE" colspan=2> Listagem das M´dias ı </th> </tr> Aqui est´ o in´ da tag. e teiclass ´ a localiza¸˜o da classe TagExtraInfo (se for e ca usada).1</jspversion> <shortname>taglocadora</shortname> <info>Tags da Locadora</info> <tag> <name>mostremidias</name> <tagclass>tags. e o nome a ıcio e da tag que quer usar (este nome est´ no arquivo TagLib. name ´ nome que vai ser utilizado para chamar esta e tag na p´gina JSP.TagMidia</tagclass> <teiclass>tags.0</tlibversion> <jspversion>1. pode-se usar livremente os atributos definidos na classe TagExtraInfo. Veja o c´digo: ca o <%@ taglib uri="/WEB-INF/tld/TagLib. 4.jsp e coloque na raiz da u e aplica¸˜o. Dˆ o nome de titulos.2.TagTEIMidia</teiclass> <bodycontent>JSP</bodycontent> <info>Tag que mostra o conte´do do BD</info> u </tag> </taglib> Dentro de <tag>. a Entre a tag de in´ ıcio e a tag final."http://java. Coloque o prefixo que vocˆ definiu.dtd"> <taglib> <tlibversion>1.4 P´gina JSP a Vamos escrever uma p´gina JSP que usa a TagMidia para listar todo a conte´do do banco de dados. <todos:mostremidias> <tr bgcolor="#E3E3E3"> <td align=center> 37 . tagclass ´ a localiza¸˜o da classe (dentro do diret´rio a e ca o WEB-INF/classes).sun.tld). </td> </tr> </todos:mostremidias> </table> </body> </html> 38 .<b>M´dia:</b> <%= titulo %> ı </td> <td align=center> <b>Ano:</b> <%= ano %> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center> <%= descricao %> </td> <td align=center> <%= tipo %> </td> </tr> <tr> <td colspan="2" bgcolor="#FFFFFF"> &nbsp. ca ca 5. a e a Tamb´m h´ modifica¸˜es no descritor da tag. procura-se no banco a de dados este texto e mostra-se o resultado da consulta na tela.jsp"> <th bgcolor="#CCDDEE" colspan=3> Digite a(s) palavra(s) chave(s) para a pesquisa </th> <tr bgcolor="#f7f7f7"> <td align=center>Pesquisa</td> <td align=center> <input type="text" name="chave" size=30> 39 .jsp.1 P´gina de pesquisa a Vamos construir um arquivo chamado pesquisa. 5. que procura por m´ ıdias no banco de dados: <%@ taglib uri="/WEB-INF/tld/TagLib. vamos fazer uma p´gina a a de pesquisa de m´ ıdias. <form method="post" action="pesquisa.2 Construindo a aplica¸˜o ca Para mostrar a utilidade das tags com parˆmetro.tld" prefix="pesquisa" %> <html> <body> <center> <table align=center width="50%"> Repare que o arquivo que processa o formul´rio ´ o pr´prio arquivo pesa e o quisa. basta especificar os atributos na a classe da Tag. e ent˜o escrever os m´todos set e get para poder acess´-los.Cap´ ıtulo 5 Release 4 5.1 Tags com parˆmetros a Para criar uma tag com parˆmetros.2.jsp. onde o usu´rio digita algum texto. e a co Vamos construir a aplica¸˜o para melhor ilustrar esta situa¸˜o. Coloca-se o nome do atributo e a exa a press˜o ou valor associado a ele.). a <% String tem = (String) request. o comando request.. a <pesquisa:mostremidias chave=’<%= tem %>’ > <tr bgcolor="#E3E3E3"> <td align=center> <b>M´dia:</b> <%= titulo %> ı </td> <td align=center> <b>Ano:</b> <%= ano %> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center> <%= descricao %> </td> <td align=center> <%= tipo %> </td> </tr> <tr> <td colspan="2" bgcolor="#FFFFFF"> &nbsp.getParameter(”chave”) retornar´ a e a valor nulo.&nbsp. </td> </tr> </pesquisa:mostremidias> </table> Este fechamento de chaves ´ relativo ao comando if( tem != null .equals("")) { %> <br><br> <table align=center width="70%"> <th bgcolor="#CCDDEE" colspan=3 align=center> M´dias encontradas ı </th> Aqui est´ a tag com parˆmetro..&nbsp.&nbsp. <input type=reset value="Limpar"> </td> </tr> </form> </table> Quando n˜o for digitado nada no campo de texto ou for a primeira vez a que a p´gina ´ acessada. e <% } %> 40 . <input type=submit value="Pesquisar >>"> &nbsp. if (tem != null && !tem.getParameter("chave"). Logo abaixo colocamos um comando de condi¸˜o que s´ executa o que h´ ca o a dentro das chaves se o usu´rio digitou alguma chave de pesquisa. sql. javax.TagTEIMidia</teiclass> <bodycontent>JSP</bodycontent> <info>Tag que mostra o conte´do do BD</info> u <attribute> <name>chave</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> Onde <name> ´ o nome do atributo.*.2.servlet.*.jsp.</center> </body> </html> 5.jsp. o a e a 5.*. public final class TagMidia implements BodyTag { private PageContext pc = null. e <rtexprvalue> ´ se v˜o ser colocadas express˜es (scriptlets ou a e a o express˜es) dinˆmicas no valor do atributo (true.Conexao.java Vamos modificar o arquivo TagMidia.2. 41 . a A parte que especifica a tag mostremidias ficar´ assim: a <tag> <name>mostremidias</name> <tagclass>tags.TagMidia</tagclass> <teiclass>tags. e se o valor ´ est´tico false). javax. Veja o novo c´digo: o package tags.java colocando um atributo chamado chave de tipo String e seus respectivos m´todos get e set.tagext.2 Descritor das Tags No descritor das tags (/WEB-INF/tld/TagLib.io. java.util. import import import import import import conexao.*. e Tamb´m vamos modificar o m´todo doStartTag() para que ele fa¸a uma cone e c sulta diferente ao banco de dados caso o valor do atributo chave n˜o seja a nulo (ou seja.tld ) h´ modifica¸˜es a sea co rem feitas para que a tag aceite parˆmetros. java.*. queremos fazer uma pesquisa no banco de dados). java.servlet. <required> e se ele ´ obrigat´rio e e o ou n˜o.3 Modificando o arquivo TagMidia. getAttribute("titulo") == null) return SKIP_BODY. String chave = null.executeQuery("SELECT * FROM Midias order by Titulo"). } else { rs = con. onde procura-se pela chave nos campos Titulo e Descricao.private private private private private BodyContent body = null. StringBuffer sb = new StringBuffer(). ResultSet rs = null. } if (pc.getString("Titulo")). 42 . Se foi passado algum parˆmetro. public void setPageContext(PageContext p) { pc = p. chave vai ser diferente de nulo. } public void setBodyContent(BodyContent b) { body = b. } catch (SQLException e) { System.setAttribute("ano".out. Conexao con = null. pc. e ´ feita a e uma consulta ao banco de dados.setAttribute("titulo". } public void setParent(Tag t) {} public Tag getParent() { return null. rs.executeQuery("SELECT * FROM Midias where "+ "Titulo like ’%"+chave+"%’ or Descricao like "+ "’%"+chave+"%’ order by Titulo").println(e). } public int doStartTag() throws JspException { try { con = new Conexao().next()) { pc. return EVAL_BODY_BUFFERED.getString("Ano")). if (chave != null) { rs = con. rs. } public void doInitBody() throws JspException {} private boolean setVariaveis() throws JspTagException { try { if (rs. } setVariaveis(). } if (con != null) { con.setAttribute("ID".getString("Tipo")).clear(). body.pc. } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"). body = null.setAttribute("tipo". con = null.getString("Descricao")).toString()). } public int doEndTag() throws JspException { try { if(rs != null) { rs. } } public int doAfterBody() throws JspException { try { sb.close().println(e). rs. } } catch (SQLException e) { System.setAttribute("descricao". pc. return true. } 43 .getString("ID")). } else { return false. rs = null. return false. pc. } public void release() { pc = null.fecharConexao().getEnclosingWriter().write(sb. rs.getString()).out.append(body. sb = null. } public String getChave() { return chave. rs. } public void setChave(String nova) { chave = nova. } } catch (SQLException e) {} return EVAL_PAGE. } return SKIP_BODY. } if(setVariaveis()) { return EVAL_BODY_AGAIN. } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"). } try { body. 2.). Se houver mais de um parˆmetro.} 5. Tente acessar a http://localhost:8080/locadora/pesquisa.jsp?chave=string e veja o que acontece.4 Passando parˆmetros pela URL a Pode-se passar os valores dos formul´rios HTML pela URL. separe-os usando ponto e v´ a ırgula(. 44 . dtd"> <web-app> </web-app> 6. Este arquivo serve como um dep´sito de informa¸˜es.xml e reside no dica e ret´rio WEB-INF.xml ´ o arquivo de configura¸˜o central da aplica¸˜o. os o o co dados que ele armazena sobre ele mesmo s˜o.xml.xml Vamos escrever o arquivo web. a aplica¸˜o pode n˜o funcionar.1 6.//DTD Web Application 2.xml da nossa aplica¸˜o. para que n˜o apare¸am as causas do a a a c erro para o usu´rio (se vocˆ n˜o escreveu alguma p´gina corretamente.Cap´ ıtulo 6 Descritor da aplica¸˜o ca O arquivo descritor da aplica¸˜o ´ chamado de web.sun. Inc. a a co Trocando a ordem.com/dtd/web-app_2_3.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems. e ca ca Como sua extens˜o de arquivo sugere. no sentido que s˜o informa¸˜es a respeito de informa¸˜es.1. a linguagem de marca¸˜o para os a ca dados no arquivo web. a e a a j´ deve ter visto a p´gina de erro que o Tomcat mostra).xml ´ XML. Colocaremos apeca nas algumas informa¸˜es. a a H´ uma ordem necess´ria das configura¸˜es usadas no arquivo web. portanto. s˜o elas: co a • O tempo de validade da sess˜o a • Uma lista com nomes de arquivos que s˜o abertos por padr˜o quando a a um diret´rio ´ acessado o e • Ajustar as p´ginas de erro padr˜o. O conte´do b´sico do descritor ´: e u a e <?xml version="1. considerados mea tainforma¸˜es.1 Construindo a aplica¸˜o ca Web. Abaixo est´ o c´digo: ca a a o 45 .3//EN" "http://java. O co a co co arquivo web. 1.//DTD Web Application 2.Throwable</exception-type> <location>/erro.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems.jsp</location> </error-page> </web-app> 6. Veja o c´digo: o ca o <%@ page isErrorPage="true" %> <html> <head> <title>Erro!</title> </head> <body> <table align="center" border="0" cellspacing="2" cellpadding="2" width="70%"> <tr> <td bgcolor="#CCDDEE" align=center> <h3>Erro</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> P´gina inexistente.lang. a Crie o arquivo erro404.sun. Inc.<br> a 46 .xml.jsp</welcome-file> <welcome-file>index.dtd"> <web-app> <session-config> <session-timeout>10</session-timeout> </session-config> <welcome-file-list> <welcome-file>opcoes.3//EN" "http://java.2 P´gina de erro a Vamos criar a p´gina de erro que especificamos no arquivo web.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/erro404.jsp</location> </error-page> <error-page> <exception-type>java.jsp (404 ´ o c´digo de p´gina n˜o encontrada) no e o a a diret´rio raiz da aplica¸˜o.<?xml version="1.com/dtd/web-app_2_3. </td> </tr> </table> </body> </html> 47 . o a a o Mas antes de olhar lembre-se que s´ se aprende fazendo. endere¸o. telefone.Cap´ ıtulo 7 Release 6 7. A tabela do c banco de dados tem o nome de Pessoas e foi criada (como vocˆ deve lembrar) e no come¸o do curso. cidade e bairro onde mora e RG.1 Construindo a aplica¸˜o ca Agora ´ sua vez de construir a aplica¸˜o. o 48 . c Nas pr´ximas p´ginas est˜o os c´digos fonte para realizar tal processo. Crie uma parte da aplica¸˜o e ca ca que faz o cadastro de pessoas. nos mesmos moldes do cadastro de m´ ıdias. ´ E necess´rio para o cadastro obter as seguintes informa¸˜es sobre a pesa co soa: nome. Sans-Serif.rios</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Nome<sup>*</sup></b> <br> <input type="text" name="nome" value="" size=30 maxlength=50></td> <td valign=top> <b>Telefone</b> <br> <input type="text" name="telefone" value="" maxlength=15> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top colspan=2> <b>Email<sup>*</sup></b> <br> <input type="text" name="email" value="" size=30 maxlength=50></td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Endere¸o c <br> <TEXTAREA NAME="endereco" ROWS="6" COLS="30"> </textarea> </td> <td valign=top> <b>RG<sup>*</sup></b></b> <br> <input type="text" name="RG" value="" maxlength=20> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Cidade<sup>*</sup></b></b> <br> <input type="text" name="cidade" value="" maxlength=30> </td> <td valign=top> 49 . padding-left:15. } </style> <title>Cadastro de Pessoa</title> </head> <body bgcolor="#FFFFFF" text="#000000"> <form action="ProcessarPessoa. font-size:11pt. td { font-family:Tahoma.html <html> <head> <style> p.CadastroPessoa.jsp" method=post name="pessoas"> <center> <table cellpadding=4 cellspacing=2 border=0> <th bgcolor="#CCDDEE" colspan=2> <font size=5>Cadastro de Pessoas</font> <br> <font size=1><sup>*</sup> Campos necess&aacute. BeanPessoa" scope="request"> <jsp:setProperty name="pessoa" property="*" /> </jsp:useBean> <% if (pessoa. padding-left:15. font-size:11pt.Sans-Serif.BeanPessoa" scope="request"/> <html> <head> <style> p.<b>Bairro<sup>*</sup></b></b> <br> <input type="text" name="bairro" value="" maxlength=40> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma"> <input type="reset" value="Limpar"> </td> </tr> </table> </center> </form> </body> </html> ProcessarPessoa. } </style> <title>Cadastro de Pessoa</title> </head> 50 .BeanPessoa" %> <jsp:useBean id="pessoa" class="beans.jsp <%@ page import="beans.ehValido()) { %> <jsp:forward page="CadPessoa.jsp" /> <% } %> RetryPessoa.jsp" /> <% } else { %> <jsp:forward page="RetryPessoa. td { font-family:Tahoma.jsp <%@ page import="beans.BeanPessoa" %> <jsp:useBean id="pessoa" class="beans. getTelefone() %>’ maxlength=15><br> <font color=#FF0000><%=pessoa.jsp" method=post name="pessoas"> <center> <table cellpadding=4 cellspacing=2 border=0> <th bgcolor="#CCDDEE" colspan=2> <font size=5>Cadastro de Pessoas</font> <br> <font size=1><sup>*</sup> Campos necess&aacute.rios</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Nome<sup>*</sup></b> <br> <input type="text" name="nome" value=’<%= pessoa.<body bgcolor="#FFFFFF" text="#000000"> <form action="ProcessarPessoa.getEmail() %>’ <font color=#FF0000><%=pessoa.getRG() %>’ <font color=#FF0000><%=pessoa.getErros("telefone")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top colspan=2> <b>Email<sup>*</sup></b> <br> <input type="text" name="email" value=’<%= pessoa.getNome() %>’ size=30 maxlength=50><br> <font color=#FF0000><%=pessoa.getErros("endereco")%></font> </td> <td valign=top> <b>RG<sup>*</sup></b></b> <br> <input type="text" name="RG" value=’<%= pessoa.getEndereco() %> </textarea><br> <font color=#FF0000><%=pessoa.getErros("cidade")%></font> </td> maxlength=30><br> 51 .getErros("email")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Endere¸o c <br> <TEXTAREA NAME="endereco" ROWS="6" COLS="30"> <%= pessoa.getErros("RG")%></font> size=30 maxlength=50>><br> maxlength=20><br> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Cidade<sup>*</sup></b></b> <br> <input type="text" name="cidade" value=’<%= pessoa.getErros("nome")%></font> </td> <td valign=top> <b>Telefone</b> <br> <input type="text" name="telefone" value=’<%= pessoa.getCidade() %>’ <font color=#FF0000><%=pessoa. /** * Implementar a classe Serializable ´ requisito para ser um Enterprise Bean.util.io. telefone = "". atributo serve para o controle de erros no formul´rio */ a Hashtable erros. import java. endereco = "".getBairro() %>’ <font color=#FF0000><%=pessoa. RG = "".Serializable { /** * Nomes */ private private private private private private private /* Este private dos atributos preferencialmente iguais aos usados no formul´rio a String nome. public BeanPessoa() { /* Iniciamos os atributos com o String nulo */ nome = "".java package beans.Hashtable. String endereco. ca a a c */ public class BeanPessoa implements java. e * Um objeto de uma classe que implementa esta interface pode ser escrito em disco ou enviado * Na aplica¸~o do curso n~o far´ diferen¸a. String email. String bairro.getErros("bairro")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma"> <input type="reset" value="Limpar"> </td> </tr> maxlength=40><br> </table> </center> </form> </body> </html> BeanPessoa. cidade = "". String telefone. String cidade. String RG. bairro = "".<td valign=top> <b>Bairro<sup>*</sup></b></b> <br> <input type="text" name="bairro" value=’<%= pessoa. 52 . } public void setEndereco(String valor) { endereco = valor. } public void setCidade(String valor) { cidade = valor. } public String getEmail() { return email. } public String getCidade() { return cidade. } public void setRG(String valor) { RG = valor. } public void setTelefone(String valor) { telefone = valor. } /** * M´todos para acessar os atributos. } public void setNome(String valor) { nome = valor. } public String getTelefone() { return telefone.email = "". } public String getEndereco() { return endereco. 53 . e setNome() para ajustar seu valor */ public String getNome() { return nome. } public void setBairro(String valor) { bairro = valor. } public String getRG() { return RG. } public String getBairro() { return bairro. e * getNome() para ver ser valor. erros = new Hashtable(). put("cidade".put("endereco". } if ((bairro == null) || bairro. digite um nome.get(s).indexOf("@") == -1)) { erros. } /** * Verifica se todos os dados exigidos foram digitados. digite o endereco. selecione o cidade.put("bairro". volta = false.equals("") || (email.equals("")) { erros. "Por favor."). "Por favor. } if ((email == null) || email. } if ((cidade == null) || cidade.put("email". digite o bairro. } if ((endereco == null) || endereco. volta = false. volta = false. "Por favor. } return volta. * al´m de outras condi¸~es desejadas. return (msg == null) ? "" : msg. if ((nome == null) || nome. e co */ public boolean ehValido() { boolean volta = true.equals("") ) { erros. } if ((RG == null) || RG. } /** * Usado para colocar algum erro na tabela 54 . volta = false.equals("") ) { erros.").put("RG"."). "Por favor.equals("") ) { erros. volta = false. volta = false. digite o email. } /** *Usado para ver as mensagens de erro armazaenados na tabela de Hash */ public String getErros (String s) { String msg = (String) erros. digite o RG.put("nome". "Por favor.} public void setEmail(String valor) { email = valor.").").equals("") ) { erros. "Por favor."). } } CadPessoa.getAttribute("pessoa"). con.msg). ’"+pessoa. } finally { if (con != null) con.out. "E-mail j´ existe. con = null.jsp <%@ page import="beans.*/ public void setErros (String chave. try { con = new Conexao().getNome()+"’ . pagina = "/sucesso. conexao. a pagina = "/cadastro/RetryPessoa.fecharConexao().getRG()+"’)"). ’"+pessoa.BeanPessoa. } System.*. Conexao con = null.put(chave.getEndereco()+"’ . } catch (SQLException ex) { if (ex. %> <jsp:forward page=’<%= pagina %>’ /> 55 .jsp".jsp".println(ex).getTelefone()+"’ ."). String msg) { erros.setErros("email". ’"+pessoa. ’"+ pessoa. } if (pagina == null) pagina = "/erro. %> <% BeanPessoa pessoa = (BeanPessoa) request. java.getEmail()+"’ .retornaIDMax("Pessoas")+ ".sql.executeUpdate("insert into Pessoas values ("+ con.getCidade()+"’ . ’"+ pessoa. ’"+pessoa. ’"+ pessoa.getBairro()+"’ .*" %> <%! String pagina = null.jsp".getErrorCode() == 1062) { pessoa. onde se o usu´rio ´ autorizado ´ a a e e criada uma sess˜o para ele. a a e a a Come¸aremos com a p´gina de acesso.2 Construindo a aplica¸˜o ca Vamos construir uma p´gina de login. uma das maneiras (e a mais a comum) ´ usar os m´todos get/setAttribute(String chave. String objeto) dise e pon´ ıveis para os objetos impl´ ıcitos pageContext.1 Passando objetos para outras partes da aplica¸˜o ca Para recuperar ou passar objetos de uma p´gina JSP para outra. 8. uma p´gina JSP para process´a a a lo.Cap´ ıtulo 8 Release 7 8. Simples HTML. request. a Precisaremos de um formul´rio de acesso. e uma p´gina JSP para testar se a sess˜o ´ v´lida ou n˜o. session e application. ou de a uma p´gina para um servlet (e vice-versa).jsp" method=POST name=login> <table width=25%> <tr> <td colspan=2 align=center bgcolor="#CCDDEE"> P´gina de Acesso a </td> </tr> <tr> <td bgcolor="#E0E0E0" width=50%> Usu´rio: a </td> <td bgcolor="#E0E0E0" width=50%> <input type=text name=usuario value=""> 56 . Veja o c´digo: c a o <html> <head> <title>P´gina de Acesso</title> a </head> <body> <center> <form action="VerificarSenha. </td> </tr> <tr> <td bgcolor="#F3F3F3" width=50%> Senha: </td> <td bgcolor="#F3F3F3" width=50%> <input type=password name=senha> </td> </tr> <tr> <td bgcolor="#F0F0F0" align=center width=50%> <input type=submit name=enviar value="Enviar"> </td> <td bgcolor="#F0F0F0" align=center width=50%> <input type=reset name=limpar value="Limpar"> </td> </tr> </table> </form> </center> </body> </html> Agora o arquivo que valida o formul´rio. "autorizado").equals("pet")) login = true. Este arquivo (sessao.jsp) ´ que nos interessa.*.getParameter("senha").equals("pet")) if (senha != null && senha.sql.setAttribute("sessao".jsp.jsp" %> <html> <head> <title>Autorizado!</title> 57 .jsp" /> P´gina de teste (autorizado. conexao. boolean login = false. a e <%@ page import="java. if (usuario != null && usuario. if (login) { session. } %> <jsp:forward page="/autorizado. Dˆ o nome de VerificarSenha. o e <%@ include file ="/sessao. Note a diretiva include no in´ a ıcio do c´digo.getParameter("usuario").jsp.*" %> <% String senha = (String) request. String usuario = (String) request. a o a a a redireciona para a p´gina de erro. e c o a a ent˜o o c´digo que est´ abaixo deste scriptlet ser´ mostrado. if (!(sess != null && sess.getAttribute("sessao"). a a e a e Se o objeto impl´ ıcito session tiver um atributo chamado de sessao e o valor dele for o String autorizado. este peda¸o de c´digo da p´gina n˜o faz nada.jsp" /> <% } %> Colocamos os Strings acima no objeto session no c´digo do arquivo Vero ficarSenha.</head> <body> <table align="center" border="0" cellspacing="2" cellpadding="2" width="70%"> <tr> <td bgcolor="#CCDDEE" align=center> <h3>Autorizado</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> Autorizado!<br> Voc^ pode fazer o que quiser agora nesta p´gina e a </td> </tr> </table> </body> </html> A p´gina que verifica se a sess˜o ´ v´lida (sessao. Caso contr´rio.jsp lembra? :) 58 .equals("autorizado"))) { %> <jsp:forward page="/erro403. a <% String sess = (String) session.jsp)´ muito simples. desses que todo site de loja da intertet tem. que vai ter como atributo principal um vetor (java.length. public BeanCarrinho() { v = new Vector(). } public void setComando(String s) { comando = s.Cap´ ıtulo 9 Release 8 Neste ultimo cap´ ´ ıtulo. mas com um pouco mais de c´digo poder´ o ıamos armazenar um objeto BeanMidia ou qualquer outra coisa que fizesse sentido na aplica¸˜o. i++) v. No caso. public class BeanCarrinho { Vector v.1 Carrinho de compras Nosso carrinho vai ser um Bean.Enumeration. i < array. String comando = null.java: o package beans.util. ca Veja o c´digo para BeanCarrinho. } private void removerItens(String[] array) { for (int i = 0.util. import java. } private void adicionarItens(String[] array) { for (int i = 0. vamos construir um carrinho virtual.Vector. i++) v. vamos armazenar apenas o t´ ıtulo da m´ ıdia. 9. import java.Vector ) que armazenar´ as m´ a ıdias que desejarmos.removeElement(array[i]).length.addElement(array[i]).util. i < array. 59 . a Veja o c´digo para a p´gina carrinho. Seria o mesmo que copiar seu a a c´digo e colar aqui.equals("adicionar")) adicionarItens(itens). } public void processar(String[] itens) { if (itens != null && comando != null) { if (comando. } } private void reset() { comando = null.jsp. E no in´ da p´gina vamos colocar a parte do ıcio a carrinho incluindo uma p´gina que vamos criar em seguida.} public String[] getItems() { String[] s = new String[v.jsp: o a <%@ taglib uri="/WEB-INF/tld/TagLib. basta modificar um pouco o arquivo pesquisa. } } 9. return s.equals("remover")) removerItens(itens). else if (comando.size()].jsp"> <th bgcolor="#CCDDEE" colspan=3> Digite a(s) palavra(s) chave(s) para a pesquisa 60 . o <%@ include file ="/carrinho1.copyInto(s).jsp" %> <table align=center width="50%"> <form method="post" action="carrinho.jsp. Vamos adicionar um formul´rio com checkboxes para o usu´rio escolher as fitas que a a deseja botar no carrinho.2 P´gina JSP a Vamos mostrar na mesma p´gina o carrinho e a pesquisa por palavrasa chave. v.tld" prefix="pesquisa" %> <html> <body> <center> Inclus˜o est´tica do arquivo carrinho1. reset(). Para isso. <input type=submit value="Pesquisar >>"> &nbsp. </td> </tr> </pesquisa:mostremidias> <tr bgcolor="#E0E0E0"> 61 .&nbsp.&nbsp.</th> <tr bgcolor="#f7f7f7"> <td align=center>Pesquisa</td> <td align=center> <input type="text" name="chave" size=30> &nbsp. if (tem != null && !tem. <input type=reset value="Limpar"> </td> </tr> </form> </table> <% String tem = (String) request.jsp’ method=post> <table align=center width="70%"> <th bgcolor="#CCDDEE" colspan=2 align=center> M´dias encontradas ı </th> <th bgcolor="#CCDDEE" >Carrinho</th> <pesquisa:mostremidias chave=’<%= tem %>’ > <tr bgcolor="#E3E3E3"> <td align=center> <b>M´dia:</b>&nbsp. ı <%= titulo %> </td> <td align=center> <b>Ano:</b> <%= ano %> </td> <td> <input TYPE=checkbox name=’reserva’ value=’<%=titulo %>’ > </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center> <%= descricao %> </td> <td align=center> <%= tipo %> </td> <td>&nbsp.equals("")) { %> <br><br> <form action=’carrinho.</td> </tr> <tr> <td colspan="3" bgcolor="#FFFFFF"> &nbsp.getParameter("chave"). para todos os parˆmetros presentes na requisi¸˜o (objeto rea ca quest). Colocando o valor do atributo property da a¸˜o <jsp:setProperty> como ca “*”.length > 0) { %> <form action=’carrinho. a a e inclu´ ımos ou removemos m´ ıdias do BeanCarrinho. ca <input TYPE=hidden name=’comando’ value=’adicionar’ > </form> <% } %> </center> </body> </html> Vamos ver a parte l´gica do carrinho agora. ele vai.jsp’ method=post> <table> <th bgcolor="#CCDDEE">Voc^ tem no carrinho:</th> e <th bgcolor="#CCDDEE" >Remover</th> <% for (int i=0.processar(temp). i++) { %> <tr> <td bgcolor="#F0F0F0"> <%= items[i] %> </td> <td bgcolor="#E0E0E0"> <input type=checkbox name=reserva value=’<%= items[i] %>’> 62 .).</td> </tr> </table> Este atributo escondido. if (items. if (temp != null) { carrinho. tentar usar o m´todo setNomeDoParametro() do Bean. diz qual a a¸˜o desejada (adicionar ou remover).. i<items.getParameterValues("reserva").length.BeanCarrinho" /> <jsp:setProperty name="carrinho" property="*" /> <% String[] temp = request. Com o m´todo processar(.<td align=center> <input type="submit" value="Confirma"> </td> <td align=center> <input type="reset" value="Limpar"> </td> <td>&nbsp. e <jsp:useBean id="carrinho" scope="session" class="beans.getItems(). o Usa-se um bean v´lido por toda a sess˜o. } String[] items = carrinho. </td> </tr> </table> <input type=hidden name=’comando’ value=’remover’> </form> <% } %> 63 .</td> </tr> <% } %> <tr bgcolor="#E0E0E0"> <td align=center> <input type="submit" value="Confirma"> </td> <td align=center> <input type="reset" value="Limpar"> </td> <td>&nbsp. padding-left:15.o</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> <a href=’cadastro/’>Cadastro</a> </td> <td> <a href=’login.jsp’>T´tulos dispon´veis</a> ı ı </td> </tr> </table> </body> </html> 64 .Cap´ ıtulo 10 Release 9 Apenas para deixar a aplica¸˜o com um interface melhor. } </style> </head> <body bgcolor="#FFFFFF" text="#000000"> <table align="center" border="0" cellspacing="2" cellpadding="2"> <tr> <td bgcolor="#CCDDEE" align=center colspan=5> <h3>Escolha a op&ccedil.&atilde.gina inicial</title> <style> p.jsp’>Pesquisa</a> </td> <td> <a href=’carrinho.jsp’>Login</a> </td> <td> <a href=’pesquisa. <html> <head> <title>P&aacute.Sans-Serif. vamos criar um ca arquivo index. td { font-family:Tahoma. font-size:11pt.jsp na raiz.jsp’>Carrinho</a> </td> <td> <a href=’titulos. } </style> </head> <body bgcolor="#FFFFFF" text="#000000"> <table align="center" border="0" cellspacing="2" cellpadding="2"> <tr> <td bgcolor="#CCDDEE" align=center colspan=2> <h3>Escolha a op&ccedil. o <html> <head> <title>P&aacute. td { font-family:Tahoma.jsp no diret´rio /cadastro.o</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> <a href=’CadastroMidia.E outro arquivo index.&atilde. padding-left:15.html’>M´dias</a> ı </td> <td> <a href=’CadastroPessoa.html’>Pessoas</a> </td> </tr> </table> </body> </html> 65 . font-size:11pt.gina de cadastro</title> <style> p.Sans-Serif. IronFlare AB. Desenvolvendo na Web com Java Server Pages. 2001.sun. Star Developer.com. Dispon´ ıvel online em http://stardeveloper. 2001.com : Java Server Pages and Servlets Articles. Primeira Edi¸˜o. Acessado em setembro de 2002.com/.com : Connecting to Databases using JDBC.orionserver. Fields. Kolb. Star Developer.com/products/jsp/. Acessado ıvel em setembro de 2002. e ca [2] Star Developer Stardeveloper. Editora Ciˆncia Moderna. Dispon´ online em http://www. Dispon´ online em http://java. [4] Sun Microsystems JavaServer Pages(TM) Technology. Mark A. Dispon´ ıvel online em http://stardeveloper. 2001. 66 . 2000. [5] Orion Application Server OrionServer Taglibs Tutorial.Referˆncias Bibliogr´ficas e a [1] Duane K. 2002. Acessado em setembro de 2002. [3] Star Developer Stardeveloper. Acessado em ıvel setembro de 2002. Sun Microsystems.com.
Copyright © 2024 DOKUMEN.SITE Inc.