Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila JSP Santa Catarina
Apostila JSP Santa Catarina
Curso de JSP
Roberto Hartke Neto
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
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
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
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
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
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!
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
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
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
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
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í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ídias</font>
14
<br> <font size=1><sup>*</sup> Campos necessários</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Tí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 <br> <input type="radio" name="tipo" value="DVD"> DVD </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma"> <input type="reset" value="Limpar"> </td> </tr>
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
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
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í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ídias</font> <br> <font size=1><sup>*</sup> Campos necessários</font> </th> <tr bgcolor="#F7F7F7"> <td valign=top> <b>Tí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
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 <br> <input type="radio" name="tipo" value="DVD" <% if (midia.getTipo() != null && midia.getTipo().equals("DVD")) out.print("checked"); %> > DVD <br> <font color=#FF0000><%=midia.getErros("tipo")%></font> </td> </tr> <tr bgcolor="#F7F7F7"> <td align=center colspan=2> <input type="submit" value="Confirma">
20
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çã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
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
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
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
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
3.2.4
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
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
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);
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
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();
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()); }
} }
3.4.3
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ão, tente novamente mais tarde</li> <li>Contate o administrador para depuração do erro.</li> </td> </tr> </table> </body> </html>
30
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
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
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
33
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"> </td> </tr> </todos:mostremidias> </table> </body> </html>
38
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
<input type=submit value="Pesquisar >>"> <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"> </td> </tr> </pesquisa:mostremidias> </table>
40
5.2.2
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
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.*;
41
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
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
</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>
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
47
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á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>
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á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>
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
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
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>
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" /> <% } %>
58
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]); }
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(); } }
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> <input type=submit value="Pesquisar >>"> <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> <%= 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> </td> </tr> <tr> <td colspan="3" bgcolor="#FFFFFF"> </td> </tr>
61
<td align=center> <input type="submit" value="Confirma"> </td> <td align=center> <input type="reset" value="Limpar"> </td> <td> </td> </tr> </table>
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> </td> </tr>
63
64
65
66