Você está na página 1de 67

UNIVERSIDADE FEDERAL DE SANTA CATARINA PROGRAMA ESPECIAL DE TREINAMENTO CIENCIAS DA COMPUTAC AO

Curso de JSP
Roberto Hartke Neto

Vers ao 1.0 Florian opolis, Outubro de 2002

Sum ario
1 Introdu c ao 1.1 O que e JSP? . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Por que usar JSP se j a existe PHP, ASP, etc? 1.2 Como JSPs funcionam . . . . . . . . . . . . . . . . . 1.3 Instalando e congurando 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 c ao . . . . . . . . . . 1.3.5 Estrutura de diret orios da aplica c ao . . . . . . 2 Release 1 2.1 Java Beans . . . . . . . . . . . . . . . . 2.1.1 O que faz de um Bean um Bean? 2.1.2 Conven c oes de um Bean . . . . . 2.2 JSP Tags . . . . . . . . . . . . . . . . . 2.2.1 A c oes JSP . . . . . . . . . . . . . 2.2.2 Diretivas . . . . . . . . . . . . . . 2.2.3 Declara co es . . . . . . . . . . . . 2.2.4 Express oes . . . . . . . . . . . . . 2.2.5 Scriptlets . . . . . . . . . . . . . 2.2.6 Coment arios . . . . . . . . . . . . 2.3 Objetos impl citos . . . . . . . . . . . . . 2.4 Construindo a aplica c ao . . . . . . . . . 2.4.1 Construindo o formul ario . . . . . 2.4.2 Criando um JavaBean . . . . . . 2.4.3 Primeiro arquivo JSP . . . . . . . 2.4.4 Formul ario para tratar erros . . . 2.4.5 P agina de sucesso . . . . . . . . . 2.4.6 Disponibilizando a aplica c ao . . . 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 ao servlets? . . . . . . . . . 3.2 Usando Java JDBC . . . . . . . . . . . . . 3.2.1 Acesso ao banco de dados . . . . . 3.2.2 Especicando o driver JDBC . . . . 3.2.3 Estabelecendo a conex ao . . . . . . 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 c ao . . . . . . . . . . . . . . . . . . . . . 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 agina de erro . . . . . . . . . . . . . . . . . . . . . . .

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 e uma Tag Library ? 4.1.2 O que e uma Tag ? . . . . 4.1.3 Tag Handlers ? . . . . . . 4.1.4 Descritor de Tag Libraries 4.2 Construindo a aplica c ao . . . . . 4.2.1 Escrevendo uma BodyTag 4.2.2 TagExtraInfo . . . . . . . 4.2.3 Descritor . . . . . . . . . . 4.2.4 P agina JSP . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

5 Release 4 5.1 Tags com par ametros . . . . . . . . . . . . . 5.2 Construindo a aplica c ao . . . . . . . . . . . 5.2.1 P agina de pesquisa . . . . . . . . . . 5.2.2 Descritor das Tags . . . . . . . . . . 5.2.3 Modicando o arquivo TagMidia.java 5.2.4 Passando par ametros pela URL . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

6 Descritor da aplica c ao 6.1 Construindo a aplica c ao . . . . . . . . . . . . . . . . . . . . . 6.1.1 Web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 P agina de erro . . . . . . . . . . . . . . . . . . . . . . .

7 Release 6 48 7.1 Construindo a aplica c ao . . . . . . . . . . . . . . . . . . . . . 48 8 Release 7 56 8.1 Passando objetos para outras partes da aplica c ao . . . . . . . 56 8.2 Construindo a aplica c ao . . . . . . . . . . . . . . . . . . . . . 56 9 Release 8 59 9.1 Carrinho de compras . . . . . . . . . . . . . . . . . . . . . . . 59 9.2 P agina JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 10 Release 9 Refer encias Bibliogr acas 64 66

Cap tulo 1 Introdu c ao


1.1 O que e JSP?

JSP signica Java Server Pages. Esta tecnologia e usada para servir conte udo din amico para o usu ario, usando l ogica e dados no lado do servidor. 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 c oes web ecientes, escal aveis e seguras rapidamente.

1.1.1

Por que usar JSP se j a existe PHP, ASP, etc?

Existem v arias linguagens usadas para criar aplica c oes web. Entre elas ASP, PHP, ColdFusion e Perl. Por que usar JSP ent ao? JSP usa Java. Java e uma das linguagens mais populares atualmente e e interpretada, portanto o c odigo escrito em uma arquitetura pode ser portado para qualquer outra. JSP e parte do pacote J2EE J2EE e um dos modelos mais usados para contruir aplica c oes de grande porte, e e suportado por v arias gigantes da computa c ao como IBM, Oracle, Sun, etc. Programa c ao em rede e inerente a Java O suporte inerente de Java para a area de redes faz dela uma otima linguagem para a Internet. JSP x ASP Uma das diferen cas que pode ser fundamental para a escolha entre estas duas tecnologias e que ASP e da Microsoft e s o roda em ambiente Windows, e tamb em todo software necess ario e pago. JSP, feito pela Sun, roda em qualquer plataforma que tenha a m aquina virtual de Java, e tem v arios softwares gratuitos para disponibilizar a aplica c ao (Tomcat por exemplo).

1.2

Como JSPs funcionam

A nalidade de JSP e fornecer um m etodo de desenvolvimento de servlets declarativo e centrado na apresenta c ao. A especica c ao de JSP e denida como uma extens ao da API de Servlets. Conseq uentemente, n ao e de se admirar que por tr as dos panos, servlets e p aginas JSP tem muito em comum. Tipicamente, p aginas JSP est ao sujeitas a uma fase de tradu c ao e outra de processamento da requisi c ao. A fase de tradu c ao e feita apenas uma vez, a menos que a p agina JSP mude, e no caso e traduzida novamente. Supondo que n ao houve nenhum erro de sintaxe na p agina, o resultado e uma p agina JSP que implementa a interface Servlet. A fase de tradu c ao e tipicamente realizada pela engine JSP, quando ela recebe uma requisi c ao para a p agina JSP pela primeira vez. A especica c ao JSP 1.1 tamb em permite que p aginas JSP sejam pr e-compiladas em arquivos class. Isto pode ser u til para evitar a demora para carregar a p agina JSP na primeira vez que ela e acessada. V arias informa c oes da fase de tradu c ao, como a localiza c ao de onde e armazenado o p agina JSP j a compilada (portanto o servlet correspondente a esta p agina) s ao dependentes da implementa c ao da engine JSP. A classe que implementa uma p agina JSP estende a classe HttpJspBase, que implementa a interface Servlet. O m etodo de servi co desta classe, jspService(), essencialmente encapsula o conte udo da p agina JSP. Ainda que o m etodo jspService() n ao pode ser sobrescrito, o desenvolvedor pode descrever eventos de inicializa c ao e destrui c ao fornecendo implementa c oes dos m etodos jspInit() e jspDestroy dentro da p agina JSP. Uma vez que a classe e carregada no recipiente, o m etodo jspService() e respons avel por responder ` as requisi c oes do cliente.

1.3

Instalando e congurando o Tomcat

Primeiro voc e precisa ter a m aquina virtual java (JDK 1.3 ou mais atual) instalada na sua m aquina. Esta pode ser obtida gratuitamente no endere co http://java.sun.com.

1.3.1

Obtendo o Tomcat

Tomcat e um servidor de p aginas JSP e Servlets. Desenvolvido pela funda c ao Apache, no projeto Jakarta, seu c odigo e aberto e o programa e gratuito. Pode ser obtido em http://jakarta.apache.org.

1.3.2

Instalando o Tomcat

Instale ou descompacte o arquivo que voc e baixou em algum diret orio. Depois voc e ter a que criar duas vari aveis de ambiente, CATALINA HOME e JAVA HOME, onde CATALINA HOME e o diret orio base do Tomcat e JAVA HOME e o diret orio base da plataforma Java. Por exemplo, se o Tomcat foi instalado em c:\tomcat e a JVM (Java Virtual Machine) est a em c:\java, estas vari aveis devem ser:

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.bat. No Windows 2000 v a em Painel de Controle, Sistema, Avan cado, Vari aveis de Ambiente e entre com as informa c oes. No caso do UNIX, use o comando export (ou set, dependendo da sua distribui c ao).

1.3.3

Executando o Tomcat

V a no diret orio CATALINA HOME\bin (onde CATALINA HOME e o diret orio base do Tomcat), e execute o arquivo startup.bat para iniciar o Tomcat e shutdown.bat para encerr a-lo. No caso dos UNIX, v a no mesmo diret orio e digite ./tomcat4 start para iniciar e ./tomcat4 stop para naliz a-lo. Para visualizar as p aginas acesse http://localhost:8080/ (localhost ou o endere co da m aquina).

1.3.4

Disponibilizando a aplica c ao

Crie um diret orio dentro do diret orio CATALINA HOME/webapps, ou coloque o arquivo da sua aplica c ao (.WAR) neste diret orio. Para ver a aplica c ao acesse a URL http://localhost:8080/(nome do diret orio ou arquivo da aplica c ao)/ no navegador. Exemplo: Para acessar a aplica c ao localizada em CATALINA HOME/webapps/app, acesse http://localhost:8080/app.

1.3.5

Estrutura de diret orios da aplica c ao

As aplica c oes JSP seguem um padr ao. Devem ter um diret orio WEBINF (letras mai usculas). Dentro desse, crie outro diret orio chamado classes (letras min usculas). Neste voc e deve colocar todos as classes que voc e usa na aplica c ao (arquivos .class), inclusive servlets e beans. Pacotes (arquivos .jar) podem ser colocados no diret orio WEB-INF/lib/. Os arquivos JSP podem ser postos no diret orio raiz ou em qualquer outro diret orio, menos no WEB-INF e sub-diret orios!

Cap tulo 2 Release 1


2.1
2.1.1

Java Beans
O que faz de um Bean um Bean?

Um Bean e simplesmente uma classe de Java que segue um conjunto de conven c oes simples de design e nomea c ao delineado pela especica c ao de JavaBeans. Os Beans n ao precisam estender uma determinada classe ou implementar uma determinada interface.

2.1.2

Conven c oes de um Bean

As conven c oes de JavaBean s ao o que nos permitem desenvolver Beans, porque elas permitem que o container Bean analise um arquivo de classe Java e interprete seus m etodos como propriedades, designando a classe como um Bean de Java. Beans s ao simplesmente objetos Java. Mas como seguem um padr ao ca mais f acil trabalhar com eles. Uma boa pr atica e colocar Bean no nome de uma classe que e um Bean, para que seja melhor identicado. Assim uma classe que representa uma pessoa caria PessoaBean ou BeanPessoa. O construtor Bean A primeira regra da cria c ao do Bean JSP e que voc e tem que implementar um construtor que n ao tenha argumentos. Este construtor e usado por exemplo para instanciar um Bean atrav es da tag <jsp:useBean> visto mais adiante. Se a classe n ao especicar um construtor sem argumentos, ent ao um construtor sem argumentos e sem c odigo ser a assumido. public Bean() { } Propriedades de um Bean Coloque os atributos como privados, e fa ca m etodos get e set para acess alos, e este m etodos ent ao ser ao p ublicos.

private String nome; public String getNome() { return nome;} public void setNome(String novo) { nome = novo; }

Uma boa conven c ao de nome de propriedades, e come car com letra min uscula e colocar em mai uscula a primeira letra de cada palavra subseq uente. Assim como nos m etodos de ajuste, a palavra set ou get come ca em min uscula e a primeira letra da propriedade ser a mai uscula.
private String corCarro; public String getCorCarro();"

Propriedades indexadas Caso a propriedade seja um conjunto de valores (array ), e uma boa pr atica criar m etodos para acessar o conjunto inteiro de valores e para acessar uma posi c ao espec ca.
private String[] telefone; public String[] getTelefone() { return telefone; } public String getTelefone(int index) { return telefone[index]; }

Propriedades booleanas Para propriedades booleanas, voc e pode substituir a palavra get por is.
private boolean enabled; public boolean isEnabled() { return enabled; }

2.2

JSP Tags

Numa olhada r apida, JSP parece com HTML (ou XML), ambos cont em texto encapsulado entre tags, que s ao denidas entre os s mbolos < e >. Mas enquanto as tags HTML s ao processadas pelo navegador do cliente para mostrar a p agina, as tags de JSP s ao usadas pelo servidor web para gerar conte udo din amico. A seguir est ao os tipos de tags v alidos em JSP:

2.2.1

A c oes JSP

Executam diversas fun c oes e estendem a capacidade de JSP. Usam sintaxe parecida com XML, e s ao usadas (entre outras coisas) para manipular Java Beans. Existem seis tipos de a c oes: 7

<jsp:forward> Este elemento transfere o objeto request contendo informa c ao da requisi c ao do cliente de uma p agina JSP para outro arquivo. Este pode ser um arquivo HTML, outro arquivo JSP ou um servlet, desde que fa ca parte da mesma aplica c ao. Sintaxe:
<jsp:forward page="(URL relativa | <%= express~ ao %>)" /> ou <jsp:forward page="(URL relativa | <%= express~ ao %>)" > <jsp:param name="nome do par^ ametro" value="(valor do par^ ametro| <%= express~ ao %>)" /> </jsp:forward>

<jsp:getProperty> Este elemento captura o valor da propriedade de um bean usando o necess m etodo get da propriedade e mostra o valor na p agina JSP. E ario criar 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 atico ou din amico numa p agina JSP. Os resultados de incluir um ou outro s ao diferentes. Se o arquivo e est atico, seu conte udo e inclu do quando a p agina e compilada num servlet. Se for din amico, funciona como uma requisi c ao para o arquivo e manda o resultado de volta para a p agina. Quando estiver terminada a a c ao do include continua-se processando o restante da p agina. Sintaxe:
<jsp:include page="{URL relativa | <%= express~ ao %>}" flush="true" /> ou <jsp:include page="{URL relativa | <%= express~ ao %>}" flush="true" > <jsp:param name="nome do par^ ametro" value="{nome do par^ ametro | <%= express~ ao %>}" /> </jsp:include>

<jsp:plugin> Executa ou mostra um objeto (tipicamente um applet ou um bean) no navegador do cliente, usando o plug-in Java que est a embutido no navegador ou instalado na m aquina. N ao ser a explicado o funcionamento deste elemento no curso. <jsp:useBean> Localiza ou instancia um componente. Primeiro tenta localizar uma inst ancia do bean. Se n ao existe, instancia ele a partir da classe especicada. Para localizar ou instanciar o bean, s ao seguidos os seguintes passos, nesta ordem: 1. Tenta localizar o bean com o escopo e o nome especicados. 2. Dene uma vari avel de refer encia ao objeto com o nome especicado. 3. Se o bean for encontrado, armazena uma refer encia ao objeto na vari avel. Se foi especicado o tipo, converte o bean para este tipo. 4. Se n ao encontrar, instancia-o pela classe especicada, armazenando uma refer encia ao objeto na nova vari avel. 5. Se o bean tiver sido instanciado (ao inv es de localizado), e ele tem tags de corpo (entre <jsp:useBean> e </jsp:useBean>), executa estas tags. Sintaxe:
<jsp:useBean id="nome da instancia" scope="page|request|session|application" { class="package.class" | type="package.class" | class="package.class" type="package.class" | beanName="{package.class | <%= express~ ao %>}" type="package.class" } { /> | > outros elementos (tags de corpo) </jsp:useBean> }

<jsp:setProperty> O elemento <jsp:setProperty> ajusta o valor de uma ou mais proprie necess dades em um bean, usando os m etodos de ajuste (set ) dele. E ario declarar o bean com <jsp:useBean> antes de ajustar uma propriedade. Estas duas a c oes trabalham juntas, portanto o nome de inst ancia usada nas duas deve ser igual. Sintaxe:

<jsp:setProperty name="nome de inst^ ancia do bean" { property="*" | property="nome da propriedade" [ param="nome do par^ ametro" ] | property="nome da propriedade" value="{string | <%= express~ ao %>}" } />

2.2.2

Diretivas

S ao instru c oes processadas quando a p agina JSP e compilada em um servlet. Diretivas s ao usadas para ajustar instru c oes no n vel da p agina, inserir dados de arquivos externos, e especicar tag libraries. Diretivas s ao denidas entre <%@ e %>. Existem tr es tipos de diretivas: Include Inclui um arquivo est atico em uma p agina JSP. Sintaxe:
<%@ include file="relativeURL" %>

Page Dene atributos que s ao aplicados a todo o arquivo JSP, e a todos os seus arquivos inclu dos estaticamente. Sintaxe:

<%@ page [ language="java" ] [ extends="package.class" ] [ import="{package.class | package.*}, ..." ] [ session="true|false" ] [ buffer="none|8kb|sizekb" ] [ autoFlush="true|false" ] [ isThreadSafe="true|false" ] [ info="text" ] [ errorPage="URL relativa" ] [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true|false" ] %>

Taglib Dene uma tag library e seu prexo a ser usado na p agina JSP. Sintaxe:

10

<%@ taglib uri="localiza c~ ao do descritor da tag" prefix="prefixo da tag" %>

2.2.3

Declara c oes

S ao similares com as declara c oes de vari aveis em Java, e denem vari aveis para uso subseq uente em express oes ou scriptlets. S ao denidas entre <%! e %>. Sintaxe:
<%! int x = 0; declara c~ ao; ... %>

2.2.4

Express oes

Cont em um comando v alido da linguagem Java que e avaliado, convertido para um String, e inserido onde a express ao aparece no arquivo JSP. N ao e usado ponte e v rgula para terminar a express ao, e s o pode haver uma entre <%= e %>. Sintaxe:
<%= pessoa.getNome() %>

2.2.5

Scriptlets

S ao blocos de c odigo Java embutidos numa p agina JSP. O c odigo do scriptlet e inserido literalmente no servlet gerado pela p agina. E denido entre <% e %>. Sintaxe:
<% int x = 0; x = 4 * 9; String str = "PET"; ... %>

2.2.6

Coment arios

S ao similares aos coment arios HTML, mas s ao tirados da p agina quando o arquivo JSP e compilado em servlet. Isto signica que os coment arios JSP n ao aparecem no c odigo fonte da p agina visualizada pelo navegador do usu ario. Coment arios em HTML s ao feitos entre <! e >, enquanto coment arios em JSP s ao entre <% e %>.

11

2.3

Objetos impl citos

Como uma caracter stica conveniente, o container JSP deixa dispon vel objetos impl citos que podem ser usados nos scriptlets e express oes, sem que o autor tenha que cri a-los. Estes objetos instanciam classes denidas na API (application program interface) de Servlets. S ao nove objetos: Tabela 2.1: Objetos Impl citos Objeto page Classe ou Interface javax.servlet.jsp.HttpJspPage Descri c ao Inst ancia de servlet da p agina Dados de congura c ao do Servlet Dados de solicita c ao incluindo par ametros

cong

javax.servlet.ServletConfig

request

javax.servlet.http.HttpServletRequest

response out

javax.servlet.http.HttpServletResponse Dados da resposta javax.servlet.jsp.JspWriter Fluxo de sa da para o conte udo da p agina Dados de sess ao espec cos de usu ario Dados compartilhados por todas as p aginas da aplica c ao Dados de contexto para execu c ao da p agina Erros n ao pegos ou exce c ao

session

javax.servlet.http.HttpSession

application

javax.servlet.ServletContext

pageContext

javax.servlet.jsp.PageContext

exception

javax.lang.Throwable

Objeto page O objeto page representa a pr opria p agina JSP ou, mais especicamente, uma inst ancia da classe de servlet na qual a p agina foi traduzida. Objeto cong O objeto cong armazena dados de congura c ao de servlet na forma de par ametros de inicializa c ao para o servlet no qual uma p agina JSP e 12

compilada. Pelo fato das p aginas JSP raramente serem escritas para interagir com par ametros de inicializa c ao, este objeto impl cito raramente e usado na pr atica. Objeto request O objeto request representa a solicita c ao que acionou o processamento da p agina atual. Para solicita c oes de HTTP, este objeto fornece acesso a todas as informa c oes associadas com uma solicita c ao, incluindo sua fonte, a URL solicitada e quaisquer cabe calhos, cookies ou par ametros associados com a solicita c ao. Dentre os usos mais comuns para o objeto request, encontra-se a procura por valores de par ametros e cookies. Objeto response O objeto response representa a resposta que ser a enviada de volta para o usu ario como resultado do processamento da p agina JSP. Objeto out Este objeto impl cito representa o uxo de sa da para a p agina, cujo conte udo ser a enviado para o navegador como o corpo de sua resposta. Objeto session Este objeto impl cito de JSP representa a sess ao atual de um usu ario individual. Todas as solicita c oes feitas por um usu ario, que s ao parte de uma u nica s erie de intera c oes com o servidor da web, s ao consideradas parte de uma sess ao. Desde que novas solicita c oes por aqueles usu arios continuem a ser recebidas pelo servidor, a sess ao persiste. Se, no entanto, um certo per odo de tempo passar sem que qualquer nova solicita c ao do usu ario seja recebida, a sess ao expira. O objeto session, ent ao armazena informa c oes a respeito da sess ao. Os dados espec cos de aplica c ao s ao tipicamente adicionados ` a sess ao atrav es de atributos, usando os m etodos da interface javax.servlet.http.HttpSession. O objeto session n ao est a dispon vel para todas as p aginas JSP, seu uso e restrito ` as p aginas que participam do gerenciamento da sess ao. Isto e indicado atrav es do atributo session da diretiva page. O padr ao e que todas as p aginas participem do gerenciamento de sess ao. Se o atributo estiver denido para false, o objeto n ao estar a dispon vel e seu uso resultar a em um erro de compila c ao quando o recipiente JSP tentar traduzir a p agina para um servlet. Objeto application Este objeto impl cito representa a aplica c ao ` a qual a p agina JSP pertence. Ela e uma inst ancia da interface javax.servlet.ServletContext. As p aginas JSP est ao agrupadas em aplica c oes de acordo com suas URLs. Este objeto permite acessar informa c oes do container, interagir com o servidor e fornece suporte para logs.

13

Objeto pageContext O objeto pageContext e uma inst ancia da classe javax.servlet.jsp.PageContext, e fornece acesso program atico a todos os outros objetos impl citos. Para os objetos impl citos que aceitam atributos, o objeto pageContext tamb em fornece m etodos para acessar aqueles atributos. Al em disso, o objeto pageContext implementa m etodos para transferir controle da p agina atual para uma outra p agina, temporariamente, para gerar output a ser inclu do no output da p agina atual, ou permanentemente para transferir todo o controle. Objeto exception O objeto exception e uma inst ancia da classe java.lang.Throwable. O objeto exception n ao est a automaticamente dispon vel em todas as p aginas JSP. Ao inv es disso, este objeto est a dispon vel apenas nas p aginas que tenham sido designadas como p aginas de erro, usando o atributo isErrorPage da diretiva page.

2.4

Construindo a aplica c ao

Iniciando a constru c ao da aplica c ao, vamos criar um formul ario de cadastro para a m dia, um bean que representa a m dia, e um arquivo JSP que processa o formul ario. Criaremos tamb em um formul ario id entico ao primeiro mas que mostra poss veis erros ocorridos no cadastro. E por u ltimo, uma p agina HTML simples que indica se o cadastro foi realizado ou n ao.

2.4.1

Construindo o formul ario

Aqui iremos criar o formul ario para o cadastro de tas. Ele e puramente feito em HTML, n ao tem c odigo jsp.
<html> <head> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </style> <title>Cadastro de M&iacute;dia</title> </head> <body bgcolor="#FFFFFF" text="#000000">

Especicamos o arquivo que processar a o formul ario no atributo action da tag form : <form action=ProcessarMidia.jsp... >
<form action="ProcessarMidia.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;dias</font>

14

<br> <font size=1><sup>*</sup> Campos necess&aacute;rios</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>T&iacute;tulo<sup>*</sup></b> <br>

O atributo name dos campos do formul ario devem preferencialmente ter o mesmo nome que seu atributo correspondente no bean usado para armazenar as informa co es do formul ario.
<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 c~ ao <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;&nbsp; <br> <input type="radio" name="tipo" value="DVD"> DVD &nbsp;&nbsp; </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.4.2

Criando um JavaBean

Vamos criar nosso bean que ter a as informa c oes da M dia. Ele deve ter todos os atributos do formul ario que constru mos, e todos os m etodos set e get para acess a-los. Al em disso, teremos outro atributo, para controle 15

de eventuais erros no processamento do formul ario (dados necess arios n ao digitados por exemplo). Usaremos uma tabela de hash (java.util.Hashtable ) que ter a como chave o nome do atributo e como valor a mensagem de erro que desejarmos. Chamaremos a Hashtable de erros, e ela tamb em ter a seus m etodos set e get. Por m, criaremos um m etodo para vericar se todos os dados necess arios foram digitados, validando ou n ao o formul ario. Abaixo est a o c odigo fonte do BeanMidia, veja os coment arios para maiores detalhes.
package beans; import java.util.Hashtable; /** * Implementar a classe Serializable e requisito para ser um * Enterprise Bean. Um objeto de uma classe que implementa * esta interface pode ser escrito em disco ou enviado pela rede. * Na aplica c~ ao do curso n~ ao far a diferen ca. */ public class BeanMidia implements java.io.Serializable {

/** * Nomes dos atributos preferencialmente iguais aos usados * no formul ario */ private String titulo; private String ano; private String tipo; private String descricao; /* Este atributo serve para o controle de erros no formul ario */ private Hashtable erros; public BeanMidia() { /* Iniciamos os atributos com o String nulo */ titulo = ""; ano = ""; descricao = ""; tipo = ""; erros = new Hashtable(); } /** * M etodos para acessar os atributos. * getNome() para ver ser valor, e setNome() para ajustar seu valor */ public String getTitulo() { return titulo; } public String getAno() { return ano; } public String getTipo() { return tipo;

16

} public String getDescricao() { return descricao; } public void setTitulo(String valor) { titulo = valor; } public void setAno(String valor) { ano = valor; } public void setTipo(String valor) { tipo = valor; } public void setDescricao(String valor) { descricao = valor; }

/** * Verifica se todos os dados exigidos foram digitados, * al em de outras condi c~ oes desejadas. */ public boolean ehValido() { boolean volta = true; if ((titulo == null) || titulo.equals("")) { erros.put("titulo", "Por favor, digite um t tulo."); volta = false; } if ((ano == null) || ano.equals("") ) { erros.put("ano", "Por favor, digite o ano da m dia ."); volta = false; } if ((tipo == null) || tipo.equals("") ) { erros.put("tipo", "Por favor, selecione o tipo da m dia ."); volta = false; } return volta; } /** *Usado para ver as mensagens de erro armazenados na tabela de Hash */ public String getErros (String s) { String msg = (String) erros.get(s); return (msg == null) ? "" : msg; }

17

/** * Usado para colocar algum erro na tabela */ public void setErros (String chave, String msg) { erros.put(chave,msg); } }

2.4.3

Primeiro arquivo JSP

Agora vamos construir o arquivo que processa o formul ario, este, at e que enm, feito em JSP. O atributo import da diretiva page estende o conjunto de classes Java que podem ser referenciadas um uma p agina JSP sem ter que explicitamente especicar os nomes de pacote de classes.
<%@ page import="beans.BeanMidia" %>

A tag <jsp:useBean> diz ` a p agina que voc e quer disponibilizar um Bean para a p agina. O atributo id especica um nome para o Bean, que ser a o nome usado para referenciar o Bean ao longo da p agina e de sua vida na aplica c ao. O atributo class especica o nome de classe do pr oprio Bean. O atributo scope controla o escopo do Bean, ou seja, para quem e quanto tempo ele permanecer a dispon vel. Os valores podem ser page, request, session e application.
<jsp:useBean id="midia" class="beans.BeanMidia" scope="request">

Mostramos abaixo tr es maneiras de ajustar os atributos de um bean. A primeira diz-se o nome do atributo do bean no par ametro property e ent ao especica-se o valor no par ametro value. Nas outras duas o atributo do bean tem o mesmo nome do valor colocado em property. Pode-se tamb em ajustar os valores dos atributos usando os m etodos set do bean, usando o ambiente dos scriptlets.
<jsp:setProperty name="midia" property="titulo" value=<%=request.getParameter("titulo")%> /> <jsp:setProperty name="midia" property="ano" /> <jsp:setProperty name="midia" property="descricao" /> <% midia.setTipo(request.getParameter("tipo")); %> </jsp:useBean>

18

Verica-se se todos os atributos necess arios foram digitados e ent ao redirecionase para a p agina de sucesso ou para o formul ario que trata erros.
<% if (midia.ehValido()) { %> <jsp:forward page="/sucesso.jsp"/> <% } else { %> <jsp:forward page="RetryMidia.jsp" /> <% } %>

2.4.4

Formul ario para tratar erros

Este arquivo e visualmente id entico ao formul ario anterior, mas ele e um arquivo JSP que mostra poss veis erros ocorridos durante o cadastro. necess Declaramos o bean usado no arquivo nas primeiras linhas. E ario que ele tenha o mesmo nome dos arquivos antecessores (no caso, ProcessarMidia.jsp).
<%@ page import="beans.BeanMidia" %> <jsp:useBean id="midia" class="beans.BeanMidia" scope="request"/> <html> <head> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </style> <title>Cadastro de M&iacute;dia</title> </head> <body bgcolor="#FFFFFF" text="#000000"> <form action="ProcessarMidia.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;dias</font> <br> <font size=1><sup>*</sup> Campos necess&aacute;rios</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>T&iacute;tulo<sup>*</sup></b> <br>

Colocamos em value o que tem no atributo titulo do BeanMidia, para que o formul ario que igual ao que foi digitado anteriormente. Isto poupa trabalho ao usu ario que n ao precisa digitar tudo novamente.

19

<input type="text" name="titulo" value=<%= midia.getTitulo() %> size=30 maxlength=40><br>

Se houve algum erro na digita c ao do t tulo, o comando midia.getErros(titulo) retornar a o String de erro que colocamos na tabela de hash associado a chave titulo, caso contr ario n ao retornar a nada e n ao aparecer a nada na p agina.
<font color=#FF0000><%=midia.getErros("titulo")%></font> </td> <td valign=top> <b>Ano<sup>*</sup></b> <br> <input type="text" name="ano" value=<%= midia.getAno() %> size=8 maxlength=8><br> <font color=#FF0000><%=midia.getErros("ano")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Descri c~ ao <br> <TEXTAREA NAME="descricao" ROWS="6" COLS="30"> <%= midia.getDescricao() %> </textarea><br> <font color=#FF0000><%=midia.getErros("descricao")%></font> </td> <td valign=top> <b>Tipo<sup>*</sup></b></b> <br>

O comando midia.getTipo().equals(String) verica se o valor do atributo tipo e igual ao String. Se for, ele imprime checked no c odigo fonte da p agina, fazendo com que o checkbox que marcado. Isto serve, novamente, para deixar o formul ario como o usu ario digitou anteriormente.
<input type="radio" name="tipo" value="VHS" <% if (midia.getTipo() != null && midia.getTipo().equals("VHS")) out.print("checked"); %> > VHS &nbsp;&nbsp; <br> <input type="radio" name="tipo" value="DVD" <% if (midia.getTipo() != null && midia.getTipo().equals("DVD")) out.print("checked"); %> > DVD &nbsp;&nbsp;<br> <font color=#FF0000><%=midia.getErros("tipo")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma">

20

<input type="reset" value="Limpar"> </td> </tr>

</table> </center> </form> </body> </html>

2.4.5

P agina de sucesso

Vamos fazer uma p agina que nos indica se a opera c ao foi realizada com sucesso. Sempre que houve exito, redirecionaremos a aplica c ao para esta p agina.
<html> <head> <title>Sucesso</title> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </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;&atilde;o realizada com sucesso. </td> </tr> <td> </table> </body> </html>

2.4.6

Disponibilizando a aplica c ao

Crie um diret orio chamado locadora no diret orio webapps do Tomcat. Dentro do diret orio locadora, crie um diret orio cadastro e coloque os arquivos ProcessarMidia.jsp, CadastroMidia.html e RetryMidia.jsp. No diret orio raiz da aplica c ao (../locadora ) coloque o arquivo sucesso.jsp, e no diret orio WEB-INF/classes/beans coloque os arquivos BeanMidia.java e BeanMidia.class Agora, inicie o Tomcat, acesse no navegador a URL http://localhost:8080/locadora e teste a aplica c ao. 21

Cap tulo 3 Release 2


3.1
3.1.1

Servlets
O que s ao servlets?

Servlets s ao programas simples feitos em Java os quais rodam em um Servlet Container. Um Recipiente (Container) Servlet e como um servidor Web que trata requisi c oes do usu ario e gera respostas. Recipiente Servlet e diferente de Servidor Web porque ele e feito somente para Servlets e n ao para outros arquivos (como .html etc). O Recipiente Servlet e respons avel por manter o ciclo de vida do Servlet. Pode ser usado sozinho (standalone ) ou conjugado com um servidor Web. Exemplo de Recipiente Servlet e o Tomcat, e de servidor Web o Apache. Servlets s ao na verdade simples classes Java as quais necessitam implementar a interface javax.servlet.Servlet. Esta interface cont em cinco m etodos que precisam ser implementados. Na maioria das vezes voc e n ao precisa implementar esta interface. Por qu e? Porque o pacote javax.servlet j a prov e duas classes que implementam esta interface i.e. GenericServlet e HttpServlet. Ent ao tudo que voc e precisa fazer e estender uma dessas classes e sobrescrever o m etodo que voc e precisa para seu Servlet. GenericServlet e uma classe muito simples que somente implementa a interface javax.servlet.Servlet e fornece apenas funcionalidades b asicas. Enquanto HttpServlet e uma classe mais u til que fornece m etodos para trabalhar com o protocolo HTTP. Assim se seu servlet usa o protocolo HTTP (o que ocorrer a na maioria dos casos) ent ao ele deveria estender a classe javax.servlet.http.HttpServlet para construir um servlet e isto e o que faremos na nossa aplica c ao. Servlets uma vez iniciados s ao mantidos na mem oria. Ent ao toda requisi c ao que chega, vai para o Servlet na mem oria e este gera uma resposta. Esta caracter stica de manter na mem oria faz com que usar Java Servlets seja um m etodo extremamente r apido e eciente para construir aplica c oes Web. N ao ser a escrito nenhum Servlet neste curso.

22

3.2

Usando Java JDBC

JDBC (Java DataBase Connectivity) e a API Java para comunica c ao com bancos de dados. JDBC especica a interface necess aria para conectar a um banco de dados, executar comandos SQL e queries, e interpretar resultados. Esta interface e independente do banco de dados e da plataforma. As classes JDBC est ao no pacote java.sql, que precisa ser importado para a classe Java que faz uso de alguma classe desta API.

3.2.1

Acesso ao banco de dados

A API JDBC n ao pode comunicar-se diretamente com o banco de dados. O acesso e fornecido por um driver JDBC, que e uma classe espec ca para o banco de dados e implementa a interface denida pela API. Este driver e fornecido pelo vendedor do banco de dados ou por outro provedor de servi co.

3.2.2

Especicando o driver JDBC

No seu programa, voc e tem que especicar o driver JDBC que vai usar. Faz-se isso com uma simples, talvez estranha, opera c ao: Class.forName(JDBC-driver-class-name) O m etodo Class.forName() faz com que a JVM carregue o driver na mem oria. Voc e pode pensar que tem que instanciar a classe do driver e usar a refer encia a ele para acessar o banco de dados, mas JDBC n ao funciona desta maneira. Quando o driver e carregado na mem oria da JVM, ele se registra com a classe java.sql.DriverManager. Ent ao voc e usa m etodos est aticos da classe DriverManager para obter refer encia ao objeto Connection, que ent ao fornecer a acesso ao banco de dados.

3.2.3

Estabelecendo a conex ao

JDBC segue o paradigma de usar uma URL para conectar a um recurso. O exato formato da URL depende do driver usado. 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; try { Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection( "jdbc:mysql://servidor/database", user , password ); } catch (ClassNotFoundException ex) { System.out.println("N~ ao foi poss vel encontrar a classe do Driver do MySQL"); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel conectar ao servidor"); } finally {

23

try { if (connection != null) connection.close(); } catch (SQLException e) { } }

3.2.4

Encontrando dados em uma tabela

Antes de poder fazer consultas ao banco de dados com JDBC, voc e precisa criar um objeto Statement. Um objeto Statement pode ser reutilizado atrav es de m ultiplas requisi c oes SQL. E criado pelo objeto Connection e e portanto dependente do driver que voc e est a usando para conectar ao banco de dados. muito simples, como voc E e pode ver:
Statement statement = connection.createStatement();

3.2.5

Fazendo consultas com JDBC

Fazer uma consulta com JDBC e f acil uma vez que voc e tenha o objeto Statement : voc e simplesmente passa a consulta como par ametro do m etodo executeQuery(). A tabela de resultados e retornada pelo m etodo como uma inst ancia da classe ResultSet da API de JDBC. Abaixo est a um exemplo de consulta:
String query = SELECT * FROM TABELA; ResultSet resultset = statement.executeQuery(query);

Estes m etodos lan cam exce c oes, portanto no seu programa deve estar dentro de um bloco try/catch. O objeto ResultSet revela o conte udo da tabela uma linha por vez e fornece m etodos para acessar dados de cada coluna da tabela da linha corrente, indicada por um cursor interno. Quando o ResultSet e criado, o cursor de linha n ao est a na primeira linha, mas sim antes dela. Chamando o m etodo next(), o ResultSet avan ca o cursor em uma linha, retornando valor verdade se a chamada foi bem sucedida. Por exemplo, para passar por todas linhas do ResultSet far amos o seguinte:
while (resultset.next()) { System.out.println ("Mais uma linha!"); }

Quando o cursor est a posicionado em uma linha que voc e gostaria de examinar, voc e pode chamar v arios m etodos suportados pelo objeto ResultSet para restaurar dados das colunas e obter informa c oes sobre os resultados.

3.3

Interface RequestDispatcher

Esta interface est a presente no pacote javax.servlet e cont em dois m etodos:

24

forward(ServletRequest request, ServletResponse response) transfere uma requisi ca o para outro recurso no mesmo servidor. Este recurso pode ser um servlet, uma p agina JSP ou uma simples p agina HTML. include(ServletRequest request, ServletResponse response) atua no lado do servidor, inclui a resposta do recurso dado (Servlet, p agina JSP ou HTML) dentro da resposta de quem chamou o recurso. Para obter uma refer encia a interface RequestDispatcher temos duas formas: ServletContext.getRequestDispatcher(String resource) ServletRequest.getRequestDispatcher(String resource) Se o servlet e subclasse de HttpServletRequest, simplesmente chama-se o m etodo getRequestDispatcher(String resource) para pegar uma refer encia ao objeto RequestDispatcher.
RequestDispatcher rd; rd = request.getRequestDispatcher("caminho do recurso"); rd.forward(request, response);

Se n ao for subclasse, utilize a outra maneira.


rd = getServletContext().getRequestDispatcher("caminho do recurso"); rd.forward(request, response);

3.4
3.4.1

Construindo a aplica c ao
Escrevendo uma classe que conecta a um banco de dados

Na aplica c ao que estamos construindo neste curso, teremos que inserir e restaurar dados do bancos de dados diversas vezes. Para simplicar nossa vida, criaremos uma classe que conecta ao banco de dados, e tem m etodos para acess a-lo. Assim para fazer a conex ao bastar a instanciar um objeto desta classe. J a no construtor da classe faremos a conex ao usando os m etodos descritos na parte de JDBC desta apostila. Para os outros m etodos, leia os coment arios do arquivo para maiores detalhes.
package conexao; import java.sql.*;

25

public class Conexao {

private Connection connection; private Statement statement; public Conexao (String servidor,String database,String user, String password) throws SQLException { try { Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection( "jdbc:mysql://"+servidor+"/"+database,user,password); } catch (ClassNotFoundException ex) { System.out.println("N~ ao foi poss vel encontrar a classe do "+ "Driver do MySQL"); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel conectar ao servidor"); throw ex; } try { statement = connection.createStatement(); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel criar a statement"); throw ex; } } public Conexao() { try { Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection("jdbc:mysql://"+ "/locadora", "", ""); } catch (ClassNotFoundException ex) { System.out.println("N~ ao foi poss vel encontrar a classe "+ "do Driver do MySQL"); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel conectar ao servidor");

} try { statement = connection.createStatement(); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel criar a statement");

} }

/** * Executa um update na base de dados * @param update String SQL a ser executado * @throws SQLException se n~ ao for poss vel executar

26

* o update (Erro de SQL). */ public synchronized void executeUpdate(String update) throws SQLException { try { statement.executeUpdate(update); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel executar o update"); 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~ ao for poss vel executar a query * (Erro de SQL). */ public synchronized ResultSet executeQuery(String query) throws SQLException { try { return statement.executeQuery(query); } catch (SQLException ex) { System.out.println("N~ ao foi poss vel executar a query"); throw ex; } } /** * Fecha a conexao com a base de dados. */ public void fecharConexao() { try { statement.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

/** * Retorna o maior n umero de um campo da tabela * for um inteiro. Assim, n~ ao teremos nenhum ID */ public int retornaIDMax(String tabela) { try { String sql="SELECT max(ID) as contador ResultSet rs = this.executeQuery(sql); rs.next(); return rs.getInt("contador")+1; } catch (SQLException e) { System.out.println("Erro na sele c~ ao do e.printStackTrace();

se ele igual a outro.

FROM "+tabela;

ID M aximo");

27

return 0; } }

3.4.2

Criando tabelas

Vamos escrever uma classe que quando executada, conecta a um banco de dados e cria a tabela Midias, que vai ser usada no curso. Basta conectar no banco de dados, criando uma inst ancia da classe Conexao, e ent ao executar um comando SQL usando o m etodo executeUpdate(String).
package conexao; import java.sql.*; public class CriaTabelas { public static void main(String[] args) { Conexao con = new Conexao(); ResultSet rs = null; try {

con.executeUpdate("create table Midias "+ "(ID int primary key not null, "+ "Titulo varchar(50) not null, Ano char(4) not null, "+ "Descricao text, Tipo enum (VHS , DVD) not null, "+ "unique(Titulo))"); con.executeUpdate("create table Pessoas "+ "(ID int primary key not null, "+ "Nome varchar(50) not null, Email varchar(50) not null, "+ "Endereco text, Cidade varchar(30) not null, "+ "Bairro varchar(40) not null, Telefone varchar(15), "+ "RG varchar(20) not null, unique(Email))"); } catch (SQLException e) { System.out.println("Erro: nao foi possivel criar tabela "+ Midias.\n "+ e.getMessage()); }

} }

Para criar as tabelas, basta executar a classe CriaTabelas. 28

3.4.3

Cadastrando os dados no banco de dados

Ap os vericar se o formul ario foi digitado corretamente (no arquivo ProcessarMidia.jsp ), vamos redirecionar a aplica c ao para um arquivo que vai cadastrar a m dia no banco de dados e redirecionar a aplica c ao para a p agina de sucesso. Modique o arquivo ProcessarMidia.jsp dando um forward para o arquivo CadMidia.jsp em vez de sucesso.jsp.
<%@ page import="beans.BeanMidia, java.sql.*, conexao.*" %> <%! String pagina = null; %> <% BeanMidia midia = (BeanMidia) request.getAttribute("midia"); Conexao con = null; try { con = new Conexao();

con.executeUpdate("insert into Midias values ("+con.retornaIDMax("Midias")+ ", "+midia.getTitulo()+" , "+midia.getAno()+ " , "+midia.getDescricao()+" , "+ midia.getTipo()+")");

pagina = "/sucesso.jsp";

} catch (SQLException ex) { if (ex.getErrorCode() == 1062) { midia.setErros("titulo", "T tulo j a existe."); pagina = "/cadastro/RetryMidia.jsp"; } System.out.println(ex); } finally { if (con != null) con.fecharConexao(); con = null; }

if (pagina == null) pagina = "/erro.jsp"; %> <jsp:forward page=<%= pagina %> />

3.4.4

P agina de erro

No arquivo CadMidia.jsp, h a refer encia a p agina /erro.jsp. Vamos cri a-la agora. Veja o c odigo: 29

O atributo isErrorPage da diretiva page e usado para marcar uma p agina JSP que serve como a p agina de erro para uma ou mais p aginas. Como resultado disso, a p agina pode acessar o objeto impl cito exception. J a que a maioria das p aginas JSP n ao serve como p aginas de erro, o valor padr ao para este atributo e false.
<%@ 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;o, tente novamente mais tarde</li> <li>Contate o administrador para depura&ccedil;&atilde;o do erro.</li> </td> </tr> </table> </body> </html>

30

Cap tulo 4 Release 3


4.1
4.1.1

Tag Libraries
O que e uma Tag Library ?

Na tecnologia JSP, a c oes s ao elementos que podem criar e acessar objetos da linguagem de programa c ao e afetar a sa da de dados. A especica c ao de JSP dene seis a c oes padr ao. JSP permite desenvolver m odulos reutiliz aveis, chamados de a c oes personalizadas (custom actions ). Uma custom action e invocada usando uma tag personalizada (custom tag ) em uma p agina JSP. Uma Tag Library e uma cole c ao de custom tags. Alguns exemplos de tarefas que podem ser feitas por custom actions incluem processamento de formul arios, acesso a banco de dados e outros servi cos. A vantagem de usar Tag Libraries em vez de outros m etodos, como JavaBeans associados a scriptlets, e que as Tags tornam-se mais simples de utilizar (principalmente para programadores HTML que n ao conhecem Java) e s ao reutiliz aveis. Algumas caracter sticas das custom tags s ao: Podem ser personalizadas atrav es de atributos passados pela p agina que solicitou a a c ao. Tem acesso a todos os objetos impl citos. Podem modicar a resposta gerada pela p agina que solicitou a a c ao. Podem se comunicar com outras tags. Pode-se criar e inicializar JavaBeans, criar vari aveis que referenciam o bean em uma tag, e ent ao usar o bean em outra tag. Podem estar aninhadas dentro de outras, permitindo intera c oes complexas dentro de uma p agina JSP.

4.1.2

O que e uma Tag ?

Uma Tag e uma classe que implementa a interface javax.servlet.jsp.tagext.Tag. usada para encapsular funcionalidades que podem ser usadas em uma E p agina JSP.

31

Uma Tag pode ser de dois tipos (h a uma terceira na vers ao 1.2 de JSP): BodyTag ou Tag. A diferen ca b asica e que o corpo de uma Tag e avaliado apenas uma vez enquanto o corpo da BodyTag pode ser avaliado v arias vezes. Quando uma Tag e encontrada, s ao executados os seguintes m etodos na seq u encia: 1. setPageContext(): para ajustar o atributo PageContext. 2. setParent(): para ajustar alguma superclasse (null se nenhuma). 3. Ajustar os atributos, executando os m etodos set de cada um. 4. doStartTag(): que inicia a tag. 5. doEndTag(): termina a tag. 6. release(): para liberar quaisquer recursos necess arios. Existe a classe TagSupport, que implementa a interface Tag, e pode ser estendida para criar-se uma Tag. A interface BodyTag estende a interface Tag e nos fornece alguns m etodos novos. S ao eles (na seq u encia de execu c ao): 1. setPageContext(): para ajustar o atributo PageContext. 2. setParent(): para ajustar alguma superclasse (null se nenhuma). 3. Ajustar os atributos, executando os m etodos set de cada um. 4. doStartTag(): que inicia a tag. 5. setBodyContent(): ajusta a conte udo do corpo da tag. 6. doInitTag() aqui colocam-se instru c oes que devem ser executadas antes de avaliar o corpo da tag. 7. doAfterBody() e executada ap os a avalia c ao do corpo. Seu valor de ao avalia o corpo novaretorno e importante. Se for SKIP BODY ele n mente, e se for EVAL BODY BUFFERED ou EVAL BODY AGAIN ele faz outra itera c ao. 8. doEndTag(): termina a tag. 9. release(): para liberar quaisquer recursos necess arios. Para criar uma BodyTag, basta que a classe implemente a interface BodyTag.

4.1.3

Tag Handlers ?

Um tratador de tags (tag handler ) e o objeto invocado por um recipiente JSP (JSP Container ) para avaliar uma custom tag durante a execu c ao da p agina JSP que referencia a tag. M etodos do tag handler s ao chamados pela classe que implementa a p agina JSP nos v arios pontos que a tag e encontrada. 32

4.1.4

Descritor de Tag Libraries

Um tag library descriptor (TLD) e um documento XML que descreve a tag library. Um TLD cont em informa c oes sobre a biblioteca (library ) como um todo e sobre cada tag contida na biblioteca. TLDs s ao usados pelo recipiente JSP para validar as tags e por ferramentas de desenvolvimento JSP. Os seguintes elementos s ao necess arios para denir uma Tag Library :
<taglib> <tlibversion>A vers~ ao da biblioteca </tlibversion> <jspversion> A vers~ ao da especifica c~ ao JSP usada </jspversion> <shortname> Um nome para a tag library </shortname> <uri> Uma URI que identifica unicamente a tag library </uri> <info> Informa c~ oes sobre a tag library </info> <tag> ... </tag> ... </taglib>

4.2

Construindo a aplica c ao

Vamos escrever uma tag que mostra todas as m dias contidas no banco de dados. Para isso, vamos fazer uma consulta e depois restaurar cada linha do resultado em uma linha de uma tabela HTML na p agina JSP. Para adicionar novos elementos dinamicamente e torn a-los dispon veis para outras a c oes (an alogo a deni c ao de v ariaveis de script) na mesma p agina, o Recipiente permite especicar quais elementos e quanto tempo eles estar ao dispon veis. Estas informa c oes s ao poss veis com a classe javax.servlet.jsp.tagext.TagExtraInfo.

4.2.1

Escrevendo uma BodyTag

Abaixo est a a classe TagMidia, que implementa a interface javax.servlet.jsp.tagext.Bodytag.


package tags; import import import import import import conexao.Conexao; java.io.*; java.sql.*; java.util.*; javax.servlet.jsp.*; javax.servlet.jsp.tagext.*;

public final class TagMidia implements BodyTag {

33

private private private private private

PageContext pc = null; BodyContent body = null; StringBuffer sb = new StringBuffer(); ResultSet rs = null; Conexao con = null;

public void setPageContext(PageContext p) { pc = p; } public void setParent(Tag t) {} public Tag getParent() { return null; }

No m etodo doStartTag() faremos a consulta no banco de dados e armazenaremos o resultado no objeto rs e chamaremos o m etodo setVariaveis para ajustar as vari aveis para a primeira passada pelo corpo da tag. A partir da , quem vai renovar os valores das vari aveis e o m etodo doAfterBody(), que vai ser executado tantas vezes quantas forem o n umero de linhas obtidos com a consulta SQL.
public int doStartTag() throws JspException { try { con = new Conexao(); rs = con.executeQuery("SELECT * FROM Midias order by Titulo"); setVariaveis(); } catch (SQLException e) { System.out.println(e); } if (pc.getAttribute("titulo") == null) return SKIP_BODY;

return EVAL_BODY_BUFFERED; } public void setBodyContent(BodyContent b) { body = b; } public void doInitBody() throws JspException {} private boolean setVariaveis() throws JspTagException { try { if (rs.next()) {

Aqui vamos ajustar as vari aveis que vamos denir na classe TagExtraInfo. 34

Armazena-se no objeto impl cito page (PageContext pc, no caso desta classe) estas vari aveis que ser ao usadas na p agina JSP.
pc.setAttribute("titulo", rs.getString("Titulo")); pc.setAttribute("ano", rs.getString("Ano")); pc.setAttribute("descricao", rs.getString("Descricao")); pc.setAttribute("tipo", rs.getString("Tipo")); pc.setAttribute("ID", rs.getString("ID")); return true; } else { return false; } } catch (SQLException e) { System.out.println(e); return false; } } public int doAfterBody() throws JspException { try { sb.append(body.getString()); body.clear(); } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"); } if(setVariaveis()) { return EVAL_BODY_AGAIN; } try { body.getEnclosingWriter().write(sb.toString()); } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"); } return SKIP_BODY; } public int doEndTag() throws JspException { try { if(rs != null) { rs.close(); rs = null; } if (con != null) { con.fecharConexao(); con = null; } } catch (SQLException e) {} return EVAL_PAGE; } public void release() { pc = null; body = null; sb = null; } }

35

4.2.2

TagExtraInfo

Precisamos denir as vari aveis que colocamos na classe TagMidia (titulo, ano, descricao, tipo e ID).
package tags; import javax.servlet.jsp.tagext.*; public class TagTEIMidia extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData data) { return new VariableInfo[] {

O construtor da classe VariableInfo aceita quatro argumentos: 1. O nome do atributo. 2. A classe do atributo (repare que e um String, est a entre aspas). 3. Se e uma nova vari avel (valor verdade) ou uma j a existente na p agina (valor falso). 4. O escopo da vari avel, onde: NESTED vale da tag de in cio a tag nal, cio at e o m da p agina JSP e AT END AT BEGIN vale da tag de in vale da tag nal at e o m da p agina JSP.
new VariableInfo("titulo", "java.lang.String", true, VariableInfo.NESTED), new VariableInfo("ano", "java.lang.String", true, VariableInfo.NESTED), new VariableInfo("tipo", "java.lang.String", true, VariableInfo.NESTED), new VariableInfo("ID", "java.lang.String", true, VariableInfo.NESTED), new VariableInfo("descricao", "java.lang.String", true, VariableInfo.NESTED) }; } }

4.2.3

Descritor

Vamos agora criar o TagLib Descriptor. Crie o diret orio tld dentro do diret orio WEB-INF e nele crie o arquivo TagLib.tld com o seguinte conte udo:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

36

"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>taglocadora</shortname> <info>Tags da Locadora</info> <tag> <name>mostremidias</name> <tagclass>tags.TagMidia</tagclass> <teiclass>tags.TagTEIMidia</teiclass> <bodycontent>JSP</bodycontent> <info>Tag que mostra o conte udo do BD</info> </tag> </taglib>

Dentro de <tag>, name e nome que vai ser utilizado para chamar esta tag na p agina JSP, tagclass e a localiza c ao da classe (dentro do diret orio WEB-INF/classes ), e teiclass e a localiza c ao da classe TagExtraInfo (se for usada).

4.2.4

P agina JSP

Vamos escrever uma p agina JSP que usa a TagMidia para listar todo conte udo do banco de dados. D e o nome de titulos.jsp e coloque na raiz da aplica c ao. Veja o c odigo:
<%@ taglib uri="/WEB-INF/tld/TagLib.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 a o in cio da tag. Coloque o prexo que voc e deniu, e o nome da tag que quer usar (este nome est a no arquivo TagLib.tld). Entre a tag de in cio e a tag nal, pode-se usar livremente os atributos denidos na classe TagExtraInfo.
<todos:mostremidias> <tr bgcolor="#E3E3E3"> <td align=center>

37

<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; </td> </tr> </todos:mostremidias> </table> </body> </html>

38

Cap tulo 5 Release 4


5.1 Tags com par ametros

Para criar uma tag com par ametros, basta especicar os atributos na classe da Tag, e ent ao escrever os m etodos set e get para poder acess a-los. Tamb em h a modica c oes no descritor da tag. Vamos construir a aplica c ao para melhor ilustrar esta situa c ao.

5.2

Construindo a aplica c ao

Para mostrar a utilidade das tags com par ametro, vamos fazer uma p agina de pesquisa de m dias, onde o usu ario digita algum texto, procura-se no banco de dados este texto e mostra-se o resultado da consulta na tela.

5.2.1

P agina de pesquisa

Vamos construir um arquivo chamado pesquisa.jsp, que procura por m dias no banco de dados:
<%@ taglib uri="/WEB-INF/tld/TagLib.tld" prefix="pesquisa" %> <html> <body> <center> <table align=center width="50%">

Repare que o arquivo que processa o formul ario e o pr oprio arquivo pesquisa.jsp.
<form method="post" action="pesquisa.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

&nbsp;&nbsp; <input type=submit value="Pesquisar >>"> &nbsp;&nbsp; <input type=reset value="Limpar"> </td> </tr> </form> </table>

Quando n ao for digitado nada no campo de texto ou for a primeira vez que a p agina e acessada, o comando request.getParameter(chave) retornar a valor nulo. Logo abaixo colocamos um comando de condi c ao que s o executa o que h a dentro das chaves se o usu ario digitou alguma chave de pesquisa.
<% String tem = (String) request.getParameter("chave"); if (tem != null && !tem.equals("")) { %> <br><br> <table align=center width="70%"> <th bgcolor="#CCDDEE" colspan=3 align=center> M dias encontradas </th>

Aqui est a a tag com par ametro. Coloca-se o nome do atributo e a express ao ou valor associado a ele.
<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; </td> </tr> </pesquisa:mostremidias> </table>

Este fechamento de chaves e relativo ao comando if( tem != null ...).


<% } %>

40

</center> </body> </html>

5.2.2

Descritor das Tags

No descritor das tags (/WEB-INF/tld/TagLib.tld ) h a modica c oes a serem feitas para que a tag aceite par ametros. A parte que especica a tag mostremidias car a assim:
<tag> <name>mostremidias</name> <tagclass>tags.TagMidia</tagclass> <teiclass>tags.TagTEIMidia</teiclass> <bodycontent>JSP</bodycontent> <info>Tag que mostra o conte udo do BD</info> <attribute> <name>chave</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>

Onde <name> e o nome do atributo, <required> e se ele e obrigat orio ou n ao, e <rtexprvalue> e se v ao ser colocadas express oes (scriptlets ou express oes) din amicas no valor do atributo (true, e se o valor e est atico false ).

5.2.3

Modicando o arquivo TagMidia.java

Vamos modicar o arquivo TagMidia.java colocando um atributo chamado chave de tipo String e seus respectivos m etodos get e set. Tamb em vamos modicar o m etodo doStartTag() para que ele fa ca uma consulta diferente ao banco de dados caso o valor do atributo chave n ao seja nulo (ou seja, queremos fazer uma pesquisa no banco de dados). Veja o novo c odigo:
package tags; import import import import import import conexao.Conexao; java.io.*; java.sql.*; java.util.*; javax.servlet.jsp.*; javax.servlet.jsp.tagext.*;

public final class TagMidia implements BodyTag {

private PageContext pc = null;

41

private private private private private

BodyContent body = null; StringBuffer sb = new StringBuffer(); ResultSet rs = null; Conexao con = null; String chave = null;

public void setPageContext(PageContext p) { pc = p; } public void setParent(Tag t) {} public Tag getParent() { return null; } public int doStartTag() throws JspException { try { con = new Conexao();

Se foi passado algum par ametro, chave vai ser diferente de nulo, e e feita uma consulta ao banco de dados, onde procura-se pela chave nos campos Titulo e Descricao.
if (chave != null) { rs = con.executeQuery("SELECT * FROM Midias where "+ "Titulo like %"+chave+"% or Descricao like "+ "%"+chave+"% order by Titulo"); } else { rs = con.executeQuery("SELECT * FROM Midias order by Titulo"); } setVariaveis(); } catch (SQLException e) { System.out.println(e); } if (pc.getAttribute("titulo") == null) return SKIP_BODY;

return EVAL_BODY_BUFFERED; } public void setBodyContent(BodyContent b) { body = b; } public void doInitBody() throws JspException {} private boolean setVariaveis() throws JspTagException { try { if (rs.next()) { pc.setAttribute("titulo", rs.getString("Titulo")); pc.setAttribute("ano", rs.getString("Ano"));

42

pc.setAttribute("descricao", rs.getString("Descricao")); pc.setAttribute("tipo", rs.getString("Tipo")); pc.setAttribute("ID", rs.getString("ID")); return true; } else { return false; } } catch (SQLException e) { System.out.println(e); return false; } } public int doAfterBody() throws JspException { try { sb.append(body.getString()); body.clear(); } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"); } if(setVariaveis()) { return EVAL_BODY_AGAIN; } try { body.getEnclosingWriter().write(sb.toString()); } catch (IOException e) { throw new JspTagException("Erro fatal: IOException!"); } return SKIP_BODY; } public int doEndTag() throws JspException { try { if(rs != null) { rs.close(); rs = null; } if (con != null) { con.fecharConexao(); con = null; } } catch (SQLException e) {} return EVAL_PAGE; } public void release() { pc = null; body = null; sb = null; } public void setChave(String nova) { chave = nova; } public String getChave() { return chave; }

43

5.2.4

Passando par ametros pela URL

Pode-se passar os valores dos formul arios HTML pela URL. Tente acessar http://localhost:8080/locadora/pesquisa.jsp?chave=string e veja o que acontece. Se houver mais de um par ametro, separe-os usando ponto e v rgula(;).

44

Cap tulo 6 Descritor da aplica c ao


O arquivo descritor da aplica c ao e chamado de web.xml e reside no diret orio WEB-INF. Este arquivo serve como um dep osito de informa c oes; os dados que ele armazena sobre ele mesmo s ao, portanto, considerados metainforma c oes, no sentido que s ao informa c oes a respeito de informa c oes. O arquivo web.xml e o arquivo de congura c ao central da aplica c ao. Como sua extens ao de arquivo sugere, a linguagem de marca c ao para os dados no arquivo web.xml e XML. O conte udo b asico do descritor e:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app>

</web-app>

6.1
6.1.1

Construindo a aplica c ao
Web.xml

Vamos escrever o arquivo web.xml da nossa aplica c ao. Colocaremos apenas algumas informa c oes, s ao elas: O tempo de validade da sess ao Uma lista com nomes de arquivos que s ao abertos por padr ao quando um diret orio e acessado Ajustar as p aginas de erro padr ao, para que n ao apare cam as causas do erro para o usu ario (se voc e n ao escreveu alguma p agina corretamente, j a deve ter visto a p agina de erro que o Tomcat mostra). H a uma ordem necess aria das congura c oes usadas no arquivo web.xml. Trocando a ordem, a aplica c ao pode n ao funcionar. Abaixo est a o c odigo: 45

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <session-config> <session-timeout>10</session-timeout> </session-config>

<welcome-file-list> <welcome-file>opcoes.jsp</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/erro404.jsp</location> </error-page>

<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/erro.jsp</location> </error-page> </web-app>

6.1.2

P agina de erro

Vamos criar a p agina de erro que especicamos no arquivo web.xml. Crie o arquivo erro404.jsp (404 e o c odigo de p agina n ao encontrada) no diret orio raiz da aplica c ao. Veja o c odigo:
<%@ 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 agina inexistente.<br>

46

</td> </tr> </table> </body> </html>

47

Cap tulo 7 Release 6


7.1 Construindo a aplica c ao

Agora e sua vez de construir a aplica c ao. Crie uma parte da aplica c ao que faz o cadastro de pessoas, nos mesmos moldes do cadastro de m dias. necess E ario para o cadastro obter as seguintes informa c oes sobre a pessoa: nome, endere co, telefone, cidade e bairro onde mora e RG. A tabela do banco de dados tem o nome de Pessoas e foi criada (como voc e deve lembrar) no come co do curso. Nas pr oximas p aginas est ao os c odigos fonte para realizar tal processo. Mas antes de olhar lembre-se que s o se aprende fazendo.

48

CadastroPessoa.html
<html> <head> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </style> <title>Cadastro de Pessoa</title> </head> <body bgcolor="#FFFFFF" text="#000000"> <form action="ProcessarPessoa.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="" 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 co <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

<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.jsp
<%@ page import="beans.BeanPessoa" %> <jsp:useBean id="pessoa" class="beans.BeanPessoa" scope="request"> <jsp:setProperty name="pessoa" property="*" /> </jsp:useBean> <% if (pessoa.ehValido()) { %> <jsp:forward page="CadPessoa.jsp" /> <% } else { %> <jsp:forward page="RetryPessoa.jsp" /> <% } %>

RetryPessoa.jsp
<%@ page import="beans.BeanPessoa" %> <jsp:useBean id="pessoa" class="beans.BeanPessoa" scope="request"/>

<html> <head> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </style> <title>Cadastro de Pessoa</title> </head>

50

<body bgcolor="#FFFFFF" text="#000000"> <form action="ProcessarPessoa.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.getNome() %> size=30 maxlength=50><br> <font color=#FF0000><%=pessoa.getErros("nome")%></font> </td> <td valign=top> <b>Telefone</b> <br> <input type="text" name="telefone" value=<%= pessoa.getTelefone() %> maxlength=15><br> <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.getEmail() %> <font color=#FF0000><%=pessoa.getErros("email")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Endere co <br> <TEXTAREA NAME="endereco" ROWS="6" COLS="30"> <%= pessoa.getEndereco() %> </textarea><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.getRG() %> <font color=#FF0000><%=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.getCidade() %> <font color=#FF0000><%=pessoa.getErros("cidade")%></font> </td>

maxlength=30><br>

51

<td valign=top> <b>Bairro<sup>*</sup></b></b> <br> <input type="text" name="bairro" value=<%= pessoa.getBairro() %> <font color=#FF0000><%=pessoa.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.java
package beans; import java.util.Hashtable; /** * Implementar a classe Serializable e requisito para ser um Enterprise Bean. * Um objeto de uma classe que implementa esta interface pode ser escrito em disco ou enviado * Na aplica c~ ao do curso n~ ao far a diferen ca. */ public class BeanPessoa implements java.io.Serializable {

/** * Nomes */ private private private private private private private /* Este private

dos atributos preferencialmente iguais aos usados no formul ario String nome; String endereco; String cidade; String telefone; String bairro; String RG; String email; atributo serve para o controle de erros no formul ario */ Hashtable erros;

public BeanPessoa() { /* Iniciamos os atributos com o String nulo */ nome = ""; endereco = ""; telefone = ""; cidade = ""; RG = ""; bairro = "";

52

email = ""; erros = new Hashtable(); } /** * M etodos para acessar os atributos. * getNome() para ver ser valor, e setNome() para ajustar seu valor */ public String getNome() { return nome; } public String getEndereco() { return endereco; } public String getCidade() { return cidade; } public String getTelefone() { return telefone; } public String getRG() { return RG; } public String getBairro() { return bairro; } public String getEmail() { return email; } public void setNome(String valor) { nome = valor; } public void setEndereco(String valor) { endereco = valor; } public void setCidade(String valor) { cidade = valor; } public void setTelefone(String valor) { telefone = valor; } public void setBairro(String valor) { bairro = valor; } public void setRG(String valor) { RG = valor;

53

} public void setEmail(String valor) { email = valor; } /** * Verifica se todos os dados exigidos foram digitados, * al em de outras condi c~ oes desejadas. */ public boolean ehValido() { boolean volta = true; if ((nome == null) || nome.equals("")) { erros.put("nome", "Por favor, digite um nome."); volta = false; } if ((endereco == null) || endereco.equals("") ) { erros.put("endereco", "Por favor, digite o endereco."); volta = false; } if ((cidade == null) || cidade.equals("") ) { erros.put("cidade", "Por favor, selecione o cidade."); volta = false; } if ((bairro == null) || bairro.equals("") ) { erros.put("bairro", "Por favor, digite o bairro."); volta = false; } if ((email == null) || email.equals("") || (email.indexOf("@") == -1)) { erros.put("email", "Por favor, digite o email."); volta = false; } if ((RG == null) || RG.equals("") ) { erros.put("RG", "Por favor, digite o RG."); volta = false; } return volta; } /** *Usado para ver as mensagens de erro armazaenados na tabela de Hash */ public String getErros (String s) { String msg = (String) erros.get(s); return (msg == null) ? "" : msg; } /** * Usado para colocar algum erro na tabela

54

*/ public void setErros (String chave, String msg) { erros.put(chave,msg); } }

CadPessoa.jsp
<%@ page import="beans.BeanPessoa, java.sql.*, conexao.*" %> <%! String pagina = null; %> <% BeanPessoa pessoa = (BeanPessoa) request.getAttribute("pessoa"); Conexao con = null; try { con = new Conexao();

con.executeUpdate("insert into Pessoas values ("+ con.retornaIDMax("Pessoas")+ ", "+pessoa.getNome()+" , "+pessoa.getEmail()+" , "+ pessoa.getEndereco()+" , "+pessoa.getCidade()+" , "+ pessoa.getBairro()+" , "+pessoa.getTelefone()+" , "+ pessoa.getRG()+")");

pagina = "/sucesso.jsp";

} catch (SQLException ex) { if (ex.getErrorCode() == 1062) { pessoa.setErros("email", "E-mail j a existe."); pagina = "/cadastro/RetryPessoa.jsp"; } System.out.println(ex); } finally { if (con != null) con.fecharConexao(); con = null; }

if (pagina == null) pagina = "/erro.jsp"; %> <jsp:forward page=<%= pagina %> />

55

Cap tulo 8 Release 7


8.1 Passando objetos para outras partes da aplica c ao

Para recuperar ou passar objetos de uma p agina JSP para outra, ou de uma p agina para um servlet (e vice-versa), uma das maneiras (e a mais comum) e usar os m etodos get/setAttribute(String chave, String objeto) dispon veis para os objetos impl citos pageContext, request, session e application.

8.2

Construindo a aplica c ao

Vamos construir uma p agina de login, onde se o usu ario e autorizado e criada uma sess ao para ele. Precisaremos de um formul ario de acesso, uma p agina JSP para process alo, e uma p agina JSP para testar se a sess ao e v alida ou n ao. Come caremos com a p agina de acesso. Simples HTML. Veja o c odigo:
<html> <head> <title>P agina de Acesso</title> </head> <body> <center> <form action="VerificarSenha.jsp" method=POST name=login> <table width=25%> <tr> <td colspan=2 align=center bgcolor="#CCDDEE"> P agina de Acesso </td> </tr> <tr> <td bgcolor="#E0E0E0" width=50%> Usu ario: </td> <td bgcolor="#E0E0E0" width=50%> <input type=text name=usuario value="">

56

</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 ario. D e o nome de VericarSenha.jsp.


<%@ page import="java.sql.*, conexao.*" %> <% String senha = (String) request.getParameter("senha"); String usuario = (String) request.getParameter("usuario");

boolean login = false; if (usuario != null && usuario.equals("pet")) if (senha != null && senha.equals("pet")) login = true; if (login) { session.setAttribute("sessao", "autorizado"); } %> <jsp:forward page="/autorizado.jsp" />

P agina de teste (autorizado.jsp. Note a diretiva include no in cio do c odigo. Este arquivo (sessao.jsp ) e que nos interessa.
<%@ include file ="/sessao.jsp" %> <html> <head> <title>Autorizado!</title>

57

</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^ e pode fazer o que quiser agora nesta p agina </td> </tr> </table> </body> </html>

A p agina que verica se a sess ao e v alida (sessao.jsp) e muito simples. Se o objeto impl cito session tiver um atributo chamado de sessao e o valor dele for o String autorizado, este peda co de c odigo da p agina n ao faz nada, e ent ao o c odigo que est a abaixo deste scriptlet ser a mostrado. Caso contr ario, redireciona para a p agina de erro.
<% String sess = (String) session.getAttribute("sessao"); if (!(sess != null && sess.equals("autorizado"))) { %> <jsp:forward page="/erro403.jsp" /> <% } %>

Colocamos os Strings acima no objeto session no c odigo do arquivo VercarSenha.jsp lembra? :)

58

Cap tulo 9 Release 8


Neste u ltimo cap tulo, vamos construir um carrinho virtual, desses que todo site de loja da intertet tem.

9.1

Carrinho de compras

Nosso carrinho vai ser um Bean, que vai ter como atributo principal um vetor (java.util.Vector ) que armazenar a as m dias que desejarmos. No caso, vamos armazenar apenas o t tulo da m dia, mas com um pouco mais de c odigo poder amos armazenar um objeto BeanMidia ou qualquer outra coisa que zesse sentido na aplica c ao. Veja o c odigo para BeanCarrinho.java :
package beans; import java.util.Vector; import java.util.Enumeration; public class BeanCarrinho { Vector v; String comando = null;

public BeanCarrinho() { v = new Vector(); } private void adicionarItens(String[] array) { for (int i = 0; i < array.length; i++) v.addElement(array[i]); } private void removerItens(String[] array) { for (int i = 0; i < array.length; i++) v.removeElement(array[i]); }

public void setComando(String s) { comando = s;

59

} public String[] getItems() { String[] s = new String[v.size()]; v.copyInto(s); return s; } public void processar(String[] itens) { if (itens != null && comando != null) { if (comando.equals("adicionar")) adicionarItens(itens); else if (comando.equals("remover")) removerItens(itens); reset(); } }

private void reset() { comando = null; } }

9.2

P agina JSP

Vamos mostrar na mesma p agina o carrinho e a pesquisa por palavraschave. Para isso, basta modicar um pouco o arquivo pesquisa.jsp. Vamos adicionar um formul ario com checkboxes para o usu ario escolher as tas que deseja botar no carrinho. E no in cio da p agina vamos colocar a parte do carrinho incluindo uma p agina que vamos criar em seguida. Veja o c odigo para a p agina carrinho.jsp :
<%@ taglib uri="/WEB-INF/tld/TagLib.tld" prefix="pesquisa" %> <html> <body> <center>

Inclus ao est atica do arquivo carrinho1.jsp. Seria o mesmo que copiar seu c odigo e colar aqui.
<%@ include file ="/carrinho1.jsp" %> <table align=center width="50%"> <form method="post" action="carrinho.jsp"> <th bgcolor="#CCDDEE" colspan=3> Digite a(s) palavra(s) chave(s) para a pesquisa

60

</th> <tr bgcolor="#f7f7f7"> <td align=center>Pesquisa</td> <td align=center> <input type="text" name="chave" size=30> &nbsp;&nbsp; <input type=submit value="Pesquisar >>"> &nbsp;&nbsp; <input type=reset value="Limpar"> </td> </tr> </form> </table> <% String tem = (String) request.getParameter("chave"); if (tem != null && !tem.equals("")) { %> <br><br> <form action=carrinho.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;</td> </tr> <tr> <td colspan="3" bgcolor="#FFFFFF"> &nbsp; </td> </tr>

</pesquisa:mostremidias> <tr bgcolor="#E0E0E0">

61

<td align=center> <input type="submit" value="Confirma"> </td> <td align=center> <input type="reset" value="Limpar"> </td> <td>&nbsp;</td> </tr> </table>

Este atributo escondido, diz qual a a c ao desejada (adicionar ou remover).


<input TYPE=hidden name=comando value=adicionar > </form> <% } %> </center> </body> </html>

Vamos ver a parte l ogica do carrinho agora. Usa-se um bean v alido por toda a sess ao. Com o m etodo processar(..), inclu mos ou removemos m dias do BeanCarrinho. Colocando o valor do atributo property da a c ao <jsp:setProperty> como *, ele vai, para todos os par ametros presentes na requisi c ao (objeto request ), tentar usar o m etodo setNomeDoParametro() do Bean.
<jsp:useBean id="carrinho" scope="session" class="beans.BeanCarrinho" /> <jsp:setProperty name="carrinho" property="*" /> <% String[] temp = request.getParameterValues("reserva"); if (temp != null) { carrinho.processar(temp); } String[] items = carrinho.getItems(); if (items.length > 0) { %> <form action=carrinho.jsp method=post> <table> <th bgcolor="#CCDDEE">Voc^ e tem no carrinho:</th> <th bgcolor="#CCDDEE" >Remover</th> <% for (int i=0; i<items.length; i++) { %> <tr> <td bgcolor="#F0F0F0"> <%= items[i] %> </td> <td bgcolor="#E0E0E0"> <input type=checkbox name=reserva value=<%= items[i] %>>

62

</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;</td> </tr>

</table> <input type=hidden name=comando value=remover> </form> <% } %>

63

Cap tulo 10 Release 9


Apenas para deixar a aplica c ao com um interface melhor, vamos criar um arquivo index.jsp na raiz.
<html> <head> <title>P&aacute;gina inicial</title> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </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;o</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> <a href=cadastro/>Cadastro</a> </td> <td> <a href=login.jsp>Login</a> </td> <td> <a href=pesquisa.jsp>Pesquisa</a> </td> <td> <a href=carrinho.jsp>Carrinho</a> </td> <td> <a href=titulos.jsp>T tulos dispon veis</a> </td>

</tr> </table> </body> </html>

64

E outro arquivo index.jsp no diret orio /cadastro.


<html> <head> <title>P&aacute;gina de cadastro</title> <style> p, td { font-family:Tahoma,Sans-Serif; font-size:11pt; padding-left:15; } </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;&atilde;o</h3> </td> </tr> <tr> <td bgcolor="#F7F7F7" align=center> <a href=CadastroMidia.html>M dias</a> </td> <td> <a href=CadastroPessoa.html>Pessoas</a> </td> </tr> </table> </body> </html>

65

Refer encias Bibliogr acas


[1] Duane K. Fields, Mark A. Kolb. Desenvolvendo na Web com Java Server Pages. Editora Ci encia Moderna, Primeira Edi c ao, 2000. [2] Star Developer Stardeveloper.com : Connecting to Databases using JDBC. Star Developer, 2001. Dispon vel online em http://stardeveloper.com. Acessado em setembro de 2002. [3] Star Developer Stardeveloper.com : Java Server Pages and Servlets Articles. Star Developer, 2001. Dispon vel online em http://stardeveloper.com. Acessado em setembro de 2002. [4] Sun Microsystems JavaServer Pages(TM) Technology. Sun Microsystems, 2001. Dispon vel online em http://java.sun.com/products/jsp/. Acessado em setembro de 2002. [5] Orion Application Server OrionServer Taglibs Tutorial. IronFlare AB, 2002. Dispon vel online em http://www.orionserver.com/. Acessado em setembro de 2002.

66

Você também pode gostar