Anda di halaman 1dari 110

Captulo 1 - A Plataforma Web

1. A Plataforma Web
A maior parte da Web so estticas. Contm informaes e links. s vezes mexem uma imagem, s vezes tm uma interface grfica que sugere alguma interatividade. As pginas realmente
interativas, que so objeto deste curso, so aquelas que no so simplesmente pginas, mas
que funcionam como interfaces para aplicaes, sejam simples ou bastante complexas.
A grande vantagem em desenvolver tais interfaces baseadas em Web a simplicidade.
Para criar a interface do usurio no precisa-se mais que saber criar uma pgina. Pode-se usar
apenas HTML ou at uma ferramenta grfica como o DreamWeaver da Macromedia ou o Microsoft FrontPage.
Criar a interface do usurio fcil. Programar a interface da pgina HTML com uma aplicao no servidor pode no ser. As ferramentas usadas para gerar formulrios freqentemente cuidam do desenvolvimento do cdigo interativo que ir tratar os dados que estes iro
receber. O problema que tais ferramentas resolvem apenas os problemas mais comuns, e
quase sempre, usando tecnologias proprietrias. Para fazer uma pgina oferecer mais que
HTML j oferece quase sempre preciso saber usar uma outra linguagem que possua recursos
de programao. Tarefas simples como validao de formulrios ou contagem de acessos no
so solucionadas usando-se apenas HTML. preciso recorrer a outras tecnologias.
Existem vrias tecnologias que oferecem recursos alm do HTTP bsico. Nem todas so
tecnologias abertas. s vezes aceitvel usar tecnologias proprietrias. Outras vezes no. Tudo
depende de onde ela aplicvel. Elas podem ser divididas em dois grupos: as que so executadas a partir do browser (lado-cliente), e as que so executadas a partir do servidor Web (ladoservidor).

1.1. Solues lado-cliente


As tecnologias lado-cliente podem comear a executar a partir do momento em que o browser
carrega uma pgina. HTML. O servidor no entende HTML nem tenta ler cdigo misturado
com ele, a no ser que sua configurao seja alterada para tal. Mas o browser precisa saber interpret-lo. Alm do HTML, um browser pode ser capacitado a interpretar diversas outras
linguagens e extenses.
As solues lado-cliente, portanto, dependem de suporte pelo browser. Se o browser
no suportar a tecnologia, pode desde simplesmente no executar, como provocar perda de
1-1

Captulo 1 - A Plataforma Web

informao. possvel usar solues lado-cliente que no dependam de forma alguma da comunicao com o servidor Web. Se a conexo com o servidor se perde, depois que toda a pgina carregada, grande parte da sua funcionalidade mantida, pois, em geral, os componentes, instrues e/ou programas esto rodando na mquina do cliente.
As principais tecnologias interativas lado-cliente, alm do prprio HTML, so: scripts do
HTML como JavaScript, JScript e VBScript; objetos ou componentes como applets Java, plugins Flash, Shockwave e controles ActiveX, outros plug-ins e dynamic HTML (DHTML). Alm das tecnologias interativas, outras tecnologias existem, que podem ou no introduzir elementos interativos. As mais recentes so a tecnologia de Cascading Style Sheets (CSS) ou folhas
de estilo, e o Extended Markup Language (XML) que permite que o provedor de contedo desenvolva uma verso personalizada de sua linguagem de formatao de pgina.
Solues lado-cliente so mais vulnerveis a incompatibilidades pois no h como o provedor de contedo garantir que os browsers dos clientes suportem totalmente as tecnologias
utilizadas. Isto comum at com as tecnologias mais populares, como JavaScript.
JavaScript uma linguagem de roteiro (script), de propriedade da Netscape e VBScript
uma linguagem de roteiro baseada no VB, de propriedade da Microsoft. Os cdigos-fonte VBScript ou JavaScript so embutidos diretamente no HTML de uma pgina e interpretado linhapor-linha pelo browser.
Para usar componentes Java, plug-ins, activeX, um objeto executvel carregado e exibido na rea da pgina. O cdigo, neste caso, no visvel ou interpretado como no caso dos
scripts. Componentes no so na verdade interpretados pelo browser, mas disparam um mdulo
de extenso (JVM, interpretadores Flash, Real-audio, etc.) para execut-los.
Os componentes mais populares so os applets e controles ActiveX. Os plug-ins (extenses pesadas) so bastante utilizados tambm mas com restries, j que dependem da plataforma onde o browser est instalado. Muita coisa que se fazia com plug-ins j se faz com componentes. Vrios plug-ins populares j foram incorporados definitivamente nos principais browsers (suporte a som, vdeo, VRML, etc.). Um dos mais populares o Flash da Macromedia.
As aplicaes lado-cliente geralmente so usadas quando a tarefa a ser executada no depende de comunicao com o servidor Web (embora freqentemente sejam usadas juntamente
com solues lado-servidor). Exemplos so a validao de campos de formulrios antes do
envio, a realizao de operaes aritmticas simples, a realizao de funes simples baseadas
na ao do usurio, etc. Em resumo: se no necessrio enviar ou recuperar algo do servidor,
pode-se usar as solues lado-cliente.
Mas fazer tudo no browser nem sempre suficiente. Para contar o nmero de acessos a
uma determinada pgina, por exemplo, pouco servem as funes matemticas do lado do cliente se estas no puderem guardar em um disco no servidor um registro com os acessos anteriores. Para isto, usamos solues lado-servidor.

1-2

Captulo 1 - A Plataforma Web

1.2. Solues lado-servidor ou cliente-servidor


Estas solues dependem da comunicao entre o cliente (browser) e servidor. Os dados ou
aes realizadas geralmente resultam da execuo de um programa ou rotina no servidor.
A comunicao cliente-servidor sempre ocorre via protocolo HTTP. o que garante
que qualquer browser vai conseguir se comunicar com qualquer servidor Web. Portanto, qualquer transformao dos dados deve ocorrer antes do envio dos mesmos s portas de comunicao, ou depois, no caso das solues lado-cliente. A transformao dos dados pode ser feita
em vrios nveis e depende da interferncia nas tarefas comuns do servidor Web. Vrios servidores possuem tecnologias proprietrias para este fim. O nvel mais baixo da programao do
servidor Web ocorre atravs da interface CGI, Common Gateway Interface. A programao CGI
de baixo nvel porque lida diretamente com a manipulao do formato dos dados enviados pelo
servidor, como a criao de cabealhos, definio de tipos de dados, etc.
CGI j foi a nica forma de interatividade via Web. Hoje, a cada dia, vem sendo
substituda por solues mais eficientes, muitas delas proprietrias. As tecnologias mais
comuns, que diferentemente do CGI, dependem do tipo e plataforma do servidor so o ISAPI,
da Microsoft, e o NSAPI, da Netscape. Estas tecnologias so mdulos ou plug-ins que
permitem que um programador desenvolva extenses destinadas ao tratamento de dados e
comunicao pelo servidor, podendo substituir totalmente o CGI com ganhos de
desempenho, porm com um razovel acrscimo de complexidade e perda de portabilidade.
Entre as SAPIs e o CGI, existem os componentes para servidor. So programas em Java
(servlets) ou objetos ActiveX que fazem o mesmo que as SAPIs, porm mantm uma portabilidade maior. Mais simples ainda so os scripts ou roteiros de cdigo embutidos em pginas Web,
que servidores devidamente configurados usam para realizar tarefas de transformao de dados
e comunicao com outros programas (ASP, JSP, LiveWire, PHP, Cold Fusion). Com essas
tecnologias, o contedo da pgina pode ser alterado no prprio servidor no momento do envio, atravs da interpretao de
Cliente
scripts, que tambm servem de
Forms
gateway com aplicaes no serviFlash Applet ActiveX
JavaScript/
dor, como bancos de dados.
Cookies
VBScript
Todas essas tecnologias substiPgina HTML
tuem completamente o CGI e
HTTP
so geralmente mais eficientes.
Todas, tambm, operam sobre o
ASP Livewire
SSI
servidor HTTP, da mesma forServidor HTTP
API Servidor
ma que CGI. Conhecer CGI,
portanto, bastante til para o
domnio de qualquer uma dessas
ASC,ADO Servlets Servidor
tecnologias.
CGI

1-3

Captulo 1 - A Plataforma Web

A figura ao lado ilustra algumas das principais tecnologias utilizadas no desenvolvimento


de pginas interativas e aplicaes intranet.

1.3. A plataforma Web


A World Wide Web um servio TCP/IP baseado no protocolo de nvel de aplicao HTTP
(HyperText Transfer Protocol) Protocolo de Transferncia de Hipertexto. A plataforma Web o meio
virtual formado pelos servidores HTTP (servidores Web que mantm sites), clientes HTTP
(browsers) e protocolo HTTP (a lngua comum entre o cliente e o servidor).

Hipertexto
Hipertexto uma forma no linear de publicao de informaes onde palavras que aparecem no decorrer do texto podem levar a outras sees de um documento, outros documentos ou at outros sistemas de informao, fugindo da estrutura linear original de um texto simples. O hipertexto baseia-se em ligaes entre dois pontos chamados de ncoras. As ligaes
entre as ncoras so chamadas de vnculos (links). Vnculos de hipertexto so implementados em
textos publicados na Web usando uma linguagem declarativa chamada HTML - HyperText Markup Language.

HTML
HTML usada para marcar um arquivo de texto simples (texto simples texto sem formatao alguma, visualizvel em qualquer editor de textos). Se um arquivo de texto simples receber
uma extenso de nome de arquivo .html ou .htm, um navegador como o Internet Explorer ir tentar interpret-lo como HTML. Dentro do texto, pode-se definir descritores (ou comandos HTML) entre os smbolos < e >:
<h1>Arquivo de texto</h1>
<p>Este o <i>primeiro</i> pargrafo.</p>

Os descritores s sero visveis quando o arquivo for visualizado em um editor de textos (como o Bloco de Notas do Windows). Ao ser visualizado em um programa capaz de entender HTML, apenas o texto aparece, com uma aparncia determinada pelos descritores:

Arquivo de texto
Este o primeiro pargrafo.
O texto com marcadores chamado cdigo-fonte HTML. O cdigo-fonte usado para
produzir a pgina visualizada o browser que chamada de pgina HTML ou pgina Web.
O browser, por ser capaz de exibir diversos tipos de informao, depende totalmente da
extenso do arquivo para saber o que fazer com ele. Se a extenso .htm ou .html no estiver
presente ou se o arquivo tiver a extenso .txt, o browser exibir o cdigo-fonte.
1-4

Captulo 1 - A Plataforma Web

Alm da formatao da pgina, o HTML responsvel tambm pela incluso de imagens


e definio dos links que permitem a navegao em hipertexto.

Servidor HTTP
O servio HTTP funciona de forma semelhante ao servio FTP - File Transfer Protocol
(protocolo de comunicao usado na Web para operaes de transferncia de arquivos). Ambos oferecem aos seus clientes um sistema de arquivos virtual onde podem localizar recursos (arquivos, programas, etc.) e transferi-los de um computador para outro. O sistema virtual pode ter
uma hierarquia prpria e totalmente diferente do sistema de arquivos real do computador, ao qual est
vinculado. Geralmente um servidor tem acesso a uma rea restrita da mquina e s permite a
visualizao dos arquivos l contidos. O sistema de arquivos virtual usa uma notao diferente
daquela usada pelo sistema real. Por exemplo, considere o seguinte sistema de diretrios no
Windows:
C:\
C:\Windows
C:\Documentos
C:\Documentos\Web\
C:\Documentos\Web\Imagens
C:\Documentos\Web\Videos

Suponha que um servidor HTTP foi instalado nessa mquina. Na instalao, ele configurado para administrar um sistema de diretrios a partir de um certo diretrio. Suponha que
esse diretrio C:\Documentos\Web\. Para o servidor, isto seu diretrio raiz. No sistema
de diretrios virtual, o diretrio raiz de um servidor chamado de / (barra). O sistema de arquivos virtual (a parte que um browser poder ter acesso) :
/
/Imagens
/Videos

(C:\Documentos\Web\)
(C:\Documentos\Web\Imagens)
(C:\Documentos\Web\Videos)

Um browser jamais ter acesso ao diretrio Windows, por exemplo. A principal funo
de um servidor Web , portanto, administrar um sistema de arquivos e diretrios virtual e atender
requisies dos clientes HTTP (os browsers), que, na maior parte das vezes, enviam comandos
HTTP pedindo que o servidor devolva um ou mais arquivos localizados nesses diretrios. Os
pedidos so feitos atravs de uma sintaxe especial chamada de URI.

URIs (URLs1)
Todas as comunicaes na plataforma Web utilizam uma sintaxe de endereamento
chamada URI - Uniform Resource Identifier - para localizar os recursos que so transferidos. O
URIs tambm so frequentemente chamadas de URLs (Uniform Resource Locators). A URL um tipo
particular de URI mas, para a nossa discusso, essa distino irrelevante. A documentao HTML
(especificao) sempre refere-se essa sintaxe como URI.

1-5

Captulo 1 - A Plataforma Web

servio HTTP depende da URI que usada para localizar qualquer coisa na Internet. Contm
duas informaes essenciais: 1) COMO transferir o objeto (o protocolo); 2) ONDE encontrlo (o endereo da mquina e o caminho virtual). URIs tipicamente so constitudas de trs partes:
x mecanismo (protocolo) usado para ter acesso aos recursos (geralmente HTTP)
x nome da mquina (precedido de //) onde o servio remoto oferecido (e a porta, se
o servio no estiver em uma porta padro) ou outro nome atravs do qual o servio
possa ser localizado (sem //).
x nome do recurso (arquivo, programa) na forma de um caminho (no sistema de arquivos virtual do servidor) onde se possa encontr-lo dentro da mquina.
Sintaxe tpica:
protocolo://maquina:porta/caminho/recurso

As URIs mais comuns so os endereos da Web, que utilizam o mecanismo HTTP para
realizar a transferncia de dados:
http://www.maquina.com.br/caminho/para/minha/pgina/texto.html

Veja algumas outras URLs:


x

ftp://usuario:senha@maquina.com/pub/arquivo.doc

Acesso a servidor FTP que exige usurio e senha para fazer download de arquivo.doc
x

nntp://news.com.br/comp.lang.java

Acesso a servidor de newsgroups para ler o grupo comp.lang.java


x

news:comp.lang.java

Acesso ao grupo comp.lang.java atravs de servidor default (definido localmente)


x

http://www.ibpinet.net/

Acesso pgina default disponvel no diretrio raiz do servidor Web de www.ibpinet.net


x

http://www.algumlugar.com:8081/textos/

Acesso pgina default disponvel no diretrio textos do servidor Web que roda na porta 8081 da mquina www.algumlugar.net
x

http://www.busca.com/progbusca.exe?opcoes=abc&pesquisa=dracula

Passagem de parmetros de pesquisa para programa de busca progbusca.exe que ter sua
execuo iniciada pelo servidor HTTP que roda na porta 80 (default) de
www.busca.com.
x

http://www.ibpinet.net/helder/dante/pt/inferno/notas_4.html#cesar

Acesso uma seo da pgina HTML notas_4.html identificada como cesar, localizada
no subdiretrio virtual /helder/dante/pt/inferno/ do servidor Web de www.ibpinet.net.
x

mailto:helder@ibpinet.net

Acesso janela de envio de e-mail do cliente de correio eletrnico local.

1-6

Captulo 1 - A Plataforma Web

Browser
O browser um programa que serve de interface universal a todos os servios que podem ser oferecidos via Web. para a plataforma Web o que o sistema operacional (Windows,
Linux, Mac) para o computador. A principal funo de um browser ler e exibir o contedo
de uma pgina Web. A maior parte dos browsers tambm capaz de exibir vrios outros tipos
de informao como diversos formatos de imagens, vdeos, executar sons e rodar programas.
Um browser geralmente usado como cliente HTTP aplicao de rede que envia requisies a um servidor HTTP e recebe os dados (uma pgina HTML, uma imagem, um programa) para exibio, execuo ou download. Browsers tambm podem ser usados off-line como
aplicao local do sistema operacional para navegar em sistemas de hipertexto construdos com
arquivos HTML (sem precisar de servidor HTTP). Nesse caso, no se comportam como clientes HTTP (j que no esto realizando operaes em rede) mas apenas como visualizadores de
mdia interativa capazes de visualizar HTML, imagens, sons, programas, etc.
Como os browsers precisam interpretar vrios tipos de cdigo (cdigo de imagens GIF,
JPEG, cdigo de programas Java e Flash, cdigos de texto HTML ou texto simples) preciso
que ele saiba identificar os dados que recebe do servidor. Isto no a mesma coisa que identificar um arquivo carregado do disco local, onde ele pode identificar o tipo atravs da extenso.
Quando os dados chegam atravs da rede, a extenso no significa nada. O servidor precisa
informar ao browser o que ele est enviando. Na Web, isto feito atravs de uma sintaxe padro para definir tipos chamada MIME - Multipart Internet Mail Extensions.

Tipos MIME
MIME uma sintaxe universal para identificar tipos de dados originalmente utilizada para permitir o envio de arquivos anexados via e-mail. O servidor Web possui, internamente,
tabelas que relacionam os tipos de dados (na sintaxe MIME) com a extenso dos arquivos por
ele gerenciados. Quando ele envia um conjunto de bytes para o browser, envia antes um cabealho (semelhante ao cabealho de e-mail) informando o nmero de bytes enviados e o tipo MIME
dos dados para que o browser saiba o que fazer com a informao. A sintaxe MIME tem a
seguinte forma:
tipo/subtipo

O tipo classifica um conjunto de bytes como imagens, textos, vdeos, programas (aplicaes), etc. O subtipo informa caractersticas particulares de cada tipo. No basta saber que o
arquivo uma imagem, preciso saber qual o formato, pois o cdigos usados para produzir
imagens de mesma aparncia grfica podem diferir bastante entre si. Tanto no servidor como
no browser h tabelas que relacionam extenses de arquivo a tipos MIME:
image/jpeg
image/png
image/gif
text/html

.jpe, .jpg, .jpeg


.png
.gif
.html, .htm, .jsp, .asp, .shtml

1-7

Captulo 1 - A Plataforma Web


text/plain
x-application/java

.txt
.class

O protocolo HTTP
O protocolo HTTP funciona de forma semelhante ao protocolo FTP File Transfer Protocol (protocolo de comunicao usado na Web para operaes de transferncia de arquivos).
Uma mquina servidora que oferece o servio HTTP geralmente usa a porta TCP/IP de nmero 80 (ou 443 para transaes seguras com SSL), reservada para esse servio. Diferentemente do FTP, o protocolo HTTP no mantm uma sesso aberta entre transferncias. Cada operao consiste de um nico envio de requisio pelo cliente, seguido de uma nica resposta. Ou
seja, h uma conexo, um envio de requisio, um recebimento de resposta e o fim da conexo. No h persistncia de informaes entre as transaes (no possvel manter o estado de
variveis entre pginas). HTTP , portanto, um protocolo que no mantm estado nem conexo.
Usar HTTP para transferir uma pgina com vrios objetos (imagens, componentes) exigir vrios acessos. Cada objeto transferido conta como um acesso e o servidor no conhece
relao alguma entre eles. Uma pgina com 50 imagens precisar de 51 acessos para que possa
ser exibida por completo na tela de um browser.

Comunicao entre clientes e servidores HTTP


A comunicao entre o browser e o servidor ocorre atravs de requisies e respostas
HTTP. Cada requisio contm uma linha com um mtodo HTTP detalhando como e o que
deve ser pedido ao servidor, seguido por um cabealho com informaes adicionais sobre a
requisio. Cada requisio recebe do servidor uma resposta que contm uma linha onde informa o estado da conexo, seguida tambm por um cabealho que descreve os dados que
sero devolvidos em seguida. Estes cabealhos tambm causam a definio de propriedades no
sistema do servidor (variveis de ambiente) que possibilitam a realizao de operaes interativas
como o CGI. A definio dos cabealhos baseada na especificao RFC822.
A tarefa do servidor localizar o arquivo, identificar o seu tipo de dados, montar um cabealho que contenha informaes sobre este arquivo (tipo de dados, tamanho, data de modificao, etc.) e enviar as informaes para a sada padro. O servidor no analisa o contedo
do arquivo mas simplesmente o redireciona porta HTTP, portanto o servidor no precisa
conhecer nem ser capaz de interpretar HTML.
Quando um visitante clica em um vnculo de hipertexto ou quando um usurio de browser digita uma nova URI na barra de endereos, o browser envia uma requisio para o servidor. Este, por sua vez, enviar sempre uma resposta, havendo ou no sucesso. Uma transao
tpica est mostrada a seguir:
Browser envia para servidor...
GET /book/ch1.html HTTP/1.0
Host: volans.argo.net
1-8

Captulo 1 - A Plataforma Web


Port: 80
Accept: text/html
Accept: image/jpg
User-Agent: Microsoft Internet Explorer (Mozilla 3.0 Compatible)

Se o servidor encontra o arquivo, retorna


HTTP/1.0 200 OK
Date: Friday, June 13, 1977
(... outros cabealhos...)
Content-type: text/html
<HTML><HEAD>
<TITLE> Capitulo 3</TITLE>
(...)

Se no acha...
HTTP/1.0 404 Not Found
Date: Friday, June 13, 1977
(... outros cabealhos...)
Content-type: text/html
<HTML><HEAD>
<TITLE>404 File Not Found</TITLE>
(...)

Com as informaes contidas no cabealho enviado pelo browser, o servidor pode tomar decises de enviar ou no o arquivo, de redirecionar, de utilizar um meio mais eficiente de
retorno de dados, etc. J o browser depende das informaes que chegam no cabealho criado
pelo servidor para saber o que fazer com os bytes que est recebendo, saber quando parar de
ler a porta do servidor (quantos bytes h para ler), o tipo dos dados, se deve guardar as informaes no cache, etc.

1.4. O que CGI


O servidor sempre retornar algo para o cliente, aps receber uma requisio. A resposta pode
ser o recurso que ele de fato pediu ou uma mensagem de erro. Se o arquivo solicitado for uma
pgina HTML, uma imagem GIF ou qualquer outro arquivo suportado pelo browser, este saber como exibi-lo. No caso de outros formatos, o browser ou redireciona para outra aplicao, ou tenta salvar em disco.
Se estiver configurado para oferecer suporte a CGI, o servidor poder, ao invs de simplesmente encontrar um arquivo e envi-lo ao browser, tentar execut-lo, funcionando como
um gateway para intermediar o envio e recebimento de dados entre o arquivo-programa e o
browser. Este programa, ao ser executado, pode ainda comunicar-se com outros programas,
estendendo o gateway alm dos limites da mquina servidora.

1-9

Captulo 1 - A Plataforma Web

CGI a sigla para Common Gateway Interface (Interface Comum de Gateway). um padro
W3C suportado por todos os servidores Web que estabelece parmetros para possibilitar a
execuo de aplicaes atravs do servidor Web. a forma mais trivial para realizar esta comunicao. O programa CGI necessita ser identificado e chamado pelo browser via uma requisio HTTP da mesma forma como ocorre com um arquivo comum. A diferena que o servidor ao encontr-lo vai tentar execut-lo em vez de simplesmente redirecion-lo envi-lo para
a sada padro. Para que o uso de CGI seja possvel, preciso que o servidor e as aplicaes
CGI estejam configuradas para funcionar desta forma. O browser nada tem a ver com o fato
de um arquivo ser devolvido ou executado pelo servidor. Tudo depende da configurao no
servidor que tanto pode mandar rodar acesso.exe como devolv-lo para download.
O uso mais comum do CGI como intermedirio para aplicaes mais complexas, principalmente de acesso e tratamento de dados dinamicamente. A figura abaixo ilustra a utilizao
da interface CGI na realizao da comunicao entre uma interface do usurio baseada em
pgina HTML com um banco de dados relacional legado acessvel atravs da mquina onde
roda o servidor Web.
BANCO DE
DADOS
Converte
para
SQL
Formulrio

PROGRAMA
CGI
Converte
para HTML
ou grfico

Recebe

Processa

Envia

Resultado

Este curso pretende mostrar como configurar CGI no servidor e como desenvolver aplicaes que atendam aos requisitos necessrios para funcionarem como programas CGI. No
sero explorados recursos especficos das linguagens usadas com CGI.

1.5. Questes
Marque com (V) as afirmaes verdadeiras e com (F) as afirmaes falsas.
___ a) preciso que um browser suporte JavaScript para entender pginas que contm cdigo ASP ou PHP, mesmo que o servidor suporte estas tecnologias.
___ b) Para carregar uma pgina que possui 5 imagens e uma applet Java, o browser precisa
fazer pelo menos 7 requisies independentes ao servidor.
___ c) O cdigo HTML dos arquivos armazenados no servidor sempre analisado e interpretado pelo servidor Web antes de ser enviado para o browser.

1-10

Captulo 1 - A Plataforma Web

___ d) preciso que o servidor Web suporte Java e JavaScript do lado do servidor (ASP por
exemplo) para que possa servir pginas HTML com JavaScript e applets Java aos seus
clientes.
___ e) possvel implementar um contador de acessos que conta o nmero de vezes que
uma determinada pgina foi acessada usando apenas tcnicas de interatividade no cliente como applets Java ou JavaScript.

1-11

Captulo 2 - Configurao e utilizao do servidor

2. Configurao e utilizao
do servidor
2.1. O servidor Apache
O servidor Web Apache est disponvel para as plataformas Windows e Unix (Linux). A
aplicao do servidor no possui interface grfica para administrao. Toda a sua configurao
feita atravs dos seus arquivos de configurao.
Aps a instalao, o diretrio da aplicao possui a seguinte estrutura:
htdocs/
bin/
modules/
icons/
logs/
conf/
cgi-bin/
proxy/

O diretrio htdocs/ o diretrio raiz de documentos, ou seja, ele corresponde ao diretrio virtual / quando o servidor for acessado atravs de uma requisio do browser contendo
uma URI. Qualquer diretrio criada abaixo de htdocs/ automaticamente estar disponvel atravs da URI http://nome.da.maquina/diretorio/. possvel, porm, oferecer acesso a
outros diretrios da mquina que no esto abaixo de htdocs/
O diretrio bin/ contm o programa executvel que mantm o servidor no ar. O diretrio logs/ contm os histricos de acesso e de erro com todas as informaes enviadas pelos
clientes que os provocaram desde a primeira execuo do servidor.
O diretrio conf/ contm os arquivos necessrios configurao do servidor. O mais
importante httpd.conf que permite criar diretrios virtuais, implantar o CGI, mudar a porta
do servidor, etc.

2-12

Captulo 2 - Configurao e utilizao do servidor

O diretrio cgi-bin/ foi previamente configurado para guardar arquivos executveis que
funcionaro como CGI. Isto pode ser alterado no arquivo httpd.conf.
A primeira coisa que precisamos fazer com o servidor Apache instalado no laboratrio
mudar a sua porta. Como na mesma mquina temos dois servidores (um servidor Microsoft e
outro Apache), eles no podem simultaneamente ocupar a mesma porta. Escolheremos a porta
8080 para o servidor Apache. Isto significar que todas as URIs direcionadas a este servidor
devero conter o nmero 8080 precedido por : logo aps o nome da mquina.
Para fazer a alterao, abra o arquivo httpd.conf e procure pela palavra Port. Ela deve
indicar o valor 80. Mude para 8080:
Port 8080

Agora desligue o servidor e ligue-o de novo. Para testar, tente acessar a sua home-page
atravs da URI http://suamaquina:8080/.

2.2. Publicao de pginas e diretrios virtuais


Voc pode publicar todo o seu site dentro de htdocs/ e substituir a pgina index.html
por uma que voc tenha criado. Se desejar, pode tambm alterar o DocumentRoot atravs do
httpd.conf, assim como outras configuraes iniciais como o nome do arquivo de ndice (index.html).
Se voc tiver outros diretrios com pginas HTML, pode public-las no servidor criando
uma URI com um novo diretrio virtual que aponte para o seu diretrio fixo. Por exemplo,
voc pode colocar todas as pginas do curso de JavaScript no ar mapeando c:\javascript\
URI /js/. Isto pode ser feito com Alias (procure no httpd.conf):
Alias

/js/

c:\javascript\

Voc pode ter vrias instrues Alias e assim mapear todos os diretrios que quiser deixar acessveis via Web.

2.3. O servidor Personal Web Server


O servidor Personal Web Server possui uma interface grfica para configurao e administrao. A home-page inicial est localizada em c:\Inetpub\Wwwroot\. H vrios diretrios
pr-configurados para permitir permisses diferentes de acesso e a execuo de scripts. Para
rodar o administrador do PWS clique no cone correspondente a partir do menu Iniciar ou na
barra de tarefas (caso ele j esteja no ar).

2-13

Captulo 3 - Usando CGI

3. Usando CGI
Como foi mencionado acima, CGI, ou Common Gateway Interface um mecanismo que permite
que browsers e outros clientes Web executem programas em um servidor Web. So largamente
utilizados para produzir pginas dinmicas, para processar contedo de formulrios, acessar
bancos de dados entre outras aplicaes.
Um servidor Web que implementa a especificao CGI capaz de executar aplicaes
solicitadas por um cliente (browser) remoto. Pode ser qualquer aplicao. Por exemplo, suponha um servidor Web instalado em uma mquina ou rede que controlem a abertura e fechamento de uma porta eltrica. Se for possvel construir uma aplicao local nessa mquina ou
rede que abra e feche a porta, ser possvel construir uma aplicao CGI e instal-la no servidor Web para que um cliente remoto, atravs de uma pgina recebida em seu browser, possa
tambm abrir e fechar a porta remotamente.
CGI oferece uma interface de baixo nvel para o controle das requisies e respostas
HTTP recebidas e enviadas por um servidor Web. Para programar em CGI, portanto, preciso conhecer um pouco de como o browser se comunica com o servidor e vice-versa. Ou seja,
conhecer o funcionamento do protocolo HTTP, a sintaxe de suas requisies, mtodos, respostas e cabealhos.
Pode-se usar qualquer linguagem de programao para escrever programas que iro executar como programas CGI. A especificao s determina regras para a entrada e sada de dados, portanto, qualquer linguagem que atenda aos requisitos mnimos exigidos pode ser usada.
Em outras palavras, um programa CGI uma caixa-preta que espera receber, na entrada, os
dados em um certo formato padro, realizar quaisquer operaes necessrias com ou sem esses
dados e retornar, na sada, dados em um outro formato padro. No interessa, portanto, a linguagem de programao usada. Deve-se usar aquela que oferea os melhores recursos para as
tarefas que desejamos realizar, e que tenha recursos suficientes para ler variveis de ambiente
do sistema (dados de entrada) e gerar dados em formato binrio. Java, embora seja bastante
popular em outras aplicaes Web, bastante fechada quanto ao acesso a propriedades do
sistema, tornando o desenvolvimento de certas aplicaes CGI mais difcil. Linguagens que s
so capazes de gerar texto como sada tambm no se adaptam bem essa finalidade.
Perl tem se tornado um padro de fato por estar disponvel em quase todas as plataformas que possuem servidores Web, ser interpretada, tornar fcil o desenvolvimento de scripts
simples com transformao de dados e apresentar uma sintaxe parecida com C e linguagens de
3-14

Captulo 3 - Usando CGI

administrao de sistemas Unix. Na maior parte dos exemplos de CGI apresentados neste curso, usaremos programas escritos na linguagem Perl.

3.1. Implantando o CGI


Para que o servidor decida tentar executar um objeto solicitado pelo browser em vez de
envi-lo sada padro (para download) necessrio configur-lo para suportar CGI.
O comando GET simplesmente solicita um objeto a um browser. Se o link de GET for
para um programa chamado contador.exe em um servidor Windows, ele ir enviar o programa para o browser, que, por sua vez, apresentar uma janela ao usurio perguntando se ele
deseja fazer o download do programa. Mas se o servidor estiver configurado de tal forma a
identificar contador.exe como sendo um programa CGI, este tentar executar o programa e,
caso tenha sucesso, enviar para a sada padro a informao gerada na sada do mesmo.
A forma de configurar CGI varia de servidor para servidor. Na maioria dos servidores
pode-se definir um programa CGI como sendo qualquer executvel que esteja em um diretrio
especial, configurado para permitir a execuo de programas CGI, ou definir CGI como um
tipo de dados. Com esta ltima configurao, um programa CGI pode residir em qualquer lugar e
ser identificado por uma extenso (por exemplo .cgi).

Servidores Apache (Unix e Windows)


Para definir uma rea de programas CGI em servidores HTTP tradicionais (CERN,
NCSA, Apache) necessrio modificar um ou mais arquivos de configurao. Um diretrio
virtual chamado /cgi-bin/ para programas CGI armazenados em /dev/lib/httpd/cgibin/ pode ser definido em um servidor Apache, acrescentando no arquivo de configurao
httpd.conf (ou srm.conf) a linha:
ScriptAlias

/cgi-bin/

/dev/lib/httpd/cgi-bin/

Esse arquivo pode ser encontrado abaixo do subdiretrio conf/ de qualquer instalao
do Apache, seja Windows ou Linux. Abra o arquivo em um editor de textos e procure por ScriptAlias. Geralmente j existe um diretrio configurado ou a instruo pode estar comentada (precedida de um #). A alterao acima far com que programas armazenados em
/dev/lib/httpd/cgi-bin/ sejam tratados como programas CGI pelo servidor, e, consequentemente, executados quando o browser os requisitar atravs da URI http://suamaquina
/cgi-bin/. Em servidores Apache para Windows, o procedimento idntico:
ScriptAlias

/progs/

c:/Apache/cgi-bin/

Desta vez o diretrio c:\Apache\cgi-bin\ foi mapeado URI http://suamaquina


/progs/ (considerando que a porta do servidor seja 80). Para definir CGI como um tipo de
dados, acrescente (ou remova o comentrio) no httpd.conf (ou srm.conf):
AddHandler

cgi-script

.cgi

3-15

Captulo 3 - Usando CGI

Servidores Microsoft
Nos sistemas Windows existem trs tipos diferentes de CGI. A maior parte dos servidores no capaz de distinguir entre eles automaticamente e necessrio configurar o CGI para
o tipo correto a ser usado. Em servidores Microsoft, alguns tipos exigem uma configurao
bem mais complexa que outros.
O primeiro tipo o Win-CGI, que suporta programas que rodam sob Windows (e no
DOS). O DOS-CGI tambm chamado simplesmente de cgi-bin suporta programas que rodam
atravs do prompt do MS-DOS como arquivos batch, e executveis DOS. Os servidores Microsoft lidam com os dois. Arquivos que devem ser executados atravs da interface CGI devem
ser corretamente configurados e colocados dentro de um diretrio, administrado pelo servidor
Web, que tenha permisso de execuo. Em outros servidores Windows como os servidores
Netscape e OReilly, preciso distinguir os programas que rodam em ambiente DOS dos programas que rodam em Windows.
Finalmente o Shell-CGI suporta programas que precisam de outro programa para executar, como programas interpretados que exigem que se chame primeiro o sistema de runtime.
Exemplos so programas em Perl, Java ou Basic interpretado. Para fazer com que esses programas funcionem em servidores Windows preciso configur-los no sistema Windows (fazendo uma associao do tipo de arquivo com o interpretador) e no servidor (no existe uma
maneira uniforme). Entre os servidores disponveis para Windows, o que suporta CGI em Perl
de forma mais simples o OReilly Website Server. O servidor PWS da Microsoft exige no s a
associao da extenso .pl com o interpretador, como a alterao e criao de chaves no Registro do Windows.
Devido complexidade da instalao CGI com Perl em servidores Microsoft, usaremos
apenas o servidor Apache para desenvolver aplicaes Web com CGI. As aplicaes devem
funcionar tanto em sistemas Linux como em Windows. Voltaremos ao servidor PWS quando
formos demonstrar e desenvolver aplicaes ASP, servlets e JSP.

3.2. Exerccios
1. Configure o servidor que est instalado na sua mquina para que passe a suportar CGI.
2. Usar programas prontos em shell, perl, C, etc. (disponveis no laboratrio) para verificar se
o CGI est OK.
3. Veja a configurao CGI do servidor Unix instalado no laboratrio lendo o arquivo
httpd.conf (depende da instalao). Quantos diretrios CGI foram definidos? Onde (em
que caminho absoluto) os programas podem ser armazenados e como podem ser chamados via uma URL?

3-16

Captulo 3 - Usando CGI

3.3. Limitaes do CGI e outras alternativas


CGI uma porttil, flexvel e suportado por todos os servidores Web. H, porm, diversas limitaes na tecnologia CGI que podem at inviabilizar certos tipos de aplicao.
Para cada requisio de um cliente, um novo processo criado, mesmo que seja para executar a mesma aplicao e fazer as mesmas coisas. Quando raramente h mais de um cliente
conectado, ou quando a requisio no ocupa tempo do servidor, isto pode no ser um problema. Porm quando h muitos clientes realizando tarefas demoradas, o desempenho despenca e pode paralisar o servidor.
Uma conseqncia desse modelo que no h compartilhamento de recursos em CGI.
Cada processo independente abre seus arquivos, roda seus programas, armazena seus dados
separadamente. No possvel implementar persistncia entre requisies pois cada requisio
est associada a um programa diferente.
Programas CGI, como so externos ao servidor, no podem aproveitar recursos, plugins ou componentes do servidor. Tambm no possvel refletir o estado do servidor se este
mudou depois que o programa foi executado.
Para eliminar ou atenuar essas limitaes, tm surgido vrias alternativas. As mais eficientes so proprietrias e exigem conhecimento de linguagens como C++. A Netscape foi a primeira a oferecer uma API para a programao do servidor, chamada NSAPI. Pouco depois, a
Microsoft fez algo semelhante, e chamou de ISAPI. Todas eram APIs C++, e incompatveis,
porm, poderiam obter o mximo de eficincia j que faziam parte do servidor, no causavam
o incio de novos processos e podiam compartilhar recursos entre si.
As Server APIs (SAPI) no substituram o CGI por no ter a mesma portabilidade e serem dependentes de fabricante. Isto sem mencionar o fato que exigem conhecimento de linguagens especficas. Outras alternativas que surgiram foram os scripts (roteiros) de servidor,
como ASP, Livewire, Cold Fusion e componentes, como os servlets e ActiveX .
Os scripts so embutidos em pginas HTML especiais. Quando o browser faz uma requisio pedindo uma dessas pginas, ele primeiro analisa todo o cdigo a procura de blocos de
linguagem que deve interpretar. Embora interpretados, como os scripts so executados pelo
prprio servidor, costumam ser mais rpidos e eficientes que CGI. Os scripts podem desde
alterar a apresentao e informao da pgina at realizar conexes a bancos de dados. Os scripts geralmente so dependentes de fabricante de servidor, mas atravs de plug-ins e extenses possvel reutiliz-los em outros servidores.
Componentes agem como mdulos dinmicos do servidor. Podem aliar a eficincia das
SAPIs com a portabilidade do CGI. Os componentes Java, chamados de servlets so os mais
portteis pois podem ser usados em servidores instalados em plataformas diferentes sem necessitar de compilao.

3-17

Captulo 3 - Usando CGI

10

Servidor IIS usando ISAPI

MB/s

7,5

2,5

Servidor IIS usando CGI


0
1

10

20

30

40

50

Clientes
Fonte: PCMagazine Labs

So vrias as opes para desenvolvimento de aplicaes do lado do servidor. Qual usar?


Depende de vrios fatores: segurana, velocidade, custo, simplicidade. Se o objetivo fazer um
sistema simples, tipo uma busca leve, um guestbook, formulrio de feedback, etc., talvez no
valha a pena investir tempo em solues muito complicadas, podendo-se aproveitar o oceano
de recursos CGI disponveis na rede. Por outro lado, se o desempenho um fator crtico, convm analisar outras alternativas como ISAPI e scripts de servidor. A tabela a seguir apresenta
um resumo das tecnologias mais populares, em ordem crescente de complexidade e eficincia:
Tecnologia
CGI
Fast-CGI
ASP e LiveWire
ASC e Servlets
ISAPI/NSAPI

Linguagens suportadas
Perl, C, C++, Basic, Pascal, Delphi, Bourne-Shell, Java, etc.
Perl, C, C++, Basic, Pascal, Delphi, Bourne-Shell, Java, etc.
ASP: VBScript, JavaScript; LiveWire: JavaScript
ASC: C++, VB, Delphi, Java; Servlets: Java
C++, VB e Delphi

CGI, porm, continua como base para estas tecnologias. A interface CGI lida com detalhes da programao do servidor em baixo-nvel, se preocupando com o formato exato de
cabealhos, requisies, etc. Conhecendo-se CGI, a escolha e uso de uma outra tecnologia
torna-se muito mais fcil, pois todas utilizam os mesmos conceitos, embora ofeream funes
e mtodos que permitem a programao em um nvel mais alto. Aprender CGI, portanto, ser
til mesmo se voc decidir usar outra tecnologia mais sofisticada.
Os captulos seguintes abordaro a interface CGI em maiores detalhes e com exerccios
prticos. O foco ser na sua especificao. Evitaremos entrar em detalhes quanto implemen-

3-18

Captulo 3 - Usando CGI

tao em uma determinada linguagem de programao, tendo a introduo linguagem Perl


somente a finalidade de facilitar a compreenso dos exemplos.

3.4. Questes
Marque com (V) as afirmaes verdadeiras e com (F) as afirmaes falsas.
___ a) Programas que sero executados pelo servidor usando a tecnologia CGI podem ser
escritos em qualquer linguagem de programao, no apenas Perl.
___ b) Programas CGI so interpretados pelo servidor Web.
___ c) Para cada cliente que usa uma aplicao Web beseada em CGI o servidor precisar
iniciar um novo processo de forma que se h 100 clientes conectados a uma aplicao
de banco de dados, h pelo menos 100 aplicaes rodando cuja execuo foi iniciada
pelo servidor Web.
___ d) A nica forma de fazer um servidor Web se comunicar com um banco de dados ou
outra aplicao no cliente atravs da interface CGI, ou seja, preciso que um programa CGI faa a intermediao entre a aplicao e o servidor Web.

3-19

Captulo 4 - Formulrios

4. Formulrios
Os componentes de formulrio so campos de entrada de dados dentro de um bloco HTML,
como botes, caixas de seleo, caixas de texto e botes de rdio. Eles so a principal forma
de entrada de dados disponvel no HTML.
Os elementos de formulrio so apenas trs: <INPUT>, <SELECT> e <TEXTAREA>, mas
produzem 12 efeitos diferentes. Todos devem ser usados dentro de um bloco <FORM>.
O objetivo deste captulo apresentar esses elementos do HTML que so essenciais no
desenvolvimento de aplicaes Web usando CGI. No se trata de um texto detalhado sobre o
assunto mas um pequeno guia de referncia.

4.1. Elemento <FORM>


O elemento <FORM> o mais importante dos elementos de formulrio. Ele define o
bloco de formulrio que deve ser atrelado a um programa no servidor. A sua sintaxe est
mostrada abaixo:
<FORM
ACTION="url para onde ser enviado o formulrio"
METHOD="mtodo HTTP (pode ser GET ou POST)"
ENCTYPE="formato de codificao"
TARGET="janela alvo de exibio da resposta do formulrio"
" >
... corpo do formulrio ...
</FORM>

A sintaxe do elemento FORM elemento contm no mnimo dois atributos, para uso com
CGI e demais aplicaes de servidor: ACTION, que indica a URL do programa CGI que ir
processar o contedo do formulrio e, METHOD, que ir indicar o mtodo de requisio HTTP
que ser usado na transferncia de informaes. Os outros elementos que so usados dentro
do bloco <FORM>, sempre tm como atributo obrigatrio um campo NAME que identifica a varivel que ir armazenar um valor fornecido pelo usurio/visitante da pgina Web. Os dados
so sempre passados ao servidor atravs de pares nome=valor, interligados pelo caractere &,
onde o nome o identificador da varivel usado pelo programa CGI e o valor do atributo
NAME do componente de formulrio:

4-20

Captulo 4 - Formulrios

Eis um exemplo de uso de <FORM>:


<FORM ACTION="http://www.acme.com/cgi-bin/pedido.pl" METHOD="POST">
<P>Seu Nome: <INPUT TYPE="text" NAME="nome">
<P>Seu endereo: <INPUT TYPE="text" NAME="endereco">
(...)
</FORM>

Este bloco de formulrio ter seus valores de entrada processados pelo programa
http://www.acme.com/cgi-bin/pedido.pl, que ser requisitado pelo browser usando o
mtodo POST. Na tela aparecero dois campos de texto. Suponha que o usurio digite como
nome Joo Lobo e como endereo Rua Dois, 2. Os dados sero enviados para o programa CGI em uma string, contendo:
nome=Jo%E3o+Lob%E3o&endereco=Rua+Dois%22+2

funo do programa CGI, extrair as informaes essenciais dessa string.


A hierarquia de componentes (elementos HTML) da interface de formulrios a seguinte:
<form>...</form>
|__ <input>
|__ <select>...</select>
|
|__ <option>...</option>
|__ <textarea>...</textarea>

Os elementos <input> so dez, diferenciados pelo seu atributo type, e se apresentam na


tela do browser de forma bastante diferente. O elemento <select> representa uma caixa de
seleo com uma ou mais opes contidas entre os descritores <option> e </option>. <textarea> representa uma caixa de texto. Maiores detalhes sobre cada componente so apresentados nas sees a seguir.

4.2. Elemento <INPUT>


O elemento <INPUT> usado para construir botes, caixas de texto, botes de rdio,
caixas de checagem e para armazenar variveis invisveis. O que distingue um objeto do outro
o seu atributo TYPE. A sintaxe geral de <INPUT> :
<input atributos>

onde os atributos podem ser diferentes, dependendo do valor do atributo type, que pode ter
os valores:

type=text

type=password

type=radio

type=checkbox

type=submit

type=reset

4-21

Captulo 4 - Formulrios

type=hidden

type=image


type=file

4.3. Botes (TYPE=BUTTON, SUBMIT ou RESET)


Os botes so criados com os atributos type=button, type=reset e type=submit. A
sua sintaxe bsica :
<INPUT TYPE="button" VALUE="rtulo do boto">
<INPUT TYPE="submit" VALUE="rtulo do boto">
<INPUT TYPE="reset" VALUE="rtulo do boto">

ou
ou

Os botes do tipo SUBMIT e RESET reagem a eventos. O boto do tipo BUTTON nada faz.
Serve apenas se for programado em JavaScript ou VBScript. Ao apertar o boto SUBMIT, o
usurio envia os dados do formulrio ao programa no servidor indicado pelo atributo ACTION
de <FORM>. Ao apertar RESET, o usurio reinicializa o formulrio com seus valores iniciais.
O atributo VALUE permite
alterar o texto que aparece dentro do boto. Em botes RESET
e SUBMIT, VALUE possui um
valor default. Em objetos Button,
o default para VALUE um string
vazio, portanto, a menos que
este atributo seja definido, o
boto aparecer vazio. A figura
ao lado mostra a aparncia dos
botes em um browser Netscape Navigator rodando em Windows 95 com e sem o atributo
VALUE.

4.4. Campos de texto


de uma linha (TYPE=TEXT ou PASSWORD)
Campos de texto de uma nica linha so definidos pelos componentes <INPUT> que
possuem atributos TYPE com os valores PASSWORD ou TEXT. Eles tm a mesma aparncia, mas
o texto dos objetos Password no exibido na tela. A sintaxe de um elemento TEXT em HTML
a seguinte:
<INPUT TYPE="text"
NAME="nome_do_campo_de_texto"
VALUE="texto inicial do campo de textos"

4-22

Captulo 4 - Formulrios
SIZE="nmero de caracteres visveis"
MAXLENGTH="nmero mximo de caracteres permitido">

Todos os atributos, exceto o atributo TYPE so opcionais. Se SIZE no for definido, a


caixa de texto ter 20 caracteres de largura. Se MAXLENGTH no for definido, no haver limite
para o nmero de caracteres digitado no campo de textos. A figura abaixo ilustra a aparncia
de componentes TEXT em um browser Netscape 4.5 rodando em Windows 95.

O elemento do tipo PASSWORD criado da mesma forma, mas com um atributo TYPE diferente:
<INPUT TYPE="password" ... >

Os caracteres do texto digitado em componentes PASSWORD no aparecem na tela, como


mostrado na figura abaixo (Windows95):

4.5. Campos ocultos (TYPE=HIDDEN)


O componente do tipo HIDDEN um campo de entrada de dados invisvel, que o usurio da
pgina no tem acesso. Serve para que o programador passe informaes ao servidor, ocultandoas no cdigo HTML da pgina. bastante til na transferncia de informaes entre formulrios distribudos em mais de uma pgina. Sua sintaxe a seguinte:
<INPUT TYPE="hidden"
NAME="nome_do_campo_oculto"
VALUE="valor armazenado" >

Os atributos NAME e VALUE so obrigatrios.

4.6. Botes de rdio (TYPE=RADIO)


O componente do tipo RADIO representa um dispositivo de entrada booleano cuja informao
relevante consiste em saber se uma opo foi selecionada ou no. Botes de radio so organizados em grupos de descritores com o mesmo nome (atributo NAME). Cada componente aparece na tela como um boto ou caixa de dois estados: ligado ou desligado. Dentro de um grupo de
componentes (todos com o mesmo atributo NAME), somente um deles poder estar ligado ao
mesmo tempo. A sintaxe de um componente RADIO em HTML a seguinte:

4-23

Captulo 4 - Formulrios
<INPUT TYPE="radio"
VALUE="valor (o valor que ser enviado ao servidor)"
CHECKED
<!-- previamente marcado -->
> Rtulo do componente

A figura abaixo mostra dois grupos de botes de rdio (em um browser Netscape rodando em Windows95). Observe que os atributos NAME distinguem um grupo do outro. O
atributo CHECKED indica um boto previamente ligado mas que pode ser desligado pelo usurio
ao clicar em outro boto.

4.7. Caixas de checagem (TYPE=CHECKBOX)


Cada elemento <INPUT> do tipo CHECKBOX aparece na tela como um boto ou caixa que
pode assumir dois estados: ligado ou desligado. Diferentemente dos componentes RADIO, vrios
componentes CHECKBOX de um mesmo grupo podem estar ligados ao mesmo tempo, no havendo, portanto, necessidade de organizar tais objetos em um grupo. A sintaxe de um elemento CHECKBOX em HTML praticamente idntica de RADIO, mudando apenas o valor do atributo TYPE:
<INPUT TYPE="checkbox" ...
VALUE="valor (o valor que ser enviado ao servidor)"
CHECKED
<!-- previamente marcado -->
> Rtulo do componente

A figura abaixo mostra um grupo de caixas de checagem (em um browser Netscape rodando em Windows95. O atributo CHECKED indica um boto previamente ligado mas que pode
ser desligado pelo usurio ao clicar em outro boto.

4-24

Captulo 4 - Formulrios

4.8. Elemento <TEXTAREA>


O elemento <TEXTAREA> um bloco (possui descritor inicial e final) e define uma rea
onde se pode ler ou digitar texto em vrias linhas. A sintaxe para criar um elemento
<TEXTAREA> em HTML a seguinte. Os atributos em negrito so obrigatrios:
<TEXTAREA
ROWS="nmero de linhas visveis"
COLS="nmero de colunas visveis"
NAME="nome_do_campo_de_texto"
ONBLUR="handlerText"
ONFOCUS="handlerText"
ONCHANGE="handlerText"
ONSELECT="handlerText" >
Texto inicial
</TEXTAREA>

A figura abaixo mostra a aparncia de componentes <TEXTAREA>:

4.9. Elemento <SELECT> e <OPTION>


Caixas e listas de seleo como as mostradas nas figuras ao lado so criadas
com o elemento HTML <SELECT>. Este
componente no contm texto mas
consiste de vrias opes, representadas
pelo elemento <OPTION>, que pode
conter texto com opes.
Os componentes <SELECT> podem ter uma aparncia e comportamento diferente dependendo se possuem ou
no os atributos SIZE e MULTIPLE. A
figura ao lado ilustra o efeito desses

4-25

Captulo 4 - Formulrios

atributos, transformando uma caixa de seleo em uma lista que permite seleo de mltiplas
opes. A sintaxe de um elemento HTML <SELECT> est mostrada abaixo:
<SELECT
NAME="nome_do_componente"
SIZE="nmero de opes visveis"
MULTIPLE
<!-- Suporta seleo mltipla -->
>
<OPTION ...> Opo 1 </OPTION>
...
<OPTION ...> Opo n </OPTION>
</SELECT>

Todos os atributos so opcionais. A existncia do atributo NAME obrigatria em formulrios


que tero dados enviados ao servidor. Os elementos <OPTION> tm a seguinte sintaxe:
<OPTION
VALUE="Valor da opo"
SELECTED >
Texto descrevendo a opo
</OPTION>

O atributo VALUE opcional. Se os dados forem enviados ao servidor, o texto contido


entre <OPTION> e </OPTION> enviado somente se um atributo VALUE no tiver sido definido.

4.10.

Outros elementos de formulrio

A especificao HTML 4 define outros elementos que podem ser usados em seus
formulrios. So <BUTTON>, <LABEL>, <FIELDSET> e outros. possvel tambm
aplicar folhas de estilo e mudar radicalmente a aparncia dos formulrios. Observe que esses
recursos no funcionam ainda nos browsers Netscape, portanto, evite us-los para desenvolver
sites com pblico-alvo que inclua tais visitantes.

4-26

Captulo 5 Perl

5. Introduo linguagem Perl

UMA BREVE INTRODUO LINGUAGEM PERL apresentada neste mdulo. O objetivo


apenas abordar os recursos de Perl utilizados nos programas CGI mais comuns para que seja
possvel demonstrar o uso de CGI. Consulte uma documentao mais detalhada para usar
recursos como controle de processos, ponteiros e construo de soquetes de rede (TCP/IP).
Veja as referncias no final.

5.1. Sintaxe bsica


De acordo com seu criador, Larry Wall, Perl abreviao de Practical Extraction and Report
Language (Linguagem para a Extrao Prtica e Relatrios) e tambm de Pathological Ecletic
Rubbish Lister (Listador de Lixo Patologicamente Ecltico). Foi criado para auxiliar o usurio e
administrador Unix a realizar tarefas que so muito complicadas para o Shell, mas ao mesmo
tempo de vida muito curta ou complicada demais para escrever em C ou outra linguagem do
Unix. Por causa dos seus recursos de formatao de texto e recursos disponveis para o
desenvolvimento de programas pequenos, porm sofisticados, Perl se tornou a linguagem
preferencial dos desenvolvedores CGI.
Perl uma linguagem interpretada. Para executar um programa em Perl, ele deve ser
armazenado em um arquivo com extenso .pl e executado atravs da invocao do
interpretador, da forma:
perl seuprog.pl

Em sistemas Unix, qualquer script pode ser transformado em um programa executvel.


Para isto, preciso que o programa informe, na primeira linha do cdigo, onde est o
interpretador. O clssico e insuportvel programa Hello World pode ser escrito em Perl da
seguinte maneira:
#!/usr/local/bin/perl
print "Hello, world!\n";

A primeira linha um comentrio para a linguagem Perl. Em sistemas Unix, diz que este
um programa em Perl e informa o endereo do interpretador, o que permite que o programa
seja executado diretamente sem precisar cham-lo, na linha de comando, ou seja, pode-se fazer
simplesmente:
5-1

Desenvolvendo Web Sites Interativos com CGI


./seuprog.pl

para executar o programa. necessrio que o bit executvel do arquivo seja ligado para que
isto funcione
chmod a+x seuprog.pl

Em sistemas Windows, o comentrio da primeira linha geralmente ignorado. Mas, em


programas CGI, alguns servidores Web como o Apache utilizam a primeira linha no Windows
para localizar o interpretador, por exemplo:
#c:\perl\bin\perl.exe
print "Hello, world!\n";

A maior parte dos servidores Web, porm, utiliza-se de outra forma de associao entre
o interpretador e o programa.
No exemplo acima, a segunda linha o cdigo executvel do programa. A instruo
print imprime o seu argumento na sada padro. No final do string que argumento de print,
h um cdigo de escape especial: \n. Este caractere provoca uma quebra de linha. Observe
que a linha termina em ;. Isto ocorre em todas as instrues simples do Perl.
Para rodar o programa, basta salv-lo (como hello.pl, por exemplo) e rod-lo:
perl hello.pl

ou diretamente,
./hello.pl

se o programa estiver em ambiente Unix com bit executvel ligado e endereo do interpretador
informado corretamente. O resultado ser
Hello, world!

5.1.1. Instrues
A sintaxe das instrues em Perl semelhante de C (ou Java). Toda instruo simples
termina com um ; (ponto-e-vrgula). Instrues compostas podem ser agrupadas entre
chaves (funes, estruturas for, while, etc.). O espao em branco (tabulaes, quebras de
linha, espaos) ignorado, exceto dentro de strings.
Para programar em Perl, pode-se utilizar o alfabeto ISO-Latin-1 (8 bits). Os
identificadores, porm, devem limitar-se ao alfabeto ASCII.
Comentrios valem at o fim de uma linha e so precedidos do caractere #.

5.1.2. Literais e identificadores


Literais so representaes dos valores escalares utilizados para representar nmeros ou
strings. Pode-se transformar dados escalares (como somar, concatenar) e armazen-los em
variveis representadas por identificadores.

5-2

Captulo 5 Perl

Todos os valores numricos tm, internamente, o mesmo formato em Perl: pontoflutuante de dupla preciso, embora possam ser representados de vrias maneiras. Os literais
numricos que representam nmeros de ponto-flutuante podem conter ponto decimal, sinal e
a letra e, indicando expoente (12.3e-34). Os que representam inteiros so por default,
decimais. Podem representar valores octais se precedidos por 0 ou hexadecimais, se
precedidos por 0x.
Strings so seqncias de caracteres. Cada caractere tem 8 bits (Perl 4). O menor string o
string vazio. O maior, ocupa toda a memria disponvel. Como voc pode manipular com strings
de 8 bits, valores binrios podem ser manipulados em Perl se forem tratados como strings.
H trs representaes diferentes para strings em Perl. Strings entre apstrofes (aspas
simples) uma seqncia de caracteres armazenada entre apstrofes. No h caracteres ilegais.
At o caractere de quebra de linha (se a linha quebrar dentro do string) considerado parte
dele. Tais strings podem, portanto, ser usados para at com dados binrios.
$texto_longo = "
<HTML>
<HEAD><TITLE>A Divina Comdia - Inferno: Canto 1</TITLE></HEAD>
<BODY><TABLE WIDTH=450><TR><TD>
<H1>Canto I</H1>
<P>Quando eu me encontrava na metade do caminho de nossa vida, me vi
perdido em uma selva escura, e a minha vida no mais seguia o
caminho certo.
(...)
</TD></TR></TABLE></BODY></HTML>
"; # este string no neutro (seria se estivesse entre ' e ')

Alguns caracteres, quando aparecem dentro de strings, podem determinar o seu final ou
terem uma interpretao diferente da desejada. Esses caracteres, para que possam aparecer na
sua forma original, devem ser precedidos de uma contr-barra. As nicas excees dentro de
um string de apstrofes so o apstrofe, se ocorrer dentro do string, e a contra barra. Para
produzir uma contra-barra, deve-se usar duas contra-barras. Para produzir um apstrofe, devese preced-lo por uma contra-barra.
Strings entre aspas (duplas) no so neutros. Variveis escalares neles contidos, cifres,
arrobas, porcentagens podem ter uma interpretao diferente se no forem precedidos de
contra-barra. Alm disso, h vrias seqncias de escape formadas por certos caracteres
especiais precedidos pela contra-barra para produzir efeitos especiais. Veja na tabela abaixo.
SEQNCIA
\b
\t
\n
\f
\r

VALOR DO CARACTERE

Retrocesso (backspace)
Tabulao
Nova Linha (new line)
Alimentao de Formulrio (form feed)
Retorno de Carro (carriage return)

5-3

Desenvolvendo Web Sites Interativos com CGI

SEQNCIA
\v
\a
\e
\cX
\l
\L
\u
\U
\E
\"
\'
\\
\nnn
\xnn

VALOR DO CARACTERE

Tabulao vertical
Bell
Escape
Qualquer caractere de controle (aqui, ^X)
Prximo caractere em caixa baixa
Prximos caracteres em caixa baixa at o \E
Prximo caractere em caixa alta
Prximos caracteres em caixa alta at o \E
Terminador de \U ou \L
Aspas
Aspa (apstrofe)
Contra Barra
O caractere correspondente ao valor octal nnn, onde nnn
um valor entre 000 e 037.
O caractere de 8-bits nn, onde nn de um a dois dgitos
hexadecimais.

A terceira categoria de strings em Perl no representa cadeias de caracteres mas, comandos


do sistema. Comandos entre crases `dir c:` so executados e seu resultado retornado.
Tais escapes tornam o programa dependente de plataforma e devem ser evitados caso se
pretenda rodar o programa em mais de uma plataforma.
Comandos do sistema tambm podem ser executados atravs do operador system:
system "dir c:";

5.1.3. Operadores
Perl oferece operadores diferentes para strings e nmeros. Os operadores aritmticos so
os mesmos usados em Java, C, C++ e linguagens semelhantes. As regras de precedncia das
operaes bsicas tambm so as mesmas, mas Perl tem regras de precedncia prprias para
diversos outros operadores.
OPERADOR
+
*
/
%
**
++
-!
&&

5-4

FUNO
Adio
Subtrao
Multiplicao
Diviso
Resto
Exponenciao
Incremento
Decremento
NO lgico
E lgico

OPERADOR
~
=
+=
-=
*=
/=
%=
&=
|=
^=

FUNO
Complemento
Atribuio simples
Atribuio com soma
Atribuio com subtrao
Atribuio com multiplicao
Atribuio com diviso
Atribuio com resto
Atribuio com AND
Atribuio com OR
Atribuio com XOR

Captulo 5 Perl

OPERADOR
||
&
^
|
>>
<<

FUNO
OU lgico
AND
XOR
OR
Desloc. de bits direita
Desloc. de bits esquerda

OPERADOR
?:
x
.
-op
=~
=!

FUNO
Operador ternrio if/then/else
Repetio de string
Concatenao de string
Teste de arquivo (op: e, d, ...)
Expr. regular combina
Expr. regular no combina

A tabela acima no inclui os operadores usados para realizar comparaes booleanas.


Para comparar nmeros ou strings, os operadores no so os mesmos. A tabela abaixo mostra
as diferenas:
COMPARAO

Maior
Menor
Maior ou igual
Menor ou igual
Igual
Diferente

STRING
gt
lt
ge
le
eq
ne

NMERO
>
<
>=
<=
==
!=

Por exemplo:
if ($metodo eq "POST") {
if ($numero >= 25) {
....

Strings podem ser concatenados usando o operador . (ponto). Quaisquer nmeros que
estiverem envolvidos sero convertidos em strings antes da concatenao. Se strings, que tiverem
partes numricas, forem usados em operaes aritmticas, eles tambm sero convertidos em
nmeros (se for possvel, ou seja, se alguma parte desses strings representar um nmero). As
partes no numricas sero descartadas.
O operador x usado para repetir strings. um operador no comutativo (como o
operador de concatenao) e transformar em strings qualquer coisa que estiver sua esquerda.
direita, este operador recebe um nmero, que informa quantas vezes um determinado string
deve ser repetido:
"Au" x 9; # imprime AuAuAuAuAuAuAuAuAu
"dinheiro" x 3; # imprime dinheirodinheirodinheiro

5.1.4. Variveis escalares


Variveis escalares so representadas por um identificador consistindo de um cifro ($),
seguido por uma letra, e depois, talvez, por nmeros e/ou letras. Cria-se uma varivel,
atribuindo-lhe um valor escalar (nmero ou string). No necessrio declarar variveis, basta
us-las. As variveis no tm tipo. Podem armazenar valores de tipos diferentes a qualquer
momento.
5-5

Desenvolvendo Web Sites Interativos com CGI


$a = 13;
$b = $a + 26;
$b++;
# operao de incremento

A operao mais comum sobre variveis escalares a atribuio. O operador de


atribuio em Perl o sinal de igualdade (=). Uma atribuio pode ser combinada com um
operador e formar uma atribuio binria:
$a = $a + 1; # esta operao, faz a mesma coisa que...
$a += 1; #atribuio binria (atribuio com soma) ... e
$a++;
# incremento unrio

O operador chop pode ser usado apenas com variveis escalares para arrancar o ltimo
caractere de um string. Isto til quando se l dados da entrada padro. A operao atua sobre
a varivel e retorna o caractere arrancado:
$gelado = "abcd";
chop $gelado;
$y = chop $gelado;

# $gelado agora contm "abc"


# $gelado contm "ab" e $y contm "c"

Variveis que ocorrem dentro de strings de aspas duplas no so ignoradas. Dentro de


tais strings, portanto, se houver necessidade de se imprimir um cifro, preciso preced-lo por
uma contra-barra. Outra soluo colocar o cifro dentro de um string neutro (de apstrofes):
$a = "texto";
$b = "Eis uma linha de $a"; # produz Eis uma linha de texto
$c1 = "Eis uma linha de \$a"; # produz Eis uma linha de $a
$c2 = "Eis uma linha de ".'$a'; # produz Eis uma linha de $a

Variveis usadas antes de terem um valor atribudo a elas possuem o valor undef. Esse
valor se traduz como false, zero ou string nulo dependendo do contexto onde utilizado.
Strings de mltiplas linhas podem ser atribudos a variveis de duas formas. A primeira,
como j vimos, usando atribuio simples:
$texto = "
Texto de mais de uma linha.
Segunda linha.
Terceira.
";

Uma outra forma usar o operador <<, que permite abrir um espao para um longo
string, que s termina quando um delimitador escolhido for encontrado sozinho em uma linha.
O efeito do bloco abaixo o mesmo que o anterior:
$texto = <<FIM;
Texto de mais de uma linha.
Segunda linha.
Terceira.
FIM

5-6

Captulo 5 Perl

No pode haver qualquer outra coisa na linha que possui o delimitador ou o programa
no o encontrar (nem ponto-e-virgula). Deve haver uma quebra de linha imediatamente aps
o nome e no deve haver qualquer espao antes.

5.1.5. Vetores indexados


Um vetor indexado uma lista ordenada de valores escalares. Cada elemento uma
varivel escalar separada com um valor independente, que pode ser de qualquer tipo. Um vetor
pode ter qualquer quantidade de elementos. No preciso declar-los. Podem crescer ou
diminuir vontade, conforme necessrio.
Vetores so representados por literais que consistem de um par de parnteses (o vetor
vazio), um par de parnteses contendo um escalar (vetor unitrio) ou um par de parnteses
contendo vrios escalares, separados por vrgulas. Os valores podem ser constantes, variveis,
expresses ou at outros vetores (cujos elementos so incorporados e fazem crescer o vetor):
(1, 2, 3, 4, 5)
($a, $b, $c) = (1, 2, 3) # atribui 1 a $a, 2 a $b, etc.
($a + 15, "anta", -17, $x)
(1..4, 10..14) # mesmo que (1, 2, 3, 4, 10, 11, 12, 13, 14)

5.1.6. Variveis de vetores


Uma varivel de vetor contm um nico vetor (com sua coleo de valores escalares). Os
identificadores so idnticos aos usados com escalares, exceto que, estes, comeam com @ em
vez de $. Por exemplo:
@vetor = ($a, $b, $c, $d);
($x, $y) = @vetor; # $x contm $a e $y contm $b
@maior = (1, @vetor, 2, 3) # mesmo que (1, $a, $b, $c, $d, 2, 3)
@dois = (1, 2);
($u, $d, %t) = @dois; # contm (1, 2, undef)

Uma varivel de vetor que ainda no tenha sido inicializada com uma atribuio contm
o vetor vazio (sem elementos) representado pelo par de parnteses (). Observe que os
elementos dos vetores inseridos tm o mesmo nvel dos elementos originais. Se o vetor s
contm referncias escalares (como o segundo e ltimos exemplos acima), pode ser usado do
lado esquerdo da atribuio. Se um vetor for atribudo a um escalar, este guardar o seu
comprimento (nmero de elementos):
$numElem = (1, 20, 46, 89) # $numElem contm 4

Os elementos dos vetores so acessveis individualmente atravs de seu ndice usando


colchetes. A referncia o prprio identificador do vetor na sintaxe de escalar (precedido de $)
e seguido de um par de colchetes [ e ] contendo um nmero (ou expresso que resulta em
nmero) correspondente ao elemento. A contagem dos elementos comea em zero:

5-7

Desenvolvendo Web Sites Interativos com CGI


@planetas = ("mercrio","vnus","terra","marte");
$x = $planetas[2];
# $x contm terra
$planetas[1] = "Ishtar"; # troca vnus por Ishtar
$planetas[5] = "Saturno"; # @planetas agora contm ("mercrio",
# "Ishtar","terra","marte",undef,"saturno")
$a = 2;
$b = $planetas[$a - 1]
# contm Ishtar

Observe que a varivel que tem acesso ao elemento do vetor escalar. Pode-se usar um
varivel de vetor, porm, para obter apenas uma parte do vetor original:
@dois = @planetas[1, 2]; # @dois contm ($planetas[1], $planetas[2])
@tres = (5,10,15,20,25,30,35,40) [4,5,6]; # @tres contm (25, 30, 35)

5.1.7. Operadores de vetores


O vetor pode ser manipulado como uma pilha usando os operadores push e pop para
acrescentar ou remover os ltimos elementos de uma lista:
push (@planetas, $novoAstro) ; # empurra $novoAstro no fim de @planetas
$ultimo = pop (@planetas);
# remove o ltimo elemento
push (@x, 1, 2, 3);
# mesmo que (@x, 1, 2, 3)

Os operadores push e pop operam no fim do vetor. Para operar no incio, pode-se usar
shift e unshift. O operador reverse retorna os elementos do vetor na ordem inversa e
sort os ordena de acordo com a ordem ascendente dos caracteres ASCII:
@z = (1, 2, 3, 10, 20, 30, 100, 200, 300);
@a = reverse @z;
# @a contm (300,200,100,30,20,10,3,2,1)
@s = sort @z;
# @s contm (1, 10, 100, 2, 20, 200, 3, 30, 300)

Para que sort faa a ordenao de acordo com uma outra regra (numrica, por
exemplo), preciso passar dois argumentos para o operador. O primeiro deve ser uma
subrotina (ou corpo da subrotina) que retorne 1, 0 ou 1 se o primeiro elemento menor,
igual ou maior, respectivamente, que o segundo.
@s = sort &ord_numerica @z;

# &ord_numerica uma chamada de


# subrotina definida localmente

Para ordenar pela ordem numrica, pode-se usar o operador auxiliar <=>, no corpo de
uma subrotina definida aps o sort da forma:
@s = sort {$a <=> $b} @z;

# (1, 2, 3, 10, 20, 30, 100, 200, 300)

Se o operador chop for aplicado em um vetor, arrancar o ltimo caractere de cada um


de seus elementos.
Expresses pode ser calculadas no contexto escalar ou no contexto de vetor. Por
exemplo, se @x for impresso, pode-se desejar imprimir seu contedo (contexto de vetor) ou
seu nmero de elementos (contexto escalar):
5-8

Captulo 5 Perl
@x = ("uga","uga","uh");
print ("Ele disse", @x,".");
# imprime Ele disse ugaugauh.
print ("Ele disse", "".@x,"."); # imprime Ele disse 3.

No exemplo acima, @x foi concatenada com o string nulo "", o que a transformou em
escalar (contm agora o nmero de elementos do vetor).
Se uma varivel de vetor aparecer dentro de uma string, ser interpretada (assim como
ocorre com os escalares). preciso, portanto, preceder os @s e possveis []s com contrabarras (ou coloc-los em strings neutros) para que no sejam interpretados como vetores ou
elementos de vetor, caso esta seja a inteno:
@argos = ("pa","ca"); $argos = "jacar";
$x = "joao@argos.net";
# imprime joaopaca.net
$x = "joao\@argos.net";
# imprime joao@argos.net
$y = "A varivel $argos[1]"; #imprime A varivel ca
$y = "A varivel $argos\[1]"; #imprime A varivel jacar[1]

5.1.8. Estruturas de controle


As estruturas de controle em Perl operam sobre blocos de declaraes. Um bloco de
declaraes uma instruo composta por vrias instrues simples, contidas entre chaves.
Um bloco aceito no lugar de qualquer instruo simples e as suas variveis (mesmo as criadas
dentro do bloco) so globais, a no ser que sejam declaradas locais.
As estruturas de Perl so if-elsif-else, unless, while, until, for e foreach. A
expresso if opera sobre um bloco (que a segue) somente se uma determinada condio
(expressa, entre parnteses, aps o if) for verdadeira. Aps o bloco if podem existir zero ou
mais blocos elsif, com outras condies, e, no final, um bloco else, complementando os
resultados possveis:
if ($x > 10) {
$b = " maior";
} elsif ($x < 0) {
$b = " menor";
} else {
$b = "est OK";
}

Os valores undef, "" e zero so considerados valores falsos. Strings contendo qualquer
coisa so considerados verdadeiros, assim como qualquer nmero diferente de zero.
A expresso unless (a no ser que) o contrrio do if. Pode ser usada quando se
deseja apenas a parte else do if (mas ela tambm pode ter clusula else):
unless ($salario <= 50000) {
# faa algo somente se $salario no for <= 50000
} else {
# caso contrrio... se salario for <= 50000
}
5-9

Desenvolvendo Web Sites Interativos com CGI

A expresso while (enquanto) permite que se implemente repeties. A expresso


until (at que) o seu oposto. O par do...while (faa ... enquanto) permite que antes
do teste, o bloco de instrues seja executado pelo menos uma vez:
while($dias < 31) {
$dias++;
}
until ($dias >= 31) {
$dias++;
}
do {
$dias++;
} while($dias < 30);

Para repeties em que se sabe previamente o nmero de vezes em que a operao ir


ocorrer, pose-se usar o for, que tem a mesma sintaxe que em C ou Java:
for ($i = 0; $i < 100; $i = $i + 10) {
print "$i carneirinhos... \n";
}

A iterao foreach permite navegar por uma lista de valores e manipul-los um por vez
como escalar. ideal para manipular vetores.
foreach $galinha (@galinheiro) {
print $galinha + "\n";
}

5.1.9. Outros operadores de controle de fluxo


Os operadores last, next e redo so usados dentro de uma estrutura de repetio para
oferecer meios alternativos de controle de fluxo (alm do controle baseado em uma condio
verdadeira). O operador last serve para forar a sada de uma repetio (while, do-while ou
for). Com next, possvel pular partes da estrutura e redo permite que se inicie uma nova
repetio (deixando de fora trechos que seguem a instruo. Veja os exemplos abaixo:
while ($tem_emprego) {
&bate_ponto;
if ($demissao) {
&recebe_indenizacao;
last; # cai fora do loop
}
&trabalha_dia_inteiro;
$dias++;
}
# last continua aqui... (no volta mais para o loop)

5-10

Captulo 5 Perl
while ($tem_emprego) {
&bate_ponto;
if ($dia_de_folga) {
&recebe_aviso;
next; # pula o resto do loop
}
&trabalha_dia_inteiro; # pula!
$dias++;
# pula!
# next continua aqui... (segue para fazer o teste do while)
}
while ($tem_emprego) {
# redo continua aqui... (e pula o teste do while!)
&bate_ponto;
if ($ponto_errado) {
redo; # pula o resto do loop e o teste
}
&trabalha_dia_inteiro;
$dias++;
}

Os operadores last, next e redo permitem sair na estrutura mais interna. Se for
necessrio o desvio para um outro bloco (mais externo), preciso rotul-lo. O rtulo consiste
de um nome, seguido por : (dois-pontos) que precede o for ou while.
EXT: for ($i = 0; $i < 10; $i++) {
INT: for ($j = 0; $j < 10; $j++) {
if ($i == $j) {
last; # cai fora do loop atual. Mesmo que last INT;
} elsif ($i < $j) {
next EXT; # pula esta rodada do loop externo.
} else {
print "($i, $j) "; # imprime (sem quebrar a linha)
}
}
print "\n"; # quebra a linha
}

O resultado do programa acima est listado abaixo:


(1,
(2,
(3,
(4,
(5,
(6,
(7,
(8,
(9,

0)
0)
0)
0)
0)
0)
0)
0)
0)

(2,
(3,
(4,
(5,
(6,
(7,
(8,
(9,

1)
1)
1)
1)
1)
1)
1)
1)

(3,
(4,
(5,
(6,
(7,
(8,
(9,

2)
2)
2)
2)
2)
2)
2)

(4,
(5,
(6,
(7,
(8,
(9,

3)
3)
3)
3)
3)
3)

(5,
(6,
(7,
(8,
(9,

4)
4)
4)
4)
4)

(6,
(7,
(8,
(9,

5)
5) (7, 6)
5) (8, 6) (8, 7)
5) (9, 6) (9, 7) (9, 8)

5-11

Desenvolvendo Web Sites Interativos com CGI

Alm das estruturas if e unless, possvel usar operadores booleanos para construir
estruturas de deciso. Os operadores so &&, ||. Veja alguns exemplos:
if ($x > 0) { print $x; }
$x > 0 && print $x;

# pode ser escrito como:

unless ($y >= 1) { print $y; }


$y >= 1 || print $y;

# pode ser escrito como:

Nas expresses &&, o primeiro termo executado. Se retornar falso, o segundo


ignorado e a expresso completa retorna falso. Se a expresso retornar verdadeiro, o valor final da
expresso depender da execuo do segundo termo. Nas expresses || se o primeiro termo
for verdadeiro, o segundo ignorado e o valor retornado ser verdadeiro. Se for falso, preciso
executar o segundo que dir o valor da expresso.
O operador ternrio ?: pode ser usado para substituir o if-else:
if ($x > 0) { $x++; } else { $x--; } # pode ser escrito como:
($x > 0) ? $x++ : $x--;

5.1.10.

Vetores associativos

Vetores associativos so colees de escalares assim como os vetores comuns, mas eles
no tm uma ordem definida. Os seus valores so organizados em pares. Um deles chamado
de chave e utilizado para recuperar o outro valor.
Uma varivel de vetor associativo tem um identificador que inicia com um sinal de
percentagem %. Cada elemento de um vetor associativo uma varivel escalar distinta, acessada
por uma outra varivel escalar, chamada de chave (key). Os elementos so localizados ou criados
fornecendo-se a chave entre chaves { e }:
$elem{"Rssia"} = "Moscou";
$elem{"China"} = "Beijing";
$z = $elem{"ndia"}; #retorna o valor armazenado na chave ndia

Se o objeto no existir, o valor undef retornado.


Perl no possui uma representao uniforme para um vetor associativo (no possvel
controlar a ordem dos elementos). Na criao e na impresso, o vetor associativo
representado como uma lista ou vetor, com um nmero par de elementos. A ordem desse
vetor, porm, no definida (pode no ser sempre a mesma). Embora seja possvel copiar um
vetor associativo para um vetor indexado, no h como saber qual elemento ser colocado em
que posio.
%pares = ("Rssia", "Moscou", "ndia", "Delhi", "Itlia", "Roma");
@vetor = %pares;

5-12

Captulo 5 Perl

5.1.11.

Operadores de associaes

possvel realizar operaes em vetores associativos com os operadores keys, values


e each. O operador keys retorna uma lista (vetor indexado) das chaves de um vetor
associativo. values faz o mesmo com os valores. Se no houver elementos no vetor, uma lista
vazia () ser retornada.
%cores = ("vermelho","ff0000","azul","0000ff","verde","00ff00");
@chaves = keys %cores;
# ("vermelho", "azul", "verde")
@valores = values %cores;
# ("ff0000", "0000ff", "00ff00")

O operador each serve para iterar sobre cada um dos elementos de um vetor
associativo. bastante til quando utilizado junto com um for ou um while:
while (($cor, $codigo) = each %cores) {
print "<td bgcolor=\#$codigo>$cor</td>";
}

Para remover elementos de um vetor associativo, preciso usar o operador delete:


delete $cores{'azul'};

5.1.12.

Operador eval

O operador eval interpreta uma string como cdigo Perl. til para construir instrues
e outras operaes para posterior execuo:
$x = "13.2";
$y = "19.6";
$op = "+";
eval("$x $op $y"); # resolve a expresso 13.2 + 19.6

5.2. Entrada e sada


Nesta seo apresentaremos os mecanismos bsicos para entrada e sada de dados em
um programa Perl, como leitura da entrada padro, gravao na sada padro, controle do
sistema de arquivos e leitura e gravao em arquivos.

5.2.1. Entrada e sada padro


Nos primeiros exemplos apresentados, mostramos exemplos de leitura de uma linha da
entrada padro usando o operador <STDIN>. Passando esse operador para uma varivel
escalar, obtm-se a prxima linha da entrada ou undef, se no houver mais linhas:
$linha = <STDIN>; #l prxima linha da entrada padro

Se voc atribuir <STDIN> a um vetor, todas as linhas restantes sero lidas e armazenadas
em um vetor indexado (lista). Cada linha ocupar o espao de um elemento, inclusive a novalinha \n. Para arrancar as novas linhas de todos os elementos do vetor, pode-se usar chop.
5-13

Desenvolvendo Web Sites Interativos com CGI


@linhas = <STDIN>; # l todas as linhas da entrada padro
chop @linhas; #arranca ltimos letras de todos os elementos de @linhas

Uma forma comum de ler todas as linhas da entrada padro fazer isto dentro de um
bloco de repetio while:
while ($_ = <STDIN>) {
chop $_;
#fazer alguma coisa com $_;
}

Essa operao to comum que no preciso usar a atribuio $_ = <STDIN>. Sempre


que um loop contm apenas um operador de entrada de dados <...>, o seu contedo
armazenado na varivel especial $_. O bloco acima, portanto, tambm pode ser escrito da
seguinte maneira:
while (<STDIN>) {
chop $_;
#fazer alguma coisa com $_;
}

Para ler o contedo de arquivos passados na linha de comando, preenchidas no


momento da execuo do programa, utiliza-se o operador <>. Por exemplo, suponha o
seguinte programa type.pl que chamado da forma:
perl type.pl inuteis1.txt inuteis2.txt

Se voc fizer:
while(<>) {
print $_;
}

todo o contedo dos dois arquivos ser impresso na tela.


Os dados passados na entrada padro tambm podem ser obtidos atravs do vetor
@ARGV. Esse vetor contm todos os nomes que aparecem aps o nome do programa que
podem ser obtidos atravs de $ARGV[0], $ARGV[1], etc. A varivel $ARGV (sem ndice)
contm o nome do programa.
Para ler um determinado nmero de caracteres da entrada padro (ou de qualquer outro
dispositivo) pode-se usar o operador read. O nome STDIN na verdade apenas uma constante
que serve de meio de acesso entrada padro. read recebe um vetor que deve conter a
origem, o destino e o nmero de caracteres que devem ser lidos, nessa ordem. Para ler 15
caracteres da entrada padro para dentro da varivel $cgc, pode-se fazer:
read(STDIN, $cgc, 25);

Para imprimir na sada padro pode-se usar os operadores print ou printf. O


operador print pode receber um escalar ou um vetor. Os escalares passados no vetor so
concatenados antes de impressos. Os resultados das trs instrues abaixo o mesmo:

5-14

Captulo 5 Perl
print "Hello, world!"; # escalar
print ("Hello, world!"); # vetor de um elemento
print ("Hello", "world", "!"); #vetor de trs elementos

Para imprimir texto formatado, Perl dispe do operador printf que funciona da mesma
maneira que o printf do C. A sintaxe inclui valores especiais como s para strings, d para
decimais e f para ponto-flutuante. Suponha que voc tenha as seguintes variveis:
$nome = "Aristteles";
$idade = 2383;
$pi = 3.14159265359;

Usando o operador printf da forma:


printf("%25s %5d anos. Nmero: %5.4f\n", $nome, $idade, $pi);

obtm-se a seguinte linha formatada (veja tamanhos dos campos em baixo):


Aristteles

2383 anos. Nmero:

1234567890123456789012345 12345
25 caracteres
5 dgitos

3.1416

12345.1234
5 dgitos . 5 decimais

O sinal de %, se usado dentro do string de printf, deve vir precedido de \, caso


contrrio, ser utilizado para se referir quantidade de caracteres de uma string (sufixo s) ou
nmero de dgitos de um decimal (sufixo d). Os nmeros de ponto-flutuante podem ser
arredondados pelo nmero de casas especificada aps o ponto no campo % com sufixo f.
A funo printf permite imprimir dados formatados. Em vez de impressos, os dados
podem ser atribudos a uma varivel usando sprintf. Veja um exemplo:
$tf = sprintf("%25s %5d anos. Nmero: %5.4f\n", $nome, $idade, $pi);
# coloca os dados formatados dentro da varivel $tf
print $tf; # imprime os dados formatados (como printf)

5.2.2. Arquivos
Assim como STDIN fornece um meio de acesso entrada padro, pode-se criar em Perl
outras constantes para ter acesso a arquivos. So chamados de file handles (alas de arquivo).
Alm de STDIN a linguagem fornece ainda STDOUT a sada padro, e STDERR a sada padro
de erro. A operao print imprime por default na sada padro. Para imprimir em outro
dispositivo, basta inform-lo aps o operador:
print STDERR "Erro: tente outra vez! \n";
print "Sada normal\n"; # mesmo que print STDOUT "Sada normal\n";

O dispositivo de padro de sada tambm pode ser alterado usando o operador select:
select STDERR; # seleciona STDERR como nova sada padro
print "Erro: tente outra vez!\n"; # mesmo que print STDERR "...";
select STDOUT; # default agora volta a ser STDOUT

5-15

Desenvolvendo Web Sites Interativos com CGI

Constantes de acesso a arquivos podem ser definidas pelo programador e utilizam-se de


um identificador que no possui prefixo (como $, %, @ ou &). Para evitar conflitos com palavras
reservadas do Perl, recomenda-se usar somente maisculas para definir tais constantes.
Para criar novas constantes de acesso a arquivos utiliza-se o operador open. A sintaxe a
seguinte:
open(NOME_DA_CONSTANTE, "nome_do_arquivo_ou_dispositivo");

O nome do arquivo pode ser o nome de um dispositivo como um programa que oferece
o servio de e-mail. Depois de criado a constante, ela pode ser usada para se ler o arquivo. No
interessa o contedo. Programas em Perl podem ler tanto arquivos de texto (7-bit) como
arquivos binrios (8-bits). Por exemplo, para abrir o arquivo nomes.txt e imprimir todo o seu
contedo, pode-se fazer:
open(ARQNOMES, "nomes.txt");
while (<ARQNOMES>) {
# l uma linha do arquivo e coloca em $_
print $_;
}

O processo de abertura do arquivo pode falhar. Se isto ocorrer, open retorna undef.
Uma forma de evitar um erro caso o arquivo no seja aberto colocar o open dentro de um
if ou unless e s tentar usar a constante criada se open tiver sucesso.
if (open(ARQNOMES, "nomes.txt")) {
...
} else {
print "Erro: no foi possvel abrir nomes.txt";
}

Geralmente, quando isto ocorre, preciso terminar o programa. Perl facilita o processo
com o operador die, que, como print, imprime um string s que na sada padro de erro
(STDERR) e depois sai do programa sinalizando com um cdigo de erro.
unless (open(ARQNOMES, "nomes.txt")) {
die "Erro: no foi possvel abrir nomes.txt";
}

Isto tambm pode ser feito com o operador ||, da forma mais compacta ainda open or die
(ou abre ou morre):
open(ARQNOMES, "nomes.txt") || die "Erro: no pude abrir nomes.txt";

Para abrir um arquivo para gravao preciso indicar a operao adicionando um


prefixo ao nome do arquivo. A gravao pode ser para sobrepor (substituir) os dados do
arquivo (se ele existir) ou para acrescentar, preservando o que j existe. Em ambos os casos, se
o arquivo no existir, ele ser criado. O smbolo > deve ser usado para indicar gravao com
sobreposio e >> para indicar gravao sem sobreposio. Para imprimir no arquivo, usa-se
print com dois argumentos, sendo o primeiro o nome da constante de acesso ao arquivo:
5-16

Captulo 5 Perl
open(ARQNOMES, ">>nomes.txt") || die "Erro: no pude
nomes.txt para
print ARQNOMES ("Bento Carneiro;", "Rua dos Vampiros
print ARQNOMES "\n";
print "Nome cadastrado no banco de dados"; # imprime

abrir
gravao";
Brasileiros, 27;");
na sada padro

O trecho de cdigo abaixo l uma linha de cada vez do arquivo fonte.txt e copia a
linha ao arquivo destino.txt.
open(FONTE, ">fonte.txt") || die "Erro: no pude abrir fonte.txt";
open(DESTINO, ">destino.txt") || die "Erro: no pude abrir
destino.txt para gravao";
while (<FONTE>) {
print DESTINO $_;
}

Para fechar um arquivo, usa-se o operador close. Em geral, o sistema se encarrega de


fech-lo quando sai do loop, mas, caso seja necessrio realizar o fechamento antes, use:
close FONTE;
close DESTINO;

possvel realizar diversos testes sobre os arquivos para obter informaes sobre eles
usando operadores op, onde op pode ser uma entre mais de 20 letras disponveis para testas se
o arquivo executvel, se ele pode ser lido, se uma conexo de rede, se texto, se diretrio,
sua idade, etc. A sintaxe tpica :
if (-op $arquivo) {
# operaes se op for verdadeiro ....
}

Por exemplo e serve para testar se um arquivo existe e d retorna um valor verdadeiro
se o arquivo for um diretrio, ento:
$arquivo = "papainoel";
if (-e $arquivo && !(-d $arquivo)) {
# operaes se op for verdadeiro ....
}

s ser executado se o papainoel existir e no for um diretrio.


A tabela abaixo relaciona os principais operadores de teste de arquivos de Perl e seus
significados. A maioria retorna uma condio verdadeira ou falsa. Outros retornam um valor
numrico.
TESTE

SIGNIFICADO

-r

Arquivo ou diretrio acessvel (pode ser lido)


Arquivo ou diretrio pode ser alterado
Arquivo ou diretrio executvel
Arquivo ou diretrio existe

-w
-x
-e

5-17

Desenvolvendo Web Sites Interativos com CGI


TESTE

SIGNIFICADO

-z

Arquivo existe e tem tamanho zero


Arquivo ou diretrio existe e tem tamanho diferente de zero
Operando um arquivo comum
Operando um diretrio
Operando um vnculo simblico
Operando um soquete de rede
Operando um dispositivo especial
Arquivo ASCII
Arquivo BINARY
Idade do arquivo em dias
ltimo acesso do arquivo em dias
ltima modificao do arquivo em dias

-s
-f
-d
-l
-S
-c
-T
-B
-M
-A
-C

Para mover (mudar o nome) e remover um arquivo ou diretrio, Perl oferece dois
operadores: unlink remove um arquivo, e rename altera o nome de um arquivo.
print Digite o nome do arquivo a ser removido: ;
chop($arquivo = <STDIN>);
unlink ($arquivo);
unlink ("senhas.txt","jegue.gif");
unlink (<*.bak>); #isto um glob. Veja prxima seo
rename ("despesas.txt", "receita.txt") || die "Isto ilegal!";

5.2.3. Diretrios
Varios operadores em Perl servem para acesso a diretrios. O mais simples o chdir,
que permite mudar de um diretrio para outro, e navegar no sistema de arquivos:
chdir ("/docs/lixo") || die "No possvel mudar para o lixo!"

O comando dependente de plataforma. Para rod-lo em Windows, preciso usar a barra


invertida a no ser que o programa seja criado para operar como CGI em um servidor Apache
que, mesmo em Windows, interpreta a barra como separador de diretrios. Para criar e remover
diretrios, Perl oferece respectivamente os operadores mkdir e rmdir. Na criao de diretrios
usando mkdir, deve-se informar o formato de permisses chmod do Unix. S possvel a
remoo de diretrios vazios:
mkdir ("zona", 0777); #cria um diretrio onde todos tm acesso total
mkdir ("casa", 0755); #cria um diretrio onde o dono tem acesso total
mas o grupo e outros s podem ler e executar
rmdir("encosto") || die "No possvel se livrar do encosto!";

5-18

Captulo 5 Perl

O recurso do Unix de permitir a filtragem de listas de arquivos atravs do Shell


chamada de globbing. Isto pode ser usado em Perl colocando o padro de busca entre sinais < e
>:
@lixo = </docs/*.bak>;

Da forma acima, o glob retorna uma lista (vetor) contendo todos os nomes que
coincidem com o padro de busca. No contexto escalar (se o glob for atribudo a uma varivel
escalar), o prximo nome de arquivo ser recebido.
Para ler o contedo de um diretrio preciso abri-lo e para isto, assim como fizemos
com os arquivos, precisamos definir uma constante (file handle) que permita o acesso ao
diretrio. O operador open no deve ser usado neste caso mas Perl oferece um operador
chamado opendir que tem exatamente a funo de abrir diretrios e retornar uma constante
que permita manipul-lo. Uma vez aberto, o contedo do diretrio pode ser listado com
readdir.
opendir (CAIXA, "/pandora") || die "Voc no pode abrir esta caixa!;
while ($males = readdir(CAIXA)) {
print "$males\n";
}

Para sair do diretrio, usa-se closedir (que geralmente no necessrio, pois o sistema
fecha os arquivos e diretrios quando sai do loop.
closedir(CAIXA);

5.3. Expresses regulares


Expresses regulares representam padres que devem ser comparados a uma cadeia de
caracteres. O resultado da comparao pode ser utilizado simplesmente para tomar decises
(em caso de sucesso ou falha), para obter informaes sobre o texto (como, quantas vezes e
onde a comparao ocorreu) ou para realizar substituies baseadas no resultado da
comparao.
Expresses regulares so comuns em vrios programas e ferramentas de sistemas
operacionais Unix como os shells e aplicaes como grep, awk, emacs e vi. Perl possui o conjunto
mais completo de expresses regulares entre essas ferramentas Unix. Como elas fazem parte da
linguagem, tambm esto presentes nas implementaes de Perl em Windows. Inspiradas em
Perl, vrias outras linguagens modernas, como JavaScript, adotam a sintaxe de expresses
regulares usadas na linguagem, que hoje tambm est presente em ferramentas de busca e
substituio de processadores de texto, programas de editorao eletrnica e ferramentas de
desenvolvimento Web.

5-19

Desenvolvendo Web Sites Interativos com CGI

5.3.1. Sintaxe bsica


A expresso regular geralmente representada entre barras /. Para us-la, ela deve ser
comparada com uma string que deve estar armazenada em uma varivel escalar (pode ser $_)
por exemplo:
$texto = "Os camelos foram beber gua na cachoeira.";
if ($texto =~ /camelo/) {
# expresso regular em negrito!
print "Existem camelos no texto!";
}

O operador =~ define o objeto no qual a expresso regular calculada. Pode ser


qualquer varivel ou um dispositivo como <STDIN>. Se o objeto e operador =~ omitido, a
operao ocorre sobre a varivel global $_.
$_ = "Os camelos foram beber gua na cachoeira.";
if (/camelo/) {
print "Existem camelos em todo lugar!";
}

Geralmente, expresses regulares so mais complexas do que as mostradas acima.


Podem conter vrios operadores, cdigos e caracteres especiais que permitem uma busca mais
refinada. Por exemplo:
if ($texto =~ /ca.el*o/) {
print "Existem camelos, cabelos, camellos, cabellllos, ...!";
}

A busca com substituio requer expresses mais elaboradas que utilizam os operadores
de transliterao e de substituio. Esses operadores podem ser aplicados para localizar padres no
texto e substitu-los por outros padres, variveis, strings ou pelo resultado de certas expresses.
Contm vrias opes que permitem buscas e substituies globais, com execuo de
expresses, etc. Sero apresentados no final desta seo. O exemplo a seguir substitui todas as
ocorrncias de cavalo por jumento em $sitio:
$sitio =~ s/cavalo/jumento/g

O sufixo g indica que a busca global.

5.3.2. Mudana de delimitadores


O delimitador usado por default para expresses regulares a barra /. Se o texto
contido entre barras possui barras, preciso preceder cada uma delas com uma contra-barra
(para anular o efeito da barra). Quando h muitas ocorrncias de /, o cdigo pode ficar
ilegvel, pois cada / se transforma em \/. possvel, porm, trocar o delimitador por
outro como parnteses, chaves, colchetes, cifres, etc. desde que seja um (ou um par) de
caracteres no-alfanumricos. Para fazer a mudana, o novo delimitador deve vir precedido pelo
caractere m. O smbolo que seguir o m ser o novo delimitador.

5-20

Captulo 5 Perl
$caminho =~ /\/home\/usuarios\/helder\/public_html\/perl\//; #default: /
$caminho =~ m@/home/usuarios/helder/public_html/perl/@; # delim: @
$caminho =~ m(/home/usuarios/helder/public_html/perl/); # delim: (

Caso sejam usados os caracteres (, { ou [, o caractere de fechamento ser o ),


} ou ] correspondente.
Para substituies, transliteraes e outras operaes semelhantes (seo seguinte), que
usam um operador (s, tr) com texto entre trs delimitadores, o m desnecessrio. O
delimitador desejado deve ser definido logo aps o s ou tr:
$x
$x
$x
$y
$y

=~
=~
=~
=~
=~

s/\/home\/usuarios\/helder\//\/~helder\//;
# default
s(/home/usuarios/helder/)(/~helder/);
# delim: (
s#/home/usuarios/helder/#/~helder/#;
# delim: #
tr/abcd/ABCD/;
# delimitador default: /
tr#abcd#ABCD#;
# delimitador: #

A troca de delimitadores s deve ser realizada nas poucas situaes onde, de fato,
melhora a legibilidade do cdigo. Evite usar como delimitadores caractere que aparecem
dentro da expresso.

5.3.3. Variveis
O contedo de variveis pode ser passado para expresses regulares da mesma forma
como so interpretados dentro de strings. possvel, portanto, construir uma expresso regular
a partir de strings previamente calculados:
$texto = "Os camelos passaram a noite numa festa com as llamas.";
print "Digite uma palavra para procurar no texto: ";
$palavra = <STDIN>;
chop $palavra;
if ($texto =~ /\b$palavra\b/) {
print "A palavra \"$palavra\" foi encontrada no texto!";
} else {
print "A palavra \"$palavra\" no foi encontrada no texto!";
}

O smbolo \b utilizado para marcar os limites de uma palavra (para evitar que a palavra
aspa, por exemplo, combine com caspa ou com aspargos).

5.3.4. Padres simples


A comparao mais simples aquela que procura combinar uma seqncia exata. Por
exemplo, encontrar o caractere a em uma string ou a palavra camelo. Um exemplo desse
tipo de combinao foi mostrado na seo anterior.
O caractere . (ponto) utilizado para representar qualquer caractere, com exceo do
caractere de nova-linha (\n). No exemplo mostrado anteriormente, /ca.elo/ combina com
camelo, cabelo, caeelo, ca&elo, etc.

5-21

Desenvolvendo Web Sites Interativos com CGI

Pode-se restringir os caracteres permitidos usando classes de caracteres, representadas


por uma seqncia de caracteres permitidos entre colchetes [ e ]. Somente um dos caracteres
da lista pode estar presente no lugar marcado. Por exemplo, /ca[bmp]elo/ combina com
camelo, cabelo e capelo, mas no com caBelo ou ca_elo. Para representar uma
seqncia de caracteres, pode-se usar o caractere -, por exemplo:
/[abcdeABCDE]/
/[0-9]/

# a mesma coisa que /[a-eA-E]/


# a mesma coisa que /[0123456789]/

Pode-se tambm inverter a seleo, ou seja, permitir qualquer caractere que no esteja na
lista. Para isto, basta colocar um circunflexo ^ antes da seqncia:
/[^abcdeABCDE]/ # qualquer caractere menos a, b, c, d e e.
/[^0-9]/
# tudo menos nmeros

Para incluir os caracteres -, ^, \ e ] na lista, preciso preced-los por uma


contra-barra.
Vrias classes so predefinidas em Perl e suas seqncias podem ser substitudas por
caracteres de escape, mostrados na tabela abaixo:
SEQNCIA

CLASSE EQUIVALENTE

\d

[0-9]

\w

[a-zA-Z0-9_]

\s

[ \r\t\n\f]

\D

[^0-9]

\W

[^a-zA-Z0-9_]

\S

[^ \r\t\n\f]

5.3.5. Seqncias, multiplicadores e alternao


Os smbolos usados na seo anterior permitem combinar no mximo um caractere.
Para fazer combinaes mais complexas, preciso usar outros padres chamados de
seqncias, multiplicadores e alternao. A seqncia j foi mostrada anteriormente. Consiste
de qualquer seqncia de caracteres entre barras, como /camelo/. Para representar zero ou
mais ocorrncias de um determinado caractere, utiliza-se o mais simples dos multiplicadores, o
asterisco *. Alm dele existem o sinal de mais + que representa um ou mais (o caractere
anterior), e o ponto de interrogao ?, que significa zero ou uma ocorrncias do caractere
anterior. A tabela abaixo fornece um resumo desses smbolos:
MULTIPLICADOR

5-22

MULT. GERAL

RESULTADO

c*

c{0,}

c+

c{1,}

c?

c{0,1}

zero ou mais c
um ou mais c
zero ou um c

Captulo 5 Perl

Por exemplo, a expresso regular /ca+me*los?/ combina com camelo, camelos,


cameeelos e caaamlo, mas no com cmelo ou cameloss.
A substituio usando multiplicadores sempre realizada com o mximo de elementos
possvel que combine com o padro. Por exemplo, a expresso regular de substituio
s/a*h/u,

quando aplicada string


$_ = "Baaaaaaaaaah, tch!";

substituir todos os 10 as consecutivos com uma nica letra u. Se a inteno substituir


grupos menores, preciso usar o multiplicador geral, definido entre chaves { e }. Com ele,
pode-se definir uma faixa de valores indicando a quantidade de elementos a serem substitudos.
Exemplos:
s/a{5}h/u
s/a{2,4}h/u
s/a{0,3}h/u
s/a{6,}h/u

#
#
#
#

exatamente 5 a: Buuh, tch!


de 2 a 4 (de preferncia) a: Buuuh, tch!
de 0 a 3 a
6 ou mais a

Para combinar com uma lista de alternativas possveis de caracteres, pode-se usar as
classes de caracteres (entre colchetes). Para combinar entre alternativas de seqncias, porm,
as classes no servem. Para isto, usa-se um grupo chamado de alternao, onde as alternativas
so separadas pelo caractere |.
/dia|tarde|noite|madrugada/ # combina com uma das alternativas
/(segunda|tera|quarta|quinta|sexta)-feira|sbado|domingo/
# parnteses definem precedncia. Opes sero segunda-feira,
# tera-feira, ..., domingo.

5.3.6. ncoras
H quatro caracteres especiais que ancoram um padro. Pode-se identificar o incio da
string, o final e a exigncia ou no de um limite (incio ou final) de uma palavra.
A tabela abaixo relaciona os quatro tipos de padro.
NCORA
^
$
\b
\B

FUNO

Incio da cadeia de caracteres


Fim da cadeia de caracteres
Fim ou incio de palavra
No h fim ou incio de palavra

O marcador \b marca o incio ou o final de uma palavra. J o marcador marca a


inexistncia desse limite. Veja alguns exemplos:
/po\b/ # combina com po mas no com pozinho
/\bpo/ # combina com po e pozinho mas no com sapo
5-23

Desenvolvendo Web Sites Interativos com CGI


/\bpo\b/ # combina com po mas no com pozinho nem sapo
/\bpo\B/ # combina com pozinho mas no com po francs
/\Bpo\B/ # combina com sapozinho mas no com um po francs

Para representar o incio de uma string, usa-se o circunflexo ^. Este caractere s tem
significado especial quando aparece no incio da expresso regular. Em qualquer outro lugar,
representa o caractere circunflexo. Se for necessrio localizar o caractere circunflexo no incio
do padro, deve-se preced-lo por uma contra-barra.
/^morcego^/
/\^morcego^/

# combina com morcego^ no incio da string


# combina com ^morcego^ em qualquer lugar

O cifro representa o final da cadeia de caracteres. S faz sentido us-lo no final de um a


expresso (em qualquer outro lugar ser interpretado como o prefixo de uma varivel escalar).
/R$/
/R\$/

# combina com R no fim da string


# combina com R$ em qualquer lugar da string

Quando houver vrios tipos diferentes de operadores de grupo (multiplicadores,


ncoras, alternao, seqncias) sempre pode-se usar parnteses para resolver o problema de
operaes que devem ser realizadas antes de outras. H uma ordem de precedncia para esses
operadores que est mostrada na tabela abaixo:
OPERADORES
1

( )

+ * ? {m,n}

abcde
^ $ \b \B

TIPO

parnteses
multiplicadores
seqncias
ncoras
alternao

Veja abaixo alguns exemplos de expresses regulares e o efeito dos parnteses e das
regras de precedncia:
/a|b*/
/(a|b)*/
/abc*/
/(abc)*/
/^x|y/
/^(x|y)/
/a|bc|d/
/(a|b)(c|d)/

#
#
#
#
#
#
#
#

um nico a ou seqncia de bbbbb...


seqncia de aaa... ou de bbb...
ab, abc, abcc, abccc, abcccc ...
"", abc, abcabc, abcabcabc, ...
x no incio da string ou y em qq. lugar
x ou y no incio da string
a ou bc ou d
ac, ad, bc ou bd

Importante: No confunda /^abc/ com /[^abc]/. A primeira expresso combina com a


string abc no incio da linha. A segunda combina com um caractere apenas que no seja a, b
ou c.

5-24

Captulo 5 Perl

5.3.7. Parnteses como memria


Alm de controlar a precedncia das operaes de grupo, parnteses tambm so usados
como memria para armazenar o resultado de expresses para uso posterior. Para recuperar
um padro previamente armazenado, preciso utilizar uma contra-barra seguida por um
inteiro (\1, \2, \3, etc.) representando a ordem em que a expresso (ou substring) ocorre.
Cada par de parnteses utilizado, mesmo se utilizado apenas para determinar precedncia,
lembrado e recuperado por um nmero inteiro. Veja alguns exemplos
/<(b)>.*<\/\1>/ # combina com qualquer coisa entre <b> e </b>
/25(.)12\11999 13(:)15\259/ # 25-12-1999 13:15:59 ou 25/12/1999 ...
/C(.*)s e D\1s/ # Cobras e Sobras, Cucos e Sucos, Cantos e Santos

As principais aplicaes dos parnteses como memria ocorrem em substituies:


$pagina = "<html><head> ... </body></html>";
$pagina =~ s/<([^>]*.)>/&lt;\1&gt;/g
# troca todos os <...> (... contm ">") por &lt;...&gt;

Depois de uma combinao bem sucedida (como o exemplo acima), as variveis


somente-leitura $1, $2, $3, etc. so definidas com os mesmos valores de \1, \2, \3, etc. Elas
podem ento ser usadas em outras partes do programa.
$bichos = "As cobras e os ratos esto com sede.";
$bichos =~ /.s c(.*)s e .s r(.*)s /; # observe o espao aps o s
print "Os g$2s devoram as s$1s do restaurante\n";

As variveis tambm podem ser lidas em um contexto de vetor:


$_ = "As cobras e os ratos esto com sede.";
($primeiro, $segundo) = /.s c(.*)s e .s r(.*)s /;
# ou @valores = /.s c(.*)s e .s r(.*)s /;

No exemplo acima, $primeiro contm o valor armazenado em $1 e $segundo contm


o valor em $2. H ainda outras trs variveis predefinidas que obtm informaes adicionais
sobre a expresso regular. Todas esto mostradas na tabela abaixo.
VARIVEL
$1, $2, $3, ...
$&
$`
$'

FUNO

Guardam os valores armazenados nos parnteses


Guarda o resultado da expresso regular
Guarda o texto antes do resultado (crase)
Guarda o texto aps o resultado (apstrofe)

As variveis so definidas aps cada expresso calculada. Se for necessrio utiliz-las mais
adiante no programa, devero ser copiadas para outras variveis. Veja um exemplo:
$texto = "Os camelos passaram a noite numa festa com as llamas";
$texto =~ /ca(.el)*o/;
print "Primeiro texto armazenado: $1\n"; # imprime mel
print "Texto localizado: $&\n"; # imprime camelos

5-25

Desenvolvendo Web Sites Interativos com CGI


print "Texto anterior: $'\n"; # imprime Os
print "Texto posterior: $`\n"; # imprime passaram ... llamas

5.3.8. Outros operadores


O sufixo i (de ignore case) pode ser acrescentado aps a ltima barra de uma expresso
regular para torn-la insensvel ao formato maisculo ou minsculo dos caracteres (caseinsensitive). Veja um exemplo:
print "Digite o que voc quer fazer: ";
$nome = chop <STDIN>;
if ($nome =~ /^listar/i) {
# listar resultados
# Usurio pode digitar Listar, LISTAR RESULTADOS, ...
}

5.3.9. Substituies
O operador de substituio, representado pelo prefixo s, colocado antes de uma
expresso regular de duas partes, tem a seguinte sintaxe bsica:
s/texto_antigo/texto_novo/

A expresso acima altera apenas a primeira ocorrncia de texto_antigo. Para localizar e


substituir todas as ocorrncias, utiliza-se o sufixo g:
s/texto_antigo/texto_novo/g

O sufixo e usado para tratar a segunda parte de um substituio como uma expresso.
Na substituio, a segunda parte executada:
s/(camelos)/chop $1/e

# substitui camelo por camelos

A tabela abaixo contm vrios sufixos freqentemente usados nos operadores de


substituio. Os sufixos podem ser colocados lado a lado em qualquer ordem. O resultado de
qualquer uma das duas expresses abaixo o mesmo:
s/texto_antigo/chop($texto). !/ge;
s/texto_antigo/chop($texto). !/eg;
SUFIXO
i
e
g

5-26

FUNO

Ignora formato caixa-alta ou caixa-baixa em qualquer


expresso regular.
Trata a segunda parte da substituio como expresso Perl (e
executa).
Realiza a substituio em todo o string (busca e substituio
global)

Captulo 5 Perl

5.3.10.

Transliterao

O operador de transliterao til para realizar substituies simultneas entre


caracteres. Para realizar uma transliterao, usa-se o comando tr, seguido de dois argumentos
entre barras (ou outro delimitador qualquer), assim como o comando s. Os operandos
consistem de uma seqncia antiga e uma nova. O primeiro caractere da nova seqncia
substituir todas as ocorrncias do primeiro caractere da antiga seqncia encontrados no
texto-objeto da substituio (ou a varivel $_). O mesmo ocorrer com os segundos caracteres,
os terceiros, etc.
$texto = "O rei roeu os rabos dos ratos de Roma.";
$texto =~ tr/aeiou/AEIOU/;
# $texto agora contm O rEI rOEU Os rAbOs dOs rAtOs dE ROmA.

possvel especificar uma seqncia ordenada usando o hfen. Por exemplo, tanto faz
usar 0123456789 ou 0-9. Se a primeira seqncia tiver mais caracteres que a segunda, o
ltimo caractere da segunda seqncia ser repetido para cada caractere da primeira seqncia
que no tiver um correspondente na segunda. Veja alguns exemplos:
$texto = "O rato roeu a roupa do rei de Roma.";
$texto =~ tr/aeioubcdfghjklmnpqrstvwxyz/AEIOU/; # 26 cars. para 5
# $texto agora contm O UAUO UOEU A UOUUA UO UEI UE ROUA.

Pode ser usado o valor de retorno de uma transliterao, que contm o nmero de
caracteres afetados. Para obter esse valor, basta atribuir o resultado da expresso uma
varivel:
$_ = "O rei roeu os rabos dos ratos de Roma.";
$num = tr/aeiou/AEIOU/; # num contm 14 e
# $_ contm O rEI rOEU Os rAbOs dOs rAtOs dE ROmA.

possvel usar o operador tr para obter o nmero de caracteres que combinam com a
primeira expresso, sem alterar a string, mantendo o segundo argumento da operao vazio:
$_ = "O rei roeu os rabos dos ratos de Roma.";
$num = tr/aeiou//; # num contm 14 e $_ no foi alterado.

Na tabela abaixo esto as principais opes que podem modificar o operador tr e sua
funo. Assim como as opes de s, elas so listadas depois da segunda seqncia, em
qualquer ordem:
$texto =~ tr/aeiou/AEIOU/cds;
SUFIXO
d
c
s

FUNO

Remove caracteres que no aparecem na segunda parte da


transliterao.
Resultado conjunto de todos os caracteres que no
aparecem na primeira parte da transliterao.
Converte mltiplas cpias seguidas de uma letra na segunda

5-27

Desenvolvendo Web Sites Interativos com CGI


SUFIXO

FUNO

parte de uma transliterao como uma s.


A melhor forma de ilustrar o funcionamento de tr atravs de exemplos. Considere a
seguinte string:
$_ = "O rei roeu os rabos dos ratos de Roma.";

A opo d elimina quaisquer caracteres listados na primeira seqncia que no tm


correspondente na segunda. Abaixo, apenas aeiou combina. Sem a opo d, a letra U
substituiria cada letra no encontrada.
tr/aeioubcdfghjklmnpqrstvwxyz/AEIOU/d; #apaga caracteres
# $_ agora contm "O EI OEU O AO O AO E ROA."
# (os caracteres a-z exceto vogais foram eliminados)

A opo c considera o complemento (a negao) da primeira seqncia em relao ao


universo de caracteres (256) disponveis.
tr/a-z/_/; # sem opes
# $_ agora contm "O ___ ____ __ _____ ___ _____ __ R___."
tr/a-z/_/c; #substitui complemento (caracteres no listados)
# $_ agora contm "__rei_roeu_os_rabos_dos_ratos_de__oma_"
# (todos os caracteres exceto a-z (O,R, ,.) foram convertidos em _

A opo s ignora repeties sucessivas de uma mesma letra.


tr/aeiou/x/; # sem opes
# $_ agora contm "O rxx rxxx xs rxbxs dxs rxtxs dx Rxmx."
$_ = "O rei roeu os rabos dos ratos de Roma.";
tr/aeiou/x/s; # ignora caracteres repetidos
# $_ agora contm "O rx rx xs rxbxs dxs rxtxs dx Rxmx."
$_ = "O rei roeu os rabos dos ratos de Roma.";
tr/a-z/x/s; # ignora caracteres repetidos
# $_ agora contm "O x x x x x x x Rx."

possvel fazer substituies sofisticadas combinando mais de uma opo:


$_ = "um
dois
trs quatro
cinco.";
tr/a-zA-Z\./ /cs; # somente espaos, ignora repeties
# $_ agora contm "um dois tr s quatro cinco."; # est entre a-z
$_ = "um
dois
trs quatro
cinco.";
tr/a-zA-Z\./ /cd; # elimina todos os espaos
# $_ agora contm "umdoistrsquatrocinco.";

5.3.11.

Operadores split e join

O operador split recebe uma string e uma expresso regular. Ele faz uma busca global
pela expresso e retorna um vetor contendo as partes da string que no combinam com a

5-28

Captulo 5 Perl

expresso. O resultado da expresso regular serve, ento, como um separador para transformar
strings em vetores:
$registro = "nome; endereo; telefone; email";
@campos = split(/;/, $registro);
($nom, $end, $tel, $ema) = @campos;

O valor default para o operador split um ou mais espaos consecutivos, ou seja


/\s+/. O objeto default a varivel $_. As duas operaes a seguir so, portanto, equivalentes:
$_ = "um
dois
trs
quatro
cinco";
@nums = split(/\s+/, $_); # eh a mesma coisa que...
@nums = split; # resultado: ("um","dois","trs","quatro","cinco")

O operador join o contrrio do split. Enquanto aquele separa, este junta. Os


argumentos so: um vetor que ter seus elementos concatenados e uma string, que ser repetida
entre os elementos do vetor.
$linTab = join("</td><td>", @nums);
# res.: um</td><td>dois</td><td>trs</td><td>quatro</td><td>cinco
print "<table border=1><tr><td>".$linTab."</td></tr></table>";

5.4. Subrotinas e bibliotecas


5.4.1. Subrotinas
O operador sub utilizado em Perl para definir um procedimento ou subrotina que pode
ser chamado de outra parte do programa ou de outro programa (se includo em uma
biblioteca). Por exemplo:
sub soma {
print 2+2;
}

define a subrotina soma. Para cham-la, utiliza-se um identificador com o nome da subrotina
precedido do caractere &.
&soma; # imprime 4.

Uma subrotina pode ter qualquer nmero de instrues, simples ou compostas. O


ltimo valor resultante de uma expresso sempre retornado. Por exemplo, na subrotina:
sub soma {
2+2;
}

a chamada
$res = &soma;

armazena o valor 4 em $res.


5-29

Desenvolvendo Web Sites Interativos com CGI

Uma subrotina termina assim que chega ao fim. Para escapar antes, pode-se usar o
operador return que tambm pode ser usado para devolver um valor, ao deixar a operao:
sub soma {
return 2+2;
}

O valor de retorno no precisa ser um escalar. Pode tambm ser um vetor.


Algumas subrotinas podem requerer parmetros passados na sua chamada. Uma rotina
de soma mais til seria chamada da forma:
$res = &soma(13,4);

O argumento que segue a chamada da funo um vetor. Ele ser automaticamente


armazenado no vetor global @_. Dentro da subrotina, os valores passados podem ser
recuperados lendo os valores desse vetor:
sub soma {
($x, $y) = @_;
return $x + $y;
}

Dentro da subrotina, @_ local. As outras variveis definidas dentro da subrotina,


porm, no so. Para declarar variveis como locais preciso usar o operador local. A forma
tpica de construir funes que recebem parmetros em Perl, , portanto:
sub soma {
local($x, $y, @extras) = @_; #$x e $y so locais (como @_)
# resto da funo.
}

A varivel @_ tambm pode ser referenciada em partes escalares, utilizando os


identificadores $_[0], $_[1], etc. O uso de elementos do vetor @_ que no existem no
provoca erros (todos contm undef).
O seguinte exemplo mostra uma subrotina que pode aceitar qualquer nmero de
argumentos.
sub somatorio {
local ($sum);
$sum = 0;
foreach $_ (@_) {
$sum += $_;
}
return $sum;
}

Para chamar a funo acima, pode-se usar qualquer vetor ou expresso que resulte em
vetor, para passar os parmetros aps o nome da funo:

5-30

Captulo 5 Perl
&somatorio(4, 8, 10); # soma 4 + 8 + 10
&somatorio(1..20);
# soma 1+2+3+...+19+20

5.4.2. Bibliotecas
Trechos de cdigo em Perl definidos em outros arquivos podem ser includos em um
programa usando a instruo require. Esse recurso extremamente til para a definio de
bibliotecas de subrotinas e variveis globais que devem ser compartilhadas por mais de um
programa.
Qualquer programa em Perl pode ser includo em outro usando require. preciso,
porm, que a ltima linha do cdigo includo contenha um valor definido e positivo (o valor
retornado pelo require). Tipicamente, os arquivos a serem includos consistem de uma
coleo de subrotinas (blocos sub { ... }). Depois das subrotinas, deve haver mais uma
linha no fim do arquivo:
1;

A linha acima o suficiente para que o arquivo possa ser usado como biblioteca e
importado com require:
require "biblio.pl";

Na distribuio original do Perl (desde a verso 4) h vrias bibliotecas que podem ser
importadas usando require. Tipicamente, os arquivos tm a extenso .pl ou .ph. A varivel
global $INC[0] (do vetor @INC) contm o diretrio onde tais bibliotecas esto armazenadas
(nas distribuies padro do Perl para Unix ou no ActivePerl para Windows).
Vrias outras bibliotecas teis podem ser encontradas na Internet. Uma das mais
populares a biblioteca cgi-lib.pl1, que contm vrias subrotinas teis ao tratamento de
dados em programas CGI. Outras como oraperl.ph e sybperl.ph contm subrotinas e
variveis teis para o acesso a bancos de dados Oracle e Sybase, respectivamente. Tambm
podem ser encontradas na Internet2.

5.5. Transformao de dados


Uma das principais vantagens de Perl como linguagem preferencial para uso na Web (em
programas CGI) a quantidade de recursos que possui para realizar transformao e
formatao de dados. Nesta seo sero apresentados os principais operadores para
manipulao e formatao de strings.

Veja na Internet em http://www.cgi-lib.org. H tambm bibliotecas para C e outras linguagens. Para


manipulao de cookies via CGI, veja a biblioteca Perl cookie.lib em http://www.worldwidemart.com/scripts/
2 http://src.doc.ic.ac.uk/packages/perl/db/perl4/. Veja tambm os mdulos (orientados a objetos) do Perl 5.
1

5-31

Desenvolvendo Web Sites Interativos com CGI

5.5.1. Manipulao de texto


Trs operadores existem para localizar e extrair trechos de um texto mais longo. As
funes index e rindex retornam um nmero indicando a posio onde tem incio uma
determinada seqncia de caracteres dentro de um texto maior. A nica diferena entre as duas
funes a ordem em que realizam a busca. index procura o texto do incio at o fim da string
e rindex faz a busca no sentido contrrio. A sintaxe geral :
$pos = index($str, $substring); # ou rindex($str, $substring);

O nmero retornado ser um valor inteiro maior ou igual a zero e menor que o
comprimento total da string. Se a substring no for encontrada, o valor retornado ser 1. Se
houver mais de uma ocorrncia do texto procurado, apenas a posio do primeiro encontrado
ser retornada (que poder ser diferente caso seja usado index ou rindex). possvel iniciar a
busca a partir de uma posio especfica, informada como terceiro argumento:
$pos = index($str, $subs, $ini); # ou rindex($str, $subs, $ini);

Veja alguns exemplos usando index e rindex:


$texto = "Abandonai toda esperana, vs que entrais!";
$num1 = index($texto, "an");
# $num1 contm 2
$num2 = index($texto, "an", $num+1); # $num2 contm 20
$num3 = rindex($texto, "an");
# $num3 contm 20
$num4 = rindex($texto, "an", $num); # $num4 contm 2

A funo substr extrai uma parte de um texto maior a partir de suas posies inicial e
final. A sintaxe bsica :
$novoString = substr($string, $inicio, $fim);

As variveis $inicio e $fim devem ser inteiros. Se $incio for menor que zero, a
contagem comea a partir do final da string. $fim deve ser maior que zero para que o resultado
retorne uma string no-vazia. Veja alguns exemplos:
$frag = substr($texto, $num1, $num2); # ou substr($texto, 2, 20);
# $frag contm "andonai toda esper" (caracteres 2 a 19)
$fim = substr($texto, -8, 6); # contm "entrai"
# iniciando na 8a. letra a partir do fim, retornar as prximas 6

O operador substr tambm pode aparecer do lado esquerdo da operao de atribuio.


Nessa situao, ele pode receber um novo texto que ir substituir a substring no texto original.
O texto novo pode ser maior ou menor que o texto substitudo:
$texto = "Abandonai toda esperana, vs que entrais!";
substr($texto, 0, 7) = "Deix"; # 4 letras no lugar de 7
# texto contm "Deixai toda esperana, vs que entrais!";
substr($texto, -8, 4) = "cheg";
substr($texto, 0, 4) = "Pass";

5-32

Captulo 5 Perl
substr($texto, 12, 20) = "a grana";
# texto contm "Passai toda a grana, vs que chegais!";

5.5.2. Formatos
Um formato um gabarito (template) de impresso. Permite criar um layout para posterior
formatao de texto. Com formatos pode-se definir como o texto ser posicionado na pgina e
fixar previamente ttulos de colunas, rtulos cabealhos e rodaps.
Antes que um formato possa ser usado ele precisa ser definido. Uma vez definido, pode
receber os dados que sero posicionados em seus campos. Finalmente, ele pode ser chamado e
impresso.
Um formato definido atravs da palavra reservada format, seguida de um identificador
que ser o nome de um formato. Segue a definio do formato (que pode ocupar zero ou mais
linhas). A definio termina com um ponto . isolado no incio de uma linha. A definio
contm um conjunto de campos fixos (linhas de texto), que contm valores fixos que devem ser
impressos. Essas linhas podem tambm conter campos variveis que so reservados atravs de
operadores de formatao. Aps uma linha que contm campos variveis, deve haver outra
linha contendo as variveis que devem substitu-los separadas por vrgulas. Veja um exemplo
de formato abaixo:
format ETIQUETA =
+-----------------------------------------------+
| Nome: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$nome
| Endereo: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$endereco
| Cidade: @<<<<<<<<<<<<<<< UF: @< CEP: @<<<<-@<<|
$cidade, $uf, $cep1, $cep2
+-----------------------------------------------+
.

O operador @<<< reserva espao para um determinado nmero de caracteres alinhados


pela esquerda. @ representa um caractere, @< representa dois, e assim por diante. Se uma linha
de campo fixa contiver 3 campos variveis @, ela deve vir seguida de uma linha com 3 variveis
escalares separadas por vrgulas.
Uma vez definido o formato, ele pode ser chamado com o operador write. Antes ele
deve ser preenchido com os dados que ir formatar. Isto feito atribuindo valores s variveis
globais utilizadas pelo formato. Os dados podem ser lidos de fontes externas. Por exemplo,
suponha um arquivo com vrios registros separados por ponto-e-vrgula:
Marie Curie;Rua do Csio, 137;Vila Tchernobyl;PE;50213-320
Hans Staden;Rua Potiguares, 13;So Paulo;SP;01234-970

Se essas informaes esto em um arquivo dados.txt, podem ser lidas pelo programa
em Perl usando open. O resultado do formato deve ser redirecionado para um arquivo (ou

5-33

Desenvolvendo Web Sites Interativos com CGI

qualquer dispositivo) que ser aberto para gravao. O nome do descritor de arquivo deve ser
o mesmo nome do formato:
open (ETIQUETA,">etiquetas.txt") || die "No pude criar formato";
open (DADOS,"dados.txt") || die "No pude abrir arquivo";
while (<DADOS>) {
# l uma linha do arquivo para $_
chop; # remove \n de $_
($nome, $endereco, $cidade, $uf, $cep) = split(/;/);
($cep1, $cep2) = split(/-/,$cep);
write ETIQUETA; # envia variveis lidas para formato
}

Depois do cdigo acima, o arquivo etiquetas.txt deve conter:


+-----------------------------------------------+
| Nome: Marie Curie
|
| Endereo: Rua do Csio, 137
|
| Cidade: Vila Tchernobyl UF: PE CEP: 50213-320|
+-----------------------------------------------+
+-----------------------------------------------+
| Nome: Hans Staden
|
| Endereo: Rua Potiguares, 13
|
| Cidade: So Paulo
UF: SP CEP: 01234-970|
+-----------------------------------------------+

Esta seo apenas apresentou os conceitos bsicos dos formatos Perl. H vrios outros
operadores e maneiras diferentes de manipular, construir e utilizar formatos. A tabela abaixo
oferece uma lista dos principais operadores para a definio dos campos de um formato.
OPERADOR
@<<<<
@>>>>
@||||
@####.##
@*
^<<<<,
^>>>>,
^||||
~
~~
.

5-34

FUNO
Reserva espao para 5 caracteres alinhados pela esquerda.
Reserva espao para 5 caracteres alinhados pela direita.
Reserva espao para 5 caracteres alinhados pelo centro.
Reserva espao para campo numrico com 5 casas antes do ponto decimal e
duas casas aps o ponto.
Reserva espao para informao que ocupa mltiplas linhas.
Reserva espao para campos preenchidos (campos multi-linha com larguras
definidas). Cada linha dever ser seguida por uma linha contendo a varivel
escalar que contm os dados (mesmo repetida).
Suprime uma linha em campos preenchidos caso ela seja vazia.
Repete o ltimo formato (campos preenchidos) caso o texto exceda o
espao reservado previamente.
Termina a definio de um formato (se sozinho no incio de uma linha)

Captulo 5 Perl

5.6. Mdulos
Enquanto Perl 4 uma linguagem totalmente orientada a procedimentos, Perl 5 inclui
todo o Perl 4 e acrescenta uma nova estrutura que permite a construo de programas
orientados a objetos.
Objetos permitem uma maior reutilizao de cdigo e a realizao de tarefas complexas
em menos linhas de cdigo e de forma mais simples. Mas a programao orientada a objetos
tambm introduz uma complexidade adicional formada por novos conceitos, termos e tcnicas
de programao que esto alm dos nossos objetivos neste tutorial, j que nosso objetivo
oferecer recursos suficientes ao desenvolvimento de aplicaes CGI tpicas.
Nesta seo apresentaremos uma viso superficial dos mdulos de classes um recurso
orientado a objetos do Perl 5 porque so teis no desenvolvimento de aplicaes em Perl
mais sofisticadas como gateways de acesso a bancos de dados ou de gerao de imagens, com
aplicaes na Web atravs de CGI. Vrios mdulos tambm esto disponveis para a
manipulao de dados recebidos por formulrios HTML. O objetivo desta seo , portanto,
mostrar como utilizar esses mdulos. No ser abordada a construo de classes e pacotes em
Perl.

5.6.1. O que so mdulos de classe


Mdulos de classe so arquivos especiais (chamados de pacotes) contendo cdigo em Perl
e que devem ser usados para o armazenamento de funes e a construo de objetos. Um objeto
algo que pode armazenar dados e ocultar operaes complexas, fornecendo uma lista finita
de operaes que podem ser realizadas sobre ele e sobre os dados que contm. As operaes
de um objeto so chamadas de mtodos. Os dados que armazena, em geral, s podem ser
alterados pelos mtodos, que so a sua interface pblica. Um programa orientado a objetos ,
portanto, um algoritmo que, em vez de ser definido em funo de uma seqncia de
operaes, caracterizado pela interao entre objetos. Tais programas podem apresentar-se
bem mais simples que os programas procedurais pois a maior parte da complexidade fica
dentro dos objetos que no aparecem no programa principal.
Para utilizar um objeto preciso primeiro cri-lo. Uma classe o molde usado para isto.
A classe contm a definio dos mtodos do objeto e uma funo especial chamada de construtor.
O construtor utilizado para criar novos objetos a partir da classe. Cada objeto tem sua
prpria cpia dos mtodos e variveis definidos na classe.
Em Perl, classes so definidas dentro de mdulos. Mdulos podem conter pacotes ou
subpacotes que, por sua vez, contm as classes. Para usar um mdulo preciso utilizar a
instruo use e o nome do(s) pacote(s) definido(s) nele. Por exemplo, para usar o mdulo
ODBC.pm que define o pacote Win32::ODBC preciso import-lo com:
use Win32::ODBC;

5-35

Desenvolvendo Web Sites Interativos com CGI

Os pacotes que se comportam como classes devem conter funes e construtores para a
construo de objetos. No caso do mdulo acima, o pacote define uma instruo new que
funciona como construtor ( uma conveno criar construtores com este nome). A instruo
requer o parmetro Win32::ODBC (nome da classe outra conveno) seguido pelo nome de
uma fonte de dados ODBC. Para criar um novo objeto com esta classe, portanto, preciso
fazer:
$objeto = new Win32::ODBC("nome_DSN");

Depois que um objeto criado, seus mtodos podem ser chamados. Diferentemente dos
mtodos de classe (ou funes) como o construtor new, acima, os mtodos tm que ser
chamados em relao ao objeto ao qual pertencem. O operador utilizado para isto ->:
$objeto->mtodo("arg1", 99, $arg3);
$objeto->metodo2;

Os objetos em Perl so destrudos automaticamente atravs de um sistema de coleta de


lixo, portanto, o programador no precisa se preocupar em destruir objetos criados.

5.6.2. Como usar mdulos


preciso conhecer quais os mtodos, classes e objetos definidos em um mdulo antes
de us-lo. Se o mdulo faz parte da distribuio original do Perl, deve haver documentao
disponvel no diretrio onde o interpretador foi instalado. Em outros casos, a documentao
deve acompanhar a distribuio do mdulo.
A instalao de um mdulo (que no esteja disponvel na distribuio Perl) pode consistir
da simples cpia de um arquivo com extenso .pm para um subdiretrio de [dir.
instalao]/perl/lib/, de vrios outros arquivos ou at da compilao de arquivos. preciso
consultar a documentao de cada mdulo.
Na distribuio original do Perl 5 (5.004) h vrios mdulos. Muitos fazem a mesma
coisa de formas diferentes; uns so mais fceis de usar, mais completos ou mais eficientes do
que outros. Nas subsees a seguir, so apresentados alguns mdulos teis para o
desenvolvimento de aplicaes CGI.

5.6.3. Mdulos para uso com CGI


Quase todas as distribuies do Perl 5 (inclusive o ActivePerl for Windows) possuem um
mdulo CGI::* ou similar com diversas classes teis para lidar com dados de formulrios e
cookies (CGI::Cookie). Esses mdulos podem ser usados no lugar das bibliotecas cgi-lib.pl
e cookie.lib compatveis com o Perl 4. H tambm mdulos HTTP::*,
HTTP::Response::* e HTTP::Request::*. Os mdulos so bastante extensos e possuem
muitos mtodos e formas de utilizao. Em vez deles, preferimos apresentar o mdulo
CGI_Lite.pm. Ele contm as funes bsicas presentes na biblioteca cgi-lib.pl (Perl 4) e
ainda recursos para decodificar dados no formato multipart/form-data (resultantes de
formulrios do tipo file-upload). Ele no faz parte da distribuio original e no tem todos os
5-36

Captulo 5 Perl

recursos dos mdulos CGI nativos mas muito mais fcil de usar. Para instal-lo, basta copiar
o arquivo CGI-Lite.pm para o diretrio perl/lib/ da sua instalao. CGI-Lite pode ser
encontrado em qualquer repositrio CPAN (Comprehensive Perl Archive Network) na Internet.

5.6.4. Exemplo de uso


O programa abaixo decodifica todos os dados recebidos pelo formulrio e os imprime
em um arquivo de texto devolvido ao browser:
use CGI_Lite;
$cgi = new CGI_Lite();
$cgi->parse_form_data();
print "Content-type: text/plain","\n\n";
$cgi->print_form_data();

O mtodo parse_form_data decodifica os dados de entrada e os retorna em um vetor


associativo. Cada valor, do par nome-valor, pode ser recuperado da forma $vetor{'nome'}.
O programa acima usou print_form_data para imprimir todos os valores. O programa
abaixo faz o mesmo usando o vetor %dados:
$cgi = new CGI_Lite();
%dados = $cgi->parse_form_data();
print "Content-type: text/plain","\n\n";
foreach $key (keys %dados) {
print $key, " = ", $dados{$key}, "\n";
}

5.6.5. Exemplo com File Upload [GUND96]


Formulrios que usam o elemento HTML <input type="file"> permitem que
arquivos sejam enviados ao servidor pelo cliente. Os dados recebidos precisam ser separados e
decodificados. O processo simples com CGI-Lite.
#!c:\perl\bin\perl.exe
use CGI_Lite;
$cgi = new CGI_Lite();
print "Content-type: text/plain","\n\n";
$cgi->set_directory("c:\lixo") || die "Diretorio nao existe!\n";
$cgi->set_platform("DOS");
$cgi->set_file_type("handle");

5-37

Desenvolvendo Web Sites Interativos com CGI


%dados = $cgi->parse_form_data();
$email = $dados{'email'};
$ARQ
= $dados{'arquivo'};
print "Eis o arquivo que voc nos enviou: \n";
print "-----------------------------------\n";
if (-T $arq) {
while ($linha = <$ARQ>) {
print $linha;
}
close $ARQ;
} else {
print "Erro: voc no enviou um arquivo de texto!";
}
print "\n-----------------------------------\n";

O arquivo HTML com um formulrio que serve de interface ao programa acima pode
ser o seguinte:
(...) <body>
<h1>Formulrio de Upload</h1>
<form action="fup.pl" method="POST" enctype="multipart/form-data">
<p>Digite seu email <input type=text name=email size=15><br>
Arquivo de texto<br><input type=file name=arquivo><br>
<button type=submit>Enviar Arquivo</button></p>
</form>
</body> (...)

5.6.6. Mdulo ODBC para Windows


H vrios mdulos Perl para acesso a bancos de dados no Unix. No Windows, preciso
utilizar o ActivePerl (www.activestate.com) ou verso compatvel, que possui alguns
mdulos nativos. Para acesso via ODBC existe um mdulo em http://www.roth.net
(compatvel com o ActivePerl). Nesse site, pode-se baixar todo o mdulo ODBC para instalao
ou apenas os arquivos j compilados e coloc-los nos lugares adequados (mais fcil).
Os arquivos do pacote so dois: ODBC.PM e ODBC.DLL. O primeiro deve ser copiado
para \lib\Win32 da instalao ActivePerl (ex: C:\perl\lib\Win32). O arquivo ODBC.PLL
deve ser copiado para \lib\Auto\Win32\ODBC\. Depois dessa instalao, o mdulo j pode
ser usado.

5.6.7. Como usar o mdulo Win32::ODBC


Seu cdigo dever ter a seguinte linha:
use Win32::ODBC;

Em seguida, abra uma conexo na sua fonte de dados (cria objeto $dados):
5-38

Captulo 5 Perl
$dados = new Win32::ODBC("DataSourceName");

Voc pode agora enviar declaraes SQL vontade atravs do objeto que foi obtido
(veja mtodos abaixo). Quando terminar de usar o banco, chame o mtodo Close():
$dados->Close();

5.6.8. Principais mtodos


Catalog qualifier, owner, name, type

Recupera o catlogo do objeto ODBC atual. Retorna um vetor de quatro elementos:


(Qualificador, Proprietrio, Nome, Tipo). Todos os nomes de campo usam caixa-alta.
Exemplo:
($qualifier, $owner, $name, $type) = $db->Catalog("", "", "%",
"'TABLE'");
Close

Fecha a conexo.
Data
Data list

Recupera os dados de um cursor previamente carregado (como resultado de uma


declarao SQL). Como escalar, retorna todos os campos concatenados. Como vetor,
retorna cada campo em um elemento de vetor.
Exemplo:
$db->Sql("SELECT f1, f2, f3 FROM foo");
$db->FetchRow();
($f1, $f2) = $db->Data("f1", "f2");

ou
$db->Sql("SELECT * FROM foo");
$db->FetchRow();
@values = $db->Data;
DataHash
DataHash list

Recupera os dados de um cursor previamente carregado (como resultado de uma


declarao SQL). Retorna uma tabela associativa (nome-valor) onde o nome do campo
a chave para recuperar o valor. Exemplo:
$db->Sql("SELECT f1, f2, f3 FROM foo");
$db->FetchRow();
%hash = $db->DataHash("f1", "f2");
print $hash{f1};

ou
5-39

Desenvolvendo Web Sites Interativos com CGI


$db->Sql("SELECT * FROM foo");
$db->FetchRow();
%hash = $db->DataHash;
foreach $key (sort(keys %hash)) {
print $key, '=', $hash{$key}, "\n";
}
Error

Retorna o ltimo erro na forma de um vetor ou um string. Exemplo:


die $db->Error(), qq(\n);
($ErrNum, $ErrText, $ErrConn) = $db->Error();
FetchRow

Busca o prximo registro (linha da coluna) da ltima declarao SQL. Para recuperar os
dados, preciso seguir um FetchRow por Data ou DataHash. Retorna undef se no
houver mais linhas para ler. Exemplo:
$db->Sql("SELECT * FROM foo");
$db->FetchRow() || die qq(Fetch error: ), $db->Error(), qq(\n);
$f1 = $db->Data("f1");
TableList
TableList qualifier, owner, name, type

Recupera uma lista de nomes de tabela da conexo ODBC atual usando Catalog.
Exemplo:
@tables = $db->TableList;

5.6.9. CGI para acesso via ODBC


O exemplo abaixo mostra um acesso simples a um banco de dados Access. Para que
funcione preciso que o mdulo ODBC esteja instalado (seo anterior) e que haja uma fonte
de dados ODBC (Data Source) no sistema com o nome mdbdados1 que aponte para a base
anuncios.mdb3, distribuda com esta apostila. O programa apenas lista o contedo da base.
#!c:\perl\bin\perl.exe
use Win32::ODBC;
print "Content-type: text/html\n\n";
&buscaTudo;
exit(0);

O banco de dados anuncios.mdb contm apenas uma tabela chamada anuncios. As colunas so numero
(INT), data (CHAR), texto (CHAR) e autor (CHAR).
3

5-40

Captulo 5 Perl
sub buscaTudo
{
$sql = "SELECT * FROM anuncios;";
$dsn = "mdbdados1"; # este o nome da fonte de dados do sistema
$bd = new Win32::ODBC($dsn);
$bd->Sql($sql);
print "<table border=1>";
while ($bd->FetchRow())
{
@registros = $bd->Data("numero", "data", "texto", "autor");
print "<tr valign=top>";
print "<td>$registros[0]</td>";
print "<td>$registros[1]</td>";
print "<td><pre>$registros[2]</pre></td>";
print "<td>$registros[3]</td>";
print "</tr>";
}
print "</table>";
$bd->Close();
}

Veja outros exemplos, com acesso completo, atualizao, insero, remoo e busca
nesta base, no disquete que acompanha esta apostila.

5.6.10.

Mdulo grfico GD

O mdulo grfico GD utilizado para gerar imagens PNG (ou GIF, nas verses mais
antigas). Para isto dispe de uma biblioteca de mtodos e classes para a manipulao grfica.
Para instalar o GD preciso baixar o mdulo em www.boutell.com, compil-lo e instal-lo.
No Unix, a instalao geralmente no apresenta problemas e simples, pois o roteiro de
instalao bastante eficiente.
No Windows, a compilao exige o GNU C Compiler, o que no muito comum entre os
usurios desse sistema. A melhor soluo, neste caso, usar o aplicativo Perl Package Manager
(PPM) do ActivePerl. Estando conectado Internet, rode PPM e, quando o prompt PPM>
aparecer, digite install GD e aguarde uns 5 minutos (enquanto ele faz download dos
arquivos). Depois de instalado, rode os programas de teste. Voc pode usar a biblioteca
incluindo no seu programa a declarao:
use GD;

Depois, crie um objeto Image, Font ou Polygon e chame seus mtodos atravs dele.

5.6.11.

Objeto Image

GD::Image

5-41

Desenvolvendo Web Sites Interativos com CGI

uma classe que permite a criao de um objeto atravs do qual pode-se manipular os
dados de uma imagem e chamar mtodos de desenho e transformao. O objeto criado
atravs do construtor (mtodo de classe) new:
$imagem = new GD::Image(50, 50);
$imagem->rectangle(0,0,40,40, $im->colorAllocate(0,0,255));

Veja um exemplo de criao e exibio de uma imagem (Manual do GD):


#!/usr/local/bin/perl
use GD;
# create a new image
$im = new GD::Image(100,100);
# allocate some colors
$white = $im->colorAllocate(255,255,255);
$black = $im->colorAllocate(0,0,0);
$red = $im->colorAllocate(255,0,0);
$blue = $im->colorAllocate(0,0,255);
# make the background transparent and interlaced
$im->transparent($white);
$im->interlaced('true');
# put a black frame around the picture
$im->rectangle(0,0,99,99,$black);
# Draw a blue oval
$im->arc(50,50,95,75,0,360,$blue);
# And fill it with red
$im->fill(50,50,$red);
# Convert the image to PNG and print it on standard output
print $im->png;

5.6.12.

Objeto Polygon

GD::Polygon

Classe usada para criar um polgono. Os mtodos que podem ser chamados a partir do
objeto permitem acrescentar e remover vrtices e realizar outras transformaes.
$poly = new GD::Polygon;
$poly->addPt(50,0);
$poly->addPt(99,99);
$poly->addPt(0,99);

5-42

Captulo 5 Perl

5.6.13.

Objeto Font

GD::Font

Classe usada para criar novas fontes.

5.6.14.

Construtor newFromGif (mtodo de classe)

Este construtor cria uma imagem (manipulvel dentro de um programa) atravs de uma
imagem GIF existente, passada atravs de um descritor de arquivo previamente aberto para um
arquivo GIF vlido. Em caso de sucesso, o construtor retorna a imagem como um objeto. Em
caso de falha, retorna undef.
open (ANTAS,"duasantas.gif") || die "Impossivel abrir arquivo";
$im = newFromGif GD::Image(ANTAS) || die "Formato incorreto";
close GIF;

5.6.15.

Principais mtodos do objeto GD::Image

colorAllocate
GD::Image::colorAllocate(r, g, b)

Este mtodo aloca uma cor de acordo com seus componentes de luz (vermelha, verde e
azul) que podem ter valores que variam entre 0 e 255. Se uma cor no for alocada, este
mtodo retorna 1. A primeira cor alocada utilizada como cor de fundo. Exemplo:
$white = $im->colorAllocate(255,255,255); # cor de fundo
$black = $im->colorAllocate(0,0,0);
$magenta = $im->colorAllocate(255,0,255);
line
GD::Image::line(x1, y1, x2, y2, cor)

Desenha uma linha de (x1, y1) a (x2, y2) na cor especificada. Pode-se usar uma cor real,
previamente alocada, ou uma das cores especiais gdBrushed, gdStyled e
gdStyledBrushed. Exemplos:
$im->line(0,0,150,150,gdBrushed);
$im->line(0,150,150,0,$magenta);
$im->line(0,75,150,75, $im->colorAllocate(255,0,0));
rectangle
GD::Image::rectangle(x1, y1, x2, y2, cor)

Desenha um retngulo na cor especificada. Os pontos (x1, y1) e (x2, y2) correspondem
aos cantos superior esquerdo e inferior direito, respectivamente. Pode-se ainda usar as
cores especiais gdBrushed, gdStyled e gdStyledBrushed. Exemplo:
$im->rectangle(10,10,100,100,$magenta);

5-43

Desenvolvendo Web Sites Interativos com CGI


filledRectangle
GD::Image::filledRectangle(x1, y1, x2, y2, cor)

Preenche um retngulo na cor especificada. Os pontos (x1, y1) e (x2, y2) correspondem
aos cantos superior esquerdo e inferior direito, respectivamente. Pode-se usar uma cor
real (previamente alocada) ou com o padro definido por uma imagem (previamente
carregada usando newFromGif) definida com o mtodo setTile(). O padro (tile) atual
pode ser atribudo ao desenho com a cor reservada gdTiled. Exemplo:
open(GIF,"tijolos.gif") || die;
$tile = newFromGif GD::Image(GIF);
$myImage->setTile($tile);
$myImage->filledRectangle(10,10,150,200,gdTiled);
polygon
GD::Image::polygon(polgono, cor)

Desenha um polgono na cor especificada. preciso, antes de desenh-lo, criar o


polgono usando a classe GD::Polygon. Um polgono deve ter pelo menos trs vrtices.
Se o ltimo vrtice no fechar o polgono, o mtodo o fechar automaticamente antes de
desenh-lo. Pode-se usar cores reais ou as cores especiais gdBrushed, gdStyled e
gdStyledBrushed para desenhar o polgono (no preenchido). Exemplo:
$poly = new GD::Polygon;
$poly->addPt(50,0);
$poly->addPt(99,99);
$poly->addPt(0,99);
$im->polygon($poly,$blue);
filledPolygon
GD::Image::filledPolygon(polgono, cor)

Desenha e preenche o polgono com a cor especificada. Pode-se usar as cores comuns
ou a cor especial gdTiled (padro baseado em imagem previamente importada).
Exemplo:
$poly = new GD::Polygon;
$poly->addPt(50,0);
$poly->addPt(99,99);
$poly->addPt(0,99);
$im->filledPolygon($poly, $magenta);
arc
GD::Image::arc(cx, cy, largura, altura, incio, fim, cor)

Desenha arcos e elipses. O centro especificado em cx, cy) e (largura, altura) especificam a
altura e largura. O incio e o fim so definidos em graus de 0 a 360. Zero a parte mais

5-44

Captulo 5 Perl

alta do elipse. Noventa (90) a parte mais direita. Para desenhar crculos, use incio em
0, fim em 360 e valores iguais para altura e largura. Pode-se usar cores reais ou as cores
especiais gdBrushed, gdStyled e gdStyledBrushed. Exemplo:
$im->arc(100,100,50,50,0,180,$blue);
fill
GD::Image::fill(x, y, color)

Preenche uma regio na cor especificada. Funciona como a ferramenta balde de tinta
nos aplicativos de desenho. A pintura comea na origem (x, y) e pra logo que encontra
um pixel de outra cor. Pode-se usar cores normais ou gdTiled. Exemplo:
$im->rectangle(10,10,100,100,$black);
$im->fill(50,50,$blue);
fillToBorder
GD::Image::fillToBorder(x, y, cor_da_borda, cor_do_preenchimento)

Como fill, este mtodo preenche uma rea com a cor especificada mas permite que se
defina outra cor para a borda. A borda s pode usar uma cor normal (no pode usar as
cores especiais). O preenchimento pode ser uma cor normal ou gdTiled. Exemplo:
$im->rectangle(10,10,100,100,$red);
$im->fillToBorder(50,50,$black,$blue); # borda ser azul
string
GD::Image::string(font, x, y, string, cor)

Este mtodo desenha uma string na posio (x,y) utilizando fonte e cor especificadas. H
quatro fontes diferentes que podem ser usadas: gdSmallFont, gdMediumBoldFont,
gdTinyFont e gdLargeFont. Exemplo:
$im->string(gdSmallFont,2,10,"Imagem vale 1000 palavras", $magenta);
png (ou gif)
GD::Image::gif

Retorna o cdigo (texto) da imagem em formato PNG (Portable Network Graphics) ou


GIF (Graphics Image Format). Apenas um dos formatos est disponvel dependendo da
verso do GD utilizada. As verses mais novas suportam apenas PNG uma vez que o
formato GIF agora proprietrio.
$imagemPNG = $im->png;
print $imagemPNG;

Consulte manual do GD para outros mtodos e mtodos dos objetos Polygon e Font.

5-45

Desenvolvendo Web Sites Interativos com CGI

5.7. Referncias
1. Randal Schwartz. Learning Perl. OReilly and Associates, 1993
2. Larry Wall. Programming Perl. OReilly and Associates, 1992
3. Shishir Gundavaram. CGI Programming for the World Wide Web. OReilly and
Associates, 1996
4. ActiveState. ActivePerl 522 Users Manual. www.activestate.com.
5. Perl 5.004 Manual Pages. www.perl.org
6. Perl 5.004 Frequently Asked Questions. www.perl.org
7. GD Graphics Library. www.boutell.com
8. Roth. Windows ODBC Module. www.roth.net
9. Spainhour and Quercia. WebMaster in a NutShell. OReilly and Associates, 1997

5-46

Captulo 6 - Fundamentos HTTP

6. Fundamentos HTTP
O PROTOCOLO HTTP consiste de um conjunto de comandos, cdigos e procedimentos que
garantem a comunicao entre um browser e um servidor Web. Para desenvolver programas
usando CGI, em qualquer linguagem, essencial conhecer os fundamentos do protocolo
HTTP Hypertext Transfer Protocol. Este o objetivo deste captulo.

6.1. O que HTTP


HTTP significa Hypertext Transfer Protocol. o principal protocolo utilizado nas comunicaes na Internet e o protocolo que d sustentao ao servio conhecido como World
Wide Web. A especificao, elaborada pelo W3C1, o define como:
HTTP um protocolo de nvel de aplicao para sistemas de hipermdia, colaborativos e distribudos. um protocolo genrico, sem estado e orientado a objetos que pode ser usado para diversas tarefas, tais como servidores de nomes e sistemas de gerenciamento de objetos distribudos, atravs da extenso de seus mtodos de requisio [RFC2068].
A W3C define HTTP como um protocolo sem estado (stateless). Isto quer dizer que o
protocolo no preserva informaes de estado entre requisies ao servidor. Se um servidor
recebe uma seqncia de 3 requisies de trs clientes ao mesmo tempo ele no saber separar
as requisies por cliente de forma a considerar informaes da primeira requisio que podem
influenciar na segunda ou terceira. Isto quer dizer que no ser possvel, por exemplo, implementar aplicaes que dependam de informaes de estado definidas em pginas separadas,
como aplicaes de comrcio online, sem recorrer a mecanismos externos ao protocolo.

6.2. Mtodos
HTTP define um conjunto de mensagens chamados de mtodos de requisio HTTP que
so usados pelo cliente, geralmente um browser como o Netscape Navigator ou Microsoft
Internet Explorer, para enviar uma requisio ao servidor. Esta requisio , na maior parte das
vezes, uma solicitao para que o servidor devolva uma pgina HTML, uma imagem, um com1

World Wide Web Consortium (http://www.w3.org)


6-1

Captulo 6 - Fundamentos HTTP

ponente ou recurso multimdia. O mtodo HTTP usado neste tipo requisio o mtodo GET
que, alm de requisitar pginas, imagens ou programas, pode requisitar informaes geradas na
sada de um dispositivo ou programa executado pelo servidor.
Vrios outros mtodos so definidos pelo protocolo HTTP. O protocolo tambm garante a possibilidade de extenses. A verso HTTP 1.1 define 7 mtodos bsicos, que so: GET,
HEAD, POST, PUT, DELETE, TRACE, OPTIONS. Um servidor Web mnimo, que suporte HTTP
1.1, deve ser capaz de entender pelo menos os mtodos GET e HEAD. Um servidor Web tpico
recebe normalmente requisies GET, HEAD e POST, sendo a grande maioria requisies GET.
As mensagens passadas em HTTP podem ser requisies ou respostas. As requisies
so formadas e enviadas por um cliente HTTP. As respostas so retornadas por um servidor.
A porta de comunicaes onde o servidor aguarda requisies , por default, a porta 80. Se
outra porta for utilizada, ela dever constar da requisio.

6.3. Requisies HTTP e mtodo GET


A requisio HTTP obedece a um formato padro [RFC2068]:
<mtodo HTTP> <URL do recurso solicitado> <verso HTTP>
<cabealhos formato RFC 822>
<dados>

O cabealho inclui informaes adicionais essenciais ou no. Tipicamente contm o nome do host (se separado da URL na requisio), a data, o nome e verso do cliente, etc. Sempre termina com uma linha em branco. Algumas requisies enviam dados adicionais aps o
cabealho. Nestes casos, o cabealho deve conter ainda o tamanho e tipo dos dados enviados.
O mtodo GET tem a finalidade de recuperar informaes do servidor. A especificao
[RFC] o define como um mtodo seguro e idempotente, ou seja, deve produzir o mesmo resultado se repetido vrias vezes. GET no envia dados aps o cabealho e possui a seguinte sintaxe
mnima:
GET <URL_relativa> HTTP/1.1
Host: <host>
<linha em branco (CRLF)>

Por exemplo:
GET /index.html HTTP/1.1
Host: www.canopus.com.br

Faz uma conexo porta 80 da mquina www.canopus.com.br e solicita ao servidor o


arquivo index.html localizado na raiz de documentos. A requisio acima normalmente contm vrias outras linhas de cabealho antes da linha em branco. Abaixo est uma requisio
para buscar a pgina index.html, formada ao se clicar em um link no Microsoft Internet Explorer:

6-2

Captulo 6 - Fundamentos HTTP


GET /index.html HTTP/1.1
User-Agent: Mozilla 4.0 (compatible; MSIE 4.01; Windows98)
Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg, image/png
Host: www.canopus.com.br

Os cabealhos presentes dependem do mtodo usado na requisio. Alguns dos cabealhos mais usados em requisies GET so:
User-Agent - contm uma string que identifica o browser que faz o pedido.
Host - endereo internet do servidor.
Date data da requisio.
Accept - pode haver vrios campos accept. Cada um contm um tipo MIME (tipo/subtipo) que aceito pelo browser que faz o pedido. Exemplos: Accept: text/plain,
text/html; Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c; Accept: *.*,
q=0.1
Accept-Encoding - tipos de codificao aceitas pelo browser.
Referer contm uma string com a URL do documento onde est a referncia (link)
do recurso solicitado. No aparece se requisio no foi causada por um link.
If-Modified-Since usada com o mtodo GET para torn-lo condicional. Se o documento no mudou desde a ltima vez em que foi recuperado, ele no ser enviado e
o browser deve busc-lo no cache.

6.4. Respostas HTTP


Aps receber uma requisio, um servidor HTTP sempre responde. A resposta pode
consistir de uma mensagem de erro, de redireo ou de sucesso. A sintaxe das respostas :
<verso HTTP> <cdigo de status> <informaes de status>
<cabealhos formato RFC822>
<dados>

O cdigo de status um nmero de trs dgitos que pode ter a forma 1xx, 2xx, 3xx, 4xx
ou 5xx, onde x qualquer dgito de 0 a 9. Cdigos comeando em 4 ou 5 indicam mensagens
de erro. Iniciando em 2 indicam sucesso. 3xx usado para indicar requisio incompleta ou
redirecionamento. 1xx usado para retornar informaes durante o processamento. Os cdigos de erro 4xx indicam que o cliente deve ter errado. Os cdigos 5xx indicam que o servidor
est consciente que o erro dele, e no pode ser solucionado pelo cliente. As informaes de
status contm um texto descrevendo a ocorrncia. Veja alguns codigos:
x OK 200 A requisio foi atendida.
x No Response 204 O servidor recebeu a requisio mas no h nada a ser retornado.
Browser deve se manter na mesma pgina.
x Bad request 400 - A sintaxe do pedido era inadequada ou impossvel de ser satisfeita.
x Unauthorized 401 O cliente no tem autorizao para obter a informao
6-3

Captulo 6 - Fundamentos HTTP

x Forbidden 403 O objeto no pode ser enviado. No adianta ter autorizao.


x Not found 404 O servidor no encontrou nada que combinasse com a URL que recebeu.
x Internal Error 500 Erro interno
x Not implemented 501 Recurso no implementado
x Moved 301 a informao se mudou para outro lugar. A resposta contm a nova URL
do recurso.
x Not Modified 304 a pgina no foi modificada desde o ltimo acesso. Recupere-a do
cache.
Por exemplo, uma resposta iniciando em:
HTTP 1.0 404 Not Found

ser enviada ao browser caso o servidor no consiga atender requisio do browser por
no encontrar o recurso solicitado, ou
HTTP 1.0 200 OK

em caso de sucesso.
Como resposta requisio GET acima (seo anterior), o servidor poderia ter retornado:
HTTP/1.0 200 OK
Server: Netscape-FastTrack/2.0a
Date: Mon, 4 Jan 1999 18:37:47 GMT
Content-type:text/html
Content-length: 19920
Last-modified: Sun, 13 Dec 1998 5:11:59 GMT
<!DOCTYPE ... </html> (19920 bytes de informao)

Poderia tambm ter retornado um erro. Por exemplo, ao requisitar uma pgina HTML
ao servletrunner (servidor especial da Sun que s serve servlets) ele retorna um erro:
HTTP/1.0 403 Forbidden
Server: servletrunner/2.0
Content-type:text/html
Content-length: 135
Date: Mon, 4 Jan 1999 18:39:55 GMT
<html><head><title></title></head>
<h1>403 Forbidden</h1><body>
Will not serve files, only servlets
</body></html>

Observe a linha em branco separando os dados (o contedo de uma pgina) do cabealho (gerado pelo servidor).

6-4

Captulo 6 - Fundamentos HTTP

Os cabealhos que o servidor devolve ao cliente referem-se a propriedades do objeto retornado mais informaes de ambiente. A maioria deles so gerados automaticamente pelo
servidor. Quando se usa CGI, preciso completar o cabealho com uma linha em branco.
Antes de completar o bloco do cabealho, porm, o programador CGI pode acrescentar novos
cabealhos, como o cabealho Content-type, que informa o tipo do contedo gerado pelo
CGI, e geralmente obrigatrio. Alguns dos principais cabealhos de resposta esto listadois a
seguir:
Content-Length: Contedo em bytes da informao enviada.
Content-Type: indica o tipo de mdia dos dados que esto sendo enviados. Tipo
MIME ou tipos de multiplas partes: Multipart/alternative, Multipart/related, Multipart/mixed ou Multipart/parallel Exemplo: Content-type: text/html.
Content-Encoding: codificao utilizada (se utilizada). Formatos suportados pelo padro W3C so x-compress e x-gzip.
Date: indica a data de criao do objeto. O formato deve seguir RFC850.
Server: inclui informaes sobre o servidor.
Expires: indica uma data em que a informao no documento no mais vlida (usada
por browser que fazem cache). O formato o mesmo de Date.
Last-Modified: este cabealho indica a data e a hora da ltima modificao de um recurso. O formato igual do de Date.
Location: define a localizao exata de um recurso, atravs de uma URL. Este deve ser
usado em separado de qualquer outro. Se o browser ler uma linha contendo Location:
http://novaURL.com/novapag.html, a janela vai ser redirecionada para buscar as informaes na nova URL.
Set-Cookie: Define um cookie.
Pragma pode ter o valor no-cache indicando que o servidor deve retornar um
documento mesmo que ele no tenha mudado (usado pelo Reload do browser).
O cabealho Content-type um dos mais importantes. Ele informa o tipo dos dados
que o browser est recebendo. Sem ele, o browser no seria capaz de distinguir uma pgina
HTML de uma imagem GIF. O cabealho Content-type contm o tipo MIME dos dados
que viro a seguir. O cabealho Content-length, no menos importante, informa quantos
caracteres o browser ter que ler antes que toda a informao seja recebida.
Sempre que se cria uma pgina dinmica, produzida por um programa CGI, necessrio
montar (imprimir) a parte do cabealho HTTP que o servidor no faz sozinho, que o Content-Type) e terminar o bloco com uma linha em branco.
O servidor Web sempre retorna alguma coisa. Qualquer coisa que esteja armazenada nos
diretrios de documentos do servidor HTTP ser retornada para o browser se houver permisso. Pode ser uma pgina HTML, mas tambm pode ser um arquivo executvel Windows. Se a

6-5

Captulo 6 - Fundamentos HTTP

raiz de documentos (/) de um servidor Web rodando em Windows C:\WINDOWS\COMMAND e


o browser solicitar
GET /format.com HTTP/1.0

o servidor devolver:
HTTP/1.0 200 OK
Server: Caranguejeira/1.0
Date: Mon, 4 Jan 1999 21:10:33 GMT
Content-type: application/x-msdownload
Content-length: 41604
Last-modified: Sat, 24 Aug 1996 11:11:00 GMT
Converted

MZx U I

(...)

6.5. Mtodo HEAD


O mtodo HEAD semelhante ao mtodo GET. A nica diferena entre eles a resposta
do servidor. O servidor que recebe HEAD, retorna o cabealho completo dos dados requeridos
mas no retorna os dados.
HEAD normalmente usada para verificar a data de ltima modificao do arquivo, o tamanho do arquivo, tipo dos dados, etc. para fins de otimizao da transferncia ou gerenciamento de cache ou proxy.

6.6. Extenses HTTP


A maior parte das requisies de um browser geralmente so para recuperar algum recurso no servidor. s vezes, porm, o cliente quer que o servidor execute um programa.
preciso que o servidor esteja configurado para identificar o que o cliente quer a partir da URL
da requisio. Um servidor que suporte CGI, por exemplo, pode identificar um pedido de execuo se a URL solicita um recurso contido em um diretrio especial:
GET /cgi-bin/format.com HTTP/1.0

aqui chamado de CGI-BIN. Desta vez, o programa ser executado na mquina servidora e a
sada do programa poder ser retornada para o cliente.
A extenso de um arquivo tambm freqentemente usada pelo servidor para distinguir
um recurso esttico de um recurso executvel. Em servidores Microsoft IIS:
GET /texto.asp HTTP/1.0

far com que o servidor tente interpretar comandos especiais na pgina HTML texto.asp e
envie o resultado para o browser.
Freqentemente, um programa no servidor requer parmetros enviados pelo cliente para
poder executar corretamente. Tome por exemplo um contador que precisa saber o nome do

6-6

Captulo 6 - Fundamentos HTTP

arquivo onde armazenar a contagem. A linha de informaes que segue a ? em uma URL
tem um comprimento limitado e chamada de Query String e pode ser usada para passar parmetros. A requisio ao contador poderia ser da forma:
GET /cgi-shl/count.pl?arq=pg34.txt HTTP/1.0

O programa em Perl count.pl ser ento executado pelo servidor recebendo o parmetro arq=pg34.txt como argumento.

6.7. Mtodo POST


POST usado pelo cliente para enviar dados ao servidor durante uma requisio. O alvo

da requisio deve ser um agente capaz de realizar alguma coisa com os dados recebidos. A
URL da requisio POST, portanto, geralmente contm informaes que fazem o servidor executar algum procedimento em vez de simplesmente retornar uma imagem ou pgina.
POST indicado para enviar grandes quantidades de dados ao servidor j que no limitado como o Query String usado para enviar informaes via GET. O mtodo POST no precisa
ser seguro ou idempotente. Pode provocar alteraes nos dados e duas requisies no precisam retornar os mesmos dados.
Veja um exemplo com o contador mostrado anteriormente. Se o browser enviasse uma
requisio POST em vez de GET os dados seriam enviados da seguinte maneira:
POST /cgi-shl/count.pl HTTP/1.0
Content-type: text/plain
Content-length: 12
arq=pg34.txt

Mas o browser no usa POST a no ser que seja instrudo a faz-lo. A forma mais comum de fazer isto, usar formulrios HTML, apresentados superficialmente na prxima seo.

6.8. Exerccios
3.1

Conecte-se via telnet porta do servidor Web instalado em qualquer servidor. Digite
os comandos GET e POST como mostrados nos exemplos acima. Veja as respostas
retornadas pelo servidor. Se quiser, defina alguns cabealhos. Quando voc imprimir
duas novas-linhas, o pedido ser enviado. Logo que o servidor atender ao seu pedido,
ele desconectar.

6-7

Captulo 7 - A Interface CGI

7. A Interface CGI
CGI um servio oferecido pelo servidor. uma extenso ao servio HTTP. Servidores
que suportam CGI podem ser configurados a executarem programas externos ao servidor,
passar-lhes parmetros recebidos de uma requisio do browser e redirecionar sua sada como
uma resposta HTTP.
CGI significa Common Gateway Interface. Sua finalidade permitir que o servidor funcione como gateway para aplicaes externas. A especificao define regras para a construo
de aplicaes que podero ser executadas pelo servidor HTTP. As regras s se aplicam entrada e sada das aplicaes. uma especificao de caixa-preta. No interessa o contedo.
As aplicaes podem ser escritas em qualquer linguagem desde que:
x sejam capazes de decodificar strings passadas como argumentos de linha de comando na entrada
x construam corretamente o final do cabealho HTTP para os dados que gerarem na
sada
Com esta flexibilidade, CGI tornou-se extremamente popular. Existem aplicaes em C,
C++, Perl, AppleScript, Java, MS-DOS, Basic, VB, Pascal, Bourne-shell e vrias outras linguagens rodando em todas as platarormas onde h servidores Web.

7.1. Formulrios HTML


A interface de formulrios oferecida por HTML permite que o leitor de uma pgina Web
possa enviar informaes de volta para o servidor atravs de componentes como botes, caixas de checagem, caixas de texto, caixas de seleo pull-down, etc. Os objetos de formulrios
em HTML so definidos dentro de um bloco <form> ... </form>. Podem ter um boto
para enviar os dados e outro para limp-los (reinicializ-los aos valores default) e vrios campos
de entrada de dados.
Os atributos mais comuns de <form> so a URL que inicia a aplicao que ir manusear
os dados e opcionalmente, o mtodo que ser usado na requisio. Por exemplo, o formulrio:
<FORM ACTION="/cgi-bin/bd.exe" METHOD="POST" >
...
</FORM>

7-8

Captulo 7 - A Interface CGI

quando for enviado, usar o mtodo POST ao requisitar a execuo de /cgi-bin/bd.exe ao


servidor. Se o atributo METHOD for omitido, a requisio ser realizada usando o mtodo GET.
Cada componente de entrada de dados de um formulrio tem um atributo NAME e um atributo VALUE. NAME, contm o nome que ser utilizado pelo CGI para recuperar o valor que
o leitor da pgina enviou, que fica armazenado em VALUE. Cada objeto de formulrio envia
seus dados no formato nome=valor.
Geralmente existem vrios campos de entrada de dados, cada um com seu nome e valores diferentes. Ao enviar um formulrio, todos os valores so concatenados com um &. No
pode haver espao entre os nomes e valores, portanto os espaos so convertidos em +.
Finalmente, caracteres que no so representados em ASCII e caracteres reservados so convertidos em hexadecimal, da forma %hh, antes de serem enviados.
Tome como exemplo o formulrio mostrado na figura 12-3. Quando o leitor apertar o
boto enviar, o browser enviar a seguinte requisio ao servidor:
<FORM ACTION="/cgi-bin/bd.exe"
METHOD="POST" >
<p>Nome: <input type=text name=nome>
<p>Idade: <input type=text name=idade>
<p>Escolha uma cor:
<select name=cor>
<option value=red>Vermelho</option>
<option value=yellow>Amarelo</option>
<option value=blue>Azul</option>
</select>
<p><input type=submit value="Enviar">
<input type=reset value="Limpar">
</FORM>
POST /cgi-bin/bd.exe HTTP/1.0
Content-type: text/plain
Content-length: 36
nome=Jo%E3o+da+Silva&idade=23&cor=yellow

Esses dados so enviados ao servidor que os repassa ao /cgi-bin/bd.exe. A requisio tambm pode ser realizada usando o mtodo GET, e os dados sero enviados no Query String:
GET /servlet/bdservlet?nome=Jo%E3o+da+Silva&idade=23&cor=yellow HTTP/1.0

7.2. Programas CGI


Programas que seguem a especificao CGI devem ser capazes de obter e decodificar
um string como

7-9

Captulo 7 - A Interface CGI


nome=Jo%E3o+da+Silva&idade=23&cor=yellow HTTP/1.0

A obteno dos dados geralmente tambm requer a capacidade de ler a entrada padro,
possivelmente ler um arquivo ou conexo de rede e obter informaes armazenadas em variveis de ambiente definidas pelo servidor.
A decodificao consiste em:
x converter os cdigos hexadecimais %hh nos seus caracteres equivalentes
x converter + em espao
x separar os pares nome/valor pelo &
x identificar, para cada par nome/valor, o nome ( esquerda do =) e o valor ( direita) e montar uma associao que permita obter o valor a partir do nome.
Com os dados obtidos, o programa CGI pode realizar qualquer tarefa como por exemplo, iniciar uma outra aplicao, montar uma requisio SQL para envio a um banco de dados,
recuperao de uma imagem de um dispositivo externo. No final, deve retornar para o cliente
uma imagem, uma pgina ou outra seqncia de bytes qualquer. O servidor no tem como
saber o tipo da seqncia de bytes para montar o cabealho para o cliente ento deixa-o incompleto para que seja completado pelo programa CGI.
O programa precisa ento imprimir na sua sada no mnimo:
x cabealho Content-type, informando o tipo de dados enviados de volta ao servidor
x uma linha em branco, indicando o fim do cabealho
x os dados.
Supondo que o programa CGI seja escrito em C, para imprimir uma mensagem em
HTML com o texto Hello CGI World em resposta a uma requisio de um browser, ele
conteria as linhas:
printf("Content-type: text/html\n"); /* observe o \n extra! */
printf("<html><body><h1>Hello CGI World</h1></body></html>");

7.3. Variveis de Ambiente


A requisio do browser gera vrias variveis de ambiente no servidor. Outras so definidas pelo servidor e pelo sistema. Todas tm um escopo definido pelo sistema, servidor, aplicao, cliente ou requisio. As principais variveis de ambiente suportadas pela maioria dos
servidores so:
SERVER_SOFTWARE
O nome e a verso do software do servidor que responde ao pedido.
Formato: nome/verso
Exemplo: CERN/3.0

7-10

Captulo 7 - A Interface CGI

SERVER_NAME
O nome da mquina onde roda o servidor, o alias DNS, ou o endereo IP.
GATEWAY_INTERFACE
A nmero da reviso da especificao CGI que o servidor utiliza.
Formato: CGI/reviso
CONTENT_LENGTH
O comprimento do contedo enviado pelo cliente.
CONTENT_TYPE
Tipo do contedo dos dados para buscas que tm informao anexada.
DOCUMENT_NAME
Nome do documento.
DOCUMENT_ROOT
Caminho absoluta da raiz de documentos HTML.
DOCUMENT_URI
URL (URI) do documento.
DATE_LOCAL
Data e hora locais.
DATE_GMT
Data e hora locais no formato Greenwich Mean Time..
LAST_MODIFIED
Data da ltima modificao do documento.
HTTP_COOKIE
Informao armazenada em um Cookie.
HTTP_ACCEPT
Tipos MIME que o cliente aceitar, dados por cabealhos HTTP. Cada item desta lista
deve ser separado por vrgulas.
Formato: type/subtype, type/subtype, etc.
HTTP_USER_AGENT
O browser que o cliente est usando para enviar o pedido.
Formato: software/version library/version.
HTTP_REFERER
URL da pgina que contm o link para a pgina atual.
PATH
Caminho (de subdiretrios).

7-11

Captulo 7 - A Interface CGI

PATH_INFO
Informao extra de caminho (de subdiretrios), como fornecida pelo cliente.
PATH_TRANSLATED
Verso de PATH_INFO traduzida pelo servidor.
QUERY_STRING
A informao que segue a ? na URL que referencia o programa CGI. a informao de
busca (query).
QUERY_STRING_UNESCAPED
A mesma informao contida em QUERY_STRING, mas com os caracteres de escape
(%nn) traduzidos.
REMOTE_HOST
O nome da mquina que faz o pedido. Se o servidor no tem esta informao, no deve
estabelecer um valor para esta varivel, mas para REMOTE_ADDR.
REMOTE_ADDR
O endereo IP da mquina remota que faz o pedido.
REQUEST_METHOD
O mtodo com o qual o pedido foi feito. Para HTTP, esse mtodo "GET", "HEAD",
"POST", etc.
SERVER_PROTOCOL
O nome e a reviso do protocolo de informaes utilizado pelo pedido.
Formato: protocolo/reviso.
Exemplo: HTTP/1.0
SERVER_PORT
O nmero da porta para o qual foi enviado o pedido.
SERVER_ROOT
O diretrio absoluto da localizao do servidor na rede.
SCRIPT_NAME
Um caminho virtual para o programa CGI que est sendo usado.

7.4. Exerccios
1. Escreva um programa CGI usando uma linguagem de sua escolha (no Unix, voc pode
escolher C, shell ou Perl) que imprima as variveis de ambiente definidas pelo browser.
No precisa gerar HTML. Pode ser text/plain (o programa s funcionar se as primeiras
linha imprimirem Content-type: text/plain e a segunda for em branco). Transfira o programa para o subdiretrio cgi-bin do seu servidor Web.
7-12

Captulo 8 - Server-side Includes

8. Server-side Includes
SERVER-SIDE INCLUDES so instrues para o servidor, embutidas em uma pgina HTML.
Normalmente, um servidor no analisa o contedo de uma pgina HTML, mas simplesmente a
recupera e envia para o cliente, aps uma requisio. Se o suporte a server-side includes estiver
instalado, e a pgina for identificada como uma pgina que o servidor deve analisar (serverparsed HTML), este procura dentro da pgina por instrues especiais, em comentrios
HTML, e realiza transformaes nos dados da pgina antes de envi-la.
As pginas que podem sofrer transformaes tero um contedo diferente no isco do
servidor e no browser do cliente. So geralmente identificados pelo subtipo MIME serverparsed-html atravs de uma extenso especial (.shtml, por exemplo). O servidor tenta processar todos os comandos encontrados antes de enviar a pgina completa ao browser. Caso o
servidor no realiza a substituio, os comandos chegaro ao browser as no sero exibidos na
pgina, pois estaro entre comentrios HTML.

8.1. Configurao
Para usar server-side includes necessrio configurar o servidor. Os servidores que suportam permitem dois nveis de segurana. Um, que permite todos os includes disponveis no
servidor e outro que permite todos mas sem o comando EXEC um include especial que causa
a execuo de um programa no servidor. Nos servidores UNIX, preciso alterar o arquivo
access.conf. As alteraes abaixo habilitam o diretrio htdocs e subdiretrios a armazenar arquivos que contm server-side includes comuns e que suportam o include EXEC.
<Directory /var/lib/httpd/htdocs>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride None
order allow,deny
allow from all
</Directory>

Para definir a extenso .shtml como indicao de server-parsed HTML, tambm necessrio definir o tipo no arquivo srm.conf (servidores Apache, NCSA):
AddType text/html .shtml
AddHandler server-parsed .shtml

8-13

Captulo 8 - Server-side Includes

Nos servidores Netscape, em Unix ou Windows, tudo isto definido na janela Content-Mgmt, opo Parse-HTML:

8.2. Server-side includes mais comuns


Server-side includes geralmente so dependentes do fabicante do servidor. H, porm,
uma coleo deles que existem desde os primeiros servidores (NCSA e CERN) e esto disponveis na maioria dos servidores modernos.
Se o suporte a server-parsed HTML estiver instalado, os comandos listados abaixo podem ser utilizados nos documentos HTML analisados pelo servidor, para incluir informao
dinmica na pgina, antes do envio ao browser. Os principais comandos esto listados a seguir.
<!--#ECHO atributo-->
Inclui o contedo de uma varivel de ambiente CGI no documento.
Atributos:

8-14

Captulo 8 - Server-side Includes

 VAR="varivel-de-ambiente" armazena o nome da varivel de ambiente a retornar. Exemplo:


<!--#ECHO VAR="LAST_MODIFIED"-->

inclui na pgina a data da ltima modificao do documento.


<!--#INCLUDE atributo-->
Adiciona todo o contedo de um arquivo ao documento, antes de envi-lo ao cliente.
Suporta um atributo, que pode ser FILE ou VIRTUAL.
Atributos:
 FILE="arquivo". Informa a localizao de arquivo em relao ao documento que
o referencia (caminho relativo).
 VIRTUAL="arquivo". Informa a localizao de arquivo em relao raiz de documentos do servidor (caminho absoluto).
<!--#EXEC atributo-->
Inclui no documento os valores retornados pela execuo de um programa no servidor
(provoca a execuo desse programa). Suporta um atributo, que pode ser CMD ou CGI.
Atributos:
 CMD="/path/command". Informa o comando do sistema a ser executado.
 CGI="/cgi-bin/programa.pl". Informa, a partir do diretrio raiz do servidor, o
caminho (diretrio CGI) e o nome de um programa CGI a ser executado. Exemplo:
<!--#EXEC CGI="/cgi-bin/counter.pl?doc=includes.html"-->

aciona o programa counter.pl que conta o nmero de vezes que o documento


foi acessado:
<!--#FSIZE atributo-->
Inclui a informao sobre o tamanho de um determinado arquivo no documento. Suporta um atributo, que pode ser FILE ou VIRTUAL.
Atributos:
 FILE="arquivo". Informa a localizao de arquivo em relao ao documento
que o referencia. Exemplo:
<!--#FSIZE FILE="filme.mpg"-->

inclui na pgina o tamanho do arquivo filme.mpg, que est no mesmo diretrio


que o documento HTML que contm a linha acima.
 VIRTUAL="arquivo". Informa a localizao de arquivo em relao raiz de documentos do servidor.
<!--#FLASTMOD atributo-->

8-15

Captulo 8 - Server-side Includes

Inclui a informao sobre a data da ltima modificao de um determinado arquivo no


documento. Suporta um atributo, que pode ser FILE ou VIRTUAL.
Atributos:
 FILE="arquivo". Informa a localizao de arquivo em relao ao documento que
o referencia. Exemplo:
<!--#FLASTMOD FILE="texto3.txt"-->

informa a data em que foi modificado o arquivo texto.txt, que est no mesmo
diretrio que o documento HTML que contm a linha acima.
 VIRTUAL="arquivo". Informa a localizao de arquivo em relao raiz de documentos do servidor. Exemplo:
<!--#FLASTMOD VIRTUAL="~helder/logs/setembro.log"-->

inclui no documento HTML o arquivo setembro.log, que est no diretrio


~helder/logs/.

8.3. Exemplos e aplicaes


O programa a seguir testa o suporte de Server Side Includes do seu servidor.
<HTML>
<HEAD>
<TITLE>Server-Side Includes</TITLE>
</HEAD>
<body bgcolor="#FFFFFF">
<H1>Server-Side Includes</H1>
<P>Variveis de configurao SSI (observe que comentrios podem ser usados
dentro dos descritores):
<PRE>&lt;!--#config timefmt="%c" formato simples de data/hora --&gt;
<!--#config timefmt="%c" formato simples de data/hora -->
&lt;!--#config sizefmt="%d bytes"--&gt;
<!--#config sizefmt="%d bytes"-->
&lt;!--#config errmsg="##ERRO!##"--&gt;
<!--#config errmsg="##ERRO!##"--></PRE>

<p>As diretivas SSI abaixo esto executadas ao lado. Para ver o arquivo original
necessrio visualiz-lo no seu diretrio e no atravs do servidor.
<p><b>Configuraes necessrias:</b>
1) Para testar a diretiva EXEC necessrio informar o nome um arquivo CGI que retorne
texto e coloc-lo no lugar de progcgi.exe. 2) Para testar as diretivas INCLUDE, FSIZE e FLASTMOD
preciso substituir ssitext.txt e ssifile.ext por arquivos existentes no mesmo diretrio onde
est a pgina SHTML.
<PRE><B>DIRETIVA SSI
<HR>

RESULTADO</B>

8-16

Captulo 8 - Server-side Includes


&lt;!--#exec cgi="/cgi-bin/progcgi.exe"--&gt; <!--#exec cgi="/cgi-bin/ssicgi.exe"-->
&lt;!--#include file="ssitext.txt"--&gt;
<br><!--#include file="ssitext.txt"-->
&lt;!--#fsize file="ssifile.txt"--&gt;
<!--#fsize file="ssifile.txt"-->
&lt;!--#flastmod file="ssifile.txt"--&gt;
<!--#flastmod file="ssifile.txt"-->
&lt;!--#echo var="DOCUMENT_NAME"--&gt;
<!--#echo var="DOCUMENT_NAME"-->
&lt;!--#echo var="DOCUMENT_URI"--&gt;
<!--#echo var="DOCUMENT_URI"-->
&lt;!--#echo var="LAST_MODIFIED"--&gt;
<!--#echo var="LAST_MODIFIED"-->
&lt;!--#echo var="QUERY_STRING"--&gt;
<!--#echo var="QUERY_STRING"-->
&lt;!--#echo var="QUERY_STRING_UNESCAPED"--&gt;<!--#echo var="QUERY_STRING_UNESCAPED"-->
&lt;!--#echo var="DATE_LOCAL"--&gt;
<!--#echo var="DATE_LOCAL"--&gt;
&lt;!--#echo var="DATE_GMT"--&gt;
<!--#echo var="DATE_GMT"-->
&lt;!--#echo var="SERVER_SOFTWARE"--&gt;
<!--#echo var="SERVER_SOFTWARE"-->
&lt;!--#echo var="SERVER_NAME"--&gt;
<!--#echo var="SERVER_NAME"-->
&lt;!--#echo var="SERVER_PROTOCOL"--&gt;
<!--#echo var="SERVER_PROTOCOL"-->
&lt;!--#echo var="REQUEST_METHOD"--&gt;
<!--#echo var="REQUEST_METHOD"-->
&lt;!--#echo var="REMOTE_HOST"--&gt;
<!--#echo var="REMOTE_HOST"-->
&lt;!--#echo var="HTTP_ACCEPT"--&gt;
<!--#echo var="HTTP_ACCEPT"-->
&lt;!--#echo var="HTTP_USER_AGENT"--&gt;
<!--#echo var="HTTP_USER_AGENT"-->
&lt;!--#echo var="REFERER"--&gt;
<!--#echo var="REFERER"-->
&lt;!--#echo var="BOGUS"--&gt;
<!--#echo var="BOGUS"--></PRE>
<HR>
</BODY>
</HTML>

8.4. Exerccios
Escreva uma pgina HTML que inclua informaes sobre a ltima modificao do arquivo
no final da pgina usando SSI.
2. Escreva uma pgina HTML que inclua o nmero gerado em arquivo pelo programa contador counter.pl ( necessrio configurar suporte ao descritor exec) em uma rea da pgina.
3. Escreva uma pgina HTML com uma tabela vazia que seja capaz de incluir linhas adicionais atravs de arquivo de texto carregado via SSI.
1.

8-17

Captulo 9 - Cookies

9. Cookies
A TECNOLOGIA CONHECIDA COMO HTTP Cookies, surgiu em 1995 como um recurso proprietrio do browser Netscape, que permitia que programas CGI gravassem informaes em um
arquivo de textos controlado pelo browser na mquina do cliente. Por oferecer uma soluo
simples para resolver uma das maiores limitaes do HTTP a incapacidade de preservar o
estado das propriedades dos documentos em uma mesma sesso os cookies logo passaram a
ser suportados em outros browsers e por linguagens e tecnologias de suporte a operaes no
cliente e servidor. Hoje, embora no seja ainda um padro formal, um padro de fato adotado pela indstria de software voltada Web e Internet.
Um cookie no um programa de computador, portanto no pode conter um vrus executvel ou qualquer outro tipo de contedo ativo. Pode ocupar no mximo 4 kB de espao no
computador do cliente. Um servidor pode definir no mximo 20 cookies por domnio (endereo de rede) e o browser pode armazenar no mximo 300 cookies. Estas restries referem-se
ao browser Netscape e podem ser diferentes em outros browsers.
H vrias formas de manipular cookies:
x Atravs de CGI ou outra tecnologia de servidor, como LiveWire, ASP ou Servlets, pode-se
criar ou recuperar cookies.
x Atravs de JavaScript tambm pode-se criar ou recuperar cookies.
x Atravs do descritor <META> em HTML, pode-se criar novos cookies ou redefinir cookies
existentes, mas no recuper-los.
Um cookie enviado para um cliente no cabealho HTTP de uma resposta do servidor.
Alm da informao til do cookie, que consiste de um par nome/valor, o servidor tambm
inclui um informaes sobre o domnio onde o cookie vlido, e o tempo de validade do
mesmo.

9.1. Criao de cookies via cabealhos HTTP


Cookies podem ser criados atravs de um cabealho HTTP usando CGI. Um bloco de
cabealhos de resposta gerado pelo servidor Web sempre que o browser solicita uma pgina
esttica. Como vimos nos captulos anteriores, parte ou todo o bloco de cabealhos tambm
pode ser gerado por um programa CGI ou equivalente. Quando um programa CGI gera um
9-18

Captulo 9 - Cookies

cabealho, pode incluir outros campos de informao sobre a pgina que o servidor no inclui
por default. Pode, por exemplo, definir um ou mais cabealhos Set-Cookie, que iro fazer
com que o browser guarde a informao passada em cookies:
HTTP/1.0 200 OK
Date: Friday, June 13, 1997
Server: Apache 1.02
Set-Cookie: cliente=jan0017
Set-Cookie: nomeclt=Marie
Content-type: text/html
<HTML><HEAD>
<TITLE> Capitulo 11</TITLE>
(...)

Quando receber a resposta do servidor e interpretar os cabealhos acima, o browser ir


gravar dois novos cookies na memria contendo as informaes cliente=jan0017 e nomeclt=Marie. Essas informaes podem ser recuperadas em qualquer pgina que tenha origem
no servidor que definiu os cookies enquanto a presente sesso do browser estiver aberta.
Um cabealho Set-Cookie pode conter muito mais informaes, que alteram a forma
como o cookie tratado pelo browser. Por exemplo, se o cookie tiver um campo expires
com uma data no futuro, as informaes do cookie sero gravadas em arquivo e persistiro
alm da sesso atual do browser:
Set-Cookie: nomeclt=Marie; expires=Monday, 15-Jan-99 13:02:55 GMT

A sintaxe completa do cabealho Set-Cookie est mostrada abaixo. Os campos so separados por ponto-e-vrgula. Todos, exceto o primeiro campo que define o nome do cookie,
so opcionais.
Set-Cookie: nome_do_cookie=valor_do_cookie;
expires=data no formato GMT;
domain=domnio onde o cookie vlido;
path=caminho dentro do domnio onde o cookie vlido;
secure

Os campos do cabealho Set-Cookie so usados na definio de cookies tanto em CGI


quanto em JavaScript. O significado dos campos est relacionado na tabela abaixo:
Campo
nome=valor

expires=data

Descrio
Este campo obrigatrio. Seqncia de caracteres que no incluem
acentos, ponto-e-vrgula, percentagem, vrgula ou espao em branco.
Para incluir esses caracteres preciso usar um formato de codificao
estilo URL. Em JavaScript, a funo escape() codifica informaes
nesse formato e a funo unescape() as decodifica.
Opcional. Se presente, define uma data com o perodo de validade

9-19

Captulo 9 - Cookies

Campo

Descrio
do cookie. Aps esta data, o cookie deixar de existir. Se este campo
no estiver presente, o cookie s existe enquanto durar a sesso do
browser. A data deve estar no seguinte formato:
DiaDaSemana, dd-mes-aa hh:mm:ss GMT

Por exemplo:
Monday, 15-Jan-99 13:02:55 GMT

O mtodo toGMTString() dos objetos Date gera uma data compatvel com este formato.
domain=domnio
Opcional. Se presente, define um domnio onde o cookie atual
vlido. Se este campo no existir, o cookie ser vlido em todo o domnio onde o cookie foi criado.
path=caminho
Opcional. Se presente, define o caminho onde um cookie vlido
em um domnio. Se este campo no existir, ser usado o caminho do
documento que criou o cookie.
secure
Opcional. Se presente, impede que o cookie seja transmitido a menos que a transmisso seja segura (baseada em SSL ou SHTTP).

9.2. Criao de cookies via HTML


Um cookie pode ser criado atravs de HTML usando o descritor <META> e seu atributo
HTTP-EQUIV. O atributo HTTP-EQUIV deve conter um cabealho HTTP. O valor do cabealho
deve estar presente no seu atributo CONTENT. A presena do um descritor <META> dentro de
um bloco <HEAD> de uma pgina HTML, criar um cookie no cliente quando este for interpretar a pgina.
<HEAD>
<META HTTP-EQUIV="Set-Cookie"
CONTENT="nomeclt=Marie; expires=Monday, 15-Jan-99 13:02:55 GMT">
(...)
</HEAD>

9.3. Espao de nomes de um Cookie


Vrias pginas de um site podem definir cookies. O espao de nomes de um cookie determinado atravs de seu domnio e caminho. Em um mesmo espao de nomes, s pode haver
um cookie com um determinado nome. A definio de um cookie de mesmo nome que um
cookie j existente no mesmo espao, sobrepe o cookie antigo.
Por default, o espao de nomes de um cookie todo o domnio onde foi criado. Para definir um novo domnio, mais restritivo, preciso definir o campo domain. Por exemplo, se o

9-20

Captulo 9 - Cookies

domnio de um cookie .biscoitos.com, ele pode ser lido nas mquinas agua.biscoitos.com e chocolate.biscoitos.com. Para restringi-lo mquina chocolate.biscoitos.com, o campo domain deve ser especificado da forma:
domain=chocolate.biscoitos.com

Somente mquinas dentro do domnio .biscoitos.com podem redefinir o domnio. Ele


necessariamente tem que ser mais restritivo que o default.
O caminho dentro do domnio onde o cookie vlido o mesmo caminho onde foi criado. O caminho pode ser alterado de forma que tenha um valor mais restritivo definindo o
campo path. Por exemplo, se um cookie vlido em todos os subdiretrios a partir da raiz,
seu path /. Para que s exista dentro de /bolachas/, o campo path pode ser especificado
da forma:
path=/bolachas/

Um cookie chamado bis definido em / no colide com um cookie tambm chamado


bis definido em /bolachas/.
Um cookie pode ser apagado se for definido um novo cookie com o mesmo nome e
caminho que ele e com data de vencimento (campo expires) no passado.

9.4. Recuperao de cookies


Toda requisio de um browser ao servidor consiste de uma linha que contm o mtodo
de requisio, URL destino e protocolo, seguida de vrias linhas de cabealho. atravs de
cabealhos que o cliente passa informaes ao servidor, como, por exemplo, o nome do browser que enviou o pedido. Uma requisio HTTP tpica tem a forma:
GET /index.html HTTP/1.0
User-Agent: Mozilla/4.5 (WinNT; I) [en]
Host: www.alnitak.org.br
Accept: image/gif, image/jpeg, */*

Quando um cookie recuperado pelo browser, ele enviado em todas as requisies


URLs que fazem parte do seu espao de nomes, atravs do cabealho do cliente Cookie. Apenas o par nome/valor armazenado no cabealho. As informaes dos campos expires, path, e domain no aparecem:
Cookie: cliente=jan0017; nomeclt=Marie

O servidor pode recuperar as informaes do cookie atravs do cabealho ou atravs da


varivel de ambiente HTTP_COOKIE, definida quando o servidor recebe uma requisio com o
cabealho Cookie. Para fazer uso dos dados de HTTP_COOKIE, preciso tratar a string que
a varivel contm, separando cada cookie pelo ponto-e-vrgula e identificando nome e valor
atravs do sinal de igualdade.

9-21

Captulo 9 - Cookies

Cookies so armazenados em ASCII e contm vrios caracteres reservados, entre eles o


ponto-e-vrgula e o sinal de igualdade. Para evitar problemas, o cookie deve ser armazenado
com esses caracteres convertidos em formatos codificados (URL-encoding, por exemplo). Na
recuperao dos dados, ser necessrio fazer uma decodificao. Vrias linguagens oferecem
ferramentas para esse tipo de codificao. Exemplos so Perl, C e JavaScript.

9.5. Exerccios
1. Crie um programa CGI (assacookie.pl) que oferea um formulrio HTML que pede o nome do usurio. Grave o nome do usurio como um cookie. Em outra pgina (comecookie.pl), leia a varivel de ambiente HTTP_COOKIE e imprima na pgina o nome do usurio.

9-22

Captulo 10 - Aplicaes usando CGI, ASP e JSP

10. Aplicaes usando


CGI, ASP e JSP
Este mdulo apresenta exemplos de aplicaes usando CGI, JSP e ASP. No pretende mostrar
como construir aplicaes em ASP e JSP pois tais tecnologias exigem conhecimentos adicionais que fogem ao escopo deste curso (Java, OLE/ActiveX e VBScript). So apresentados
programas simples que podero ser comparados com programas em Perl desenvolvidos durante o curso e que podero ser demonstrados em sala de aula.

10.1.

Aplicaes de acesso a bancos de dados

Para os exemplos deste mdulo, usamos o arquivo Access anuncios.mdb distribudo no


disquete. No preciso ter Access instalado para us-lo, mas preciso ter um driver para o
MS-Access disponvel no Windows. Voc tambm pode construir o arquivo em outro banco
de dados. Ele consiste de apenas uma tabela (por simplicidade) com quatro colunas e inicialmente 6 registros. O formato das colunas o seguinte:
Ttulo numero
Tipo
INT PRIMARY KEY

data
CHAR(24)

texto
CHAR(8192)

autor
CHAR(50)

possvel desenvolver programas CGI que realizem a conexo direta a um banco de


dados especfico, utilizando seus drivers proprietrios. Como focamos em tecnologias abertas,
mostraremos algumas aplicaes que usam drivers abertos, baseados em ODBC e JDBC.

ODBC
Para criar e administrar bancos de dados relacionais precisamos ter um ambiente prprio, geralmente fornecido pelo fabricante. Para usar esses bancos de dados dentro de aplicaes, precisamos de uma maneira de encapsular o SQL dentro de uma linguagem de programao, j que embora SQL seja eficiente na administrao de bancos de dados, ela no possui
recursos de uma linguagem de programao de propsito geral. Usando SQL podemos ter

10-1

Captulo 10 - Aplicaes usando CGI, ASP e JSP

acesso a bancos de dados de uma forma padro dentro de programas escritos em C ou C++
atravs da interface ODBC.
ODBC Open Database Connectivity uma interface de baixo nvel baseada na linguagem C que oferece uma interface consistente para a comunicao com um banco de dados
usando SQL. Surgiu inicialmente como um padro para computadores desktop, desenvolvido
pela Microsoft, mas em pouco tempo tornou-se um padro de fato da indstria. Todos os
principais fabricantes de bancos de dados dispem de drivers ODBC.
ODBC possui diversas limitaes. As principais referem-se dependncia de plataforma
da linguagem C (recentemente, tambm em Perl), dificultando o porte de aplicaes ODBC
para outras plataformas. Diferentemente das aplicaes desktop, onde praticamente domina a
plataforma Windows, aplicaes de rede e bancos de dados freqentemente residem em mquinas bastante diferentes. A independncia de plataforma nesses casos altamente desejvel.
Java oferece as vantagens de ODBC juntamente com a independncia de plataforma com sua
interface JDBC.
Muitos bancos de dados j possuem drivers JDBC, porm possvel ainda encontrar
bancos de dados que no os possuem, mas tm drivers ODBC. Tambm, devido a ubiqidade
da plataforma Windows, que contm um conjunto de drivers ODBC nativos, interessante
poder interagir com esses drivers em vrias ocasies, por exemplo, ao montar um banco de
dados SQL baseado em arquivos de texto. Como a plataforma Java contm um driver JDBC
para ODBC, podemos usar JDBC em praticamente qualquer banco de dados.

JDBC
Java Database Connectivity - JDBC, uma interface baseada em Java para acesso a bancos de dados atravs de SQL. uma verso Java de ODBC - uma alternativa que acrescenta ao
ODBC a portabilidade entre plataformas. Oferece uma interface uniforme para bancos de dados de fabricantes diferentes, permitindo que sejam manipulados de uma forma consistente. O
suporte a JDBC proporcionado por uma API Java padro (pacote java.sql) e faz parte da
distribuio Java. Usando JDBC, pode-se obter acesso direto a bancos de dados atravs de
applets e outras aplicaes Java.
JDBC uma interface de nvel de cdigo. Consiste de um conjunto de classes e interfaces que permitem embutir cdigo SQL como argumentos na invocao de seus mtodos. Por
oferecer uma interface uniforme, independente de fabricante de banco de dados, possvel
construir uma aplicao Java para acesso a qualquer banco de dados SQL. A aplicao poder
ser usada com qualquer banco de dados que possua um driver JDBC: Sybase, Oracle, Informix, ou qualquer outro que ainda no inventado, desde que implemente um driver JDBC.
Para que se possa usar JDBC na comunicao com um banco de dados, preciso que exista um driver para o banco de dados que implemente os mtodos JDBC. Para que uma aplicao se comunique com um banco de dados, ela precisa carregar o driver (pode ser em tempo
de execuo) e obter uma conexo ao mesmo. Depois de obtida a conexo, pode-se enviar
requisies de pesquisa e atualizao e analisar os dados retornados usando mtodos Java e
10-2

Captulo 10 - Aplicaes usando CGI, ASP e JSP

passando instrues SQL como argumentos. No preciso conhecer detalhes do banco de


dados em questo. Em uma segunda execuo do programa, o programa pode carregar outro
driver e utilizar os mesmos mtodos para ter acesso a um banco de dados diferente.
Muitos bancos de dados no tm driver JDBC, mas tm driver ODBC. Por causa disso,
um driver JDBC para bancos de dados ODBC fornecido pela Sun e includo na distribuio
Java. Com essa ponte JDBC-ODBC possvel usar drivers ODBC atravs de drivers JDBC.
Esse driver somente um dos quatro tipos diferentes de drivers JDBC previstos pela especificao.
A figura abaixo mostra um diagrama em camadas da arquitetura JDBC
Aplicao JDBC
ilustrando os diferentes tipos de drivers.
API JDBC
Existem quatro tipos de drivers JDBC:
JDBC Driver Manager
Protocolo JDBC

x Tipo 1 - drivers que usam uma ponDriver tipo 4


Driver tipo 2
Driver tipo 3
Driver tipo 1
te para ter acesso a um banco de
Pure Java
API nativa
JDBC-Rede
Ponte JDBC-ODBC
dados. Este tipo de soluo geralProtocolo
de
Cdigo nativo
Cdigo nativo
rede aberto
mente requer a instalao de softDriver ODBC
Protocolo
Middleware
Protocolo
ware do lado do cliente. Um exemproprietrio
Protocolo
Protocolo
proprietrio
SGBD
plo de driver do tipo 1 a ponte
proprietrio
proprietrio
SGBD
SGBD
SGBD
JDBC-ODBC distribuda pela Sun
na distribuio Java.
BD
BD
BD
BD
x Tipo 2 - drivers que usam uma API
nativa. Esses drivers contm mtoArquitetura JDBC
dos Java implementados em C ou
C++. So Java na superfcie e C/C++ no interior. Esta soluo tambm requer software
do lado do cliente. A tendncia que esses drivers evoluam para drivers do tipo 3
x Tipo 3 - drivers que oferecem uma API de rede ao cliente para que ele possa ter acesso a
uma aplicao middleware no servidor que traduz as requisies do cliente em uma API
especfica ao driver desejado. Esta soluo no requer software do lado do cliente.
x Tipo 4 - drivers que se comunicam diretamente com o banco de dados usando soquetes de
rede. uma soluo puro Java. No requer cdigo do lado do cliente. Este tipo de driver
geralmente distribudo pelo prprio fabricante do banco de dados.
A ponte JDBC-ODBC distribuda juntamente com o JDK um driver do tipo 1. Nos
exemplos apresentados neste trabalho, utilizamos esse driver apenas para acesso local atravs
do ODBC nativo do Windows. o menos eficiente de todos pois no permite otimizaes e
dependente das limitaes do driver com o qual faz ponte.
Uma aplicao JDBC pode carregar ao mesmo tempo diversos drivers. Para determinar
qual driver ser usado em uma conexo, uma URL passada como argumento do mtodo
usado para obter uma conexo. Esta URL tem a sintaxe seguinte:

10-3

Captulo 10 - Aplicaes usando CGI, ASP e JSP


jdbc:subprotocolo:dsn

O subprotocolo o nome do tipo de protocolo de banco de dados que est sendo usado
para interpretar o SQL. um nome dependente do fabricante. A aplicao usa o subprotocolo
para identificar o driver a ser instanciado. O dsn o nome que o subprotocolo utilizar para
localizar um determinado servidor ou base de dados. Pode ser o nome de uma fonte de dados
do sistema local (Data Source Name) ou uma fonte de dados remota. Veja alguns exemplos:
jdbc:odbc:anuncios
jdbc:oracle:contas
jdbc:msql://alnitak.orion.org/clientes

Para conhecer mais sobre JDBC preciso conhecer Java, o que est fora do escopo deste curso. Mais adiante ser apresentado um exemplo de acesso a bancos de dados usando JSP
que utiliza um driver JDBC para realizar a conexo.

10.2.

Acesso ODBC usando Perl

CGI para acesso via ODBC


O mdulo usado nos nossos exemplos (no disquete) foi obtido de http://www.roth.net
e compatvel com o ActivePerl (www.activestate.com). Neste site, pode-se baixar todo o mdulo ODBC para instalao ou apenas os arquivos j compilados e coloc-los nos lugares adequados. Veja o captulo 5 (Perl) para mais detalhes sobre este mdulo e como instal-lo.
O exemplo abaixo mostra um acesso simples a um banco de dados Access. Para que
funcione preciso que o mdulo ODBC esteja instalado (seo anterior) e que haja uma fonte
de dados ODBC (Data Source) no sistema com o nome mdbdados1 que aponte para a base
anuncios.mdb, distribuda no disquete. O programa apenas lista o contedo da base.
#!c:\perl\bin\perl.exe
use Win32::ODBC;
print "Content-type: text/html\n\n";
&buscaTudo;
exit(0);
sub buscaTudo
{
$sql = "SELECT * FROM anuncios;";
$dsn = "mdbdados1";
$bd = new Win32::ODBC($dsn);
$bd->Sql($sql);
print "<table border=1>";
while ($bd->FetchRow())
{

10-4

Captulo 10 - Aplicaes usando CGI, ASP e JSP


@registros = $bd->Data("numero", "data", "texto", "autor");
print "<tr valign=top>";
print "<td>$registros[0]</td>";
print "<td>$registros[1]</td>";
print "<td><pre>$registros[2]</pre></td>";
print "<td>$registros[3]</td>";
print "</tr>";
}
print "</table>";
$bd->Close();
}

Supondo que o programa acima esteja armazenado em um arquivo dados.pl, situado no


diretrio CGI-BIN do Apache que roda em localhost:8080, a URL http://localhost:8080/cgibin/dados.pl digitada em um browser, em um link ou no atributo ACTION de um formulrio
devolver uma pgina com os dados formatados em uma tabela. Veja outros exemplos, com
acesso completo, atualizao, insero, remoo e busca nesta base, no disquete que acompanha esta apostila.

10.3.

Acesso usando Servlets

Para utilizar servlets ou JSP preciso que o servidor os suporte. Isto pode ser uma caracterstica nativa do servidor ou pode ser implementado atravs de mdulos externos (plug-ins)
como o JRun e o Jakarta (produtos disponveis gratuitamente na Internet). Os exemplos a seguir foram executados em servidores Personal Web Server da Microsoft, rodando em Windows98 e NT, usando o mdulo Allaire JRun.
Servlets so aplicaes Java. No so aplicaes standalone (como programas CGI escritos em Java). Tambm no executam como applets. Para executar um servlet preciso primeiro instal-lo em um servidor Web. Depois, necessrio enviar uma requisio do cliente ao
servidor, que o faa iniciar o servlet. Um servlet HTTP um componente Java que pode ser
usado como extenso de um servidor Web, assim como um applet pode ser usado como extenso de um browser. Com um servlet, o servidor HTTP pode oferecer servios adicionais e
personalizados como suporte a novos protocolos de comunicao, gerao automtica de pginas, acesso a banco de dados, controle remoto de aplicaes e dispositivos, etc.
Dependendo de como o servlet instalado, ele pode ser iniciado uma nica vez e permanecer ativo at que o servidor seja inicializado, ou pode ser iniciado quando for requisitado
por um cliente e destrudo quando o cliente terminar o servio. O primeiro tipo chamado de
servlet permanente; o segundo um servlet temporrio.
A API para desenvolvimento de servlets distribuda pelo Java Servlet Development Kit
(JSDK) consiste de dois pacotes:
x javax.servlet - contm classes e interfaces para o desenvolvimento e uso de servlets
genricos
10-5

Captulo 10 - Aplicaes usando CGI, ASP e JSP

x javax.servlet.http - classes e interfaces para o desenvolvimento de servlets HTTP.

Mdulo JRun
O mdulo JRun o mais popular plug-in para servidores Web que os habilita a suportar
servlets. Distribudo gratuitamente pela LiveSoftware (www.livesoftware.com) e recentemente
comprado pela Allaire, pode ser instalado nos principais servidores das plataformas Windows,
Macintosh e Unix.
Cada servidor tem a sua interface caracterstica. A interface do JRun bastante diferente
daquela do servletrunner ou do Java Web Server (Sun). A instalao dos servlets realizada
atravs de uma tela grfica onde se pode definir duas propriedades e outras informaes de
inicializao.
Entre os servidores disponveis no laboratrio, o JRun pode ser instalado em todos
(O'Reilly WebSite for Windows, Personal Web Server, Internet Information Server, Netscape
Fastrack Server e Apache for Linux), exceto no Apache for Windows. Aps a instalao, um
diretrio especial mapeado especialmente para a execuo dos servlets.

Exemplo: Hello World


O exemplo abaixo ilustra um servlet simples (a ttulo de exemplo, pois Java est fora do
escopo deste curso). Para rod-lo preciso compilar o cdigo Java abaixo usando as bibliotecas (pacotes) javax.servlet, instal-lo no servidor e execut-lo atravs de uma requisio do
browser. Se o servlet (arquivo .class compilado) estiver instalado na mquina local, usando
JRun e PWS na configurao default, a URL para execut-lo deve ser
http://localhost/servlet/SimpleServlet.
/*
* Copyright (c) 1996-1997 Sun Microsystems, Inc. All Rights Reserved.
* Hello World para Servlets
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SimpleServlet extends HttpServlet
{
public void doGet (HttpServletRequest
request,
HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter
out;
String
title = "Simple Servlet Output";
out = response.getWriter();
out.println("<HTML><HEAD><TITLE>");
10-6

Captulo 10 - Aplicaes usando CGI, ASP e JSP


out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>This is output from SimpleServlet.");
out.println("</BODY></HTML>");
out.close();
}
}

Acesso a banco de dados usando Servlets


Para entender como funcionam os servlets preciso entender Java. O exemplo abaixo
est includo aqui para que possa ser comparado s outras tecnologias utilizadas. A listagem
contm o cdigo-fonte. preciso compil-lo, gerar um arquivo-objeto (com extenso .class) e
instal-lo no servidor. Para execut-lo, pode-se usar uma URL localizada no atributo ACTION
de um formulrio, link ou digitada diretamente no browser. No PWS use a URL:
http://nomedamaquina/servlet/Dados para execut-lo.
import
import
import
import

java.io.*;
java.sql.*;
javax.servlet.*;
javax.servlet.http.*;

public class Dados


extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException{
PrintWriter out = null;
try {
out = response.getWriter();
response.setContentType("text/html");
out.println("<html><body>");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con =
DriverManager.getConnection("jdbc:odbc:mdbdados1","","");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM anuncios");
out.println("<table border=1>");
out.println("<tr><td>Nmero</td>
<td> Autor </td><td>" +
"Texto </td><td> Data </td></tr>");
while (rs.next()) {
String aut = rs.getString("autor");
String txt = rs.getString("texto");
String dat = rs.getString("data");
int num = rs.getInt("numero");
10-7

Captulo 10 - Aplicaes usando CGI, ASP e JSP


out.println("<tr><td>"+ num +"</td><td>"+ aut +"</td><td>"+
txt +"</td><td>"+ dat +"</td></tr>");
}
out.println("</table>");
}

catch (Exception e) {
out.println("<h1>Exceo: " + e + "</h1>");

}
out.println("</body></html>");
out.close();
}
}

10.4.

Acesso usando Active Server Pages

Active Server Pages ou ASP uma soluo da Microsoft compatvel com o Internet Information
Server (IIS) e, atravs de plug-in, com os principais servidores do mercado. Consiste de pginas HTML que podem conter scripts e interpretados pelo servidor e fazer o mesmo (ou mais)
que CGI ou servlets.
As pginas tm a extenso .ASP para que o servidor possa identific-las como tal. So
pginas HTML como outras quaisquer mas possuem cdigo de programas para o servidor
embutido.
O cdigo pode ser escrito em vrias linguagens de roteiro. As mais populares so VBScript e JavaScript (JScript). Trechos do programa podem ser includos entre os descritores <script> e </script> usando o atributo RUNAT=server:
<script language=VBScript runat=server> </script>

Esses blocos <SCRIPT> so usados principalmente para incluir trechos maiores do


programa. Jamais chegam ao browser. So totalmente consumidos pelo servidor ao gerar a
pgina HTML que ser enviada.
O cdigo ASP pode ser misturado com o HTML da pgina atravs dos descritores <% e
%>. Qualquer coisa escrita entre <% %> ignorado pelos servidores que no suportam o
formato e por browsers, caso por algum motivo, o servidor falhe em interpretar o ASP.
ASP pode ser usado para gerar pginas dinmicas, cujo contedo definido por fatores
como preferncias do usurio, localidade, etc. Pode usar todos os recursos de programao do
JavaScript ou VBScript inclusive para tarefas proibidas no browser como acesso a disco e
rede. H vrios objetos prprios do ASP (utilizveis tanto em JavaScript como em VBScript)
com mtodos especficos para abrir conexes de bancos de dados, enviar requisies, fazer
conexes de rede, gerar novas pginas, formatar pginas, salvar em disco, manter sesses com
cookies de forma transparente, etc. O poder do ASP maior quando utiliza objetos do sistema
Windows, atravs de sua interface DCOM. Vrios objetos leves ADO (ActiveX Data Objetcs)

10-8

Captulo 10 - Aplicaes usando CGI, ASP e JSP

para servidor podem ser manipulados pelo ASP. A programao em ASP e ADO est fora do
escopo deste curso. Para maiores informaes sobre ASP, consulte a documentao do Internet Information Server ou Personal Web Server da Microsoft que contm tutoriais sobre o
tema
Uma pgina ASP um programa que gera uma nova pgina. Pode ser usada como destino (ACTION) de um formulrio. Usar ASP em vez de ISAPI, CGI ou servlets pode ser uma
boa idia quando h mais texto HTML para ser copiado sem alteraes que modificaes a
serem feitas na pgina. Com CGI, servlets ou ISAPI seria necessrio embutir o HTML na linguagem de programao e mandar imprimir cada linha. Com ASP se faz o contrrio: embutese o programa dentro do HTML. O servidor interpreta a pgina, gera uma nova e envia para o
browser como text/html. O browser no tem a menor idia que a pgina foi gerada por ASP,
CGI ou se veio diretamente do servidor.
Veja um exemplo simples de como ASP pode ser usado para criar uma pgina dinmica:
<html><body>
<h1>Bem-vindo ao servidor da ATKM em Marte!
<h2>Evite conectar-se entre 19 e 23 horas locais. A data e hora de
hoje so:
<%=Now %> </h2>
</body></html>

O exemplo acima informa a hora local do servidor guardada na varivel Now. O exemplo acima usa uma expresso ASP, que expressa entre <%= e %>. Uma expresso ASP comea
com <%= e termina com %>. O resultado de uma expresso calculado no momento em que a
pgina lida pelo servidor.
Alm das expresses, ASP tambm define diretivas (entre <%@ e %>) que permitem definir propriedades do cdigo, como linguagem utilizada (se no for VBScript), etc. Uma diretiva
comea com <%@ e termina com %>. Ela permite definir o tipo de dados de sada, importar
arquivos, especificar o uso de outra linguagem em vez de Java, etc. Algumas variveis podem
receber valor nas diretivas, da forma:
<%@nomeVar = "valor" %>

A manipulao de dados em ASP realizada atravs de objetos do servidor que representam entidades de entrada e sada, como o servidor, a requisio, a resposta, etc. O exemplo
a seguir utiliza ainda objetos ADO para obter acesso ao driver ODBC e enviar uma requisio
a um banco de dados (o mesmo usado com CGI).

Acesso ao banco de dados usando ASP


A pgina abaixo deve ser instalada em um diretrio do Internet Information Server que
esteja habilitado a rodar scripts. Deve tambm estar na mquina onde h uma fonte de dados

10-9

Captulo 10 - Aplicaes usando CGI, ASP e JSP

ODBC chamada mdbdados vinculada ao arquivo anuncios.mdb (veja sees anteriores). O


cdigo ASP est mostrado em negrito.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Acesso a Dados via ASP</title>
<%@ language="javascript" %>
<% dsn = "mdbdados1"; %>
</head>
<body>
<h1>ASP: Informao armazenada em <%=dsn %> </h1>
<table border=1>
<tr><td>Nmero</td><td> Autor </td><td> Texto </td><td> Data </td></tr>
<% con = Server.CreateObject("ADODB.Connection");
con.Open ("DSN=" + dsn);
rs = Server.CreateObject("ADODB.Recordset");
rs.Open("SELECT * from anuncios", con);
while(!rs.EOF) {
num = rs("numero");
txt = rs("texto");
aut = rs("autor");
dat = rs("data");
rs.MoveNext();
%>
<tr>
<td> <%=num %> </td>
<td><pre> <%=txt %> </pre></td>
<td> <%=aut %> </td>
<td> <%=dat %> </td>
</tr>
<%

%>

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

Supondo que o programa acima esteja armazenado em um arquivo dados.asp, situado na


raiz do servidor em localhost, a URL http://localhost/dados.asp digitada em um browser, em
um link ou no atributo ACTION de um formulrio devolver uma pgina com os dados formatados em uma tabela, idntica quela usando CGI.

10-10

Captulo 10 - Aplicaes usando CGI, ASP e JSP

10.5.

Acesso usando Java Server Pages

A Sun possui uma tecnologia equivalente ao ASP que se chama Java Server Pages ou
JSP. A sintaxe para incluso na pgina a mesma. A nica diferena que o cdigo deve ser
escrito em Java. Na execuo, o cdigo JSP compilado e transformado em um servlet que
permanece no cache do servidor e atende a outras solicitaes. Em aplicaes que exigem um
maior desempenho do servidor, esta caracterstica permite que pginas JSP sejam mais eficientes que pginas ASP, que so interpretadas a cada solicitao.
O exemplo abaixo ilustra uma aplicao Hello World simples escrita com JSP (cdigo
em negrito). O programa aceita um parmetro que pode ser passado via QUERY_STRING ou
entrada padro:
<HTML>
<HEAD><TITLE>Hello</TITLE></HEAD>
<BODY>
<H1>
<%
if (request.getParameter("name") == null) {
out.println("Hello World");
}
else {
out.println("Hello, " + request.getParameter("name"));
}
%>
</H1>
</BODY></HTML>

Um scriptlet nome usado para se referir aos programas escritos usando JSP possui
quatro variveis pr-definidas para facilitar a entrada e sada. O programador pode definir outras, pois tem toda a linguagem Java disposio. Os tipos so classes Java usadas na construo de servlets. As variveis so:
request a requisio do cliente, do tipo HttpServletRequest
response a resposta do servidor, do tipo HttpServletResponse
out a sada padro, um objeto PrintWriter
in a entrada padro, um objeto BufferedReader.
Alm do cdigo includo nos scriptlets, JSP permite, como ASP, o uso de expresses e diretivas. Uma expresso JSP comea com <%= e termina com %>. O resultado de uma expresso calculado no momento em que a pgina lida pelo servidor, e o resultado transformado
em uma String. Uma diretiva comea com <%@ e termina com %>. Ela permite definir o tipo
de dados de sada, importar um determinado pacote, estender outra classe e at especificar o
uso de outra linguagem em vez de Java. Algumas variveis podem receber valor nas diretivas,
da forma:

10-11

Captulo 10 - Aplicaes usando CGI, ASP e JSP


<%@nomeVar = "valor" %>

Quando for preciso declarar mtodos, variveis locais e praticamente embutir um servlet
em uma pgina, pode-se usar declaraes atravs do bloco <script> com o argumento
RUNAT=SERVER, como ocorre em ASP. Esse bloco jamais chegar ao cliente mas ser totalmente consumido pelo servidor antes que a pgina seja gerada. Veja um exemplo (a explicao
do cdigo Java est fora do escopo deste curso).
<HTML><HEAD><TITLE>Hello</TITLE></HEAD>
<BODY>
<H1>Hello, <%= getName(request) %></H1>
</BODY></HTML>
<SCRIPT RUNAT="server">
private static final String DEFAULT_NAME = "World";
private String getName(HttpServletRequest req) {
String name = req.getParameter("name");
if (name == null)
return DEFAULT_NAME;
else
return name;
}
</SCRIPT>

Acesso a banco de dados usando JSP


O programa abaixo realiza a conexo a um banco de dados atravs do driver JDBC para
ODBC (que est vinculado ao arquivo anuncios.mdb). O cdigo JSP, em negrito, utiliza a linguagem Java. Compare com o cdigo ASP e o programa CGI vistos anteriormente.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Acesso a dados via JSP</title>
<%@ import = "java.sql.*, java.io.*, java.util.*" %>
<% String dsn = "mdbdados1"; %>
</head>
<body>
<h1>JSP: Informao armazenada em <%=dsn %></h1>
<table border=1>
<tr><td>Nmero</td><td> Autor </td><td> Texto </td><td> Data </td></tr>
<%
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

10-12

Captulo 10 - Aplicaes usando CGI, ASP e JSP


Connection con = DriverManager.getConnection("jdbc:odbc:"+dsn);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM anuncios");
while (rs.next()) {
String aut = rs.getString("autor");
String txt = rs.getString("texto");
String dat = rs.getString("data");
int num = rs.getInt("numero");
%>
<tr>
<td> <%=num %> </td>
<td><pre> <%=txt %> </pre></td>
<td> <%=aut %> </td>
<td> <%=dat %> </td>
</tr>
<%

<%

}
} catch (Exception e) { %>
<h1>Exception: <%=e %> </h1>
} %>

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

Supondo que o programa acima esteja armazenado em um arquivo dados.jsp, situado na


raiz do servidor em localhost, a URL http://localhost/dados.jsp digitada em um browser, em
um link ou no atributo ACTION de um formulrio devolver uma pgina com os dados formatados em uma tabela, idntica quela usando CGI e ASP.

10-13

Captulo 11 - Apndice: SQL

11. Apndice: SQL


Um banco de dados relacional pode ser definido de maneira simples como um conjunto de
tabelas (com linhas e colunas) onde as linhas de uma tabela podem ser relacionadas a linhas de
outra tabela. Este tipo de organizao permite a criao de modelos de dados compostos de
vrias tabelas. Umas contendo informao, outras contendo referncias que definem relaes
entre as tabelas de informao. O acesso s informaes armazenadas em bancos de dados
relacionais em geral bem mais eficiente que o acesso a dados organizados seqencialmente ou
em estruturas de rvore.

11.1.

Structured Query Language (SQL)

Para utilizar um banco de dados relacional, preciso ter um conjunto de instrues para
recuperar, atualizar e armazenar dados. A maior parte dos bancos de dados relacionais suportam uma linguagem padro chamada SQL Structured Query Language. O conjunto de instrues SQL foi padronizado em 1992 de forma que as mesmas instrues podem ser usadas
por bancos de dados diferentes. Mas vrios fabricantes possuem extenses e certas operaes
mais especficas possuem sintaxes diferentes em produtos de diferentes fabricantes.
Poucos sistemas implementam totalmente o SQL92. Existem vrios nveis que foram definidos durante a padronizao do SQL em 1992. O conjunto mnimo de instrues chamado de entry-level e suportado por JDBC.
Nas sees seguintes, apresentaremos os seis principais comandos da linguagem SQL.
Este no um guia completo. Apresentamos apenas o suficiente para permitir a compreenso
dos exemplos que mostraremos em JDBC. Para um tratamento mais detalhado de SQL, consulte a bibliografia no final deste captulo.

CREATE, DROP
Antes de ilustrar a recuperao e atualizao de dados em uma tabela, precisamos ter
uma tabela. Para criar uma nova tabela em um banco de dados, usamos a instruo CREATE
TABLE. A sintaxe bsica desta instruo :
CREATE TABLE nome_da_tabela
(nome_coluna tipo_de_dados [modificadores],
[nome_coluna tipo_de_dados [modificadores], ... ])

11-14

Captulo 11 - Apndice: SQL

Os modificadores so opcionais e geralmente dependentes de fabricante de banco de


dados. A maior parte das implementaes suporta: NOT NULL, PRIMARY KEY e UNIQUE como
modificadores:
CREATE TABLE anuncios (numero INT PRIMARY KEY,
data DATE,
texto CHAR(8192),
autor CHAR(50))";

A sintaxe exata do CREATE dependente de banco de dados. Todos suportam a sintaxe


principal (CREATE TABLE). As incompatibilidades surgem no suporte a tipos de dados e modificadores. A instruo acima funciona com o driver ODBC do Microsoft Access, via ponte
ODBC-JDBC. No funciona, no entanto com o driver JDBC do banco de dados mSQL, j
que o mSQL no suporta o tipo DATE. Tambm no funciona com o driver ODBC para arquivos de texto, da Microsoft que no suporta o modificador PRIMARY KEY nem campos com
mais de 255 caracteres.
Para remover uma tabela do banco de dados, pode-se usar a instruo DROP. A sintaxe
simples:
DROP TABLE nome_da_tabela

INSERT, UPDATE, DELETE


Depois que uma tabela criada, dados podem ser inseridos usando a instruo INSERT.
preciso respeitar os tipos de dados definidos para cada coluna de acordo com a estrutura
definida previamente para cada tabela. A sintaxe bsica do INSERT :
INSERT INTO nome_da_tabela (nome_da_coluna, ..., nome_da_coluna)
VALUES (valor, ..., valor)

No lugar de valor, pode ser passado toda uma expresso SQL que resulte em um valor. Um
exemplo do uso de INSERT, na tabela criada na seo anterior seria:
INSERT INTO anuncios
VALUES (156, '13/10/1998', 'Novo anuncio!', 'Fulano');

O apstrofo (') usado para representar strings.


UPDATE permite que dados previamente inseridos sejam modificados. Sua sintaxe bsica
:
UPDATE nome_da_tabela
SET nome_da_coluna = valor,
...,
nome_da_coluna = valor
WHERE expressao_condicional

No lugar de valor, pode ser passado toda uma expresso SQL que resulte em um valor
ou a palavra reservada NULL. Eis um exemplo do uso de UPDATE:

11-15

Captulo 11 - Apndice: SQL


UPDATE anuncios
SET texto = 'Em branco!',
autor = ''
WHERE codigo > 150

Para remover registros (linhas da tabela), usa-se DELETE:


DELETE FROM nome_da_tabela
WHERE expressao_condicional

Por exemplo, a instruo:


DELETE FROM anuncios
WHERE texto LIKE '%Para o Lixo%'

apaga todos os registros cujo texto contm 'Para o Lixo'.

SELECT
O comando SQL mais freqentemente utilizado SELECT. Com ele possvel selecionar linhas (registros) de um banco de dados de acordo com uma determinada condio. A sintaxe bsica de SELECT :
SELECT nome_da_coluna, ..., nome_da_coluna
FROM nome_da_tabela
WHERE expresso_condicional

A lista de colunas a serem selecionadas pode ser substituda por * se todas as colunas
sero selecionadas. A sintaxe mostrara acima bsica. Para selecionar todos os nmeros e textos de registros escritos pelo autor Mefisto, pode-se fazer:
SELECT codigo, texto
FROM anuncios
WHERE autor = 'Mefisto'

11-16