You are on page 1of 59

31

JavaServer Pages (JSP): bnus para desenvolvedores Java


Objetivos
Ser capaz de criar e instalar JavaServer Pages. Utilizar objetos implcitos JSP e Java para criar pginas Web dinmicas. Especificar as informaes globais JSP com diretivas. Utilizar aes para manipular JavaBeans em uma JSP, incluir outros recursos dinamicamente e encaminhar solicitaes para outras JSPs. Criar bibliotecas de marcas personalizadas que encapsulem funcionalidades complexas em novas marcas que possam ser reutilizadas pelos programadores JSP e projetistas de pginas Web. Um tomate no se comunica com outro tomate, acreditamos. Poderamos estar errados. Gustav Eckstein Um burro me parece um cavalo traduzido para o holands. Georg Christoph Licthtenberg Aps um pedido justo deve haver um ato de silncio. Dante Alighieri Talento uma questo de quantidade. Talento no escreve uma pgina: escreve trezentas. Jules Renard Toda ao se deve a uma entre sete causas: sorte, natureza, compulso, hbito, razo, raiva ou apetite. Aristteles

1024

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Sumrio
31.1 31.2 31.3 31.4 31.5 Introduo Viso geral de JavaServer Pages Um primeiro exemplo de JavaServer Page Objetos implcitos Criando scripts 31.5.1 Componentes da sintaxe de scripts 31.5.2 Exemplo de criao de scripts Aes-padro 31.6.1 Ao <jsp:include> 31.6.2 Ao <jsp:forward> 31.6.3 Ao <jsp:plugin> 31.6.4 Ao <jsp:useBean> Diretivas 31.7.1 Diretiva page 31.7.2 Diretiva include Bibliotecas de marcas personalizadas 31.8.1 Marca personalizada simples 31.8.2 Marca personalizada com atributos 31.8.3 Avaliando o corpo de uma marca personalizada Recursos na World Wide Web

31.6

31.7

31.8

31.9

Resumo Terminologia Exerccios de auto-reviso Respostas aos exerccios de auto-reviso Exerccios

31.1 Introduo
Nossa discusso sobre redes clienteservidor continua neste captulo com as JavaServer Pages (JSPs) uma extenso da tecnologia servlet. As JavaServer Pages simplificam a entrega de contedo dinmico na Web. Essa tecnologia permite criar contedo dinmico reutilizando-se componentes predefinidos e interagindo-se com os componentes que utilizam a criao de scripst do lado servidor. Os programadores de JavaServer Pages podem reutilizar JavaBeans e criar bibliotecas de marcas personalizadas que encapsulem funcionalidades complexas e dinmicas. As bibliotecas de marcas personalizadas permitem que at mesmo projetistas de pginas Web que no conhecem Java aprimorem as pginas Web com contedo dinmico e recursos poderosos de processamento. Alm das classes e interfaces para programar servlets (de pacotes javax.servlet e javax.servlet.http), as classes e interfaces especficas programao de JavaServer Pages encontram-se nos pacotes javax.servlet.jsp e javax.servlet.jsp.tagext. Discutimos muitas dessas classes e interfaces neste captulo medida que apresentamos os fundamentos das JavaServer Pages. Para obter uma descrio completa sobre JavaServer Pages, veja a especificao 1.1 de JavaServer Pages, que pode ser baixada do endereo java.sun.com/products/jsp/download.html. Alm disso, tambm inclumos outros recursos sobre JSP na Seo 31.9. [Nota: o cdigo-fonte e as imagens de todos os exemplos deste captulo podem ser encontrados no CD que acompanha este livro e em nosso site www.deitel.com.]

31.2 Viso geral de JavaServer Pages


H quatro componentes-chave para JSPs: diretivas, aes, scriptlets e bibliotecas de marcas. As diretivas so mensagens para o continer de JSP que permite ao programador especificar as configuraes de uma pgina, incluir contedo a partir de outros recursos e especificar bibliotecas de marcas personalizadas para utilizao em uma JSP. As aes encapsulam funcionalidades em marcas predefinidas que os programadores podem incorporar a uma JSP. As aes so freqentemente realizadas com base nas informaes enviadas ao servidor como parte de uma solicitao

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1025

feita pelo cliente. Eles tambm podem criar objetos Java para utilizao em scriptlets JSP. Os scriptlets ou elementos de script permitem inserir cdigo Java que interaja com os componentes em uma JSP (e possivelmente outros componentes de aplicativos Web) para realizar processamento de solicitaes. As bibliotecas de marcas fazem parte do mecanismo de extenso de marca que permite criar marcas personalizadas. Essas marcas permitem manipular o contedo das JSPs. Esses tipos de componente de JSP so discutidos em detalhes nas prximas sees. De vrias maneiras, as Java Server Pages se parecem com documentos-padro XML ou XHTML. Na verdade, as JSPs normalmente incluem marcaes XHTML ou XML. Tais marcaes so conhecidas como dado de modelo fixo ou texto de modelo fixo. Os dados de modelo fixo freqentemente ajudam o programador a decidir se utiliza um servlet ou uma JSP. Os programadores tendem a utilizar JSPs quando a maior parte do contedo enviado ao cliente envolver dados de modelo fixo e somente uma pequena parte do contedo for gerada dinamicamente com cdigo Java. Os programadores utilizam servlets apenas quando uma pequena parte do contedo enviado ao cliente envolver dados de modelo fixo. Realmente, alguns servlets no produzem contedo. Em vez disso, realizam uma tarefa em favor do cliente, depois invocam outros servlets ou outras JSPs para fornecer uma resposta. Observe que, na maioria dos casos, as tecnologias servlet e JSP so intercambiveis. Como ocorre com os servlets, as JSPs normalmente so executadas como parte de um servidor Web. O servidor freqentemente conhecido como continer de JSP.
Observao de engenharia de software 31.1 Texto literal em uma JSP torna-se literais de string no servlet que representa a JSP traduzida.

Quando um servidor compatvel com JSP recebe a primeira solicitao para uma JSP, o continer de JSP traduz essa JSP em um servlet Java que trata a solicitao atual e as solicitaes futuras para a JSP. Se houver algum erro na compilao do novo servlet, esses erros resultam em erros em tempo de traduo. O continer de JSP coloca as instrues em Java que implementam a resposta de JSP no mtodo _jspService em tempo de traduo. Se o novo servlet compilar adequadamente, o continer de JSP invoca o mtodo _jspService para processar a solicitao. A JSP pode responder diretamente solicitao ou pode invocar outros componentes de aplicativo Web para ajudar a processar a solicitao. Todos os erros que ocorrem durante o processamento da solicitao so conhecidos como erros em tempo de solicitao.
Dica de desempenho 31.1 Alguns contineres de JSP traduzem as JSPs para servlets em tempo de instalao. Isso elimina o overhead de traduo para o primeiro cliente que solicita cada JSP.

Ao todo, o mecanismo de solicitao/resposta e o ciclo de vida de uma JSP so os mesmos de um servlet. As JSPs podem definir os mtodos jspInit e jspDestroy (semelhantes aos mtodos de servlet init e destroy), que o continer de JSP invoca ao inicializar e terminar uma JSP, respectivamente. Os programadores JSP podem definir esses mtodos utilizando declaraes JSP parte do mecanismo de criao de script JSP.

31.3 Um primeiro exemplo de JavaServer Page


Comeamos nossa apresentao s JavaServer Pages com um exemplo simples (Fig. 31.1) em que a data e a hora atual so inseridas em uma pgina Web que usa uma expresso JSP.
1 2 3 4 5 6 7 8 9 10 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""> <!-- Fig. 31.1: clock.jsp > <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <meta http-equiv = "refresh" content = "60" />

Fig. 31.1

Utilizando uma expresso JSP para inserir data e hora em uma pgina Web (parte 1 de 2).

1026
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

<title>A Simple JSP Example</title> <style type = "text/css"> .big { font-family: helvetica, arial, sans-serif; font-weight: bold; font-size: 2em; } </style> </head> <body> <p class = "big">Simple JSP Example</p> <table style = "border: 6px outset;"> <tr> <td style = "background-color: black;"> <p class = "big" style = "color: cyan;"> <!-- expresso JSP para inserir data/hora --> <%= new java.util.Date() %> </p> </td> </tr> </table> </body> </html>

Fig. 31.1

Utilizando uma expresso JSP para inserir data e hora em uma pgina Web (parte 2 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1027

Como voc pode ver, a maior parte de clock.jsp consiste em marcao XHTML. Em casos como esse, as JSPs so mais fceis de implementar que os servlets. Em um servlet que realiza a mesma tarefa que essa JSP, cada linha de marcao XHTML , em geral, uma instruo Java separada que gera como sada o string que representa a marcao como parte da resposta para o cliente. Escrever cdigo para exibir marcao freqentemente pode gerar erros. A maioria dos editores de JSP fornece uma sintaxe colorida para ajudar os programadores a verificar se sua marcao segue a sintaxe adequada.
Observao de engenharia de software 31.2 As JavaServer Pages so mais fceis de implementar que os servlets quando a resposta a uma solicitao do cliente consistir, principalmente, na marcao que permanece constante entre as solicitaes.

A JSP da Fig. 31.1 gera um documento XHTML que exibe a data e a hora atual. A linha-chave nessa JSP (linha 30) a expresso
<%= new java.util.Date() %>

As expresses JSP so delimitadas pelos smbolos <%= e %>. Essa expresso em particular cria uma nova instncia da classe Date a partir do pacote java.util. Quando o cliente solicita essa JSP, a expresso anterior insere a representao String da data e da hora na resposta para o cliente.
Observao de engenharia de software 31.3 O continer de JSP converte o resultado de cada expresso JSP em um String que enviado para a sada como parte da resposta para o cliente.

Observe que utilizamos o elemento meta de XHTML na linha 10 para configurar um intervalo de atualizao de 60 segundos para o documento. Isso faz com que o navegador solicite clock.jsp a cada 60 segundos. Para cada solicitao de carga de clock.jsp, o continer de JSP reavalia a expresso na linha 30, criando um novo objeto Date com a data e a hora atual do servidor. Como ocorreu no Captulo 30, utilizamos o Tomcat da Apache para testar nossas JSPs no aplicativo advjhtp1 que criamos anteriormente. Para obter mais detalhes sobre como criar e configurar o aplicativo advjhtp1, releia a Seo 30.3.1 e a Seo 30.3.2. Para testar o clock.jsp, crie uma nova pasta denominada jsp na subpasta advjhtp1 do diretrio webapps do Tomcat. Em seguida, copie clock.jsp para a pasta jsp. Abra seu navegador e insira o seguinte URL para testar o clock.jsp: http://localhost:8080/advjhtp1/jsp/clock.jsp Ao invocar a JSP pela primeira vez, perceba o retardo medida que o Tomcat traduz a JSP em um servlet e o invoca para responder sua solicitao. [Nota: no necessrio criar um nome de pasta jsp em um aplicativo Web. Utilizamos essa pasta para separar os exemplos deste captulo dos exemplos de servlet do Captulo 30.]

31.4 Objetos implcitos


Os objetos implcitos fornecem aos programadores acesso a muitos recursos de servlet no contexto de uma JavaServer Page. Os objetos implcitos possuem quatro escopos: aplicativo, pgina, solicitao e sesso. A JSP e o aplicativo de continer de servlet possuem objetos com escopo de aplicativo. Qualquer servlet ou JSP pode manipular esses objetos. Os objetos com escopo de pgina s existem na pgina que os define. Cada pgina tem suas prprias instncias dos objetos implcitos de escopo de pgina. Os objetos com escopo de solicitao existem at o fim da solicitao. Por exemplo, uma JSP pode processar parcialmente uma solicitao e, ento, encaminhar a solicitao a outro servlet ou JSP para mais processamento. Os objetos de escopo de solicitao saem de escopo quando o processamento de solicitao concludo com uma resposta para o cliente. Os objetos com escopo de sesso existem para toda a sesso de navegao do cliente. A Fig. 31.2 descreve os objetos implcitos JSP e seus escopos. Este captulo demonstra vrios desses objetos. Observe que muitos dos objetos implcitos estendem as classes ou implementam as interfaces discutidas no Captulo 30. Portanto, as JSPs podem utilizar os mesmos mtodos que os servlets usam para interagir com tais objetos, como foi descrito no captulo 30. A maioria dos exemplos utilizam, neste captulo, um ou mais dos objetos implcitos da Fig. 31.2.

1028

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Objeto implcito
Escopo de aplicativo application Escopo de pgina config

Descrio

Esse objeto javax.servlet.ServletContext representa o continer em que a JSP executada. Esse objeto javax.servlet.ServletConfig representa as opes de configurao JSP. Como ocorre com os servlets, as opes de configurao podem ser especificadas em um descritor de aplicativo Web. Esse objeto java.lang.Throwable representa a exceo que passada pgina de erro de JSP. Esse objeto est disponvel somente em uma pgina de erro JSP. Esse objeto javax.servlet.jsp.JspWriter escreve texto como parte da resposta a uma solicitao. utilizado implicitamente com expresses JSP e aes que inserem contedo de um string em uma resposta. Esse objeto java.lang.Object representa a referncia this instncia JSP atual. Esse objeto javax.servlet.jsp.PageContext oculta os detalhes subjacentes da implementao do servlet e do continer de JSP e fornece acesso aos objetos implcitos discutidos nessa tabela para os programadores JSP. Esse objeto representa a resposta para o cliente. O objeto normalmente uma instncia de uma classe que implementa HttpServletResponse (pacote javax.servlet.http). Se for utilizado um protocolo diferente de HTTP, o objeto uma instncia de uma classe que implementa javax.servlet.ServletResponse. Representa a solicitao do cliente. O objeto normalmente uma instncia de uma classe que implementa HttpServletRequest (pacote javax.servlet.http). Se for utilizado um protocolo diferente de HTTP, o objeto uma instncia de uma subclasse de javax.servlet.ServletRequest. O objeto javax.servlet.http.HttpSession representa as informaes de sesso de cliente se tal sesso foi criada. Esse objeto est disponvel somente nas pginas que participam de uma sesso.

exception out

page pageContext

response

Escopo de solicitao request

Escopo de sesso session

Fig. 31.2

Objetos implcitos JSP.

31.5 Criando scripts


As JavaServer Pages freqentemente apresentam contedo gerado dinamicamente como parte de um documento XHTML enviado para o cliente em resposta a uma solicitao. Em alguns casos, o contedo esttico, mas exibido somente se certas condies forem atendidas durante uma solicitao (como fornecer valores em um form que envia uma solicitao). Os programadores JSP podem inserir cdigo Java e lgica em uma JSP que use scripts.
Observao de engenharia de software 31.4 Atualmente, as JavaServer Pages suportam scripts somente em Java. As futuras verses de JSP podero suportar outras linguagens de criao de scripts.

31.5.1 Componentes da sintaxe de scripts


Os componentes da sintaxe de scripts das JSP incluem scriptlets, comentrios, expresses, declaraes e seqncias de escape. Esta seo descreve cada um desses componentes. Muitos desses componentes da sintaxe de scripts so demonstrados na Fig. 31.4 no fim da Seo 31.5.2.

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1029

Os scriptlets so blocos de cdigo delimitados por <% e %>. Contm instrues em Java que o continer coloca no mtodo _jspService em tempo de traduo. As JSPs suportam trs estilos de comentrio: comentrios de JSP, comentrios de XHTML e comentrios da linguagem de criao de scripts. Os comentrios de JSP so delimitados por <%-- e --%>. Tais comentrios podem ser colocados por toda JSP, mas no dentro de scriptlets. Os comentrios de XHTML so delimitados por <!-- e -->. Podem ser colocados por toda JSP, mas no dentro de scriptlets. Os comentrios da linguagem de criao de scripts so atualmente os comentrios de Java, porque Java a nica linguagem de criao de scripts JSP no presente momento. Os scriptlets podem utilizar comentrios de Java de uma nica linha (delimitados por / e /) e comentrios de vrias linhas (delimitados por /* e */).
Erro comum de programao 31.1 Colocar um comentrio de JSP ou um comentrio de XHTML dentro de um scriptlet um erro de sintaxe em tempo de traduo que impede que a JSP seja adequadamente traduzida.

Os comentrios de JSP e os comentrios da linguagem de criao de scripts so ignorados e no aparecem na resposta para o cliente. Ao visualizar o cdigo-fonte de uma resposta JSP, os clientes vero somente os comentrios de XHTML no cdigo-fonte. Os diferentes estilos de comentrio so teis para separar os comentrios que o usurio deve ser capaz de ver dos comentrios que a lgica do documento processou no servidor. A expresso JSP, delimitada por <%= e %>, contm uma expresso em Java que avaliada quando o cliente solicita a JSP que contm a expresso. O continer converte o resultado de uma expresso JSP em um objeto String e, ento, gera como sada o String como parte da resposta para o cliente. As declaraes (delimitadas por <%! e %>) permitem definir variveis e mtodos. As variveis tornam-se variveis de instncia da classe servlet que representa a JSP traduzida. De maneira semelhante, os mtodos tornam-se membros da classe que representa a JSP traduzida. As declaraes de variveis e os mtodos em uma JSP utilizam a sintaxe Java. Portanto, a declarao de varivel deve terminar com um ponto-e-vrgula, como em
<%! int counter = 0; %>

Erro comum de programao 31.2 Declarar uma varivel sem utilizar ponto-e-vrgula de terminao um erro de sintaxe. Observao de engenharia de software 31.5 As variveis e os mtodos declarados nas declaraes JSP so inicializados quando a JSP inicializada e esto disponveis para utilizao em todos os scriptlets e em todas as expresses nessa JSP. As variveis declaradas desta maneira tornam-se variveis de instncia da classe servlet que representa a JSP traduzida. Observao de engenharia de software 31.6 Como ocorre com os servlets, as JSPs no devem armazenar informaes de estado do cliente em variveis de instncia. Em vez disso, as JSPs devem utilizar o objeto implcito JSP session.

Os caracteres especiais ou as seqncias de caractere que o continer de JSP normalmente utiliza para delimitar o cdigo JSP podem ser includos em uma JSP como caracteres literais nos elementos de script, dados de modelo fixo e valores de atributo que usam seqncias de escape. A Fig. 31.3 mostra o caractere literal ou os caracteres e as seqncias de escape correspondentes e discute onde utilizar as seqncias de escape.

31.5.2 Exemplo de criao de scripts


A JSP da Fig. 31.4 demonstra os recursos bsicos da criao de scripts que respondem s solicitaes get. A JSP permite ao usurio inserir um nome e, ento, gera como sada esse nome como parte da resposta. Utilizando o script, a JSP determina se um parmetro firstName foi ou no passado para a JSP como parte da solicitao; se no foi, a JSP retorna um documento XHTML que contm um form atravs do qual o usurio pode inserir o nome. Caso contrrio, a JSP obtm o valor firstName e o utiliza como parte de um documento XHTML que d boas-vindas ao usurio das JavaServer Pages.

1030

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Literal
<%

Seqncia de escape
<\%

Descrio
A seqncia de caracteres <% normalmente indica o comeo de um scriptlet. A seqncia de escape <\% coloca os caracteres literais <% na resposta para o cliente. A seqncia de caracteres %> normalmente indica o fim de um scriptlet. A seqncia de escape %\> coloca os caracteres literais %> na resposta para o cliente. Como acontece com as literais de string em programa Java, as seqncias de escape para caracteres , " e \ permitem que esses caracteres apaream nos valores de atributo. Lembre-se de que o texto literal em uma JSP torna-se literais de string no servlet que representa a JSP traduzida.

%>

%\>

" \

\ \" \\

Fig. 31.3

Seqncias de escape JSP.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

<?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.4: welcome.jsp --> <!-- JSP que processa uma solicitao "get" contendo dados. --> <html xmlns = "http://www.w3.org/1999/xhtml"> <!-- seo cabealho do documento --> <head> <title>Processing "get" requests with data</title> </head> <!-- seo corpo do documento --> <body> <% // inicia o scriptlet String name = request.getParameter( "firstName" ); if ( name != null ) { %> <% -- termina o scriptlet para inserir dados de modelo fixo --%> <h1> Hello <%= name %>, <br /> Welcome to JavaServer Pages! </h1> <% // continua o scriptlet } // termina o if else { %> <%-- termina o scriptlet para inserir dados de modelo fixo --%> <form action = "welcome.jsp" method = "get">

Fig. 31.4

Criando script de uma JavaServer Page (welcome.jsp) (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1031

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

<p>Type your first name and press Submit</p> <p><input type = "text" name = "firstName" /> <input type = "submit" value = "Submit" /> </p> </form> <% // continua o scriptlet } // termina o if

%> <% -- termina o scriptlet --%> </body> </html> <!-- termina o documento XHTML -->

Fig. 31.4

Criando script de uma JavaServer Page (welcome.jsp) (parte 2 de 2).

Observe que a maior parte do cdigo na Fig. 31.4 marcao XHTML (isto , dados de modelo fixo). Por todo o elemento body h vrios scriptlets (linhas 17-23, 30-35 e 45-49) e uma expresso JSP (linha 26). Observe que aparecem trs estilos de comentrio nessa JSP. Os scriptlets definem uma estrutura if/else que determina se a JSP recebeu ou no um valor para o nome como parte da solicitao. A linha 19 utiliza o mtodo getParameter da solicitao de objeto implcito JSP (um objeto HttpServletRequest) para obter o valor do parmetro firstName e atribui o resultado varivel name. A linha 21 determina se name no null (isto , foi passado um valor de nome para a JSP como parte da solicitao). Se essa condio for true, o scriptlet termina temporariamente; assim, os dados de modelo fixo nas linhas 25-28 podem ser enviados para a sada. A expresso JSP na linha 26 d sada do valor da varivel name (isto , o nome passado para a JSP como parmetro da solicitao). O scriptlet continua nas linhas 30-35 com a chave de fechamento do corpo da estrutura if e o comeo da parte else da estrutura if/else. Se a condio na linha 21 for false, as linhas 25-28 no so enviadas para a sada. Em vez disso, as linhas 37-43 enviam para a sada um ele-

1032

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

mento form. O usurio pode digitar um primeiro nome no form e pressionar o boto Submit para solicitar a JSP novamente e executar o corpo da estrutura if (linhas 25-28).
Observao de engenharia de software 31.7 Os scriptlets, as expresses e os dados de modelo fixo podem ser combinados entre si em uma JSP para criar respostas diferentes com base nas informaes em uma solicitao para uma JSP. Dica de teste e depurao 31.1 s vezes, difcil depurar erros em uma JSP, pois os nmeros de linha informados por um continer de JSP normalmente se referem ao servlet que representa a JSP traduzida, no aos nmeros originais da linha no JSP. Os ambientes de desenvolvimento de programa, como o Forte for Java Community Edition, da Sun Microsystems, Inc., permitem que as JSPs sejam compiladas no ambiente, assim voc pode ver as mensagens de erro de sintaxe. Essas mensagens incluem a instruo no servlet que representa a JSP traduzida, o que pode ser til na determinao do erro. Dica de teste e depurao 31.2 Muitos contineres de JSP armazenam os servlets que representam as JSPs traduzidas. Por exemplo, o diretrio de instalao do Tomcat contm uma subpasta denominada work em que voc pode encontrar o cdigo-fonte para os servlets traduzidos pelo Tomcat.

Para testar a Fig. 31.4 no Tomcat, copie o arquivo welcome.jsp na pasta jsp criada na Seo 31.3. Abra o navegador e insira o seguinte URL para testar o welcome.jsp:
http://localhost:8080/advjhtp1/jsp/welcome.jsp

Quando voc executar a JSP pela primeira vez, ela exibe o form em que voc pode inserir seu nome, pois o URL anterior no passa um parmetro firstName para a JSP. Depois que voc enviar o nome, o navegador deve parecer da maneira mostrada na segunda captura de tela da Fig. 31.4. Nota: como ocorre com os servlets, possvel passar argumentos de solicitaes get como parte do URL. O seguinte URL fornece o parmetro firstName para welcome.jsp:
http://localhost:8080/advjhtp1/jsp/welcome.jsp?firstName=Paul

31.6 Aes-padro
Continuamos nossa discusso sobre JSPs com as aes-padro (Fig. 31.5). Essas aes fornecem implementadores de JSP com acesso a vrias das tarefas mais comuns realizadas em uma JSP, como incluir contedo a partir de outros recursos, encaminhar solicitaes para outros recursos e interagir com os JavaBeans. Os contineres de JSP processam as aes em tempo de solicitao. As aes so delimitadas por <jsp:ao> e </jsp:ao>, onde ao o nome da ao-padro. Nos casos em que nada aparece entre as marcas de abertura e finalizao, pode-se utilizar a sintaxe de elemento vazio de XML <jsp:ao />. A Fig. 31.5 resume as aes-padro da JSP. Utilizamos as aes nas prximas subsees.

Ao
<jsp:include> <jsp:forward> <jsp:plugin>

Descrio
Inclui dinamicamente outro recurso em uma JSP. Enquanto a JSP executada, o recurso designado includo e processado. Encaminha o processamento da solicitao para outra JSP, servlet ou pgina esttica. Essa ao termina a execuo da JSP atual. Permite que um componente plug-in seja adicionado a uma pgina na forma de um elemento HTML object ou embed especfico do navegador. No caso de um applet em Java, essa ao permite fazer download e instalar o Java Plug-in, se ele j no estiver instalado no computador do cliente.

Fig. 31.5

Aes-padro JSP (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1033

Ao
<jsp:param> Manipulao de JavaBean <jsp:useBean> <jsp:setProperty>

Descrio
Utilizada com as aes include, forward e plugin para especificar pares de informaes de nome/valor adicionais a serem utilizados por essas aes. Especifica se a JSP utiliza uma instncia JavaBean. A ao especifica o escopo do bean e lhe atribui um ID que os componentes de script podem utilizar para manipul-lo. Configura uma propriedade na instncia JavaBean especificada. Um recurso especial dessa ao a correspondncia automtica de parmetros da solicitao para as propriedades bean do mesmo nome. Obtm uma propriedade na instncia JavaBean especificada e converte o resultado em um string para sair na resposta.

<jsp:getProperty>

Fig. 31.5

Aes-padro JSP (parte 2 de 2).

31.6.1 Ao <jsp:include>
As JavaServer Pages suportam dois mecanismos de incluso a ao <jsp:include> e a diretiva include. A ao <jsp:include> permite que contedo dinmico seja includo em uma JavaServer Page. Se o recurso includo mudar entre as solicitaes, a prxima solicitao para a JSP que contm a ao <jsp:include> inclui o novo contedo do recurso. Por outro lado, a diretiva include copia o contedo na JSP uma s vez, em tempo de traduo da JSP. Se o recurso includo se alterar, o novo contedo no ser refletido na JSP que utilizou a diretiva include a menos que a JSP seja recompilada. A Fig. 31.6 descreve os atributos da ao <jsp:include>.
Observao de engenharia de software 31.8 De acordo com a especificao 1.1 das JavaServer Pages, o continer de JSP tem permisso de determinar se um recurso includo com a diretiva include se alterou. Se se alterou, o continer pode recompilar a JSP que incluiu o recurso. Entretanto, a especificao no fornece um mecanismo para indicar ao continer uma alterao em um recurso includo. Dica de desempenho 31.2 A ao <jsp:include> mais flexvel que a diretiva include, mas exige overhead maior quando o contedo da pgina mudar freqentemente. Utilize a ao <jsp:include> somente quando o contedo dinmico for necessrio. Erro comum de programao 31.3 Configurar o atributo flush da ao <jsp:include> como false um erro em tempo de traduo. Atualmente, o atributo flush suporta somente valores true.

Ao
page flush

Descrio
Especifica o caminho URI relativo do recurso a incluir. O recurso deve fazer parte do mesmo aplicativo Web. Especifica se o buffer deve ser esvaziado depois que o include for realizado. Em JSP 1.1, necessrio que esse atributo seja true.

Fig. 31.6

Atributos da ao <jsp:include>.

1034

INTERNET & WORLD WIDE WEB COMO PROGRAMAR Erro comum de programao 31.4 No especificar o atributo flush da ao <jsp:include> um erro em tempo de traduo. obrigatrio especificar esse atributo. Erro comum de programao 31.5 Especificar uma pgina que no faz parte do mesmo aplicativo Web em uma ao <jsp:include> um erro em tempo de solicitao. Nesse caso, a ao <jsp:include> no inclui nenhum contedo.

O prximo exemplo demonstra a ao <jsp:include> utilizando quatro recursos XHTML e JSP que representam tanto o contedo esttico como o dinmico. A JavaServer Page include.jsp (Fig. 31.10) inclui trs outros recursos: banner.html (Fig. 31.7), toc.html (Fig. 31.8) e clock2.jsp (Fig. 31.9). A JavaServer Page include.jsp cria um documento XHTML que contm uma table na qual o banner.html distribui duas colunas ao longo do topo da table, toc.html a coluna esquerda da segunda linha e clock2.jsp (uma verso simplificada da Fig. 31.1) a coluna direita da segunda linha. A Fig. 31.10 utiliza trs aes <jsp:include> (linhas 38-39, 48 e 55-56) como contedo nos elementos td da table. Utilizando dois documentos XHTML e um JSP na Fig. 31.10, demonstramos que as JSPs podem incluir tanto contedo esttico como dinmico. As janelas de sada na Fig. 31.10 demonstram os resultados de duas solicitaes separadas include.jsp. Para testar a Fig. 31.10 no Tomcat, copie os arquivos banner.html, toc.html, clock2.jsp, include.jsp e a pasta images para o diretrio jsp criado na Seo 31.3. Abra o navegador e insira o seguinte URL para testar o welcome.jsp:
http://localhost:8080/advjhtp1/jsp/include.jsp

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

<!-- Fig. 31.7: banner.html > <!-- banner a ser includo em outro documento > <div style = "width: 580px"> <p> Java(TM), C, C++, Visual Basic(R), Object Technology, and <br /> Internet and World Wide Web Programming Training&nbsp;<br /> On-Site Seminars Delivered Worldwide </p> <p> <a href = mailto:deitel@deitel.com> deitel@deitel.com</a><br /> 978.579.9911<br /> 490B Boston Post Road, Suite 200, Sudbury, MA 01776 </p> </div>

Fig. 31.7

Banner (banner.html) a ser includo ao longo do topo do documento XHTML criado pela Fig. 31.10.

1 2 3 4 5 6 7 8 9

<!-- Fig. 31.8: toc.html --> <!-- contedo a ser includo em outro documento --> <p><a href = "http://www.deitel.com/books/index.html"> Publications/BookStore </a></p> <p><a href = "http://www.deitel.com/whatsnew.html"> Whats New

Fig. 31.8

ndice analtico (toc.html) a ser includo no lado inferior esquerdo do documento XHTML criado pela Fig. 31.10 (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1035

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

</a></p> <p><a href = "http://www.deitel.com/books/downloads.html"> Downloads/Resources </a></p> <p><a href = "http://www.deitel.com/faq/index.html"> FAQ (Frequently Asked Questions) </a></p> <p><a href = "http://www.deitel.com/intro.html"> Who we are </a></p> <p><a href = "http://www.deitel.com/index.html"> Home Page </a></p> <p>Send questions or comments about this site to <a href = "mailto:deitel@deitel.com"> deitel@deitel.com </a><br /> Copyright 1995-2002 by Deitel &amp; Associates, Inc. All Rights Reserved. </p>

Fig. 31.8

ndice analtico (toc.html) a ser includo no lado inferior esquerdo do documento XHTML criado pela Fig. 31.10 (parte 2 de 2).

1 2 3 4 5 6 7 8 9 10 11 12 13 14

<!-- Figura 31.9: clock2.jsp --> <!-- data e hora a serem includas em outro documento --> <table> <tr> <td style = "background-color: black;"> <p class = "big" style = "color: cyan; font-size: 3em; font-weight: bold;"> <%= new java.util.Date() %> </p> </td> </tr> </table>

Fig. 31.9

JSP clock2.jsp a ser includa como contedo principal no documento XHTML criado pela Fig. 31.10.

1 2 3 4 5 6 7 8 9 10

<?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.7: include.jsp --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Using jsp:include</title>

Fig. 31.10

JSP include.jsp inclui recursos com <jsp:include> (parte 1 de 3).

1036
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

<style type = "text/css"> body { font-family: tahoma, helvetica, arial, sans-serif; } table, tr, td { font-size: .9em; border: 3px groove; padding: 5px; background-color: #dddddd; } </style> </head> <body> <table> <tr> <td style = <img src width alt = </td> <td> <% inclui banner.html nessa JSP %> <jsp:include page = "banner.html" flush = "true" /> </td> </tr> <tr> <td style = "width: 160px"> <% inclui toc.html nessa JSP %> <jsp:include page = "toc.html" flush = "true" /> </td> <td style = "vertical-align: top"> <% inclui clock2.jsp nessa JSP %> <jsp:include page = "clock2.jsp" flush = "true" /> </td> </tr> </table> </body> </html>

"width: 160px; text-align: center"> = "images/logotiny.png" = "140" height = "93" "Deitel & Associates, Inc. Logo" />

Fig. 31.10

JSP include.jsp inclui recursos com <jsp:include> (parte 2 de 3).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1037

Fig. 31.10

A JSP include.jsp inclui recursos com <jsp:include> (parte 3 de 3).

31.6.2 Ao <jsp:forward>
A ao <jsp:forward> permite encaminhar o processamento de solicitao para um recurso diferente. O processamento de solicitao atravs da JSP original termina logo que a JSP encaminha a solicitao. A ao <jsp:forward> tem apenas um atributo page que especifica o URI relativo do recurso (no mesmo aplicativo Web) para o qual a solicitao deve ser encaminhada.
Observao de engenharia de software 31.9 Ao utilizar a ao <jsp:forward>, o recurso para o qual a solicitao ser encaminhada deve estar no mesmo contexto (aplicativo Web) que a JSP que originalmente recebeu a solicitao.

A JavaServer Page forward1.jsp (Fig. 31.11) uma verso modificada de welcome.jsp (Fig. 31.4). A diferena principal est nas linhas 22-25, nas quais a JavaServer Page forward1.jsp encaminha a solicitao para a JavaServer Page forward2.jsp (Fig. 31.12). Observe a ao <jsp:param> nas linhas 23-24. Ela adiciona um parmetro da solicitao que representa a data e a hora em que a solicitao inicial foi recebida para o objeto de solicitao encaminhado para forward2.jsp.
1 2 3 4 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EM" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Fig. 31.11

JSP forward1.jsp recebe um parmetro firstName, adiciona uma data aos parmetros da solicitao e a encaminha para forward2.jsp para mais processamento (parte 1 de 2).

1038
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

<!-- Fig. 31.11: forward1.jsp --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Forward request to another JSP</title> </head> <body> <% // inicia o scriptlet String name = request.getParameter( "firstName" ); if ( name != null ) { %> <%-- termina o scriptlet para inserir o modelo de dados fixos --%> <jsp:forward page = "forward2.jsp"> <jsp:param name = "date" value = "<%= new java.util.Date() %>" /> </jsp:forward> <% // continua o scriptlet } // termina o if else { %> <%-- termina o scriptlet para inserir o modelo de dados fixos --%> <form action = "forward1.jsp" method = "get"> <p>Type your first name and press Submit</p> <p><input type = "text" name = "firstName" /> <input type = "submit" value = "Submit" /> </p> </form> <% } // continua o scriptlet // termina o else

%> <%-- termina o scriptlet --%> </body> </html> <!-- termina o documento XHTML -->

Fig. 31.11

JSP forward1.jsp recebe um parmetro firstName, adiciona uma data aos parmetros da solicitao e a encaminha para forward2.jsp para mais processamento (parte 2 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1039

A ao <jsp:param> especifica os pares de nome/valor de informaes que so passadas para as aes <jsp:include>, <jsp:forward> e <jsp:plugin>. Cada ao <jsp:param> tem dois atributos requeridos: name e value. Se a ao <jsp:param> especifica um parmetro que j existe na solicitao, o novo valor para o parmetro assume precedncia sobre o valor original. Todos os valores para esse parmetro podem ser obtidos com o mtodo getParameterValues da solicitao do objeto implcito JSP, que retorna um array de Strings. A JSP forward2.jsp utiliza o name especificado na ao <jsp:param> ("date") para obter a data e a hora. Ela tambm utiliza o parmetro firstName originalmente passado a forward1.jsp para obter o nome do usurio. As expresses JSP na Fig. 31.12 (linhas 23 e 31) inserem valores de parmetro da solicitao na resposta para o cliente. A captura de tela na Fig. 31.11 mostra a interao inicial com o cliente. A captura de tela na Fig. 31.12 mostra os resultados retornados para o cliente depois que a solicitao foi encaminhada para forward2.jsp.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

<?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- forward2.jsp --> <html xmlns = "http://www.w3.org/1999/xhtml" <head> <title>Processing a forwarded request</title> <style type = "text/css"> .big { font-family: tahoma, helvetica, arial, sans-serif; font-weight: bold; font-size: 2em; } </style> </head> <body> <p class = "big"> Hello <%= request.getParameter( "firstName" ) %>, <br /> Your request was received <br /> and forwarded at </p> <table style = "border: 6px outset;"> <tr> <td style = "background-color: black;"> <p class = "big" style = "color: cyan;"> <%= request.getParameter( "date" ) %> </p> </td> </tr> </table> </body> </html>

Fig. 31.12

JSP forward2.jsp recebe uma solicitao (de forward1.jsp nesse exemplo) e utiliza os parmetros da solicitao como parte da resposta para o cliente (parte 1 de 2).

1040

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Fig. 31.12

JSP forward2.jsp recebe uma solicitao (de forward1.jsp nesse exemplo) e utiliza os parmetros da solicitao como parte da resposta para o cliente (parte 2 de 2).

Para testar a Fig. 31.11 e a Fig. 31.12 no Tomcat, copie forward1.jsp e forward2.jsp na pasta jsp criada na Seo 31.3. Abra o navegador Web e insira o seguinte URL para testar o welcome.jsp:
http://localhost:8080/advjhtp1/jsp/forward1.jsp

31.6.3 Ao <jsp:plugin>
A ao <jsp:plugin> adiciona um applet ou JavaBean a uma pgina Web na forma de um elemento XHTML object ou embed especfico para o navegador. Essa ao tambm permite que o cliente faa download do Java Plug-in e o instale, se ainda no tiver sido instalado. A Fig. 31.13 descreve os atributos da ao <jsp:plugin>. A Fig. 31.14 define um applet que desenha uma figura usando a API Java2D. O applet possui trs parmetros que permitem ao implementador JSP especificar a cor de fundo para o desenho. Os parmetros representam os componentes red, green e blue de uma cor RGB com valores no intervalo de 0 a 255. O applet obtm os valores de parmetro nas linhas 21-23. Se ocorrer alguma exceo durante o processamento dos parmetros, sero capturadas na linha 32 e ignoradas, deixando o applet com sua cor de fundo padro (branco).

Atributo
type code codebase align

Descrio
Tipo de componente bean ou applet. Classe que representa o componente. Localizao da classe especificada no atributo code e dos repositrios de arquivo especificados no atributo archive. Alinhamento do componente.

Fig. 31.13

Atributos da ao <jsp:plugin> (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1041

Atributo
archive height hspace jreversion name vspace title width nspluginurl iepluginurl

Descrio
Lista dos repositrios de arquivos separada por espaos, contendo recursos utilizados pelo componente. Pode incluir a classe especificada pelo atributo code. Altura do componente na pgina especificada em pixels ou em porcentagem. Nmero de pixels do espao que aparece esquerda e direita do componente. A verso do Java Runtime Environment e o plug-in necessrio para executar o componente. O valor-padro 1.1. Nome do componente. Nmero de pixels do espao que aparece acima e abaixo do componente. Texto que descreve o componente. Largura do componente na pgina, especificada em pixels ou em porcentagem. Localizao para download do Java Plug-in para o Netscape Navigator. Localizao para download do Java Plug-in para o Internet Explorer.

Fig. 31.13

Atributos da ao <jsp:plugin> (parte 2 de 2).

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

// Fig. 31.14: ShapesApplet.java // Applet que demonstra um Java2D GeneralPath. package com.deitel.advjhtp1.jsp.applet; // pacotes do ncleo Java import java.applet.*; import java.awt.event.*; import java.awt.*; import java.awt.geom.*; // pacotes de extenso Java import javax.swing.*; public class ShapesApplet extends JApplet { // inicializa o applet public void init() { // obtm parmetros de cor do arquivo XHTML try { int red = Integer.parseInt( getParameter( "red" ) ); int green = Integer.parseInt( getParameter( "green" ) ); int blue = Integer.parseInt( getParameter( "blue" ) ); Color backgroundColor = new Color( red, green, blue ); setBackground( backgroundColor ); } // se houver uma exceo ao se processar os parmetros // de cor, a captura e ignora catch ( Exception exception ) { // no faz nada }

Fig. 31.14

Applet que demonstra <jsp:plugin> na Fig. 31.15 (parte 1 de 2).

1042
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

} public void paint( Graphics g ) { // cria arrays de coordenadas x e y int xPoints[] = { 55, 67, 109, 73, 83, 55, 27, 37, 1, 43 }; int yPoints[] = { 0, 36, 36, 54, 96, 72, 96, 54, 36, 36 }; // obtm referncia para um objeto Graphics2D Graphics2D g2d = ( Graphics2D ) g; // cria uma estrela a partir de uma srie de pontos GeneralPath star = new GeneralPath(); // configura a coordenada inicial do GeneralPath star.moveTo( xPoints[ 0 ], yPoints[ 0 ] ); // cria a estrela -- isso no desenha a estrela for ( int k = 1; k < xPoints.length; k++ ) star.lineTo( xPoints[ k ], yPoints[ k ] ); // fecha a forma grfica star.closePath(); // desloca a origem para (200, 200) g2d.translate( 200, 200 ); // gira ao redor da origem e desenha estrelas em cores aleatrias for ( int j = 1; j <= 20; j++ ) { g2d.rotate( Math.PI / 10.0 ); g2d.setColor( new Color( ( int ) ( Math.random() * 256 ), ( int ) ( Math.random() * 256 ), ( int ) ( Math.random() * 256 ) ) ); g2d.fill( star ); } } } // desenha uma estrela preenchida

Fig. 31.14

Applet que demonstra <jsp:plugin> na Fig. 31.15 (parte 2 de 2).

A maioria dos navegadores Web em utilizao hoje no suporta applets escritos para a plataforma Java 2. Execut-los na maioria dos navegadores atuais exige o Java Plug-in. A Fig. 31.15 utiliza a ao <jsp:plugin> (linhas 10-22) para se incorporar o Java Plug-in. A linha 11 indica o nome do pacote e o nome da classe do applet. A linha 12 indica o codebase a partir do qual deve ser feito o download do applet. A linha 13 indica que o applet deve ter 400 pixels de largura, e a linha 14 indica que o applet deve ter 400 pixels de altura. As linhas 16-20 especificam os parmetros do applet. Voc pode alterar a cor de fundo no applet alterando as componentes azul, verde e vermelho. Observe que a ao <jsp:plugin> exige que aparea alguma ao <jsp:param> em uma ao <jsp:params>.
1 2 3

<!-- Fig. 31.15: plugin.jsp --> <html>

Fig. 31.15

Utilizando <jsp:plugin> para incorporar um applet Java a uma JSP (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1043

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

<head> <title>Using jsp:plugin to load an applet</title> </head> <body> <jsp:plugin type = "applet" code = "com.deitel.advjhtp1.jsp.applet.ShapesApplet" codebase = "/advjhtp1/jsp" width = "400" height = "400"> <jsp:params> <jsp:param name = "red" value = "255" /> <jsp:param name = "green" value = "255" /> <jsp:param name = "blue" value = "0" /> </jsp:params> </jsp:plugin> </body> </html>

Fig. 31.15

Utilizando <jsp:plugin> para incorporar um applet Java a uma JSP (parte 2 de 2).

1044

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Para testar a ao <jsp:plugin> no Tomcat, copie os arquivos plugin.jsp e ShapesApplet.class na pasta jsp criada na Seo 31.3 [Nota: ShapesApplet definido no pacote com.deitel.advjhtp1.jsp.applet. Esse exemplo funcionar somente se a estrutura de pastas do pacote adequado for definida na pasta classes.] Abra o navegador Web e insira o seguinte URL para testar o plugin.jsp:
http://localhost:8080/advjhtp1/jsp/plugin.jsp

As capturas de tela na Fig. 31.15 mostram o applet em execuo no Microsoft Internet Explorer 5.5 e no Netscape Navigator 6.0.

31.6.4 Ao <jsp:useBean>
A ao <jsp:useBean> permite manipular um objeto Java. Essa ao cria um objeto Java ou localiza um j existente para utilizao na JSP. A Fig. 31.16 resume os atributos da ao <jsp:useBean>. Se os atributos class e beanName no forem especificados, o continer JSP tenta localizar um objeto existente do tipo especificado no atributo type. Como os objetos implcitos JSP, os objetos especificados com a ao <jsp:useBean> tm escopo page, request, session ou application que indica onde eles podem ser utilizados em um aplicativo Web. Os objetos com escopo page so acessveis somente na pgina em que so definidos. As vrias pginas JSP supostamente podem acessar objetos com outros escopos. Por exemplo, todas as JSPs que processam uma solicitao simples podem acessar um objeto com escopo request.
Erro comum de programao 31.6 Pelo menos um dos atributos class e type de <jsp:useBean> devem ser especificados; caso contrrio, ocorre um erro em tempo de traduo.

Atributo
id

Descrio
Nome utilizado para manipular o objeto Java com as aes <jsp:setProperty> e <jsp:getProperty>. A varivel desse nome tambm declarada para utilizao em elementos de script JSP. O nome especificado aqui faz distino entre letras maisculas e minsculas. Escopo em que o objeto Java acessvel page, request, session ou application. O escopo-padro page. Nome completamente qualificado de classe do objeto Java. Nome de um bean que pode ser utilizado com o mtodo instantiate da classe java.beans.Beans para carregar um JavaBean na memria. O tipo do JavaBean. Pode ser do mesmo tipo do atributo class, uma superclasse desse tipo ou uma interface implementada por esse tipo. O valor-padro o mesmo do atributo class. Ocorre uma ClassCastException se o objeto Java no for do tipo especificado com o atributo type.

scope class beanName type

Fig. 31.16

Atributos da ao <jsp:useBean>.

Muitos sites Web hoje colocam anncios rotativos em suas pginas Web. Cada visita a uma dessas pginas em geral resulta em um anncio diferente que est sendo exibido no navegador Web do usurio. Em geral, clicar em um anncio leva-o para o site Web da empresa que o colocou. Nosso primeiro exemplo de <jsp:useBean> demonstra um rotator bean de anncio simples que exibe alternadamente uma lista de cinco anncios. Nesse exemplo, os anncios so capas de algum de nossos livros. Clicar em uma capa leva-o para o site da Amazon.com, no qual voc pode ler a respeito e possivelmente fazer o pedido do livro.

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1045

O bean Rotator (Fig. 31.17) tem trs mtodos: getImage, getLink e nextAd. O mtodo getImage retorna o nome do arquivo com a imagem da capa do livro. O mtodo getLink retorna o hyperlink com o livro na Amazon.com. O mtodo nextAd atualiza o Rotator; assim, as prximas chamadas para getImage e getLink retornam informaes de um anncio diferente. Os mtodos getImage e getLink representam uma propriedade somente de leitura de JavaBean image e link, respectivamente. Rotator monitora o anncio atual com sua varivel selectedIndex, que atualizada invocando-se o mtodo nextAd.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 // Fig. 31.17: Rotator.java // JavaBean de anncios rotativos. package com.deitel.advjhtp1.jsp.beans; public class Rotator { private String images[] = { "images/jhtp3.jpg", "images/xmlhtp1.jpg", "images/ebechtp1.jpg", "images/iw3htp1.jpg", "images/cpphtp3.jpg" }; private String links[] = { "http://www.amazon.com/exec/obidos/ASIN/0130125075/" "deitelassociatin", "http://www.amazon.com/exec/obidos/ASIN/0130284173/" "deitelassociatin", "http://www.amazon.com/exec/obidos/ASIN/013028419X/" "deitelassociatin", "http://www.amazon.com/exec/obidos/ASIN/0130161438/" "deitelassociatin", "http://www.amazon.com/exec/obidos/ASIN/0130895717/" "deitelassociatin" }; private int selectedIndex = 0; // retorna o nome do arquivo com a imagem para o anncio atual public String getImage() { return images[ selectedIndex ]; } // retorna o URL para o site Web correspondente do anncio public String getLink() { return links[ selectedIndex ]; } // atualiza selectedIndex, assim as prximas chamadas para getImage e // getLink retornam um anncio diferente public void nextAd() { selectedIndex = ( selectedIndex + 1 ) % images.length; } }

+ + + + +

Fig. 31.17

Bean Rotator que mantm um conjunto de anncios.

As linhas 7-8 da JavaServer Page adrotator.jsp (Fig.31.18) obtm uma referncia para uma instncia da classe Rotator. O id para o bean rotator. A JSP utiliza esse nome para manipular o bean. O escopo do objeto session, de modo que cada cliente individual veja a mesma seqncia de anncios durante sua sesso de

1046

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

navegao. Quando adrotator.jsp receber uma solicitao de um novo cliente, o continer de JSP cria o bean e armazena na session JSP desse cliente (um objeto HttpSession). Em cada solicitao para essa JSP, a linha 22 utiliza a referncia rotator criada na linha 7 para invocar o mtodo nextAd do bean Rotator. Portanto, cada solicitao receber o prximo anncio mantido pelo bean Rotator. As linhas 29-34 definem um hyperlink para o site Amazon.com para um livro particular. As linhas 29-30 introduzem a ao <jsp:getProperty> para obter o valor da propriedade link para o bean Rotator. A ao <jsp:getProperty> tem dois atributos name e property que determinam o objeto bean a manipular e a propriedade a obter. Se o objeto JavaBean utiliza a conveno para a atribuio de nomes JavaBean padro, o mtodo utilizado para obter o valor da propriedade link do bean deve ser getLink. A ao <jsp:getProperty> invoca getLink no bean designado por rotator, converte o valor de retorno em um String e gera como sada o String como parte da resposta para o cliente. A propriedade link torna-se o valor do atributo href do hyperlink. O hyperlink representado na pgina Web resultante como a imagem com a capa de livro. As linhas 32-33 criam um elemento img e utilizam outra ao <jsp:getProperty> para obter o valor da propriedade image do bean Rotator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.18: adrotator.jsp > <jsp:useBean id = "rotator" scope = "application" class = "com.deitel.advjhtp1.jsp.beans.Rotator" /> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>AdRotator Example</title> <style type = "text/css"> .big { font-family: helvetica, arial, sans-serif; font-weight: bold; font-size: 2em } </style> <%-- atualiza o anncio --%> <% rotator.nextAd(); %> </head> <body> <p class = "big">AdRotator Example</p> <p> <a href = "<jsp:getProperty name = "rotator" property = "link" />"> <img src = "<jsp:getProperty name = "rotator" property = "image" />" alt = "advertisement" /> </a> </p> </body> </html>

Fig. 31.18

JSP adrotator.jsp utiliza um bean Rotator para exibir um anncio diferente em cada solicitao pgina (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1047

Fig. 31.18

JSP adrotator.jsp utiliza um bean Rotator para exibir um anncio diferente em cada solicitao pgina (parte 2 de 2).

Observe que as propriedades da imagem e do link tambm podem ser obtidas com expresses JSP. Por exemplo, a ao <jsp:getProperty> nas linhas 29-30 pode ser substituda pela expresso
<%= rotator.getLink() %>

De maneira semelhante, a ao <jsp:getProperty> nas linhas 32-33 pode ser substituda pela expresso
<%= rotator.getImage() %>

Para testar adrotator.jsp no Tomcat, copie o arquivo adrotator.jsp para a pasta jsp criada na Seo 31.3. Voc deve ter copiado a pasta images no diretrio jsp quando testou a Fig. 31.10. Se no, deve copiar a pasta images agora. Copie Rotator.class para a pasta WEB-INF\classes do aplicativo Web advjhtp1 no Tomcat. [Nota: esse exemplo funcionar somente se a estrutura de diretrios do pacote adequado para Rotator estiver definida na pasta classes. Rotator definido no pacote com.deitel.advjhtp1.jsp.beans.] Abra o navegador Web e insira o seguinte URL para testar o adrotator.jsp:
http://localhost:8080/advjhtp1/jsp/adrotator.jsp

Tente recarregar essa JSP vrias vezes em seu navegador para ver a alterao do anncio com cada solicitao. A ao <jsp:setProperty> pode configurar os valores de propriedade JavaBean. Essa ao particularmente til para mapear os valores de parmetro da solicitao para as propriedades JavaBean. Podem-se utilizar os parmetros da solicitao para configurar as propriedades de tipos primitivos boolean, byte, char, int, long, float e double e dos tipos java.lang String, Boolean, Byte, Character, Integer, Long, Float e Double. A Fig. 31.19 resume os atributos <jsp:setProperty>.

1048

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Atributo
name property

Descrio
O ID do JavaBean atravs do qual uma propriedade (ou propriedades) ser configurada. Nome da propriedade a ser configurada. Especificar "*" para esse atributo faz com que a JSP corresponda aos parmetros da solicitao s propriedades do bean. Para cada parmetro de solicitao correspondente (isto , o nome do parmetro da solicitao idntico ao nome da propriedade do bean), a propriedade correspondente no bean configurada com o valor do parmetro. Se o valor do parmetro da solicitao for "", o valor de propriedade permanece inalterado. Se os nomes de parmetro da solicitao no corresponderem aos nomes de propriedade do bean, pode-se utilizar esse atributo para especificar o parmetro da solicitao que deve ser utilizado para se obter o valor para uma propriedade especfica do bean. opcional. Se esse atributo for omitido, os nomes de parmetro da solicitao devem corresponder aos nomes da propriedade do bean. Valor a ser atribudo a uma propriedade do bean. O valor em geral o resultado de uma expresso JSP. Esse atributo particularmente til para configurar as propriedades do bean que no podem ser configuradas com parmetros da solicitao. opcional. Se esse atributo for omitido, a propriedade JavaBean deve ser de um tipo de dados que pode ser configurado com parmetros da solicitao.

param

value

Fig. 31.19

Atributos da ao <jsp:setProperty>. Erro comum de programao 31.7 Utilize o atributo value da ao <jsp:setProperty> para configurar os tipos de propriedade do JavaBean que no podem ser configuradas com parmetros da solicitao; caso contrrio, ocorrem erros de converso. Observao de engenharia de software 31.10 A ao <jsp:setProperty> pode utilizar valores de parmetro da solicitao para configurar as propriedades JavaBean somente para as propriedades dos seguintes tipos: Strings, tipos primitivos (boolean, byte, char, short, int, long, float e double) e classes empacotadoras de tipo (Boolean, Byte, Character, Short, Integer, Long, Float e Double).

Nosso prximo exemplo um livro de convidados que permite aos usurios colocar nome, sobrenome e endereo de correio eletrnico em um banco de dados do livro de convidados. Depois de enviar as informaes, os usurios vem uma pgina Web que contm todos os usurios no livro. O endereo de e-mail de cada pessoa exibido como um hyperlink que permite ao usurio enviar uma mensagem de e-mail pessoa. O exemplo demonstra a ao <jsp:setProperty>. Alm disso, o exemplo introduz a diretiva JSP page e as pginas de erro JSP. O exemplo do livro de convidados consiste no JavaBeans GuestBean (Fig. 31.20) e GuestDataBean (Fig. 31.21) e as JSPs guestBookLogin.jsp (Fig. 31.22), guestBookView.jsp (Fig. 31.23) e guestBookErrorPage.jsp (Fig. 31.24). As sadas desse exemplo so mostradas na Fig. 31.25. O JavaBean GuestBean (Fig. 31.20) define trs propriedades para o convidado: firstName, lastName e email. Cada uma delas constitui uma propriedade de leitura/gravao com os mtodos set e get que manipulam a propriedade.
1 2 3 4 // Fig. 31.20: GuestBean.java // JavaBean que armazena dados sobre um convidado no livro de convidados. package com.deitel.advjhtp1.jsp.beans;

Fig. 31.20

GuestBean armazena as informaes sobre um convidado (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1049

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

public class GuestBean { private String firstName, lastName, email; // configura o nome do convidado public void setFirstName( String name ) { firstName = name; } // obtm o nome do convidado public String getFirstName() { return firstName; } // configura o sobrenome do convidado public void setLastName( String name ) { lastName = name; } // obtm o sobrenome do convidado public String getLastName() { return lastName; } // configura o endereo de correio eletrnico do convidado public void setEmail( String address ) { email = address; } // obtm o endereo de correio eletrnico do convidado public String getEmail() { return email; } }

Fig. 31.20

GuestBean armazena as informaes sobre um convidado (parte 2 de 2).

O JavaBean GuestDataBean (Figura 31.21) conecta-se ao banco de dados guestbook e fornece os mtodos getGuestList e addGuest para manipular o banco de dados. O banco de dados do livro de visitas tem uma tabela simples (guests) contendo trs colunas (firstName, lastName e email). Fornecemos um script SQL (guestbook.sql) com esse exemplo que pode ser utilizado com o Cloudscape DBMS para criar o banco de dados guestbook. Para obter mais detalhes sobre como criar um banco de dados com o Cloudscape, consulte novamente o Captulo 30.
1 2 3 4 5 6 7 // Fig. 31.21: GuestDataBean.java // A classe GuestDataBean faz uma conexo de banco de dados e // pode inserir e recuperar os dados a partir do banco de dados. package com.deitel.advjhtp1.jsp.beans; // Pacotes do ncleo Java import java.io.*;

Fig. 31.21

GuestDataBean realiza o acesso ao banco de dados em favor de guestBookLogin.jsp (parte 1 de 3).

1050
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

import java.sql.*; import java.util.*; public class GuestDataBean { private Connection connection; private PreparedStatement addRecord, getRecords; // constri o objeto TitlesBean public GuestDataBean() throws Exception { // carrega o driver Cloudscape Class.forName( "COM.cloudscape.core.RmiJdbcDriver" ); // conecta-se ao banco de dados connection = DriverManager.getConnection( "jdbc:rmi:jdbc:cloudscape:guestbook" ); getRecords = connection.prepareStatement( "SELECT firstName, lastName, email FROM guests" ); addRecord = connection.prepareStatement( "INSERT INTO guests ( " + "firstName, lastName, email ) " + "VALUES ( ?, ?, ? )" ); } // retorna um ArrayList de GuestBeans public List getGuestList() throws SQLException { List guestList = new ArrayList(); // obtm a lista de ttulos ResultSet results = getRecords.executeQuery(); // obtm os dados da linha while ( results.next() ) { GuestBean guest = new GuestBean(); guest.setFirstName( results.getString( 1 ) ); guest.setLastName( results.getString( 2 ) ); guest.setEmail( results.getString( 3 ) ); guestList.add( guest ); } return guestList; } // insere um convidado no banco de dados guestbook public void addGuest( GuestBean guest ) throws SQLException { addRecord.setString( 1, guest.getFirstName() ); addRecord.setString( 2, guest.getLastName() ); addRecord.setString( 3, guest.getEmail() );

Fig. 31.21

GuestDataBean realiza o acesso ao banco de dados em favor de guestBookLogin.jsp (parte 2 de 3).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1051

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

addRecord.executeUpdate(); } // fecha as instrues e termina a conexo com o banco de dados protected void finalize() { // tenta fechar a conexo com o banco de dados try { getRecords.close(); addRecord.close(); connection.close(); } // processa SQLException na operao de fechamento catch ( SQLException sqlException ) { sqlException.printStackTrace(); } } }

Fig. 31.21

GuestDataBean realiza o acesso ao banco de dados em favor de guestBookLogin.jsp (parte 3 de 3).

O mtodo getGuestList de GuestDataBean (linhas 39-58) retorna uma List de objetos GuestBean que representam os convidados no banco de dados. O mtodo getGuestList cria GuestBeans a partir do ResultSet retornado por PreparedStatement getRecords (definidos nas linhas 25-28 e executados na linha 44). O mtodo addGuest de GuestDataBean (linhas 61-68) recebe um GuestBean como argumento e utiliza as propriedades do GuestBean como argumentos para PreparedStatement addRecord (definidos nas linhas 30-35). Essa PreparedStatement (executada na linha 67) insere um novo convidado no banco de dados. Observe que os mtodos getGuestList e addGuest do construtor GuestDataBean no processam excees em potencial. No construtor, a linha 19 pode lanar uma ClassNotFoundException e as outras instrues podem lanar SQLExceptions. De maneira semelhante, as SQLExceptions podem ser lanadas a partir dos corpos dos mtodos getGuestList e addGuest. Nesse exemplo, deixamos passar propositadamente qualquer exceo de volta para a JSP que invoca alguns mtodos ou o construtor do GuestDataBean. Isso permite demonstrar as pginas de erro JSP. Quando a JSP realiza uma operao que causa uma exceo, ela pode incluir scriptlets que capturam a exceo e a processam. As excees que no so capturadas podem ser encaminhadas para uma pgina de erro JSP para serem tratadas. A JavaServer Page guestBookLogin.jsp (Fig. 31.22) uma verso modificada forward1.jsp (Fig. 31.11) que exibe um form em que os usurios podem inserir nome, sobrenome e endereo de e-mail. Quando o usurio enviar o form, guestBookLogin.jsp solicitado novamente, assim ele pode assegurar que todos os valores dos dados foram inseridos. Se no, o guestBookLogin.jsp responde com o form novamente, assim o usurio pode preencher o(s) campo(s) ausente(s). Se o usurio fornecer todas as trs partes das informaes, guestBookLogin.jsp encaminha a solicitao para guestBookView.jsp, que exibe o contedo do livro de convidados.
1 2 3 4 5 6 7 8 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.22: guestBookLogin.jsp --> <%-- configuraes de pgina --%> <%@ page errorPage = "guestBookErrorPage.jsp" %>

Fig. 31.22

A JavaServer Page guestBookLogin.jsp permite enviar nome, sobrenome e endereo de correio eletrnico para que sejam colocados no livro de convidados (parte 1 de 3).

1052
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

<%-- beans utilizados nessa JSP --%> <jsp:useBean id = "guest" scope = "page" class = "com.deitel.advjhtp1.jsp.beans.GuestBean" /> <jsp:useBean id = "guestData" scope = "request" class = "com.deitel.advjhtp1.jsp.beans.GuestDataBean" /> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Guest Book Login</title> <style type = "text/css"> body { font-family: tahoma, helvetica, arial, sans-serif; } table, tr, td { font-size: .9em; border: 3px groove; padding: 5px; background-color: #dddddd; } </style> </head> <body> <jsp:setProperty name = "guest" property = "*" /> <% // inicia o scriptlet if ( guest.getFirstName() == null || guest.getLastName() == null || guest.getEmail() == null ) { %> <% -- termina o scriptlet para inserir o modelo de dados fixos --%> <form method = "post" action = "guestBookLogin.jsp"> <p>Enter your first name, last name and email address to register in our guest book.</p> <table> <tr> <td>First name</td> <td> <input type = "text" name = "firstName" /> </td> </tr> <tr> <td>Last name</td> <td> <input type = "text" name = "lastName" /> </td> </tr>

Fig. 31.22

A JavaServer Page guestBookLogin.jsp permite enviar nome, sobrenome e endereo de correio eletrnico para que sejam colocados no livro de convidados (parte 2 de 3).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1053

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

<tr> <td>Email</td> <td> <input type = "text" name = "email" /> </td> </tr> <tr> <td colspan = "2"> <input type = "submit" value = "Submit" /> </td> </tr> </table> </form> <% // continua o scriptlet } // termina o if else { guestData.addGuest( guest ); %> <%-- termina o scriptlet para inserir a ao jsp:forward --%> <%-- encaminha para exibir contedo do livro de convidados --%> <jsp:forward page = "guestBookView.jsp" /> <% // continua o scriptlet } // termina o else

%> <%-- termina o scriptlet --%> </body> </html>

Fig. 31.22

A JavaServer Page guestBookLogin.jsp permite enviar nome, sobrenome e endereo de correio eletrnico para que sejam colocados no livro de convidados (parte 3 de 3).

A linha 8 de guestBookLogin.jsp introduz a diretiva page, que define as informaes que esto globalmente disponveis em uma JSP. As diretivas so delimitadas por <%@ e %>. Nesse caso, o atributo errorPage da diretiva page configurado como guestBookErrorPage.jsp (Fig. 31.24), indicando que todas as excees no-interceptadas so encaminhadas para guestBookErrorPage.jsp para processamento. Uma descrio completa da diretiva page aparece na Seo 31.7. As linhas 11-14 definem duas aes <jsp:useBean>. As linhas 11-12 criam uma instncia de GuestBean denominada guest. Esse bean tem o escopo page existe para ser utilizado somente nessa pgina. As linhas 1414 criam uma instncia de GuestDataBean denominada guestData. Esse bean tem o escopo request existe para ser utilizado nessa pgina e em qualquer outra pgina que ajude a processar uma solicitao individual de um cliente. Portanto, quando guestBookLogin.jsp encaminhar uma solicitao para guestBookView.jsp, o GuestDataBean ainda estar disponvel para utilizao em guestBookView.jsp. A linha 36 demonstra as propriedades de configurao do GuestBean denominado guest com os valores de parmetro da solicitao. Os elementos input nas linhas 55, 63 e 71 tm os mesmos nomes das propriedades GuestBean. Dessa forma, usamos a capacidade da ao <jsp:setProperty> de fazer a correspondncia entre os parmetros da solicitao e as propriedades que especificam "*" para o atributo property. A linha 36 tambm pode configurar as propriedades individualmente com as seguintes linhas:

1054

INTERNET & WORLD WIDE WEB COMO PROGRAMAR


<jsp:setProperty name = "guest" property = "firstName" param = "firstName" /> <jsp:setProperty name = "guest" property = "lastName" param = "lastName" /> <jsp:setProperty name = "guest" property = "email" param = "email" />

Se os parmetros da solicitao tivessem nomes diferentes das propriedades do GuestBean, o atributo param em cada uma das aes <jsp:setProperty> anteriores poderia ser alterado para o nome apropriado de parmetro da solicitao. A JavaServer Page guestBookView.jsp (Fig. 31.23) gera como sada um documento XHTML que contm as entradas do livro de convidados no formato tabular. As linhas 8-10 definem trs diretivas page. A linha 8 especifica que a pgina de erro para essa JSP guestBookErrorPage.jsp. As linhas 9-10 introduzem o atributo import da diretiva page. O atributo import permite aos programadores especificar as classes Java e os pacotes que so utilizados no contexto de JSP. A linha 9 indica que as classes de pacote java.util so utilizadas nessa JSP e a linha 10 indica que as classes de nosso pacote com.deitel.advjhtp1.jsp.beans tambm so utilizadas. As linhas 13-14 especificam uma ao <jsp:useBean> que obtm uma referncia para um objeto da classe GuestDataBean. Se j existir um objeto GuestDataBean, a ao retorna uma referncia para o objeto existente. Se no existir um objeto GuestDataBean, a ao cria um GuestDataBean para utilizao nessa JSP. As linhas 50-59 definem um scriptlet que obtm a lista de convidados do GuestDataBean e comea um loop para gerar as entradas como sada. As linhas 61-70 combinam o texto de modelo fixo com as expresses JSP para criar linhas na tabela de dados do livro de convidados que ser exibido no cliente. O scriptlet nas linhas 72-76 termina o loop.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.23: guestBookView.jsp --> <%-- configuraes de pgina --%> <%@ page errorPage = "guestBookErrorPage.jsp" %> <%@ page import = "java.util.*" %> <%@ page import = "com.deitel.advjhtp1.jsp.beans.*" %> <%-- GuestDataBean que obtm a lista de convidados --%> <jsp:useBean id = "guestData" scope = "request" class = "com.deitel.advjhtp1.jsp.beans.GuestDataBean" /> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Guest List</title> <style type = "text/css"> body { font-family: tahoma, helvetica, arial, sans-serif; } table, tr, td, th { text-align: center; font-size: .9em; border: 3px groove; padding: 5px;

Fig. 31.23

A JavaServer Page guestBookView.jsp exibe o contedo do livro de convidados (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1055

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

background-color: #dddddd; } </style> </head> <body> <p style = "font-size: 2em;">Guest List</p> <table> <thead> <tr> <th style = "width: 100px;">Last name</th> <th style = "width: 100px;">First name</th> <th style = "width: 200px;">Email</th> </tr> </thead> <tbody> <% // inicia o scriptlet List guestList = guestData.getGuestList(); Iterator guestListIterator = guestList.iterator(); GuestBean guest; while ( guestListIterator.hasNext() ) { guest = ( GuestBean ) guestListIterator.next(); %> <%-- termina o scriptlet; insere o modelo de dados fixos --%> <tr> <td><%= guest.getLastName() %></td> <td><%= guest.getFirstName() %></td> <td> <a href = "mailto:<%= guest.getEmail() %>"> <%= guest.getEmail() %></a> </td> </tr> <% // continua o scriptlet } // termina o while %> <%-- termina o scriptlet --%> </tbody> </table> </body> </html>

Fig. 31.23

A JavaServer Page guestBookView.jsp exibe o contedo do livro de convidados (parte 2 de 2).

A JavaServer Page guestBookErrorPage.jsp (Fig. 31.24) gera como sada um documento XHTML que contm uma mensagem de erro com base no tipo de exceo que faz com que essa pgina de erro seja invocada. As linhas 8-10 definem vrias diretivas page. A linha 8 introduz o atributo isErrorPage da diretiva page. Configurar esse atributo como true torna a JSP uma pgina de erro e permite acesso ao objeto implcito JSP exception que faz referncia a um objeto de exceo que indica qual problema ocorreu.

1056

INTERNET & WORLD WIDE WEB COMO PROGRAMAR Erro comum de programao 31.8 O objeto implcito de JSP exception pode ser utilizado somente em pginas de erro. Utilizar esse objeto em outras JSPs resulta em um erro em tempo de traduo.

As linhas 29-46 definem scriptlets que determinam o tipo de exceo que ocorreu e comea a gerar como sada uma mensagem de erro apropriada com os dados de modelo fixo. A mensagem de erro real, obtida a partir da exceo, enviada para a sada na linha 56.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Figura 31.24: guestBookErrorPage.jsp --> <%-- configuraes de pgina --%> <%@ page isErrorPage = "true" %> <%@ page import = "java.util.*" %> <%@ page import = "java.sql.*" %> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Error!</title> <style type = "text/css"> .bigRed { font-size: 2em; color: red; font-weight: bold; } </style> </head> <body> <p class = "bigRed"> <% // scriptlet que determina o tipo de exceo // e gera como sada o incio da mensagem de erro if ( exception instanceof SQLException ) %> An SQLException <% else if ( exception instanceof ClassNotFoundException ) %> A ClassNotFoundException <% else %> An exception <%-- termina o scriptlet para inserir o modelo de dados fixos --%>

Fig. 31.24

A JavaServer Page guestBookErrorPage.jsp responde a excees em guestBookLogin.jsp e guestBookView.jsp (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1057

50 51 52 53 54 55 56 57 58 59 60 61 62

<%-- continua gerando como sada a mensagem de erro --%> occurred while interacting with the guestbook database. </p> <p class = "bigRed"> The error message was:<br /> <%= exception.getMessage() %> </p> <p class = "bigRed">Please try again later</p> </body> </html>

Fig. 31.24

A JavaServer Page guestBookErrorPage.jsp responde a excees em guestBookLogin.jsp e guestBookView.jsp (parte 2 de 2).

A Fig. 31.25 mostra interaes de exemplo entre o usurio e as JSPs no exemplo de livro de convidados. Nas duas primeiras linhas de sada, usurios diferentes inseriram nome, sobrenome e correio eletrnico. Em cada caso, o contedo atual do livro de convidados retornado e exibido para o usurio. Na interao final, um terceiro usurio especificou um endereo de e-mail que j existia no banco de dados. O endereo de e-mail a chave primria na tabela guests do banco de dados guestbook, assim seus valores devem ser nicos. Dessa forma, o banco de dados impede que o novo registro seja inserido e que ocorra uma exceo. A exceo encaminhada para guestBookErrorPage.jsp para processamento, o que resulta na ltima captura de tela. Para testar o livro de convidados no Tomcat, copie os arquivos guestBookLogin.jsp, guestBookView.jsp e guestBookErrorPage.jsp na pasta jsp criada na Seo 31.3. Copie os arquivos GuestBean.class e GuestDataBean.class na pasta WEB-INF\classes do aplicativo Web advjhtp1 no Tomcat. [Nota: esse exemplo s funcionar se a estrutura de pastas do pacote adequado para GuestBean e GuestDataBean for definida na pasta classes. Essas classes so definidas no pacote com.deitel.advjhtp1.jsp.beans.] Abra o navegador Web e insira o seguinte URL para testar o guestBookLogin.jsp:
http://localhost:8080/advjhtp1/jsp/guestBookLogin.jsp

Fig. 31.25

Janelas de sada de exemplo do livro de convidados JSP (parte 1 de 2).

1058

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Fig. 31.25

Janelas de sada de exemplo do livro de convidados JSP (parte 2 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1059

31.7 Diretivas
As diretivas so mensagens para o continer de JSP que permitem especificar as configuraes de pgina (como a pgina de erro), incluindo o contedo de outros recursos e especificar as bibliotecas de marcas personalizadas para utilizao em uma JSP. As diretivas (delimitadas por <%@ e %>) so processadas em tempo de traduo. Portanto, no produzem nenhuma sada imediata, pois so processadas antes que a JSP aceite qualquer solicitao. A Fig. 31.26 resume os trs tipos de diretiva. Elas so discutidas nas prximas subsees.

31.7.1 Diretiva page


A diretiva page especifica as configuraes globais para a JSP no continer de JSP. Pode haver muitas diretivas page, desde que haja apenas uma ocorrncia de cada atributo. A nica exceo para essa regra o atributo import, que pode ser utilizado repetidamente para importar os pacotes Java utilizados na JSP. A Fig. 31.27 resume os atributos da diretiva page.
Erro comum de programao 31.9 Fornecer vrias diretivas page com um ou mais atributos em comum causa um erro em tempo de traduo de JSP. Erro comum de programao 31.10 Fornecer uma diretiva page com um atributo ou valor que no seja reconhecido um erro em tempo de traduo de JSP.

Diretiva
page include

Descrio
Define as configuraes de pgina para o continer de JSP processar. Faz com que o continer de JSP realize uma insero em tempo de traduo de outro contedo do recurso. Enquanto a JSP traduzida em um servlet e compilada, o arquivo designado substitui a diretiva include e traduzido como se fosse originalmente parte da JSP. Permite incluir suas prprias marcas na forma de bibliotecas de marcas. Elas podem ser utilizadas para encapsular funcionalidades e simplificar a codificao de uma JSP.

taglib

Fig. 31.26

Diretivas JSP.

Atributo
language extends import

Descrio
A linguagem de criao de scripts utilizada em JSP. Atualmente, o nico valor vlido para esse atributo java. Especifica a classe a partir da qual a JSP traduzida ser herdada. Esse atributo deve ser um nome de classe e um pacote completamente qualificado. Especifica uma lista de nomes separados por vrgulas de classe e/ou pacotes completamente qualificados que sero utilizados na JSP atual. Quando a linguagem de criao de scripts for java, a lista de importao padro java.lang.*, javax.servlet.*, javax.servlet.jsp.* e javax.servlet.http.*. Se vrias propriedades import forem especificadas, os nomes de pacote so colocados em uma lista pelo continer. Especifica se a pgina participa de uma sesso. Os valores para esse atributo so true (participa de uma sesso o padro) ou false (no participa de uma sesso). Quando a pgina faz parte de uma sesso, o objeto implcito JSP session est disponvel para utilizao na pgina. Caso contrrio, session no est disponvel. No ltimo caso, utilizar session no cdigo de script resulta em um erro em tempo de traduo.

session

Fig. 31.27

Atributos da diretiva page (parte 1 de 2).

1060

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Atributo
buffer

Descrio
Especifica o tamanho do buffer de sada utilizado com o objeto implcito out. O valor desse atributo pode ser none para nenhum armazenamento em buffer ou um valor como 8kb (o tamanho-padro do buffer). A especificao JSP indica que o buffer utilizado deve ser pelo menos do tamanho especificado. Quando configurado como true (o valor-padro), esse atributo indica que o buffer de sada utilizado com o objeto implcito out deve ser esvaziado automaticamente quando o buffer for preenchido. Se configurado como false, ocorre uma exceo se o buffer estourar. O valor desse atributo deve ser true se o atributo de buffer estiver configurado como none. Especifica se a pgina segura para thread. Caso seja true (o padro), a pgina considerada segura para thread e pode processar vrias solicitaes ao mesmo tempo. Caso seja false, o servlet que representa a pgina implementa a interface java.lang.SingleThreadModel e apenas uma solicitao pode ser processada por vez por essa JSP. O padro JSP permite que existam vrias instncias de uma JSP para as JSPs que no so seguras para thread. Isso permite que o continer trate as solicitaes de forma mais eficiente. Entretanto, no garante que os recursos compartilhados atravs de instncias JSP sejam acessados de uma maneira segura para thread. Especifica um string de informaes que descreve a pgina. Esse string retornado pelo mtodo getServletInfo do servlet que representa a JSP traduzida. Pode ser invocado pelo objeto implcito de JSP page. Qualquer exceo na pgina atual que no capturada enviada para a pgina de erro, para processamento. O objeto implcito exception da pgina de erro faz referncia exceo original. Especifica se a pgina atual uma pgina de erro que ser invocada em resposta a um erro em outra pgina. Se o valor do atributo for true, o objeto implcito exception criado e faz referncia exceo original que ocorreu. Caso seja false (o padro), qualquer utilizao do objeto exception na pgina resulta em um erro em tempo de traduo. Especifica o tipo MIME dos dados na resposta para o cliente. O tipo-padro text/html.

autoFlush

isThreadSafe

info

errorPage

isErrorPage

contentType

Fig. 31.27

Atributos da diretiva page (parte 2 de 2). Observao de engenharia de software 31.11 De acordo com a seo de especificao JSP 2.7.1, o atributo extends no deve ser utilizado sem uma cuidadosa considerao, visto que restringe a capacidade do continer de JSP de fornecer superclasses especializadas que podem melhorar a qualidade do servio oferecido. Lembre-se de que uma classe Java pode estender exatamente uma outra classe. Se sua JSP especificar uma superclasse explcita, o continer de JSP no pode traduzir sua JSP em uma subclasse de uma de suas prprias classes de servlet aprimoradas do aplicativo continer. Erro comum de programao 31.11 Utilizar o objeto implcito JSP session em uma JSP que no tem o atributo session de sua diretiva page configurado como true gera um erro em tempo de traduo.

31.7.2 Diretiva include


A diretiva include inclui o contedo de outro recurso apenas uma vez, em tempo de traduo da JSP. A diretiva include tem somente um atributo file que especifica o URL da pgina a ser includa. A diferena entre a diretiva include e a ao <jsp:include> s notvel se o contedo includo se alterar. Por exemplo, se a definio de um documento XHTML se alterar depois que for includo com a diretiva include, as invocaes futuras da JSP mostraro o contedo original do documento XHTML, no o novo contedo. Ao contrrio, a ao <jsp:include> processada em cada solicitao para a JSP. Portanto, as alteraes no contedo includo seriam visveis na prxima solicitao para a JSP que utiliza a ao <jsp:include>.

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM Observao de engenharia de software 31.12

1061

A especificao 1.1 de JavaServer Pages no fornece um mecanismo para atualizar o texto includo em uma JSP com a diretiva include. A verso 1.2 da especificao JSP permite que o continer fornea esse mecanismo, mas a especificao no oferece isso diretamente.

A JavaServer Page includeDirective.jsp (Fig. 31.28) reimplementa a JavaServer Page include.jsp (Fig. 31.10) utilizando as diretivas include. Para testar includeDirective.jsp no Tomcat, copie o arquivo includeDirective.jsp na pasta jsp criada na Seo 31.3. Abra o navegador e insira o seguinte URL para testar o includeDirective.jsp:
http://localhost:8080/advjhtp1/jsp/includeDirective.jsp

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

<?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.28: includeDirective.jsp --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Using the include directive</title> <style type = "text/css"> body { font-family: tahoma, helvetica, arial, sans-serif; } table, tr, td { font-size: .9em; border: 3px groove; padding: 5px; background-color: #dddddd; } </style> </head> <body> <table> <tr> <td style = <img src width alt = </td> <td> <%-- inclui banner.html nessa JSP --%> <%@ include file = "banner.html" %> </td> </tr> <tr> <td style = "width: 160px">

"width: 160px; text-align: center"> = "images/logotiny.png" = "140" height = "93" "Deitel & Associates, Inc. Logo" />

Fig. 31.28

JSP includeDirective.jsp demonstra a incluso de contedo em tempo de traduo com a diretiva include (parte 1 de 2).

1062
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

<%-- inclui toc.html nessa JSP --%> <%@ include file = "toc.html" %> </td> <td style = "vertical-align: top"> <%-- inclui clock2.jsp nessa JSP --%> <%@ include file = "clock2.jsp" %> </td> </tr> </table> </body> </html>

Fig. 31.28

JSP includeDirective.jsp demonstra a incluso de contedo em tempo de traduo com a diretiva include (parte 2 de 2).

31.8 Bibliotecas de marcas personalizadas


Ao longo deste captulo, voc tem visto como as JavaServer Pages podem simplificar a entrega de contedo Web dinmico. Nossa discusso continua com as bibliotecas JSP de marcas personalizadas, que fornece outro mecanismo para encapsular funcionalidades complexas para utilizao em JSPs. As bibliotecas de marcas personalizadas definem uma ou mais marcas personalizadas que os implementadores JSP podem utilizar para criar contedo dinmico. A funcionalidade dessas marcas personalizadas definida nas classes Java que implementam a interface Tag (pacote javax.servlet.jsp.tagext), normalmente estendendo a classe TagSupport ou BodyTagSupport. Esse mecanismo permite criar uma complexa funcionalidade para os projetistas de pgina Web que no tem nenhum conhecimento de programao Java.

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1063

Anteriormente, apresentamos a ao <jsp:useBean> e JavaBeans para incorporar funcionalidades complexas e encapsuladas em JSP. Em muitos casos, a ao <jsp:useBean> e o JavaBeans podem realizar as mesmas tarefas que as marcas personalizadas. Entretanto, a ao <jsp:useBean> e o JavaBeans apresentam desvantagens os JavaBeans no podem manipular o contedo JSP e os projetistas de pginas Web devem ter algum conhecimento de Java para utilizar os JavaBeans. Com as marcas personalizadas, possvel lanar mo de uma funcionalidade complexa sem se conhecer nada de Java. Nesta seo, apresentamos trs exemplos de marcas personalizadas. Cada marca faz parte de uma nica biblioteca de marcas personalizadas que chamamos de advjhtp1. A JSP inclui uma biblioteca de marcas personalizadas com a diretiva taglib. A Fig. 31.29 resume os atributos da diretiva taglib.

Atributo
uri tagPrefix

Descrio
Especifica o URI relativo ou absoluto do descritor da biblioteca de marcas. Especifica o prefixo que distingue as marcas personalizadas das marcas predefinidas. Os nomes de prefixo jsp, jspx, java, javax, servlet, sun e sunw so reservados.

Fig. 31.29

Atributos da diretiva taglib.

Todos os exemplos nesta seo utilizam a diretiva taglib. H vrios tipos de marcas personalizadas com diferentes nveis de complexidade. Demonstramos as marcas simples, as simples com atributos e as que podem processar seus elementos corpo. Para obter detalhes completos sobre as bibliotecas de marcas personalizadas, veja os recursos na Seo 31.9.

31.8.1 Marca personalizada simples


Nosso primeiro exemplo de marca personalizada implementa uma marca personalizada simples que insere o string Welcome to JSP Tag Libraries em uma JSP. Ao criar marcas personalizadas, voc deve definir uma classe tratadora de marca para cada marca que implementar funcionalidades da marca, um descritor de biblioteca de marcas que fornece informaes sobre a biblioteca de marcas e as marcas personalizadas para o continer de JSP, e uma JSP que utilize a marca personalizada. A Fig. 31.30 (customTagWelcome.jsp) demonstra nossa primeira marca personalizada. No final desta seo, mostramos como configurar esse exemplo para teste no Tomcat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.30: customTagWelcome.jsp --> <!-- JSP que utiliza uma marca personalizada para exibir contedo. --> <%-- diretiva taglib --%> <%@ taglib uri = "advjhtp1-taglib.tld" prefix = "advjhtp1" %> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Simple Custom Tag Example</title> </head> <body> <p>The following text demonstrates a custom tag:</p> <h1> <advjhtp1:welcome />

Fig. 31.30

JSP customTagWelcome.jsp utiliza uma marca personalizada simples (parte 1 de 2).

1064
21 22 23 24

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

</h1> </body> </html>

Fig. 31.30

JSP customTagWelcome.jsp utiliza uma marca personalizada simples (parte 2 de 2).

A diretiva taglib na linha 9 permite que a JSP utilize as marcas em nossa biblioteca de marcas. A diretiva especifica o uri do arquivo descritor da biblioteca de marcas (advjhtp1-taglib.tld; Fig. 31.32) que fornece informaes sobre nossa biblioteca de marcas para o continer de JSP e o prefix para cada marca (advjhtp1). Os programadores JSP utilizam a biblioteca de marcas prefix quando se referem s marcas em uma determinada biblioteca. A linha 20 utiliza uma marca personalizada chamada welcome para inserir texto na JSP. Observe que o prefixo advjhtp1: vem antes do nome da marca. Isso permite que o continer de JSP interprete o significado da marca e invoque o tratador de marcas apropriado. Note tambm que a linha 20 pode ser escrita com as marcas de abertura e de finalizao, como segue
<advjhtp1:welcome> </advjhtp1:welcome>

A Fig. 31.31 define a classe WelcomeTagHandler o tratador de marca que implementa a funcionalidade de nossa marca personalizada welcome. Cada tratador deve implementar a interface Tag, que define os mtodos que um continer de JSP invoca para incorporar a funcionalidade de uma marca em uma JSP. A maioria das classes do tratador implementa a interface Tag, estendendo a classe TagSupport ou a classe BodyTagSupport.
Observao de engenharia de software 31.13 As classes que definem os tratadores de marcas personalizadas devem implementar a interface Tag a partir do pacote javax.servlet.jsp.tagext. Observao de engenharia de software 31.14 A classe tratador de marca personalizada deve estender a classe TagSupport se o corpo da marca for ignorado ou simplesmente enviado para a sada durante o processamento da marca personalizada. Observao de engenharia de software 31.15 A classe tratador de marca personalizada deve estender a classe BodyTagSupport se o tratador interagir com o contedo do corpo da marca. Observao de engenharia de software 31.16 Os tratadores de marcas personalizadas devem ser definidos nos pacotes Java.

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1065

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

// Fig. 31.31: WelcomeTagHandler.java // Tratador de marca personalizada que trata uma marca simples. package com.deitel.advjhtp1.jsp.taglibrary; // Pacotes do ncleo Java import java.io.*; // pacotes de extenso Java import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class WelcomeTagHandler extends TagSupport { // Mtodo chamado para iniciar o processamento da marca public int doStartTag() throws JspException { // tenta o processamento da marca try { // obtm JspWriter para enviar o contedo para a sada JspWriter out = pageContext.getOut(); // imprime o contedo out.print( "Welcome ta JSP Tag Libraries!" ); } // relana IOException para o continer de JSP como JspException catch( IOException ioException ) { throw new JspException( ioException.getMessage() ); } return SKIP_BODY; } } // ignora o corpo da marca

Fig. 31.31

Tratador de marca personalizada WelcomeTagHandler.

A classe WelcomeTagHandler implementa a interface Tag estendendo a classe TagSupport (ambas do pacote java.servlet.jsp.tagext). Os mtodos mais importantes da interface Tag so doStartTag e doEndTag. O continer de JSP invoca esses mtodos ao encontrar a marca personalizada de abertura e a marca personalizada de fechamento, respectivamente. Esses mtodos lanam JspExceptions se forem encontrados problemas durante o processamento da marca personalizada.
Observao de engenharia de software 31.17 Se ocorrerem excees diferentes de JspExceptions em uma classe tratadora de marca personalizada, elas devem ser capturadas e processadas. Se impedirem o processamento adequado da marca, devem ser relanadas como JspExceptions.

Nesse exemplo, a classe WelcomeTagHandler anula o mtodo doStartTag para gerar como sada o texto que se torna parte da resposta da JSP. A linha 20 utiliza o objeto pageContext do tratador de marca personalizada (herdado da classe TagSupport) para obter o objeto JspWriter que o mtodo doStartTag utiliza para gerar texto como sada. A linha 23 utiliza o JspWriter para gerar um string como sada. A linha 31 retorna a constante SKIP_BODY do inteiro static (definida na interface Tag) para indicar que o continer de JSP deve ignorar qualquer texto ou outros elementos que aparecem no corpo da marca. Para incluir o contedo de corpo como parte da resposta, especifique a constante inteira static EVAL_BODY_INCLUDE como valor de retorno. Esse exemplo no exige nenhum processamento quando a marca de fechamento for encontrada pelo continer de JSP; assim, no anulamos doEndTag. A Fig. 31.32 define o arquivo descritor da biblioteca de marcas personalizadas. Esse documento XML especifica as informaes necessrias pelo continer de JSP, como o nmero da verso da biblioteca de marcas (elemento

1066

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

tlibversion), o nmero da verso do JSP (elemento jspversion), informaes sobre a biblioteca (elemento info) e informaes sobre as marcas na biblioteca (um elemento tag para cada marca). Nesse descritor de biblioteca de marcas, o elemento tag nas linhas 18-30 descreve nossa marca welcome. A linha 19 especifica a marca name utilizada pelos programadores JSP para acessar as funcionalidades personalizadas em uma JSP. As linhas 21-23 especificam o tagclass a classe tratadora de marcas personalizadas. Esse elemento associa o nome da marca com uma classe especfica tratadora de marcas. O elemento bodycontent (linha 25) especifica que nossa marca personalizada tem um corpo empty. Esse valor tambm pode ser tagdependent ou JSP. As linhas 2729 especificam as informaes sobre a marca com um elemento info. [Nota: introduzimos outros elementos do descritor de biblioteca de marcas conforme necessrio. Para obter uma descrio completa do descritor de biblioteca de marcas, veja a especificao 1.1 das JavaServer Pages, que pode ser baixada do endereo java.sun.com/ products/jsp/download.html.]
Observao de engenharia de software 31.18 A classe tratadora de marcas personalizadas deve ser especificada com seu nome completo de pacote no elemento tagclass do descritor de biblioteca de marcas.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

<?xml version = "1.0" encoding = "ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <!-- Um descritor de biblioteca de marcas --> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>advjhtp1</shortname> <info> A simple tab library for the examples </info> <!-- Uma marca simples que gera contedo --> <tag> <name>welcome</name> <tagclass> com.deitel.advjhtp 1.jsp.taglibrary.WelcomeTagHandler </tagclass> <bodycontent>empty</bodycontent> <info> Inserts content welcoming user to tag libraries </info> </tag> </taglib>

Fig. 31.32

Arquivo descritor da biblioteca de marcas personalizadas (advjhtp1-taglib.tld).

Para testar customTagWelcome.jsp no Tomcat, copie os arquivos customTagWelcome.jsp e advjhtp1-taglib.tld para a pasta jsp criada na Seo 31.3. Copie WelcomeTagHandler.class para a pasta WEB-INF\classes do aplicativo Web advjhtp1 no Tomcat. [Nota: a classe WelcomeTagHandler deve aparecer em sua estrutura adequada de pastas de pacote na pasta classes. WelcomeTagHandler definido no pacote com.deitel.advjhtp1.jsp.taglibrary.] Abra o navegador e insira o seguinte URL para testar o customTagWelcome.jsp:
http://localhost:8080/advjhtp1/jsp/customTagWelcome.jsp

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1067

31.8.2 Marca personalizada com atributos


Muitos elementos XHTML e JSP utilizam atributos para personalizar suas funcionalidades. Por exemplo, um elemento XHTML pode especificar um atributo style que indica como o elemento deve ser formatado no navegador do cliente. De maneira semelhante, os elementos de ao da JSP tm atributos que ajudam a personalizar seu comportamento em uma JSP. Nosso prximo exemplo demonstra como especificar atributos para suas marcas personalizadas. A Fig. 31.33 (customTagAttribute.jsp) semelhante Fig. 31.30. Esse exemplo utiliza uma nova marca, chamada welcome2, para inserir o texto na JSP que personalizada com base no valor do atributo firstName. A captura de tela mostra os resultados das marcas welcome2 nas linhas 20 e 30. A marca na linha 20 especifica o valor "Paul" para o atributo firstName. As linhas 26-28 definem um scriptlet que obtm o valor de parmetro name da solicitao e o atribui referncia name de String. A linha 30 utiliza o name em uma expresso JSP como valor para o atributo firstName. Na captura de tela do exemplo, essa JSP foi invocada com o seguinte URL:
http://localhost:8080/advjhtp1/jsp/ customTagAttribute.jsp?firstName=Sean

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

<?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 31.33: customTagAttribute.jsp --> <!-- JSP que utiliza uma marca personalizada para exibir contedo. --> <%-- diretiva taglib --%> <%@ taglib uri = "advjhtp1-taglib.tld" prefix = "advjhtp1" %> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Specifying Custom Tag Attributes</title> </head> <body> <p>Demonstrating an attribute with a string value</p> <h1> <advjhtp1:welcome2 firstName = "Paul" /> </h1> <p>Demonstrating an attribute with an expression value</p> <h1> <%-- scriptlet que obtm o parmetro da solicitao "name" --%> <% String name = request.getParameter( "name" ); %> <advjhtp1:welcome2 firstName = "<%= name %>" /> </h1> </body> </html>

Fig. 31.33

Especificando atributos para uma marca personalizada (parte 1 de 2).

1068

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Fig. 31.33

Especificando atributos para uma marca personalizada (parte 2 de 2).

Ao definir o tratador de marca personalizada para uma marca com atributos, voc deve fornecer os mtodos que permitem configurar os valores dos atributos no tratador de marca. Os mtodos que manipulam atributos seguem a mesma conveno para atribuio de nomes do mtodo set e get que as propriedades JavaBean. Portanto, o atributo firstName da marca personalizada configurado com o mtodo setFirstName. De maneira semelhante, o mtodo para se obter o valor do atributo firstName seria getFirstName (no definimos esse mtodo para esse exemplo). A classe Welcome2TagHandler (Fig. 31.34) define sua varivel firstName na linha 13 e um mtodo set correspondente setFirstName (linhas 37-40). Quando o continer de JSP encontra uma marca welcome2 em uma JSP, ele cria um novo objeto Welcome2TagHandler para processar a marca e configurar os atributos dela. Em seguida, o continer invoca o mtodo doStartTag (linhas 16-34) para realizar o processamento da marca personalizada. As linhas 24-25 utilizam o valor de atributo firstName como parte da sada de texto pela marca personalizada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // Figura 31.34: Welcome2TagHandler.java // Tratador de marca personalizada que trata uma marca simples. package com.deitel.advjhtp1.jsp.taglibrary; // Pacotes do ncleo Java import java.io.*; // Pacotes de extenso Java import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class Welcome2TagHandler extends TagSupport { private String firstName = ""; // Mtodo chamado para iniciar o processamento da marca public int doStartTag() throws JspException

Fig. 31.34

Tratador da marca personalizada Welcome2TagHandler para uma marca com um atributo (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1069

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

{ // Tenta o processamento da marca try { // Obtm JspWriter para gerar contedo como sada JspWriter out = pageContext.getOut(); // Imprime o contedo out.print( "Hello " + firstName + ", <br />Welcome ta JSP Tag Libraries!" ); } // relana IOException para o continer JSP como JspException catch( IOException ioException ) { throw new JspException( ioException.getMessage() ); } return SKIP_BODY; } // Configura o atributo firstName com o nome do usurio public void setFirstName( String username ) { firstName = username; } } // Ignora o corpo da marca

Fig. 31.34

Tratador da marca personalizada Welcome2TagHandler para uma marca com um atributo (parte 2 de 2).

Antes que a marca welcome2 possa ser utilizada em uma JSP, devemos tornar o continer de JSP ciente da marca adicionando-a a uma biblioteca de marcas. Para fazer isso, adicione o elemento marca da Fig. 31.35 como um filho do elemento taglib no descritor de biblioteca de marcas advjhtp1-taglib.tld. Como no exemplo anterior, o elemento tag contm os elementos name, tagclass, bodycontent e info. As linhas 16-20 introduzem o elemento attribute para especificar as caractersticas dos atributos de uma marca. Cada atributo deve ter um elemento atributo separado que contm os elementos name, required e rtexprvalue. O elemento name (linha 17) especifica o nome do atributo. O elemento required especifica se o atributo necessrio (true) ou opcional (false). O elemento rtexprvalue especifica se o valor do atributo pode ser o resultado de uma expresso JSP avaliada em tempo de execuo (true) ou se deve ser um literal de string (false). Para testar customTagAttribute.jsp no Tomcat, copie os arquivos customTagAttribute.jsp e o atualizado advjhtp1-taglib.tld para a pasta jsp criada na Seo 31.3. Copie o arquivo Welcome2TagHandler.class para a pasta WEB-INF\classes do aplicativo Web advjhtp1 no Tomcat. [Nota: esse exemplo funcionar apenas se a estrutura de pastas do pacote adequado para Welcome2TagHandler for definida na pasta classes.] Abra o navegador e insira o seguinte URL para testar o customTagAttribute.jsp:
http://localhost:8080/advjhtp1/jsp/ customTagAttribute.jsp?firstName=Sean

O texto ?firstName=Sean no URL anterior especifica o valor para o parmetro da solicitao name que utilizado pela marca personalizada welcome2 na linha 30 na Fig. 31.33.
1 2 3 4 5 <!-- Uma marca com um atributo --> <tag> <name>welcome2</name> <tagclass>

Fig. 31.35

Elemento tag para a marca personalizada welcome2 (parte 1 de 2).

1070
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

com.deitel.advjhtp1.jsp.taglibrary.Welcome2TagHandler </tagclass> <bodycontent>empty</bodycontent> <info> Inserts content welcoming user to tag libraries. Uses attribute "name" to insert the users name. </info> <attribute> <name>firstName</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>

Fig. 31.35

Elemento tag para a marca personalizada welcome2 (parte 2 de 2).

31.8.3 Avaliando o corpo de uma marca personalizada


As marcas personalizadas so particularmente poderosas para processar o corpo do elemento. Quando uma marca personalizada interage com o corpo do elemento, so necessrios mtodos adicionais para realizar essas interaes. Os mtodos so definidos na classe BodyTagSupport. Em nosso prximo exemplo, reimplementamos guestBookView.jsp (Fig. 31.24) e substitumos o processamento JavaBean realizado na JSP por uma marca personalizada guestlist. A Fig. 31.36 (customTagBody.jsp) utiliza a marca personalizada guestlist nas linhas 41-52. Observe que as expresses JSP no corpo do elemento guestlist utilizam nomes de varivel que no so definidos na JSP. Essas variveis so definidas pelo tratador de marca personalizada quando a marca personalizada encontrada. O tratador de marca personalizada coloca as variveis na JSP PageContext, assim as variveis podem ser utilizadas em toda a pgina. Embora nenhuma repetio seja definida na JSP, o tratador de marca personalizada definido para varrer todos os convidados no banco de dados guestbook. Essa ao resulta na criao de uma linha de tabela na pgina Web resultante, para cada convidado no banco de dados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- customTagBody.jsp --> <%-- diretiva taglib --%> <%@ taglib uri = "advjhtp1-taglib.tld" prefix = "advjhtp1" %> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Guest List</title> <style type = "text/css"> body { font-family: tahoma, helvetica, arial, sans-serif } table, tr, td, th { text-align: center;

Fig. 31.36

Utilizando uma marca personalizada que interage com o seu corpo (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1071

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

font-size: .9em; border: 3px groove; padding: 5px; background-color: #dddddd } </style> </head> <body> <p style = "font-size: 2em">Guest List</p> <table> <thead> <th style = "width: 100px">Last name</th> <th style = "width: 100px">First name</th> <th style = "width: 200px">Email</th> </thead> <%-- marca personalizada guestlist --%> <advjhtp1:guestlist> <tr> <td><%= lastName %></td> <td><%= firstName %></td> <td> <a href = "mailto:<%= email %>"> <%= email %></a> </td> </tr> </advjhtp1:guestlist> </table> </body> </html>

Fig. 31.36

Utilizando uma marca personalizada que interage com o seu corpo (parte 2 de 2).

Como ocorre em guestBookView.jsp, o tratador de marca personalizada GuestBookTag (Fig. 31.37) cria um GuestDataBean para acessar o banco de dados guestbook. A classe GuestBookTag estende Body-

1072

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

TagSupport, que contm vrios mtodos novos, incluindo doInitBody e doAfterBody (da interface BodyTag). O mtodo doInitBody chamado uma vez, depois de doStartTag e antes de doAfterBody. O mtodo doAfterBody pode ser chamado muitas vezes para processar o corpo de uma marca personalizada.
Observao de engenharia de software 31.19 O mtodo doInitBody em geral realiza processamento de uma nica vez antes de o mtodo doAfterBody processar o corpo de uma marca personalizada. Se o mtodo doStartTag retornar Tag.SKIP_BODY, o mtodo doInitBody no ser chamado.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

// Fig. 31.37: GuestBookTag.java // Tratador de marca personalizada que l as informaes do banco de // dados guestbook e disponibiliza esses dados em uma JSP. package com.deitel.advjhtp1.jsp.taglibrary; // Pacotes do ncleo Java import java.io.*; import java.util.*; // pacotes de extenso Java import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; // Pacotes Deitel import com.deitel.advjhtp1.jsp.beans.*; public class GuestBookTag extends BodyTagSupport { private String firstName; private String lastName; private String email; private GuestDataBean guestData; private GuestBean guest; private Iterator iterator; // Mtodo chamado para iniciar o processamento da marca public int doStartTag() throws JspException { // tenta o processamento da marca try { guestData = new GuestDataBean(); List list = guestData.getGuestList(); iterator = list.iterator(); if ( iterator.hasNext() ) { processNextGuest(); return EVAL_BODY_TAG; } else return SKIP_BODY; } // se ocorrer alguma exceo, no continua o processamento // do corpo da marca catch( Exception exception ) { exception.printStackTrace(); return SKIP_BODY; // ignora o corpo da marca // continua o processamento do corpo

// termina o processamento do corpo

Fig. 31.37

Tratador da marca personalizada GuestBookTag (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1073

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94

} } // processa o corpo e determina se o processamento do corpo // deve continuar public int doAfterBody() { // tenta gerar os dados do corpo try { bodyContent.writeOut( getPreviousOut() ); } // se ocorrer exceo, termina o processamento do corpo catch ( IOException ioException ) { ioException.printStackTrace(); return SKIP_BODY; // termina o processamento do corpo } bodyContent.clearBody(); if ( iterator.hasNext() ) { processNextGuest(); return EVAL_BODY_TAG; // continua o processamento do corpo } else return SKIP_BODY; // termina o processamento do corpo } // obtm o prximo GuestBean e extrai seus dados private void processNextGuest() { // obtm o prximo convidado guest = ( GuestBean ) iterator.next(); pageContext.setAttribute( "firstName", guest.getFirstName() ); pageContext.setAttribute( "lastName", guest.getLastName() ); pageContext.setAttribute( "email", guest.getEmail() ); } }

Fig. 31.37

Tratador da marca personalizada GuestBookTag (parte 2 de 2).

O continer de JSP invoca o mtodo doStartTag (linhas 27-51) quando encontra a marca personalizada guestlist em uma JSP. As linhas 31-34 criam um novo GuestDataBean, para obter uma List a partir dos GuestBeans do GuestDataBean e criam um Iterator para manipular o contedo ArrayList. Se no houver nenhum elemento na lista (testado na linha 36), a linha 42 retorna SKIP_BODY para indicar que o continer no deve realizar mais nenhum processamento do corpo da marca guestlist. Caso contrrio, a linha 37 invoca o mtodo processNextGuest de private (linhas 80-93) para extrair as informaes para o primeiro convidado e criar as variveis que contm essas informaes na JSP PageContext (representada com a varivel pageContext que foi herdada de BodyTagSupport). O mtodo processNextGuest utiliza o mtodo setAttribute de PageContext para especificar o nome e o valor de cada varivel. O continer responsvel por criar variveis reais utilizadas na JSP. Faz-se isso com a ajuda da classe GuestBookTagExtraInfo (Fig. 31.38) O mtodo doAfterBody (linhas 55-77) realiza o processamento repetitivo do corpo da marca guestlist. O continer de JSP determina se o mtodo doAfterBody deve ser chamado novamente, com base no valor de re-

1074

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

torno do mtodo. Se doAfterBody retornar EVAL_BODY_TAG, o continer chamar o mtodo doAfterBody novamente. Se doAfterBody retornar SKIP_BODY, o continer vai parar de processar o corpo e invocar o mtodo doEndTag do tratador de marca personalizada para completar o processamento personalizado. A linha 59 invoca writeOut sobre a varivel bodyContent (herdada de BodyTagSupport) para processar os dados do primeiro cliente (armazenados quando doStartTag foi chamado). A varivel bodyContent faz referncia a um objeto da classe BodyContent (pacote javax.servlet.jsp.tagext). O argumento para o mtodo writeOut o resultado do mtodo getPreviousOut (herdado da classe BodyTagSupport), que retorna o objeto JspWriter para a JSP que invoca a marca personalizada. Isso permite que a marca continue a construir a resposta para o cliente utilizando o mesmo fluxo de sada que a JSP. Em seguida, a linha 68 invoca o mtodo clearBody de bodyContent para garantir que o contedo do corpo que acabou de ser gerado no seja processado como parte da prxima chamada a doAfterBody. As linhas 70-76 determinam se h mais convidados a processar. Se houver, doAfterBody invoca o mtodo private processNextGuest para obter os dados para o prximo convidado e retorna EVAL_BODY_TAG para indicar que o continer deve chamar doAfterBody novamente. Caso contrrio, doAfterBody retorna SKIP_BODY para terminar o processamento do corpo. O continer de JSP no pode criar variveis em PageContext a menos que o continer conhea os nomes e os tipos dessas variveis. Essas informaes so especificadas por uma classe com o mesmo nome do tratador de marca personalizada e que termina com ExtraInfo (GuestBookTagExtraInfo na Fig. 31.38). As classes ExtraInfo estendem a classe TagExtraInfo (pacote javax.servlet.jsp.tagext). O continer utiliza as informaes especificadas por uma subclasse de TagExtraInfo para determinar quais variveis ele deve criar (ou utilizar) no PageContext. Para especificar as informaes das variveis, anule o mtodo getVariableInfo. Esse mtodo retorna um array de objetos VariableInfo que o continer utiliza para criar novas variveis no PageContext ou para permitir que uma marca personalizada use variveis existentes no PageContext. O construtor VariableInfo recebe quatro argumentos um String que representa o nome da varivel, um String que representa o nome da classe da varivel, um boolean que indica se a varivel deve ser criada pelo continer (true, se tiver) e uma constante inteira static que representa o escopo da varivel na JSP. As constantes na classe VariableInfo so NESTED, AT_BEGIN e AT_END. NESTED indica que a varivel pode ser utilizada somente no corpo da marca personalizada. AT_BEGIN indica que a varivel pode ser utilizada em qualquer lugar na JSP depois que a marca de abertura da marca personalizada for encontrada. AT_END indica que a varivel pode ser utilizada em qualquer lugar na JSP depois da marca de fechamento da marca personalizada. Antes de utilizar a marca guestlist em uma JSP, devemos fazer com que o continer de JSP tome conscincia da existncia da marca, adicionando-a a uma biblioteca de marcas. Adicione o elemento tag da Fig. 31.39 como filho do elemento taglib no descritor de biblioteca de marcas advjhtp1-taglib.tld. Como ocorre no exemplo anterior, o elemento tag contm os elementos name, tagclass, bodycontent e info. As linhas 1012 apresentam o elemento teiclass para especificar a classe ExtraInfo da marca personalizada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // Fig. 31.38: GuestBookTagextraInfo.java // Classe que define os nomes e os tipos das variveis criadas pelo // tratador de marca personalizada GuestBookTag. package com.deitel.advjhtp1.jsp.taglibrary; // Pacotes do ncleo Java import javax.servlet.jsp.tagext.*; public class GuestBookTagExtraInfo extends TagExtraInfo { // mtodo que retorna as informaes sobre as variveis // que GuestBookTag cria para utilizao em uma JSP public VariableInfo [] getVariableInfo( TagData tagData ) { VariableInfo firstName = new VariableInfo( "firstName", "String", true, VariableInfo.NESTED ); VariableInfo lastName = new VariableInfo( "lastName",

Fig. 31.38

GuestBookTagExtraInfo utilizado pelo continer para definir as variveis de script em uma JSP que utiliza a marca personalizada guestlist (parte 1 de 2).

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1075

19 20 21 22 23 24 25 26 27 28 29

"String", true, VariableInfo.NESTED ); VariableInfo email = new VariableInfo( "email", "String", true, VariableInfo.NESTED ); VariableInfo varableInfo [] = { firstName, lastName, email }; return varableInfo; } }

Fig. 31.38

GuestBookTagExtraInfo utilizado pelo continer para definir as variveis de script em uma JSP que utiliza a marca personalizada guestlist (parte 2 de 2).

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

<!-- Uma marca que varre um ArrayList de objetos <!-- GuestBean, que podem ser exibidos em uma JSP <tag> <name>guestlist</name>

--> -->

<tagclass> com.deitel.advjhtp1.jsp.taglibrary.GuestBookTag </tagclass> <teiclass> com.deitel.advjhtp1.jsp.taglibrary.GuestBookTagExtraInfo </teiclass> <bodycontent>JSP</bodycontent> <info> Iterates over a list of GuestBean objects </info> </tag>

Fig. 31.39

Elemento tag para a marca personalizada guestlist.

Para testar customTagBody.jsp no Tomcat, copie os arquivos customTagBody.jsp e advjhtp1taglib.tld atualizados para a pasta jsp criada na Seo 31.3. Copie GuestBookTag.class e GuestBookTagExtraInfo.class na pasta WEB-INF\classes do aplicativo Web advjhtp1 no Tomcat. [Nota: esse exemplo funcionar apenas se a estrutura de pastas do pacote adequado para GuestBookTag e GuestBookTagExtraInfo for definida na pasta classes.] Abra o navegador Web e insira o seguinte URL para testar o customTagBody.jsp:
http://localhost:8080/advjhtp1/jsp/customTagBody.jsp

Esse captulo apresentou muitos recursos JSP. Entretanto, h recursos adicionais que esto alm do escopo deste livro. Para obter uma descrio completa das JavaServer Pages, veja a especificao 1.1 das JavaServer Pages, que pode ser baixada do endereo java.sun.com/products/jsp/download.html. Outros recursos JSP so listados na Seo 31.9.

31.9 Recursos na World Wide Web


java.sun.com/products/jsp

Homepage para se obter informaes sobre JavaServer Pages no site de Java da Sun Microsystems.
java.sun.com/products/servlet

Homepage para se obter informaes sobre servlets no site de Java da Sun Microsystems.

1076

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

java.sun.com/j2ee

Homepage de Java 2 Enterprise Edition no site de Java da Sun Microsystems.


www.w3.org

Homepage do World Wide Web Consortium. Esse site fornece informaes sobre os padres da Internet e da Web em desenvolvimento, como XHTML, XML e CSS.
jsptags.com

Inclui tutoriais, bibliotecas de marcas, softwares e outros recursos para programadores JSP.
jspinsider.com

Esse site sobre programao Web se concentra em recursos para programadores JSP. Inclui softwares, tutoriais, artigos, cdigo de exemplos, referncias e links para outros recursos de programao JSP e Web.

Resumo
As JavaServer Pages (JSPs) so uma extenso da tecnologia servlet. As JavaServer Pages permitem criar contedo dinmico reutilizando componentes predefinidos e interagindo com eles atravs da utilizao de scripts do lado servidor. Os programadores JSP podem criar bibliotecas de marcas personalizadas que permitem aos projetistas de pginas Web que no conhecem programao Java aprimorar suas pginas com contedo dinmico e recursos poderosos de processamento. As classes e as interfaces especficas programao de JavaServer Pages esto localizadas nos pacotes javax.servlet.jsp e javax.servlet.jsp.tagext. O download da especificao 1.1 das JavaServer Pages pode ser feito do endereo java.sun.com/products/ jsp/download.html. H quatro componentes-chave para JSPs diretivas, aes, scriptlets e bibliotecas de marcas. As diretivas especificam as informaes globais que no so associadas com uma solicitao a uma JSP particular. As aes encapsulam funcionalidades em marcas predefinidas que os programadores podem incorporar a uma JSP. Os scriptlets ou os elementos de script permitem inserir cdigo Java que interage com os componentes em uma JSP (e possivelmente outros componentes de aplicativo Web) para realizar o processamento da solicitao. As bibliotecas de marcas fazem parte do mecanismo de extenso de marcas que permite criar novas marcas que encapsulam a complexa funcionalidade de Java. As JSPs normalmente incluem marcao XHTML ou XML. Essa marcao conhecida como dados de modelo fixo ou texto de modelo fixo. Os programadores tendem a utilizar JSPs quando a maior parte do contedo enviado ao cliente forem dados de modelo fixo e somente uma pequena parte do contedo for gerada dinamicamente com cdigo Java. Os programadores utilizam servlets quando uma pequena parte do contedo corresponder a dados de modelo fixo. As JSPs normalmente so executadas como parte de um servidor Web. O servidor freqentemente conhecido como continer de JSP. Quando um servidor compatvel com JSP recebe a primeira solicitao para uma JSP, o continer traduz essa JSP em um servlet Java que trata a solicitao atual e as solicitaes futuras a uma JSP. O continer de JSP coloca as instrues em Java que implementam uma resposta JSP no mtodo _jspService em tempo de traduo. O mecanismo de solicitao/resposta e o ciclo de vida de uma JSP so os mesmos de um servlet. As JSPs podem definir os mtodos jspInit e jspDestroy invocados quando o continer inicializa uma JSP e quando o continer termina uma JSP, respectivamente. As expresses JSP so delimitadas por <%= e %>. Essas expresses so convertidas em Strings pelo continer de JSP e enviadas para a sada como parte da resposta. O elemento XHTML meta pode configurar um intervalo de atualizao para um documento que carregado em um navegador. Isso faz com que o navegador solicite o documento repetidamente no intervalo especificado em segundos. Quando voc invoca uma JSP pela primeira vez no Tomcat, h um retardo medida que o Tomcat traduz a JSP em um servlet e invoca o servlet para responder sua solicitao. Os objetos implcitos fornecem aos programadores recursos de servlet no contexto de uma JavaServer Page. Os objetos implcitos tm quatro escopos aplicativo, pgina, solicitao e sesso. Os objetos com escopo de aplicativo fazem parte do aplicativo de continer de servlet e JSP. Os objetos com escopo de pgina s existem como parte da pgina em que so utilizados. Cada pgina tem suas prprias instncias dos objetos implcitos de escopo de pgina.

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1077

Os objetos com escopo de solicitao existem at o fim da solicitao. Os objetos de escopo de solicitao saem do escopo quando o processamento de solicitao concludo com uma resposta para o cliente. Os objetos com escopo de sesso existem para a sesso de navegao inteira do cliente. Os componentes de script de JSP incluem scriptlets, comentrios, expresses, declaraes e seqncias de escape. Os scriptlets so blocos de cdigo delimitados por <% e %>. Contm instrues em Java que so colocadas no mtodo _jspService quando o continer traduz uma JSP em um servlet. Os comentrios de JSP so delimitados por <%-- e --%>. Os comentrios XHTML so delimitados por <!-- e -->. Os comentrios em Java de uma nica linha (//) e os comentrios de vrias linhas (delimitados por /* e */) podem ser utilizados dentro de scriptlets. Os comentrios de JSP e os comentrios da linguagem de criao de scripts so ignorados e no aparecem na resposta. Uma expresso de JSP, delimitada por <%= e %>, contm uma expresso em Java que avaliada quando o cliente solicita a JSP que contm a expresso. O continer converte o resultado de uma expresso de JSP em um objeto String, e assim gera como sada o String como parte da resposta para o cliente. As declaraes, delimitadas por <%! e %>, permitem definir variveis e mtodos. As variveis tornam-se variveis de instncia da classe que representa a JSP traduzida. De maneira semelhante, os mtodos tornam-se membros da classe que representa a JSP traduzida. Os caracteres especiais ou as seqncias de caractere que o continer JSP normalmente utiliza para delimitar o cdigo de JSP podem ser includos em uma JSP como caracteres literais em elementos de script, dados de modelo fixo e valores de atributo que usam seqncias de escape. As aes-padro de JSP fornecem implementadores de JSP com acesso a vrias das tarefas mais comuns realizadas em uma JSP. Os contineres de JSP processam as aes em tempo de solicitao. As JavaServer Pages suportam dois mecanismos de incluso a ao <jsp:include> e a diretiva include. A ao <jsp:include> permite que o contedo dinmico seja includo em uma JavaServer Page. Se o recurso includo se alterar entre solicitaes, a prxima solicitao para a JSP que contm a ao <jsp:include> inclui o novo contedo do recurso. A diretiva include processada uma s vez, em tempo de traduo da JSP, e faz com que o contedo seja copiado para a JSP. Se o recurso includo se alterar, o novo contedo no ser refletido na JSP que utilizou a diretiva include, a menos que a JSP seja recompilada. A ao <jsp:forward> permite encaminhar o processamento de uma solicitao para um recurso diferente. O processamento da solicitao pela JSP original termina logo que a solicitao encaminhada. A ao <jsp:param> especifica pares de nome/valor de informaes que so passadas para as aes include, forward e plugin. Cada ao <jsp:param> tem dois atributos necessrios name e value. Se uma ao param especificar um parmetro que j existe na solicitao, o novo valor para o parmetro assume precedncia sobre o valor original. Todos os valores para esse parmetro podem ser obtidos com o mtodo getParameterValues do objeto implcito de JSP request, que retorna um array de Strings. A ao de JSP <jsp:plugin> permite que um applet ou JavaBean seja adicionado a uma pgina da Web na forma de um elemento XHTML object ou embed especfico do navegador. Essa ao tambm permite o download e a instalao do Java Plug-in se ele j no estiver instalado no computador do cliente. A ao <jsp:useBean> permite manipular um objeto Java. Pode usar essa ao para criar um objeto Java para utilizao na JSP ou para localizar um objeto existente. Como os objetos implcitos JSP, os objetos especificados com a ao <jsp:useBean> possuem escopo page, request, session ou application que indica onde podem ser utilizados em um aplicativo da Web. A ao <jsp:getProperty> obtm o valor da propriedade do JavaBean. A ao <jsp:getProperty> tem dois atributos name e property que especificam o objeto bean a ser manipulado e a propriedade a ser obtida. Os valores de propriedade do JavaBean podem ser configurados com a ao <jsp:setProperty>. Essa ao particularmente til para mapear os valores de parmetro da solicitao para as propriedades do JavaBean. Os parmetros da solicitao podem ser utilizados para configurar as propriedades de tipos primitivos boolean, byte, char, int, long, float e double e os tipos de java.lang String, Boolean, Byte, Character, Integer, Long, Float e Double. A diretiva page define as informaes que esto globalmente disponveis em uma JSP. As diretivas so delimitadas por <%@ e %>. O atributo errorPage da diretiva page indica onde todas as excees no-interceptadas so encaminhadas para processamento. A ao <jsp:setProperty> tem a capacidade de corresponder aos parmetros da solicitao com as propriedades homnimas em um bean que especifica "*" para o atributo property.

1078

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

O atributo import da diretiva page permite especificar os pacotes e as classes Java utilizados no contexto de uma JSP. Se o atributo isErrorPage da diretiva page estiver configurado como true, a JSP uma pgina de erro. Essa condio permite acesso ao objeto implcito JSP exception que cria referncia a um objeto de exceo que indica qual problema ocorreu. As diretivas so mensagens para o continer JSP que permitem especificar as configuraes de pgina (como a pgina de erro), incluir o contedo de outros recursos e especificar as bibliotecas de marcas personalizadas que podem ser utilizadas em uma JSP. As diretivas so processadas no momento em que uma JSP traduzida em um servlet e compilada. Portanto, as diretivas no produzem nenhuma sada imediata. A diretiva page especifica as configuraes globais para uma JSP no continer de JSP. H muitas diretivas page, desde que haja somente uma ocorrncia de cada atributo. A exceo para essa regra o atributo import, que pode ser utilizado repetidamente para importar pacotes Java. As bibliotecas de marcas personalizadas definem uma ou mais marcas personalizadas que os implementadores de JSP podem utilizar para criar contedo dinmico. A funcionalidade dessas marcas personalizadas definida em classes Java que implementam a interface Tag (pacote javax.servlet.jsp.tagext), normalmente estendendo a classe TagSupport ou BodyTagSupport. Uma JSP pode incluir uma biblioteca de marcas personalizadas com a diretiva taglib. Ao implementar marcas personalizadas, voc deve definir uma classe tratadora de marca para cada marca, a qual fornece a funcionalidade da marca, um descritor de biblioteca de marcas que fornece informaes sobre a biblioteca de marcas e suas marcas personalizadas para o continer de JSP, e uma JSP que utiliza a marca personalizada. Os mtodos mais importantes da interface Tag so doStartTag e doEndTag. O continer de JSP invoca esses mtodos quando encontra a marca personalizada de abertura e a marca personalizada de fechamento, respectivamente. Um arquivo descritor da biblioteca de marcas personalizadas um documento XML que especifica as informaes sobre a biblioteca de marcas exigida pelo continer de JSP. A classe BodyTagSupport contm vrios mtodos para interagir com o corpo de uma marca personalizada, incluindo doInitBody e doAfterBody (da interface BodyTag). O mtodo doInitBody chamado uma vez depois de doStartTag e uma vez antes de doAfterBody. O mtodo doAfterBody pode ser chamado muitas vezes para processar o corpo de uma marca personalizada.

Terminologia
%\> seqncia de escape para %> <\% seqncia de escape para a ao <% ao ao <jsp:forward> ao <jsp:getProperty> ao <jsp:include> ao <jsp:param> ao <jsp:plugin> ao <jsp:setProperty> ao <jsp:useBean> aes-padro atributo hspace de <jsp:plugin> atributo id da ao <jsp:useBean> atributo iepluginurl de <jsp:plugin> atributo import da diretiva page atributo info da diretiva page atributo isErrorPage da diretiva page atributo isThreadSafe da diretiva page atributo jreversion de <jsp:plugin> atributo language da diretiva page atributo name de <jsp:param> atributo name de <jsp:plugin> atributo name de <jsp:setProperty> atributo nspluginurl de <jsp:plugin> atributo page de <jsp:forward> atributo page de <jsp:include> atributo param de <jsp:setProperty> atributo prefix da diretiva taglib atributo property de <jsp:setProperty> atributo scope de <jsp:useBean> atributo session da diretiva page atributo tagPrefix da diretiva taglib atributo title de <jsp:plugin> atributo type de <jsp:plugin> atributo type de <jsp:useBean> atributo uri da diretiva taglib atributo value de <jsp:param>

atributo align da ao <jsp:plugin>


atributo archive da ao <jsp:plugin> atributo autoFlush da diretiva page atributo beanName de <jsp:useBean> atributo buffer da diretiva page atributo class da ao <jsp:useBean> atributo code da ao <jsp:plugin> atributo codebase da ao <jsp:plugin> atributo contentType da diretiva page atributo de marca personalizada atributo errorPage da diretiva page atributo extends da diretiva page atributo file da diretiva include atributo flush da ao <jsp:include> atributo height de <jsp:plugin>

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM atributo value de <jsp:setProperty> atributo vspace de <jsp:plugin> atributo width de <jsp:plugin> attribute de descritor de biblioteca de marcas biblioteca de marcas biblioteca de marcas personalizadas classe BodyTagSupport classe TagExtraInfo classe TagSupport comentrio constante AT_BEGIN constante AT_END constante EVAL_BODY_INCLUDE constante NESTED constante SKIP_BODY continer contedo dinmico corresponder os parmetros da solicitao dados de modelo fixo declarao delimitadores de comentrio JSP <%-- e --%> delimitadores de comentrio XHTML <!-- e --> delimitadores de declarao <%! e %> delimitadores de diretiva <%@ e %> delimitadores de expresso JSP <%= e %> delimitadores de scriptlet <% e %> descritor da biblioteca de marcas diretiva diretiva include diretiva page diretiva taglib elemento bodycontent (descritor da biblioteca de marcas) elemento de script elemento jspversion do descritor de biblioteca de marcas elemento meta elemento name do descritor de biblioteca de marcas elemento required do descritor de biblioteca de marcas elemento rtexprvalue do descritor de biblioteca de marcas elemento tag do descritor da biblioteca de marcas elemento tagclass do descritor da biblioteca de marcas elemento teiclass do descritor da biblioteca de marcas elemento tlibversion (descritor da biblioteca de marcas) encaminhar uma solicitao erro em tempo de solicitao erro em tempo de traduo escopo da aplicao escopo de pgina

1079

escopo de sesso escopo de solicitao escopo de um bean escopos de objeto implcito especificao 1.1 de JavaServer Pages especificar atributos de uma marca personalizada expresso HttpSession (javax.servlet.http) incluir um recurso incluso em tempo de traduo interface BodyContent interface BodyTag interface PageContext interface Tag intervalo de atualizao Java Plug-in JavaServer Pages (JSPs) JspWriter (pacote javax.servlet.jsp) marca personalizada marca personalizada com atributos marca personalizada simples mecanismo de extenso de marcas mtodo _jspService mtodo doAfterBody da interface BodyTag mtodo doEndTag da interface Tag mtodo doInitBody da interface BodyTag mtodo doStartTag da interface Tag mtodo getParameterValues do objeto request mtodo getVariableInfo de Tag Extra Info mtodo jspDestroy mtodo jspInit mtodo setAttribute de PageContext objeto implcito objeto implcito application objeto implcito config objeto implcito exception objeto implcito out objeto implcito page objeto implcito pageContext objeto implcito request objeto implcito response objeto implcito session pacote javax.servlet.jsp pacote javax.servlet.jsp.tagext pgina de erro par nome/valor rede cliente-servidor scriptlet seqncia de escape texto de modelo fixo tratador de marca tratador de marca personalizada

1080

INTERNET & WORLD WIDE WEB COMO PROGRAMAR

Exerccios de auto-reviso
31.1
Preencha as lacunas em cada uma das seguintes afirmaes: a) A ao de JSP __________ permite que um applet ou JavaBean seja adicionado a uma pgina Web na forma de um elemento XHTML object ou embed especfico do navegador. b) A ao __________ tem a capacidade de corresponder os parmetros da solicitao s propriedades de mesmo nome em um bean especificando "*" para o atributo property. c) H quatro componentes-chave para JSPs: __________ , __________ , __________ e __________ . d) Uma JSP pode incluir uma biblioteca de marcas personalizadas com a diretiva __________ . e) Os objetos implcitos tm quatro escopos: __________ , __________ , __________ e __________ . f) A diretiva __________ processada uma nica vez, em tempo de traduo de JSP, e faz com que o contedo seja copiado na JSP. g) As classes e as interfaces especficas programao de JavaServer Pages so localizadas nos pacotes __________ e __________ . h) As JSPs normalmente so executadas como parte de um servidor Web, conhecido como __________ . i) O mtodo__________ pode ser chamado repetidamente para processar o corpo de uma marca personalizada. j) Os componentes de script JSP incluem __________ , __________ , __________ __________ e __________. Determine se cada uma das seguintes afirmaes verdadeira ou falsa. Se for falsa, explique por qu. a) Existe um objeto com escopo de pgina em cada JSP de um aplicativo Web em particular. b) As diretivas especificam as informaes globais que no esto associadas com uma solicitao de JSP em particular. c) O continer de JSP invoca os mtodos doInitBody e doAfterBody quando encontra a marca personalizada de abertura e a marca personalizada de fechamento, respectivamente. d) As bibliotecas de marcas fazem parte do mecanismo de extenso de marcas que permite criar novas marcas que encapsulam a complexa funcionalidade de Java. e) A ao <jsp:include> avaliada uma nica vez em tempo de traduo da pgina. f) Como os comentrios XHTML, os comentrios JSP e os comentrios de linguagem da criao de script aparecem na resposta para o cliente. g) Os objetos com escopo de aplicativo fazem parte de um aplicativo Web em particular. h) Cada pgina tem suas prprias instncias de objetos implcitos de escopo de pgina. i) A ao <jsp:setProperty> tem a capacidade de corresponder os parmetros da solicitao s propriedades do mesmo nome em um bean especificando "*" para o atributo property. j) Existem objetos com escopo de sesso para toda a sesso de navegao do cliente.

31.2

Respostas aos exerccios de auto-reviso


a) <jsp:plugin>. b) <jsp:setProperty>. c) diretivas, aes, scriptlets, bibliotecas de marcas. d) taglib. e) aplicativo, pgina, solicitao e sesso. f) include. g) javax.servlet.jsp, javax.servlet.jsp.tagext. h) continer de JSP. i) doAfterBody. j) scriptlets, comentrios, expresses, declaraes, seqncias de escape. 31.2 a) Falsa. Os objetos com escopo de pgina s existem como parte da pgina em que so utilizados. b) Verdadeira. c) Falsa. O continer de JSP invoca os mtodos doStartTag e doEndTag quando encontra a marca personalizada de abertura e de fechamento, respectivamente. d) Verdadeira. e) Falsa. A ao <jsp:include> permite que o contedo dinmico seja includo em uma JavaServer Page. f) Falsa. Os comentrios JSP e de linguagem de criao de script so ignorados e no aparecem na resposta. g) Falsa. Os objetos com escopo de aplicativo fazem parte da JSP e do aplicativo de continer de servlet. h) Verdadeira. i) Verdadeira. j) Verdadeira.

31.1

CAPTULO 31 JAVASERVER PAGES (JSP): BNUS PARA DESENVOLVEDORES JAVATM

1081

Exerccios
Crie a classe ResultSetTag (um tratador de marca personalizada) que pode exibir as informaes de qualquer ResultSet. Utilize a classe GuestBookTag da Fig. 31.37 como guia. Os nomes de atributo pageContext devem ser os nomes da coluna no ResultSet. Os nomes de coluna podem ser obtidos pelo ResultSetMetaData associado com o ResultSet. Crie o descritor de biblioteca de marcas para a marca personalizada nesse exerccio e testea em uma JSP. 31.4 Crie uma JSP e um catlogo de endereos baseados em JDBC. Utilize o exemplo de livro de convidados da Fig. 31.20 Fig. 31.24 como guia. Seu catlogo de endereos deve permitir que o usurio insira, exclua e procure as entradas que desejar. 31.5 Incorpore o ResultSetTag do Exerccio 31.3 no exemplo de catlogo de endereos do Exerccio 31.4. 31.6 Reimplemente sua soluo para o Exerccio 31.5 (FAQs Web dinmicas) utilizando JSPs em vez de servlets. Crie um tratador de marca personalizada semelhante ao criado no Exerccio 31.3 para ajudar a exibir as informaes de FAQs. 31.7 Modifique sua soluo do Exerccio 31.6 de modo que a primeira JSP invocada pelo usurio retorne uma lista de tpicos de FAQs a partir da qual escolher. Cada tpico deve ser um hyperlink que invoca outra JSP com um argumento que indica o tpico que o usurio gostaria de visualizar. A JSP deve consultar o banco de dados de FAQs e retornar um documento XHTML que contm somente as FAQs desse tpico. 31.8 Reimplemente o aplicativo Web da Fig. 30.28 (pesquisa de animal favorito) com as JSPs. 31.9 Modifique sua soluo do Exerccio 31.8 para permitir que o usurio veja os resultados da pesquisa sem responder pesquisa. 31.10 Reimplemente a Fig. 30.25 (recomendaes de livro) com as JSPs. Utilize o objeto implcito de JSP session para monitorar as selees do usurio e determinar as recomendaes apropriadas de livro. Lembre-se de utilizar a diretiva page para indicar que cada JSP participa de uma sesso.

31.3

You might also like