Programação Web com ASP - Active Server Pages

Transcrição

Programação Web com ASP - Active Server Pages
João Vieira
Centro Atlântico
Programação Web com
ASP - Active Server Pages
Edições Centro Atlântico
Portugal/2000
Reservados todos os direitos por Centro Atlântico, Lda.
Qualquer reprodução, incluindo fotocópia, só pode ser feita
com autorização expressa dos editores da obra.
Programação Web com Active Server Pages
Colecção: Tecnologias
Autor: João Vieira
Direcção gráfica: Centro Atlântico
Capa: Paulo Buchinho
© Centro Atlântico, Lda., 2000
Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Tel. 22 - 938 56 28/9 Fax. 22 - 938 56 30
Rua da Misericórdia, 76 - 1200 Lisboa
Tel. 21 - 321 01 95
Fax 21 - 321 01 85
Portugal
[email protected]
www.centroatlantico.pt
Fotolitos: Centro Atlântico
Impressão e acabamento: Rolo & Filhos
1ª edição: Janeiro de 2000
ISBN: 972-8426-21-6
Depósito legal: 146.485/00
Marcas registadas: todos os termos mencionados neste livro conhecidos como sendo marcas
registadas de produtos e serviços, foram apropriadamente capitalizados. A utilização de um
termo neste livro não deve ser encarada como afectando a validade de alguma marca registada
de produto ou serviço.
O Editor e os Autores não se responsabilizam por possíveis danos morais ou físicos causados
pelas instruções contidas no livro nem por endereços Internet que não correspondam às HomePages pretendidas.
Dedico este livro aos meus pais,
Maria de Jesus S. R. Sousa Vieira,
António Tiago Vieira
Índice
1. Introdução às Active Server Pages
1.1
1.2
1.3
1.4
1.5
1.6
1.7
Do Autor
Requisitos para as ASP
ASP vs. JavaScript / VBScript
Instalar o servidor de Internet
Programar com ficheiros ASP e HTML
Conhecer o HTML (Hyper Text Markup Language) em 12 passos
Sites com recursos de ASP
12
13
15
16
19
19
23
2. Expressões e Operadores
2.1
2.2
2.3
Os primeiros passos
2.1.1 Exemplo: ‘Olá Portugal’
2.1.2 Exemplo: ‘Olá Portugal’ com variável
2.1.3 Exemplo: Cálculo de variáveis
2.1.4 Exemplo: Código ASP embebido em HMTL
IF, THEN, ELSE, END IF…
2.2.1 Exemplo: Comparação entre variáveis
28
28
29
29
30
FOR, WHILE, CASE…
2.3.1 Exemplo: Comparação de variáveis com ciclos
2.3.2 Exemplo: Select Case
2.3.3 Exemplo: Contadores ASP embebidos em HMTL
2.3.4 Exemplo: HMTL embebido em contadores ASP
32
33
33
34
2.4
Variáveis
35
2.5
Tabela de Operadores
2.5.1 Exemplo: Comparação de variável entre valores 37
2.5.2 Exemplo: Utilização de todos os operadores
38
3. Funções
3.1
Tabela de funções base das ASP
40
3.2
As nossas funções
3.2.1 Exemplo: Nº dias até o ano 2001
3.2.2 Exemplo: Validar o e-mail
3.2.3 Exemplo: Criar uma ComboBox a partir de um array
3.2.4 Exemplo: Criar um gráfico em HTML a partir de um array
48
50
52
53
Uso de SSI (Server Side Includes) com as nossas funções
3.3.1 Exemplo: Uso de um ficheiro externo com SSI
3.3.2 Exemplo: Ficheiro com todas as funções
3.3.3 Exemplo: ASP que usa o ficheiro com todas as funções
56
57
58
3.3
4. Objectos
4.1
Tabela de Objectos
62
4.2
Variáveis globais e de sessão
65
4.3
Interagir com o utilizador
4.3.1 Exemplo: Responder ao utilizador com os dados recolhidos
4.3.2 Exemplo: Validar formulário
4.3.3 Exemplo: Curso online
4.3.4 Exemplo: Protecção de páginas com password
72
73
81
88
Ficheiro global.asa
4.4.1 Exemplo: Quantos utilizadores estão a visitar a página
4.4.2 Exemplo: Chat em Browser
100
102
Cookies, dados do utilizador e do servidor
4.5.1 Exemplo: Recolher dados do utilizador
4.5.2 Exemplo: Páginas personalizadas
105
107
Formatação de strings
108
4.4
4.5
4.6
5. Bases de dados
5.1
Bases de Dados / SQL
114
5.2
Construir uma base de dados em Microsoft Access
117
5.3
Conexão à base de dados
122
5.4
Inserir, apagar e actualizar dados em bases de dados
5.4.1 Exemplo: Inserir dados
5.4.2 Exemplo: Eliminar dados
5.4.3 Exemplo: Actualizar dados
127
135
137
Apresentação de dados
5.5.1 Exemplo: Listar dados em tabela
5.5.2 Exemplo: Listar dados com imagens
5.5.3 Exemplo: Listar dados a pedido
142
144
146
Exemplos com bases de dados
5.6.1 Exemplo: Livro de Visitas
5.6.2 Exemplo: Sondagens de opinião
148
152
5.5
5.6
6. Componentes
6.1
Introdução aos Componentes
156
6.2
Tratamento de ficheiros de texto com o TextStream
6.2.1 Exemplo: História sem fim
6.2.2 Exemplo: Contador de acessos
159
163
Componentes de e-mail
6.3.1 Exemplo: Envio de e-mail com attachment
164
Criar componentes em Visual Basic 6
6.4.1 Exemplo: Componente Livro de Visitas
173
6.3
6.4
7. Exemplos reais
7.1
7.2
7.3
Introdução
A Rã: Motor de Busca
A Loja: Loja E-Commerce
182
183
197
g t t m t o seu e-book
b
Peça gratuitamente
Receba gratuitamente, por e-mail, a versão
digital (e-book) deste livro, para poder utilizar
todos os programas sem ter que os re-escrever.
Para tal, envie a cópia da factura deste livro
para o Centro Atlântico, para o e-mail
[email protected] ou por correio para,
Centro Atlântico
Ap. 413
4760 V. N. Famalicão
12 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
1.1 Do Autor
Escrevi este livro, acima de tudo, para dar algum apoio a todos
aqueles que querem iniciar-se neste tema de programação Internet
do lado do servidor. Quando comecei a pesquisar estes assuntos,
há alguns anos, a realidade era muito diferente para conseguir
programar neste tipo de sistemas. Seria necessário um servidor (com
certos requisitos), e conhecimentos bastante mais avançados de
programação. A definição de páginas dinâmicas na altura, consistia
na existência de ficheiros executáveis do lado do servidor que criavam
páginas HTML consoante o que o utilizador procurava, e que limitava
bastante os tipos de pesquisa. Quando o Perl (para programação
de páginas dinâmicas) apareceu, o panorama mudou, e as facilidades
deste tipo de programação começavam. Mesmo assim, a Microsoft
apareceu com os IDC (Internet Database Connector), que apesar
de serem de mais fácil compreensão não eram tão potentes a nível
de desenvolvimento.
Mais tarde, apareceram as ASP, que deram uma grande (e boa)
viragem na programação do lado do servidor. O programador
começava a ter uma linguagem potente e flexível onde podia
desenvolver o mais variado tipo de serviços e de soluções.
Quando comecei a trabalhar nesta linguagem estava-se a fazer a
transição do sistema IDC para as ASP. As facilidades das mesmas
deram-me hipótese de as poder experimentar onde quer que fosse.
Mesmo assim, os recursos a nível de manuais e páginas Internet
eram poucos, e tive bastantes dificuldades em me desenvolver nesta área. Apesar de tudo, dois sites deram-me uma grande ajuda
(www.swynk.com e www.4guysfromrolla.com), pois muitos programadores já lá deixavam os seus artigos, código e ideias. Com este
suporte on-line e alguma ajuda de programadores de todo o mundo,
comecei a desenvolver páginas, e tudo foi correndo normalmente.
Quando me senti preparado comecei a escrever artigos para estes
mesmos sites, para apoiar aqueles que iriam ter as mesmas dificuldades que eu tive.
Com este livro quero fazer o mesmo, apoiar todos os que querem
entrar nesta área, e tentar que o caminho para o domínio das ASP
seja o menos dificultado possível. Este livro está separado por capítulos; cada capítulo está estruturado por uma parte do sistema das
ASP, e foi dada uma ordem a estes, para que os temas estivessem
ordenados por níveis de dificuldade. No final deixo alguns exemplos, que sei irão ser muito úteis a todos aqueles que querem algo
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 13
mais que tópicos e artigos. Estes exemplos para os iniciados necessitam de uma compreensão de todos os temas abordados neste
livro, mas os programadores mais avançados podem ir directamente para os exemplos, e recorrer ao manual para entenderem ou reverem alguns aspectos da programação com ASP. Espero que este
livro sirva para aquilo que o leitor está à procura, pois quando eu
comecei se tivesse tido este manual, metade dos meus problemas
tinham sido resolvidos muito mais depressa. Para me ajudar nos
temas tenho os problemas que normalmente recebo todas as semanas de vários pontos do planeta, que me dão uma ideia daquilo
que os programadores mais precisam quando começam a trabalhar
com esta tecnologia.
1.2 Requisitos para as ASP
‘ASP’ é a abreviatura de Active Server Pages. ASP são páginas
dinâmicas para a Internet, que usam uma linguagem de programação ao estilo do VB (Visual Basic). Para quem está familiarizado
com o VB não lhe será difícil entender este código, pois as rotinas
de scripting de ambos os sistemas são quase idênticas e seguem
as mesmas regras. Se além do VB, tiver sólidos conhecimentos de
HTML (Hyper Text Marked Language), rapidamente estará preparado para programar sobre este sistema a um bom nível depois de
dominar os tópicos deste manual. Mesmo que não domine o HTML,
poderá ler o capítulo 1.6 onde estão indicados alguns dos principais
comandos (chamados Tags) do mesmo.
Este sistema foi o segundo adoptado pela Microsoft para a criação
de poderosos sites dinâmicos com acesso a bases de dados. O
primeiro sistema foi o de IDC que usava um sistema de dois ficheiros, um com o código HTML (HTX) que continha rotinas de chamada de ficheiros IDC, que por sua vez tinham as declarações de SQL
para acesso às bases de dados. Não era tão flexível, era mais lento
de se programar, e tinha certos requisitos de programação algo diferentes das ASP.
CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 15
1.3 ASP vs JavaScript/VBScript
Muitas pessoas perguntam “…Qual a diferença entre as ASP e o
JavaScript? Ou o VBScript? Ou mesmo o tão potente Java?…”.
Bem, as diferenças são bastantes, não só falando das ASP, mas
também de outras linguagens parecidas, como o Perl, PHP ou mesmo o Cold Fusion. Enquanto o JavaScript e o VBScript e o Java,
funcionam do lado do cliente (apesar de haver hipótese do Java
funcionar também a nível do servidor com servlets) as ASP funcionam no servidor. Uma boa maneira de notar esta diferença entre as
ASP e o JavaScript/VBScript, é olhando para as instruções de programação de ambos. Quando estamos no nosso browser e vamos
ver o source de um ficheiro com JavaScript ou VBScript, vemos todo
o código, e daí vem o problema desse código poder ser usado ilegalmente por outro programador - situação muito usual. Com as
ASP, ao tentar aceder ao código, só se vê puro HTML, pois as ASP
são tratadas e processadas no servidor de Internet que por sua vez
envia a formatação online toda em HTML.
O código de JavaScript é facilmente identificado no meio do código
HTML, sendo a sua estrutura a seguinte:
<SCRIPT LANGUAGE=”JAVASCRIPT”>
{
history.go(-1);
}
</SCRIPT>
Este exemplo está a simular o botão de recuo do browser, fazendo
com que seja recuada uma página. Normalmente este código é usado na seguinte situação (pelo menos aquela em que o uso mais):
<a href=”javascript : history-go(-1)”>Voltar Atrás</a>
O VBScript é no final de contas o código base das ASP, mas que
corre no lado do cliente:
<SCRIPT LANGUAGE=”VBSCRIPT”>
formatcurrency(“10000”)
</SCRIPT>
Este código formata o valor 10000, para que fique 10.000$00.
16 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Com o Java o problema é diferente, é muito pesado, nem todos os
browsers o suportam, e a sua programação é dispendiosa, e toma
muitos recursos, que a fazem ideal para outros campos. Este foi
então posto de parte por todos aqueles que querem sites com rápido acesso a bases de dados, e flexíveis, não só na programação
mas também na utilização (interface com o utilizador), onde as ASP
e linguagens semelhantes têm vindo a dominar todo o mercado. E
se formos a ter em conta o que é aceder a bases de dados online,
poderemos ver que todos os serviços online têm de aceder a essas
mesmas estruturas, para poderem praticar o chamado e-commerce,
que veremos também neste manual.
1.4 Instalar o servidor de Internet
O servidor de Internet é bastante fácil de instalar e a documentação
da Microsoft que vem com o pacote do software é bastante explícita. Mesmo assim vou só indicar alguns pontos para a instalação do
software.
Se está a pensar em instalar um servidor de Internet para ter páginas online, a opção certa é o WindowsNT com o Option Pack 4 (de
onde vem o IIS 4) e se possível com o Service Pack 4 ou 5 do
WindowsNT. Se quiser usar sistemas mais recentes pode também
usar o Windows 2000, que vem mais seguro no aspecto dos sites
que fiquem sob sua alçada e trás já o IIS 5.
As grandes diferenças no IIS 5 serão no aspecto do uso de código e
alguns objectos novos, que não são bem novos, mas sim melhoramentos de alguns já usados anteriormente. A nível de performance
essa será melhor pois os cabeçalhos de HTTP (a informação que é
recolhida pelo browser, enviada pelo servidor) quando possível são
enviados comprimidos, permitindo uma redução de tamanho de informação. Terá alguns wizards para instalação de sites, e um grande avanço é que o programador não terá de se preocupar com as
extensões dos ficheiros, podendo colocar código ASP em qualquer
lado, pois o novo servidor vai detectar as diferenças. Existirá uma
maneira mais prática de redireccionamento de páginas, poderá ser
executado código dinamicamente (do tipo o utilizador ter uma página online para testar scripts no momento), melhor controlo de componentes, e o mais importante de todos, a hipótese de se criarem e
usarem classes, sistema usado por programadores em ambientes
de programação orientada por objectos.
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 17
Caso contrário, o PWS para o Windows 98 é uma boa escolha pois
pesa menos no computador e será o suficiente para criar as ASP
que irá usar futuramente no Windows NT. Eu indicaria então que
instalasse tudo o que vem no pacote (PWS ou IIS), as consolas de
gestão, o transaction server, os exemplos, o ADO (Access Data
Obects), todos os componentes que vierem – em resumo, tudo o
que for possível instalar. Perceberá durante a leitura deste manual o
porquê desta indicação, e com a sua especialização nesta matéria
ao longo da sua vida profissional também o entenderá.
O directório onde as páginas vão ficar instaladas pode ser aquele
que o programador quiser, mas aconselho vivamente a utilizar o
que está por defeito c:\inetpub\wwwroot\, e a partir do interior deste
gerir todas as páginas que quiser criar. Não apague os ficheiros que
ele criar, principalmente um chamado global.asa, que iremos tratar
mais adiante.
Depois de todo o sistema instalado tem de activar o serviço de
Internet. No PWS basta ir ao Personal Web Server e carregar em
Start (normalmente ele já está por defeito). No IIS 4 terá de ir à
Management Console e escolher Default Web Site da lista do lado esquerdo, carregando depois no botão de run.
Fig. 1.2 - Aspecto da consola do PWS
Como se pode verificar na figura 1.2, o servidor virtual criado por
defeito é o nome que se deu ao computador, variando por isso de
máquina para máquina. No meu caso será jvpc. Assim, quando for
preciso aceder ao servidor virtual, poder-se-á fazer no browser através de http://jvpc/ ; aparecer-lhe-ão informações do PWS, da mesma
maneira que se escrevesse no address link do seu browser localhost
.
CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 19
1.5 Programar com ficheiros
ASP e HTML
As extensões dos ficheiros ASP é *.asp, e dos ficheiros HMTL é *.html
ou *.htm
Conforme a versão do servidor Internet, o programador poderá definir quais as extensões a usar e para que tipo de ficheiro. Poderá até
personalizar os ficheiros ASP, fazendo com que passem a ser *.xyz
Como estes tipos de ficheiros não são compilados e sim interpretados (os *.asp no servidor e os *.html no browser), o programador estará a programar sobre ficheiros de texto, mas com as extensões referidas. Normalmente são usados editores Freeware, que se podem
encontrar na Internet, ou outros mais profissionais como o InterDev
da Microsoft. Acho que cada um deve tentar todos os que puder,
para fazer a escolha que esteja mais apropriada à sua maneira de
programar.
1.6 Conhecer o HTML (Hyper
Text Markup Language) em
12 passos
Para se programar as ASP, serão necessários certos requisitos, não
só a nível de hardware como de conhecimento a nível de programação. Falo do HTML, que é necessário como base para um bom entendimento de tudo aquilo que é descrito neste manual. Para isso
descreverei alguns comandos do HTML, que de linguagem de programação tem muito pouco, visto que se poderia comparar a alguns
processadores de texto bastante antigos (quem se lembrar do
WordStar sabe ao que me refiro!).
Vou então indicar 12 pontos essenciais em relação ao HTML, para
que o leitor fique melhor preparado para o que vai ler nos próximos
capítulos, onde se misturará HTML com o código ASP.
20 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
1. O código HTML que aparece no browser fica sempre entre duas
Tags - Tags são os comandos que estão entre os símbolos <>
<HTML>
<BODY>
…………….
</BODY>
</HTML>
2. Como deve ter reparado, todas as Tags que começam com
<NOMEDATAG> têm de acabar com uma barra </NOMEDATAG>. Nem
todas o requerem, mas podemos dizer que cerca de 90% sim.
3. Para enviar conteúdo para o browser de maneira a ser visível
pelo utilizador, basta escrever:
<HTML>
<BODY>
ISTO É UM TESTE
</BODY>
</HTML>
4. Para mudar-se os parâmetros dos textos escritos é usada a Tag
<FONT>, onde poderá mudar o tamanho das letras, a cor e até
mesmo o tipo de letra:
<HTML>
<BODY>
<FONT FACE=”ARIAL” COLOR=”GREEN” SIZE=”5”>ISTO É UM
TESTE</FONT>
</BODY>
</HTML>
5. Para simular um parágrafo existe a Tag <P>
<HTML>
<BODY>
<P><FONT FACE=”ARIAL” COLOR=”GREEN” SIZE=”5”>ISTO É UM
TESTE</FONT></P>
E ISTO JÁ É OUTRO TESTE
</BODY>
</HTML>
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 21
6. A mudança de linha é feita com <BR> que funciona como que
um Enter no mesmo parágrafo:
<HTML>
<BODY>
<P><FONT FACE=”ARIAL” COLOR=”GREEN” SIZE=”5”>ISTO É UM
TESTE</FONT></P>
E ISTO<BR> JÁ É<BR> OUTRO TESTE<BR>
</BODY>
</HTML>
7. Para se criar tabelas usamos <TABLE></TABLE>, onde <TR></TR>
simbolizam as linhas, e <TD></TD> as colunas dessa mesma linha:
<HTML>
<BODY>
<TABLE BORDER=”1”>
<TR>
<TD>ESTA É A PRIMEIRA LINHA, PRIMEIRA COLUNA</TD>
<TD> ESTA É A PRIMEIRA LINHA, SEGUNDA COLUNA </TD>
</TR>
<TR>
<TD> ESTA É A SEGUNDA LINHA, PRIMEIRA COLUNA </TD>
<TD> ESTA É A SEGUNDA LINHA, SEGUNDA COLUNA </TD>
</TR>
</TABLE>
</BODY>
</HTML>
8. Quando queremos introduzir comentários ao código usamos
<!— —>. Dá muito jeito quando o código HTML é muito extenso,
comentando assim o que está criado em vários pontos do script:
<HTML>
<BODY>
<!—ISTO QUE AQUI ESTÁ ESCRITO NÃO APARECE NO BROWSER—>
ISTO SIM, JÁ APARECE NO BROWSER
</BODY>
</HTML>
22 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
9. Quando é necessário um script, para funcionar do lado do cliente
tipo JavaScript ou VBScript usa-se a Tag <Script Language=”….”>
</Script>
<HTML>
<BODY>
<!—ISTO QUE AQUI ESTÁ ESCRITO NÃO APARECE NO BROWSER—>
ISTO SIM, JÁ APARECE NO BROWSER
<SCRIPT LANGUAGE=”JAVASCRIPT”>
………….
</SCRIPT>
</BODY>
</HTML>
10.Uma das maneiras de recebermos dados do utilizador é através
de formulários. Podemos usar o método POST ou GET, que serão
definidos para o tipo de programação com dados dos utilizadores
via ASPs. Estes são estruturados da seguinte maneira:
<HTML>
<BODY>
<FORM NAME=”nomedoformulario” METHOD=”POST”>
O seu nome:<INPUT NAME=”nome”><BR>
O seu telefone:<INPUT NAME=”email”><BR>
<INPUT TYPE=”SUBMIT”>
</FORM>
</BODY>
</HTML>
11.Para ter um texto que vai ter a outra página, tem de fazer o link
com a Tag <A> </A>
<HTML>
<BODY>
<FORM NAME=”nomedoformulario” METHOD=”POST”>
O seu nome:<INPUT NAME=”nome”><BR>
O seu telefone:<INPUT NAME=”email”><BR>
<INPUT TYPE=”SUBMIT”>
</FORM>
<A HREF=”outrapagina.html”>Pode seguir por aqui</A>
</BODY>
</HTML>
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 23
12. Para mostrar uma imagem no browser use a Tag <IMG>
<HTML>
<BODY>
<IMG SRC=”nomedaimagem.gif”>
</BODY>
</HTML>
Ficam assim demonstrados os passos que julgo serem os básicos
essenciais do HTML, para compreender parte daquilo que vai ser
demonstrado neste manual. A linguagem HMTL é bastante simples
e limitada. Uma boa observação a outros sites pode fazer maravilhas aos seus conhecimentos de HMTL ;-)
Quando estiver no capítulo dos exemplos deste manual, e se não
estiver a perceber o código de HTML volte a consultar este capítulo
onde se introduziram as Tags que poderiam causar mais dúvidas. A
maioria das outras Tags e opções são quase óbvias aquando da
sua tradução para português.
1.7 Sites com recursos de ASP
Poderia enumerar muitas dezenas de sites com recursos a nível
das ASP, alguns dos quais eu ainda recorro. Mas vou indicar aqueles que julgo valerem mesmo a pena, não apenas pelo conteúdo
que têm, mas também pela maneira como apresentam o conteúdo
e o organizam:
www.activeserverpages.com
Este é o site ‘Pai’ das ASP. Terá
sido em princípio o primeiro relacionado com este assunto.
Tem muitos exemplos explicados, e vários truques para
aquelas dificuldades que vão
aparecendo enquanto programamos. É actualizado periodicamente há muito tempo.
28 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
2.1 Os primeiros passos
Para começar irei demonstrar-lhe, em apenas uma linha, como
poderá escrever uma frase; depois veremos o mesmo no HTML,
com variáveis e acções entre variáveis. Isto ainda antes de definir os
objectos, métodos, expressões, funções e regras das ASP. Terei
como princípio que o leitor tem conhecimentos de HTML, visto ser a
base de toda esta programação (programação Internet).
(ficheiro cpt2-1-1.asp)
<%response.write”Olá Portugal”%>
Vemos aqui algo que nos salta à vista e que são os <% %>. Como se
pode facilmente verificar, estes são os identificadores de onde começa e acaba a ASP que foi construída, pois quando introduzirmos
código entre o HTML, teremos de definir onde estão as ASP, e estes
indicadores serão determinantes para esse propósito. Response é
um objecto das ASP que conta com bastantes métodos. Este e o
objecto Request vão ser sem sombra de dúvidas aqueles com que
irá trabalhar mais. Encontra uma tabela no capítulo seguinte com os
objectos principais e seus métodos de maneira que sempre que
necessitar os possa encontrar mais rapidamente consultando a tabela.
(ficheiro cpt2-1-2.asp)
<%
pais = “Portugal”
response.write”Olá “ & pais
%>
Este segundo exemplo demonstra uma abordagem diferente mas
com o mesmo resultado no browser. Aqui pretendo demonstrar a
maneira como se fazem ligações com o símbolo &
30 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Neste exemplo foi feito aquilo que de mais normal vai ser feito no
resto deste manual - usar as variáveis geradas ou não nas ASP e
introduzi-las no meio do código HTML. Repare no truque para que a
variável fique entre o HTML. Não foi necessária a rotina
response.write, sendo então introduzido apenas o caracter de
igualdade seguido da variável.
A plica ‘ é usada para comentar, sempre que quisermos introduzir
algum comentário ao código. Neste livro vamos usá-la com frequência para dar explicações adicionais de algumas situações a nível de
programação.
Julgo que com estes exemplos o leitor ficou a perceber como se
estrutura de um modo geral a programação em ASP.
2.2 IF, THEN, ELSE, END IF…
Vamos então iniciar alguma programação básica e essencial, aquilo
que une toda a programação, e que são os operadores e as
expressões. Vou começar pelas expressões, e deixar uma tabela
de operadores para o final deste capítulo (visto que são bastante
poucos). Entretanto estes vão sendo usados nos próximos exemplos.
(ficheiro cpt2-2-1.asp)
<%
a= 10
b=100
if a < b then
response.write “a é menor que b”
else
if a > b then
response.write “a é maior que b”
end if
end if
%>
CAPÍTULO 2: EXPRESSÕES E OPERADORES 31
A expressão IF, foi aqui usada para que em conjunto com o operador
< , fizessem uma comparação. A mensagem que vai ser enviada
para o browser, depende dos valores a e b. O IF tem uma estrutura
simples:
IF (ALGO) THEN
(FAZ MAIS ALGO)
END IF
Ou quando as opções são várias:
IF (ALGO) THEN
(FAZ ALGO)
END IF
IF (ALGO2) THEN
(FAZ ALGO2)
END IF
IF (ALGO3) THEN
(FAZ ALGO3)
END IF
Mas se as opções estão em cadeia, e se uma acontecer, as outras
têm de ficar anuladas. Teremos de usar a expressão ELSE:
IF (ALGO) THEN
(FAZ ALGO)
ELSE
IF (ALGO2) THEN
(FAZ ALGO2)
ELSE
IF (ALGO3) THEN
(FAZ ALGO3)
END IF
END IF
END IF
Este tipo de expressões dá muito jeito aos programadores, mas
quando existem várias opções em cadeia, eu sugiro que se use a
expressão CASE; fica melhor organizado, e as confusões dentro do
código são bastante menores. Estas pequenas ‘regras’ que vou escrevendo neste manual, não são propriamente para serem seguidas religiosamente. Se calhar o leitor nem vai ter muitos problemas,
mas quando o código começa a ficar muito extenso, o programa
tende a ficar confuso. Notará isso se lá voltar ao fim de uns meses
para fazer manutenção (muito comum em sites na Internet).
32 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
2.3 FOR, WHILE, CASE…
As expressões de repetição, usadas pelas ASP, são conhecidas de
qualquer programador, não sendo por isso algo que precise de uma
especial atenção para as tentar perceber.
(ficheiro cpt2-3-1.asp)
<%
a= 4
b=12
if a < b then ‘ comparação entre dois valores
for I=0 to a ‘ ciclo FOR
response.write “ a(“ & a & ”) é maior que “ & I & “<br>”
‘ o símbolo <br> em HTML simboliza mudança de linha
‘ no mesmo parágrafo
next I ‘ final de ciclo FOR
else
if a>b then
I=a
While b<I ‘ciclo WHILE
Response.write “b(“ & b & ”) é menor que” & I & “<br>”
I=I–1
wend ‘ final de ciclo WHILE
end if
end if
%>
Neste caso aproveitei código de um exemplo inteiro, para lhe dar
mais umas linhas com este ciclo WHILE. Inicialmente faz-se a primeira comparação, que se repetirá enquanto a mesma for válida.
Neste caso enquanto b for menor que I, o ciclo (loop) vai sendo concretizado.
A minha expressão de repetição favorita, é a CASE, muito flexível e
rápida. Por mais tarde que eu volte a mexer no código, fico a sempre
perceber o que lá se passa em minutos.
CAPÍTULO 2: EXPRESSÕES E OPERADORES 33
(ficheiro cpt2-3-2.asp)
<%
resposta = 4
Select case resposta
case “1” response.write “ Não é ” & resposta
case “2” response.write “ Não é ” & resposta
case “3” response.write “Acertou é ” & resposta
case “4” response.write “ Não é ” & resposta
case else response.write”Desconhecido….”
end select
%>
Neste case a comparação é feita por hipóteses em função de uma
resposta (variável resposta), tendo-se atenção à mesma, iremos fazer uma comparação com as hipóteses possíveis (1, 2, 3 e 4 são as
únicas possíveis) e executar a declaração correspondente (se acertou ou se não acertou).
(ficheiro cpt2-3-3.asp)
<CENTER><TABLE BORDER=”1”>
<% contador = 1
while contador<6%>
<TR>
<TD BGCOLOR=”RED””>
<FONT COLOR=”WHITE”><%=contador%></FONT></TD>
<TD><%=(contador-1)%></TD>
<TD><%=(contador+1)%></TD>
<TD><%=(contador*100)%></TD>
</TR>
<%
contador = contador + 1
wend
%>
</TABLE></CENTER>
Neste caso, fui usar novamente o WHILE, mas com o intuito do leitor perceber a potencialidade de trabalhar com tabelas - no final de
contas aquilo que mais vai usar se o destino que pretende dar aos
seus conhecimentos de ASP for a programação com bases de dados. Introduzindo o valor que se quer dentro de cada célula da tabela, é o truque que origina, as grandes tabelas dos sites de comércioelectrónico. Além de texto, pode introduzir um novo esquema de tabelas e/ou imagens.
CAPÍTULO 2: EXPRESSÕES E OPERADORES 35
2.4 Variáveis
Nas ASP, as variáveis são também, como no Visual Basic, dinâmicas, não sendo por isso necessária a sua inicialização. Seja como
for, é ‘má’ programação usar variáveis globais sem controlo sobre
as mesmas. Deve-se usar, mas não em excesso, assim como se
devem sempre inicializar as mesmas, não só para melhor controlo,
mas também para melhor performance. Para que não se ‘desleixe’
com as variáveis, use o código <% Option Explicit %> no início de cada
página para que tenha de inicializar sempre as variáveis. Assim, as
alocações de memória, para as variáveis dinâmicas, serão feitas
com uma melhor estrutura, ficando por esse motivo beneficiado o
desempenho das suas páginas.
Para inicializar uma variável em ASP basta usar Dim . Para criarmos a variável ‘xpto’ usamos então <%Dim xpto%>
Temos nas ASP, alguns tipos de variáveis a considerar:
- variáveis usuais (usadas no momento, e que, como são
dinâmicas, podem ser criadas a qualquer altura sem
inicialização das mesmas; podemos incluir os arrays neste grupo, que podem ser passados para as variáveis de sessão).
Normalmente quando as inicializamos usamos a expressão
Dim variável
- variáveis Application (usadas como globais no site pois todos os utilizadores têm acesso à mesma);
- variáveis de sessão/Session (usadas para acompanharem
toda uma sessão de acesso por parte de um utilizador, mas só
acessíveis por este, e não por todos como as de Application).
36 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
2.5 Operadores
Apesar de já terem sido praticamente todos usados neste capítulo,
vou então deixar uma pequena tabela dos operadores, para referência.
Os operadores de comparação e igualdade são os seguintes:
TIPO DE OPERADOR
DESCRIÇÃO
=
Igualar a…
·
if a = b
·
c=d
<
Menor do que…
·
if a < b
·
while c < x
>
Maior do que…
·
if a > b
·
while c > x
<=
Menor ou igual do que…
·
if a <= b
·
while c <= x
>=
Maior ou igual do que…
·
if a >= b
·
while c >= x
<>
Diferente de…
·
if a <> b
·
while c <> x
Estes são os operadores principais das ASP, e será com estes que
iremos trabalhar ao longo deste manual. Estes operadores não serão usados única e exclusivamente no código de ASP, mas também
aquando do uso de declarações de SQL.
CAPÍTULO 2: EXPRESSÕES E OPERADORES 37
Quando queremos fazer comparações múltiplas podemos então usar
AND ou OR, como nos seguintes casos:
(ficheiro cpt2-5-1.asp)
<% a = 10
b = 20
c = “Teste”
If a > 9 AND a <=20 then
Response.write “ (a) está entre 9 e 20 <br>“
End if
%>
Nos operadores aritméticos temos então uma outra tabela:
TIPO DE OPERADOR
DESCRIÇÃO
^
Usado para expoente,
(Para o caso de 26, temos
nas ASP , (2^6))
*
Multiplicador,
(2*5)
/
Divisão para retornar valor singular…
(a / b)
\
Divisão inteira…
(a \ b)
+
Soma…
(a+b)
Este valor também funciona para
concatenação tal como o símbolo &
-
Diferença…
(a–b)
MOD
Resto da divisão…
( a MOD b )
Podemos então demonstrar todos os operadores aritméticos da tabela anterior, num ficheiro de ASP.
38 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt2-5-2.asp)
<%
a=2
b=8
c = 10
st1 =”Desta maneira”
st2 = “ também podemos concatenar strings.”
Response.Write “a = 2<br>”
Response.Write “b = 8<br>”
Response.Write “c = 10<br>”
Response.write “st1 = ‘Desta maneira’<br>”
Response.write “st2 = ‘ também podemos concatenar strings.’<br>”
Response.Write “<br><br>”
Response.Write “- b^a -> “ & b^a & “<br>”
Response.Write “- a*b -> “ & a*b & “<br>”
Response.Write “- c/a -> “ & c/a & “<br>”
Response.Write “- a\b -> “ & a\b & “<br>”
Response.Write “- a-b -> “ & a-b & “<br>”
Response.Write “- a+b -> “ & a+b & “<br>”
Response.Write “- c MOD a -> “ & c MOD a & “<br>”
Response.Write “- st1 + st2 -> “ & st1+st2 & “<br>”
%>
E para se perceber um pouco melhor o que está a acontecer neste
código, pode recorrer à seguinte imagem, que julgo responder a
qualquer dúvida com que possa ter ficado.
Fig. 2.4 - Resultado do ficheiro cpt2-5-2.asp
Estes operadores são muito importantes na medida em que todo o
tipo de estatísticas, contas, comparações e cálculos extra os irão
requerer. No dia a dia, as empresas precisam de certas situações
resolvidas que por vezes não têm solução nas funções pré-definidas das ASP, e nessa altura terá de ser o leitor a desenvolver as
suas próprias funções, por meio destes operadores de base.
40 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
3.1 Tabela de Funções base das ASP
Um dos aspectos que mais se destaca nas ASP são as suas
funções, e a facilidade de manuseamento das mesmas. Existem
funções que facilitam muito a vida a quem faz a programação de
vários sites . A recursividade é um dos pontos fortes quando
programamos, e as funções ajudam nesse aspecto.
A tabela seguinte, tal como a tabela de objectos que existe no próximo capítulo, vão de encontro a tudo aquilo que este manual se refere - a programação de potentes sites interactivos e dinâmicos. Será
a partir deste capítulo que o leitor se irá confrontar com exemplos
realmente essenciais para a programação do dia a dia de sites profissionais. Espero que estas tabelas vão de encontro às necessidades do leitor, que quer procurar rapidamente aquela função ou objecto que necessita no momento em que está a programar. A tabela
está por ordem alfabética para facilitar a procura de qualquer uma
das funções que possa ser necessária. As funções são da versão
2.00 das ASP, pertencente ao VBScript V4.
TABELA DE FUNÇÕES DAS ASP
Função
Descrição
Abs()
Esta função serve para devolver números
absolutos, sejam eles de que tipo forem.
Ex.
variavel = Abs(23.34) ‘ devolve 23.34
variavel = Abs(-23.34) ‘ devolve 23.34
Array()
Os arrays servem para definirmos listas de
valores dentro de uma mesma variável. São muito
usados para simplificar actos muito comuns em
programação, a todos os níveis. Um array é
constituído por vários valores que estão
separados por uma posição. O array
variavel(“João”, 3, 1200, “Sol”), tem 4 posições. As
posições de um array começam sempre do 0.
Para acedermos aos dados que esta tem, basta
indicarmos a posição que nos interessa.
Ex.
variavel(“João”, 3, 1200, “Sol”)
Response.write variavel(0) ‘ devolve João
Response.write variavel(1) ‘ devolve 3
Response.write variavel(3) ‘ devolve Sol
CAPÍTULO 3: FUNÇÕES 41
Asc()
Devolve o número ASCII de um caracter
Ex.
variavel1 = Asc(“C”) ‘devolve 67
variavel2 = Asc(“1”) ‘devolve 49
Atn()
Serve para calcular o arco-tangente de um valor
Ex.
Atn(1) ‘ devolve 0,785398163397448
CBool()
Retorna True ou False: False se a expressão for
falsa, caso contrário True
Ex.
Cbool(32=32) ‘ devolve True
Cbool(10=32) ‘ devolve False
CByte()
Transforma qualquer valor (do tipo não Byte) para
o tipo Byte
Ex.
CByte(225.1278) ‘ devolve 225
CCur()
Idêntico a CByte(), mas neste caso para
o tipo de moeda usado.
CDate()
Converte uma expressão que tende para uma
Data, numa Data validada, não sendo necessário
usar IsDate()
Ex.
variavel1 = Cdate(“Dezembro 1, 1990”)
‘ a variável1 fica com uma data válida
CDbl()
Converte um valor (do tipo não Double)
para o tipo Double
Chr()
Ao contrário da função Asc(), esta converte os
valores ASCII para o caracter correspondente
Ex.
Chr(67) ‘devolve C
Chr(49) ‘ devolve 1
CInt()
Converte um valor (do tipo não Intenger)
para o tipo Integer
CLng()
Converte um valor (do tipo não Long)
para o tipo Long
Cos()
Devolve o coseno de um ângulo
42 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
CreateObject() Cria uma referência a um objecto externo
Ex.
Set Objecto=Server.CreateObject(“Projecto.Objecto”)
Csng()
Converte um valor (do tipo não Single)
para o tipo Single
CStr()
Converte um valor (do tipo não String)
para o tipo String
Ex.
CStr(123) ‘ devolve uma string “123”
Date()
Devolve a Data corrente no servidor Internet
Ex.
response.write Date()
DateAdd()
Esta função serve para o programador obter uma
data posterior ou anterior àquela que pretende
usar para cálculo.
Podemos querer saber qual o dia referente a 20
dias depois da data pretendida, ou 1 mês, ou 2
anos.
A expressão usa 3 campos, o primeiro para
introduzirmos o campo de data por onde queremos calcular a diferença, o segundo campo para
o valor numérico dessa diferença, e no final a data
de início.
O campo do caracter que define o tipo de diferença aceita as seguintes opções:
h – horas
n – minutos
s – segundos
yyyy – anos
q – quarto anual
m – meses do ano
y – dias do ano
d – dias
w – dias da semana
ww – semanas do ano
Ex. DateAdd(“m”, 1, “31-Jan-2000”) ‘ devolve 29-Fev-2000
DateAdd(“d”, 1, “31-Jan-2000”) ‘ devolve 1-Fev-2000
DateDiff()
Devolve a diferença entre duas datas escolhendo
um dos campos de comparação explicados em
DateAdd()
Ex.
DateDiff(“d”, Now, “31-Jan-1999”)
‘ devolve a diferença entre a data de hoje
e o dia 31 de Janeiro de 1999
CAPÍTULO 3: FUNÇÕES 43
DatePart()
É dada uma certa data e obtemos em que altura
do ano acontece usando os valores de campo de
DateAdd()
Ex.
DatePart(“q”, “31-Set-2000”)
‘ devolve o quarto do ano em que a data se aplica
DateSerial()
Devolve uma data para especificados ano,
mês e dia
DateValue()
Devolve uma data válida daquela que é pedida
Day()
Devolve o dia do mês de uma data
Ex. Day(“31-Set-2000”) ‘ devolve 31
Exp()
Devolve a exponencial de um valor
Filter()
Pesquisa um array, para procura de um
valor ou expressão
Ex. variavel1(“Internet”,”Sites”,”Hosting”,”Portugal”)
Filter(variavel1,”Si”) ‘ devolve Sites
Fix()
Devolve o inteiro de um qualquer valor
FormatCurrency()Transforma um valor normal numérico
para valor monetário.
Ex. FormatCurrency(32420) ‘ devolve 32.420$00
FormatDateTime() Funciona como FormatCurrency()
mas para datas
FormatNumber() Formata um número da maneira que nos convém
FormatPercent() Devolve uma percentagem do universo que o
programador pretende
Ex. FormatPercent(23/230) ‘ devolve 10,00%
GetObject()
Devolve a referência a um objecto
Hex()
Transforma um valor para resultado hexadecimal
Hour()
Devolve a hora de uma expressão
Ex. Hour(Now()) ‘ devolve a hora do momento
InStr()
Devolve a posição de uma string dentro
de outra a contar do início
Ex. InStr(1,”Hoje é um bom dia para se
programar”, “ra”) ‘ devolve 21
44 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
InStrRev()
Devolve a posição de uma string dentro
de outra a contar do fim
Ex. InStr(1,”Hoje é um bom dia para
se programar”, “ma”,35,0) ‘ devolve 33
IsArray()
Devolve True ou False em relação a uma variável,
validando-a no caso de ser ou não um array
IsDate()
Devolve True ou False em relação a uma string,
validando-a no caso de esta ser do tipo Date ou não
IsEmpty()
Valida uma variável, para ver se a mesma
está ou não vazia
IsNull()
Valida uma variável para ver se a mesma
é Null ou não
IsNumeric()
Valida uma string/valor para ver se o mesmo é
numérico ou não
IsObject()
Valida um Objecto, certificando-se se o mesmo
o é ou não
Join()
Junta todas as variáveis dentro de um array,
criando uma só.
Ex.
variavel(0) = “Hoje ”
variavel(0) = “está ”
variavel(0) = “bom ”
variavel(0) = “tempo.”
variavel2 = Join(variavel)
‘a variavel2 ficará igual a “Hoje está bom tempo.”
LBound()
Devolve o menor valor da dimensão de um array
LCase()
Devolve uma string em ‘lower case’
Ex.
LCase(“Estamos em Setembro.”)
‘ devolve “estamos em setembro.”
Devolve um certo número de caracteres a contar
do lado esquerdo da string
Ex.
Left(“Vamos programar ASP.”,3)
‘devolve “Vam”
Left()
Len()
Devolve o tamanho de uma string
Ex.
Len(“Vamos programar ASP.”)
‘ devolve 20
CAPÍTULO 3: FUNÇÕES 45
Log()
Devolve o logaritmo de um dado número
LTrim()
Devolve uma string sem espaços do lado esquerdo
Ex.
LTrim(“ Isto é um teste.”)
‘ devolve “Isto é um teste.”
Mid()
Serve para termos um número dado de
caracteres de uma string, a partir de uma dada
posição
Ex.
Mid(“Vamos programar ASP.”, 7, 9 )
‘ devolve “programar”
Minute()
Devolve o minuto de uma data/hora
Month()
Devolve o valor correspondente ao mês de uma
dada data
Ex.
Month(date())
‘ devolve o valor do mês em que
estiver a testar o código
MonthDate()
Devolve o nome do mês (por extensão)
Ex. MonthDate(10) ‘ devolve “Outubro”
Now()
Devolve a data e hora corrente
Oct()
Devolve o valor octal de um dado número
Replace()
Altera certo caracter/string por outro dado
Ex.
replace(“yyXiiXppX22fXjX” , ”X” , ”P” )
‘ devolve “yyPiiPppP22fPjP”
RGB()
Devolve um valor representativo de uma cor. A
expressão é estruturada por RGB(vermelho,
verde, azul)
Os valores usados vão de 0 a 255
Ex.
RGB(22,233,143)
‘ devolve 9431318
Right()
Funciona como a função Left() mas a
contar da direita
Rnd()
Retorna um valor aleatório
Round()
Faz arredondamento a valores numéricos
Ex.
Round(23,77) ‘ devolve 24
46 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Second()
Devolve os segundos de uma dada hora
Sgn()
Devolve o sinal de um valor
Ex.
Sgn(2) ‘ devolve 1
Sgn(-12) ‘ devolve –1
Sgn(0) ‘ devolve 0
Sin()
Devolve o seno de um ângulo indicado
Space()
Introduz um dado número de espaços numa string
Ex. response.write “Teste“ & Space(12) & “Feito…”
‘devolve “Teste
Feito…”
Split()
Divide uma string num array, escolhendo o critério
de separação
Ex. resultado = Split(“IstoKéKmaisKumKteste.”, “K”, -1, 1)
‘ devolve ;
‘ resultado(0) = “Isto”
‘ resultado(1) = “é”
‘ resultado(2) = “mais”
‘ resultado(3) = “um”
‘ resultado(4) = “teste.”
Sqr()
Devolve a raiz quadrada de um valor
StrComp()
Compara duas strings, devolvendo um valor, no
que respeita se são iguais ou não.
A estrutura desta função é StrComp(var1,var2,tipo)
Var1 e var2 são duas strings à escolha, o tipo
pode ser definido por 0 (comparação entre
binários) ou 1 (comparação entre textos)
Ex.
var1 = “Teste”
var2 = “ TesTE”
StrComp( var1, var2) ‘ devolve 1
StrComp( var1, var2, 0) ‘ devolve –1
StrComp( var1, var2, 1) ‘ devolve 0
StrReverse() Devolve uma string dada, invertendo-a
Ex.
StrReverse(“123456”) ‘ devolve “654321”
String()
Devolve repetidamente um caracter escolhido
um número de vezes definido
Ex. String(“C”,10) ‘ devolve “CCCCCCCCCC”
Tan()
Devolve a tangente de um determinado número
CAPÍTULO 3: FUNÇÕES 47
Time()
Devolve a hora do sistema
TimeSerial()
Devolve uma hora para hora,
minuto e segundos especificados
TimeValue()
Devolve uma hora válida daquela que é pedida
TypeName()
Devolve o tipo de variável que estamos a usar
Ex.
TypeName(“ASP”) ‘ devolve “String”
TypeName(12.40) ‘ devolve “Double”.
TypeName(NullVar) ‘ devolve “Null”
TypeName(ArrayVar) ‘ devolve “Variant()”.
TypeName(6) ‘ devolve “Integer”
UBound()
Devolve o maior valor da dimensão de um array
Ucase()
Devolve uma string em ‘upper case’
Ex.
LCase(“Estamos em Setembro.”)
‘ devolve “ESTAMOS EM SETEMBRO.”
VarType()
Parecido com TypeName(), mas devolve um valor
correspondente aos dados da variável a validar.
Os números possíveis de resposta são:
0 – Vazio
1 – Null
2 – Integer
3 – Long
4 – Single
5 – Double
6 – Currency
7 – Date
8 – String
9 – Object
10 – Error
11 – Boolean
12 – Variant
13 – Data Access Object
(DAO)
17 – Byte
8192 – Array
WeekDay()
Devolve o dia da semana de uma dada data
Ex.
WeekDay (“Outubro 10, 1999”)
‘ devolve 1 que representa Domingo
WeekDayName() Devolve por extenso o dia da semana de uma
dada data
Ex.
WeekDayName (1)
ou
WeekDayName(WeekDay (“Outubro 10, 1999”))
‘ devolvem ambas as expressões domingo
Year()
Devolve o ano de uma dada data
48 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Apesar da existência de um número considerável de funções nas
ASP estas vingam não pela quantidade das mesmas, mas sim, nos
objectos que existem. Com os objectos que as ASP disponibilizam,
o leitor poderá criar potentes funções próprias, ou componentes para estas em Visual Basic.
Este assuntos serão abordados noutros capítulos, mas que não terão nexo se o leitor não conhecer o funcionamento de procedimentos e funções em ASP, ou até mesmo o uso de ficheiros externos.
Neste capítulo ainda não irá aprender como interagir com o utilizador,
mas sim tratar de todo o tipo de dados e/ou variáveis que lhe poderão aparecer.
3.2 As nossas Funções
O leitor tem acesso a todas as funções disponíveis pelas ASP 2.00,
e a partir de agora pode definir as suas próprias funções. Não esquecer que as ASP 3.00 vêm com o Windows 2000 e o seu IIS5,
como indicado no primeiro capítulo. Nos próximos casos as funções que vão ser criadas serão para situações que por vezes aparecem na programação de sites Internet.
Neste primeiro exemplo criou-se uma função que devolve o número
de dias que faltam até ao ano 2001 a partir de uma dada data.
(ficheiro cpt3-2-1.asp)
<%
Function a2001(data) ‘ início da função
If IsDate(data) then ‘ se for uma data for válida
‘ então envia-se a diferença entre datas
a2001 = DateDiff(“d”,data,”Janeiro 1, 2001")
else ‘ caso contrário
‘ enviamos a data como inválida, em forma de informação
a2001 = “Data inválida...”
end if ‘ final do if
End Function ‘ final da função
Response.Write “Hoje é “ & now() & “<br><br>” ‘ escreve a data
corrente
‘ escreve-se então o resultado
Response.write “Faltam “ & a2001(now()) & “ dias até ao ano 2001.”
%>
CAPÍTULO 3: FUNÇÕES 49
Foram usadas as seguintes funções:
IsDate()
DateDiff()
Now()
para nos certificarmos se a dada data tinha
realmente um formato válido de data;
que retorna o número de dias até ao ano 2001
(o número de dias pois é isso que foi
estabelecido, aquando do campo “d”);
dá-nos a data corrente, que inclui
as horas.
Como se viu, as funções têm uma estrutura própria:
Function nome_da_funcao(variavel1, variavel2, variaveln)
…….
Nome_da_funcao = resposta
End Function
Fig. 3.1 - Resultado do ficheiro cpt3-2-1.asp
A maneira de chamar uma função é simples, basta o uso do nome
da função em qualquer ponto do código.
No próximo exemplo pretende-se saber se um e-mail é válido. Desta
maneira o programa valida algo que perturba muitos programadores, para tentarem que o input dos utilizadores seja o mais correcto
possível, e os e-mails introduzidos sejam o mais correctos.
50 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt3-2-2.asp)
<%
Function valmail(email) ‘ início da função
‘ se o tamanho do e-mail for menor que 5 dificilmente será válido([email protected])
If Len(email) <= 5 Then
Valmail=False else
‘se não existir um @ também não é válido
If InStr(1, email, “@”, 1) < 2 Then
valmail=False
Else
‘ o ponto final é também importante
If InStr(1,email, “.”, 1) < 4 Then
Valmail=False
Else
Valmail=True
End If
End If
End If
End Function ‘ final da função
if valmail(“o_meu_email@algum_email.com”) then
Response.Write”O e-mail o_meu_email@algum_email.com é
válido.<br>”
Else
Response.Write”O e-mail o_meu_email@algum_email.com não é
válido.<br>”
End if
if valmail(“tentar@iludir”) then
Response.Write “O e-mail tentar@iludir é válido.<br>”
Else
Response.Write “O e-mail tentar@iludir não é válido.<br>”
End if
%>
Foram usadas as seguintes funções:
Len()
retorna o tamanho de uma string, para
sabermos se tem o tamanho mínimo
pretendido para um e-mail normal
InStr()
muito usado para nos certificarmos da
existência do símbolo @ ou de um ponto
final, sempre usado antes da extensão
do domínio.
O leitor tem assim, uma função que lhe valida todos os e-mails que
receber como input.
52 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt3-2-3.asp)
<%@ Language=”VBScript” %>
<%
Function criacaixa()
%><select size=”1" name=”nome”><%
For I=0 to UBound(ardados)
%>
<option><%=ardados(I)%></option>
<%
Next
%></select><%
End Function
Dim ardados(3) ‘ inicialização de array
Ardados(0)
Ardados(1)
Ardados(2)
Ardados(3)
= “Alentejo”
= “Minho”
= “Algarve”
= “Beira-Litoral”
%>
<form>
Viajar Para ? <%=criacaixa()%>
</form>
Foram usadas as seguintes funções:
UBound()
retorna o tamanho de um array, necessário
neste caso para sabermos até que
ponto podemos ir com o ciclo FOR.
Fig. 3.3 - Resultado do ficheiro cpt3-2-3.asp
CAPÍTULO 3: FUNÇÕES 53
Como se pode ver, foi usada a linha <%@ Language=”VBScript” %>
que serve para o programador ter acesso mais facilitado ao código
ASP, que é conhecido como o VBScript do lado do servidor. O IIS
interpreta código, e acaba por percorrer todas as linhas, quer tenham ASP ou não, se indicarmos no ínicio do ficheiro de que se trata
de um ficheiro com VBScript, a sua performance será melhorada,
mas não é essencial o uso desta linha no ínicio do código.
Algo também muito comum são os gráficos correspondentes a opiniões, ou outros, para transmitir informação a partir dos dados em
bases de dados. No exemplo seguinte pode-se perceber o truque de
criar gráficos em HTML, que servem para esse mesmo propósito. O
código seguinte é bastante explícito nesse ponto. O truque é o de
controlar o tamanho das células das tabelas de HTML com os valores indicados pelo programa, que os pode aceder de qualquer lado,
mas neste exemplo indicados array a array.
(ficheiro cpt3-2-4.asp)
<%@ Language=”VBScript” %>
<%
Function criagrafico()
For I=0 to Ubound(ardados)
%>
<table border=”0" width=”100">
<tr><td><font face=”ARIAL” size=”2">
<%= ardados(I,0)%></font></td></tr>
<tr><td><table bgcolor=”blue” border=”1" width=”<%=ardados(I,1)%>”>
<tr><td>
</td></tr></table>
</td></tr></table>
<%
Next
End Function
Dim ardados(3,3)
Ardados(0,0) = “Primeiro”
ardados(0,1) = 100
ardados(1,0) = “Segundo”
ardados(1,1) = 40
ardados(2,0) = “Terceiro”
ardados(2,1) = 60
ardados(3,0) = “Quarto”
ardados(3,1) = 18
criagrafico()
%>
CAPÍTULO 3: FUNÇÕES 55
que mantém, ou que repete bastante nas várias páginas de um
mesmo site. Com os SSI, o programador introduz todas as funções
que quer num ficheiro, que por sua vez é chamado no início do código ASP. A partir daí todas as funções desse ficheiro estão acessíveis na programação dessa página ASP. Devemos usar os SSI para
aquele tipo de código que sabemos vai ser alterado em várias páginas. Dessa maneira, bastará alterar uma vez, para que todas as
páginas fiquem actualizadas com o novo código.
A maneira de se chamar um ficheiro dentro de um ASP (uso de
SSI), tenha ele parte de código HTML, ou de ASP, é <!—#INCLUDE
FILE=”ficheiro.inc”—> . Este código é introduzido no código HTML,
e não no de ASP. Mas tem de estar num ficheiro de ASP e não no de
um de HTML - um pouco confuso! Vejamos então os seguintes ficheiros, criados a partir de tudo aquilo que temos vindo a criar neste
capítulo, e recorrendo ao uso de SSI (chamada de ficheiros exteriores para complementar a programação).
Vamos então criar um ficheiro que tem o nosso topo de página HTML
por defeito. Esse ficheiro ficará com uma extensão diferente (*.inc)
para se poder diferenciar dos outros. Pode-se criar HMTL e ASP
nesse mesmo ficheiro.
(ficheiro cpt3-3-1.inc)
<div align=”center”>
<center>
<table border=”0" width=”80%” bgcolor=”#0000FF”>
<tr>
<td width=”100%”><b><font face=”Arial” color=”#FFFFFF”>A
Listagem das minhas Funções:</font></b></td>
</tr>
</table>
</center>
</div>
<div align=”right”><%=FormatDateTime(Now(),2)%></div><br>
Foram usadas as seguintes funções:
FormatDateTime()
Now()
formata a data escolhida, neste caso
com um Formato de tipo 2;
é usada para que seja formatada a
data corrente.
CAPÍTULO 3: FUNÇÕES 57
(ficheiro cpt3-3-2.asp)
<%@ Language=”VBScript” %>
<%
Function a2001(data)
if IsDate(data) then
a2001 = DateDiff(“d”,data,”Janeiro 1, 2001")
else
a2001 = “Data inválida...”
end if
End Function
Function valmail(email)
If Len(email) <= 5 Then
valmail=False
else
If InStr(1, email, “@”, 1) < 2 Then
valmail=False
Else
If InStr(1,email, “.”, 1) < 4 Then
valmail=False
else
valmail=True
End If
End If
End If
End Function
Function criacaixa()
%><select size=”1" name=”nome”><%
For I=0 to UBound(ardados)
%>
<option><%=ardados(I)%></option>
<%
Next
%></select><%
End Function
Function criagrafico()
For I=0 to UBound(ardados2)
%>
<table border=”0" width=”100">
<tr><td><font face=”ARIAL” size=”2"><%= ardados2(I,0)%></font></td></tr>
<tr><td><table bgcolor=”blue” border=”1"
width=”<%=ardados2(I,1)%>”><tr><td></td></tr></table></td></tr></table>
<%
Next
End Function
%>
58 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Como foi visto o ficheiro cpt3-3-2.asp tem todas as funções criadas
neste capítulo. Iremos incluí-lo com a potencialidade dos SSI numa
outra página que usaremos para demonstrar as funções. Foi alterado o nome de um dos arrays, para que não existissem conflitos
entre ambas as funções. De futuro, as funções recebem os
parâmetros, para não nos preocuparmos com este tipo de situações. Vemos então no exemplo a seguir, introduzido através de SSI,
o ficheiro cpt-3-3-2.asp . Para as ASP é como se todo aquele código
estivesse presente no ficheiro, tomando todas as funções como locais. A partir deste momento podemos utilizar o ficheiro e todas as
suas funções.
(ficheiro cpt3-3-3.asp)
<!—#INCLUDE FILE=”cpt3-3-2.asp”—>
<!—#INCLUDE FILE=”cpt3-3-1.inc”—>
<p>
Iremos agora ver todos as funções do capítulo a funcionar,<br>
e não precisamos de as ter neste ficheiro.<br>
Desta maneira temo-las em todos os ASP que quisermos sem termos de<br>
escrever o código todo de novo, ou de passar o tempo<br>
no Copy & Paste...</p><br>
<%Response.Write “Hoje é “ & now() & “<br>”
Response.write “Faltam “ & a2001(now()) & “ dias até ao ano
2001.<br><br>”
if valmail(“o_meu_email@algum_email.com”) then
Response.Write “O e-mail o_meu_email@algum_email.com é
válido.<br>”
Else
Response.Write “O e-mail o_meu_email@algum_email.com não é
válido.<br>”
End if
if valmail(“tentar@iludir”) then
Response.Write “O e-mail tentar@iludir é válido.<br>”
Else
Response.Write “O e-mail tentar@iludir não é válido.<br>”
End if
Dim ardados(3) ‘ inicialização de array
Ardados(0) = “Alentejo”
ardados(1) = “Minho”
ardados(2) = “Algarve”
ardados(3) = “Beira-Litoral”
%>
CAPÍTULO 3: FUNÇÕES 59
<br><br><form id=form1 name=form1>
Viajar Para? <%=criacaixa()%>
</form><br>
<%
Dim ardados2(3,3)
Ardados2(0,0) = “Primeiro”
ardados2(0,1) = 100
ardados2(1,0) = “Segundo”
ardados2(1,1) = 40
ardados2(2,0) = “Terceiro”
ardados2(2,1) = 60
ardados2(3,0) = “Quarto”
ardados2(3,1) = 18
criagrafico()
%>
O resultado na imagem seguinte é bastante explícito daquilo que se
pretendia. Temos todas as funções a funcionar, e podendo funcionar
em todos os ficheiros ASP que o programador tiver para o seu site,
com apenas a inserção de uma linha de código no topo de cada
página ASP.
Fig. 3.6 - Resultado do ficheiro cpt3-3-3.asp
Agora o leitor poderá estender toda a sua programação num só ficheiro, pelo menos as funções que acha virem a ser aquelas que
mais vai utilizar.
62 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
4.1 Tabela de Objectos
Os objectos que as ASP têm por defeito parecem ser poucos, mas
os seus métodos são os suficientes para que o leitor consiga
alcançar os objectivos pretendidos para o seu site. A maneira de
usar os objectos é bastante simples, e intuitiva, funcionando como
os objectos das outras linguagens.
TABELA DE OBJECTOS DAS ASP
Objectos
Métodos e suas funções
Response
· Redirect
usado para redireccionarmos o utilizador para
outra página. Usado normalmente para controlo
de utilizadores e acessos.
· Cookies
mecanismo para deixar informações do lado do
cliente com variada informação (dentro das
cookies existem outros métodos para o seu
controlo, como veremos depois em pormenor).
· Write
é esta a maneira para enviar informação para o
browser.
· CacheControl
desta maneira controlamos se a página pode
deixar que se faça cache da mesma nos
browsers (por defeito não deixa fazer cache).
· Charset
uma maneira de definirmos o tipo de caracteres
a usar.
· ContentType
para definir o tipo de informação que vai ser
passada, usado normalmente para UpLoad onde
definimos que queremos passar não só informação usual, mas também binária, originária de
ficheiros.
CAPÍTULO 4: OBJECTOS 63
· Expires
uma maneira de definir o tempo que uma página
ficará activa e deixará de estar disponível. Neste
caso definimos ao fim de quanto tempo expirará.
· ExpireAbsolute
idêntico ao Expires, com a diferença que se pode
controlar, não com o valor que define ao fim de
quanto tempo, mas sim com uma data que
define a altura em que deixa de estar disponível.
· IsClientConnected – desta maneira controlamos se o cliente ainda está ligado.
· Status
define o código que está no HTTP header.
· AddHeader
Ajusta dinamicamente a informação que está no
HTTP header.
Request
· Cookies
neste caso será usado para ir buscar os cookies
criados com o objecto response.
· Querystring
desta maneira poderemos obter os valores que vêm
da página anterior, depois de submetermos um
formulário com o método GET.
· Form
este método permite-nos obter os dados enviados
por um formulário que esteja com o método POST.
· ServerVariables
usa-se muito este método para identificar os tipos
de browsers que o cliente está a usar, os IPs do
mesmo, a página de onde o cliente veio, assim
como variadas informações sobre o servidor que
está a ser usado.
64 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Server
· HTMLEncode
o método que formata a informação que o utilizador
insere. Esta formatação é muito importante devido
a alguns símbolos serem reconhecidos pelo HTML,
e por esse motivo o layout pode não ter o aspecto
planeado
· URLEncode
parecido com o HTMLEncode, mas formata a string
de maneira a ser válida para usar na linha de
address dos browsers.
· CreateObject
é esta a maneira como iremos aceder a objectos
exteriores, assim como componentes criados por
nós ou outros. Os componentes de ASP são ficheiros de extensão DLL, especiais para os ASPs,
possíveis com o VB ou o VC++ (Visual C++).
· MapPath
é com este método que trabalharemos os nossos
ficheiros localmente (no servidor).
Session
· Timeout
as sessões do servidor têm um limite, ao fim do
qual toda a informação contida nas sessions
desaparecem. Desta maneira poderemos
controlar o tempo que as sessões estão activas.
· SessionID
este é o método que nos dá o nuúmero da sessão
do cliente corrente. São uma espécie de
impressão digital das sessões.
· Abandon
força a finalização das sessões.
Application
A variável global, mas idêntica para todos os
utilizadores, ao contrário das sessions que são
variáveis do tipo global, mas só para o cliente que
está nessa sessão.
TextStream
· CreateTextFile
método de criação de ficheiros de texto.
· OpentextFile
método de leitura dos ficheiros de texto.
CAPÍTULO 4: OBJECTOS 65
A estrutura de um objecto e seu método é do tipo objecto.método,
logo, para criar-mos, por exemplo, um cookie , usamos
response.cookies, e para obter o valor introduzido na cookie, usaremos então request.cookies.
Depois de se ver esta tabela, muitas questões ficam no ar, em relação a vários métodos que aqui descrevemos. A sua grande maioria
vai ser aprofundada nos próximos capítulos, mas iremos tratar alguns
deles ainda neste capítulo, assim como desenvolver exemplos reais
de como usufruir ao máximo destes objectos.
4.2 Variáveis globais e de sessão
As variáveis globais/sessão, serão uma das hipóteses que o programador terá para poder passar dados de base de uma página
para a outra. Normalmente quando se passa de uma página para
outra, as variáveis da primeira página deixam de funcionar numa
segunda. A maneira de ultrapassar este obstáculo é usando os objectos Application e Session. Apesar de ambos os objectos serem
usados para variáveis globais, cada um tem um objectivo diferente,
e um comportamento diferente dentro do contexto da programação
de páginas ASP. Para o leitor perceber como ambas funcionam explica-se então como funciona o servidor de Internet que suporta as
ASP:
O servidor Internet faz um controlo de acessos às páginas que contém sob sua alçada, e por isso cria um ID para cada acesso HTTP
que é feito na máquina onde está instalado e a correr. Desta forma o
servidor consegue fazer uma estatística mais pormenorizada, que a
grande maioria dos outros não conseguem. A partir do momento
que o programador tem acesso a este ID, poderá seguir o rasto
(pormenorizado) daquilo que esse utilizador faz, dentro do site. O ID
de sessão, que pode aceder-se por session.sessionID, termina e
passa a ser outro a partir do momento que o browser é desligado, ou
que passa o tempo limite de uma sessão, que se pode aceder por
session.TimeOut . Cada pessoa que está a aceder ao site tem um
ID diferente, assim como que cada sessão é diferente, podendo o
programador usar as sessões, para passar de variáveis de uma
página para outra, visto que a ligação apenas se quebra no desligar
do browser, ou no atingir do limite de tempo das sessões. Pode-se
ver pelo código seguinte o ID de uma sessão e o tempo limite que
está por defeito no servidor.
66 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt4-2-1.asp)
<%
Response.Write “O numero desta sessão é “ & session.SessionID
Response.Write “<br>O tempo de validade de uma sessão é de “
Response.write session.Timeout & “ minutos.”
%>
Foram usadas os seguintes objectos:
Response.Write
Session.SessionID
Session.Timeout
objecto usado para escrita, tanto em
cookies, browser, headers, etc.
a maneira de saber qual o código da
sessão no momento.
devolve o tempo de expiração das
sessões, definido no momento.
Fig. 4.1 - Resultado do ficheiro cpt4-2-1.asp
Podemos então usar o objecto Session para passarmos todo o tipo
de variáveis de uma páginas ASP para outra. Aqui então está um
exemplo em que passamos uma string entre duas páginas. Ter em
atenção de que estas variáveis ficam acessíveis não só na página
que se corre em seguida, mas em todas aquelas que pertencerem
a esse site. Por isso se para chegar-mos a um ficheiro C começando em A, tenhamos de passar por B, a sessão criada em A continua
activa.
CAPÍTULO 4: OBJECTOS 67
(ficheiro cpt4-2-2.asp)
<%
Response.Write “<br>O tempo de validade de uma sessão é de “ &
session.Timeout & “ minutos.”
session.Timeout = 10
Response.Write “<br> Depois de alterado passou a “ & session.Timeout
session(“Teste”) = “Isto é um teste”
Response.Write “<br>Entretanto foi criada uma variável de sessão
Session(“”Teste””),”
Response.Write “que contém a string ‘“ & session(“Teste”) & “‘ .”
%>
<br><br><a href=”cpt4-2-3.asp”>carregue aqui para passar à próxima
página</a>
Foram usadas os seguintes objectos:
Session(“Teste”)
Session.TimeOut
a maneira de saber qual o código da
sessão no momento;
neste ficheiro usámos este objecto
com este método, de maneira a
alterarmos o tempo limite de uma
sessão.
A possibilidade de podermos alterar o tempo limite de uma sessão é
muito importante, tanto para sites de protecção por password, como
para sites mais pesados, onde necessitamos de mais tempo, pois
uma página que demore muito tempo a abrir, ou a processar algo
bastante pesado, possa demorar mais de 1 minuto, e nessa altura a
sessão deveria ter um mínimo de 2 minutos. Aqui também pudemos
ver como é possível usar “ “ dentro de uma string, ou então lá criar
algo com os mesmos. Visto que as “ “ são usadas para conter strings,
e outro tipo de dados, o programador para as usar terá de criar uma
a mais por cada uma que lá introduzir. Tal como está no ficheiro, que
vimos anteriormente.
No ficheiro cpt4-2-2.asp temos então a possibilidade de ver como
se altera o objecto que controla o tempo das sessões, e como criar
uma sessão nossa, e lá introduzir dados que queiramos estarem
acessíveis em uma ou várias páginas.
Este ficheiro vai chamar um outro (cpt4-2-3.asp) para que o leitor se
aperceba da maneira como foi possível criar uma sessão própria e
aceder à mesma, a partir de outras páginas.
CAPÍTULO 4: OBJECTOS 69
As imagens são bem elucidativas em relação ao uso de uma sessão criada pelo programador. Da mesma maneira que criada uma
sessão para suportar uma string, o leitor poderá usar para criar um
array ou número. As hipóteses são imensas, e a programação a
este nível é bastante facilitada com este objecto.
Outro objecto que é usado para tratar de variáveis globais é
Application, que é criado e acessível tal como se faz com as sessões, com a particularidade que para o alterarmos tem-se de seguir
certas regras.
A grande diferença entre Application e Session é que enquanto as
variáveis criadas pelo segundo são acedidas apenas pelo utilizador
do momento, ou por aquele a quem pertence um SessionID, as variáveis Application são acedidas por todos os utilizadores, todos os
SessionID. Fica assim um esquema para o leitor perceber melhor
como isto funciona.
Fig. 4.4 - Funcionamento das variáveis globais
Pelo esquema pode-se reparar que para cada utilizador existe uma
sessão independente, enquanto a variável de Application é igual para
todos.
Vemos então um exemplo de como criar e aceder a uma variável de
Application. Repare que existem dois métodos Lock e UnLock para
que a mesma possa ser alterada. Para aceder à mesma não é necessário usar as regras ditas anteriormente, e visíveis no exemplo
seguinte:
70 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt4-2-4.asp)
<%
Application.Lock
Application(“Teste2”) = “Uma variável acessível por todos os utilizadores...”
Application.UnLock
Response.Write “ Avariável Application(“”Teste2"”) é > “
Response.Write Application(“Teste2”) & “ <“
%>
Foram usados os seguintes objectos:
Application.Lock
serve para trancar a variável aos
utilizadores, de maneira a poder ser
alterada a variável;
Application(“Teste2”) da mesma maneira que se usa as
Sessions, pode-se criar uma
variável e aceder à mesma;
Application.UnLock usado para depois que é alterada a
variável, tirando o Lock.
Fig. 4.5 - Resultado do ficheiro cpt4-2-4.asp
CAPÍTULO 4: OBJECTOS 71
4.3 Interagir com o utilizador
Aquilo que realmente faz a diferença entre as páginas estáticas e as
páginas dinâmicas é a possibilidade de resposta aos utilizadores
em tempo real. Podem-se programar páginas que recebendo um
input de um utilizador, estas respondem de acordo com os dados
recolhidos, e isso não se pode fazer apenas com HMTL, e outros
recursos básicos.
Para se recolher dados do utilizador é necessário criar uma estrutura que permite o utilizador inseri-los, de maneira que o programador
possa trabalhar com os mesmos. Em primeiro lugar é criado um
formulário HTML, que tanto pode estar numa simples página HTML,
como numa página ASP. O utilizador pode ter uma página HTML
com o formulário que depois de submetido vai buscar um ficheiro
ASP, onde o programador pode recolher os dados e trabalhar sobre
eles. Ou então o programador numa mesma página ASP controla o
input que é feito, e conforme o estado em que o contexto se encontra, conforme a acção que é accionada. Mas com os ficheiros de
exemplo seguintes, o leitor vai perceber as diferenças.
(ficheiro cpt4-3-1.html)
<form action=”cpt4-3-1.asp” method=”POST”>
Nome: <input type=”text” name=”nome” size=”20"><br>
Idade: <input type=”text” name=”idade” size=”2" Maxlength=”2"><br>
Telefone: <input type=”text” name=”telefone” size=”12" Maxlength=”14"><br>
<input type=”submit” value=”Enviar”>
</form>
Foram usadas as seguintes Tags:
Application.Lock
serve para trancar a variável aos
utilizadores, de maneira a poder ser
alterada a variável;
Application(“Teste2”) da mesma maneira que se usa as
Sessions, pode-se criar uma
variável e aceder à mesma;
Application.UnLock usado para depois que é alterada a
variável, tirando o Lock.
CAPÍTULO 4: OBJECTOS 73
(ficheiro cpt4-3-2.asp)
<%Sub usar_dados()%>
O utilizador <strong><%=Request.Form(“nome”)%></strong>,
tem <strong><%=Request.Form(“idade”)%></strong> anos<br>
e está acessível pelo número de telefone
<strong><%=Request.Form(“telefone”)%></strong> !
<%End Sub%>
<%Sub formulario()%>
<form action=”cpt4-3-2.asp” method=”POST” id=form1 name=form1>
Nome: <input type=”text” name=”nome” size=”20"><br>
Idade: <input type=”text” name=”idade” size=”2" Maxlength=”2"><br>
Telefone: <input type=”text” name=”telefone” size=”12"
Maxlength=”14"><br>
<input type=”submit” value=”Enviar” name=”submeter”>
</form>
<%End Sub%>
<%
if Request.Form(“submeter”)=”” then
formulario
else
usar_dados
end if
%>
Usando um só ficheiro ASP simulamos os dois ficheiros anteriores,
num só, poupando ‘burocracia’ algorítmica.
Fig. 4.8 - Resultado inicial do ficheiro cpt4-3-2.asp
CAPÍTULO 4: OBJECTOS 75
- rendimento mensal entre 80.000$00 e 100.000$00 e média maior
que 13 valores;
- rendimento mensal entre 100.000$00 e 160.000$00 e média
maior que 16;
- média maior que 18;
- o aluno não pode ter menos de 10 anos e mais de 28.
Não vamos aprofundar muito com questões das quantidades envolvidas, mas vamos então pedir os dados necessários para que possamos dizer se tem hipótese ou não no caso de se candidatar. Além
de dizermos isso, vamos calcular a idade do aluno pela data de
nascimento. Desta forma o leitor perceberá mais alguns pontos de
desenvolvimento ASP a este nível e poderemos então criar um
pequeno curso online que demonstra muito genericamente uma das
grandes potencialidades da Internet, a formação online.
Continuando então, vamos criar o formulário com as perguntas, e
não esquecendo os nomes de cada Tag de input, nomes esses que
serão os identificadores no uso do objecto request.
Vamos por partes, neste caso vamos estudar a estrutura a desenvolver. Separemos por partes o que vai ser feito:
- Formulário de pedido de dados do aluno;
- Validação dos dados do aluno;
- Apresentação do resultado.
Estas 3 fases distintas podem ser feitas em 3 procedimentos diferentes. Criaremos um procedimento formulario(), dados_validar() e
resposta(). Ficamos assim com os 3 pontos definidos. Basta agora
criar o código que os vai colocar em produção.
Comecemos pelo formulário que vai pedir os dados ao utilizador:
76 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<%Sub formulario()%>
<p align=”center”><I><b>
<font size=”4" color=”#800000">Simulador de Bolsas de
Estudo</font></b></I>
<br>
<div align=”center”>
<center>
<FORM name=”bolsa” method=”POST”>
<table border=”0" width=”400" bgcolor=”#CED299"><tr>
<td width=”100%” align=”left”>
<strong>
<font size=”2" face=”ARIAL” color=”RED”>
<%=session(“erro”)%></font></strong>
<font face=”Arial”><b>Nome: </b></font>
<input type=”text” name=”nome” size=”44"
value=”<%=Request.Form(“nome”)%>” maxlength=”50">
<font face=”Arial”><b><br>Data de Nascimento:</b></font>
<input type=”text” name=”dia” size=”2" value=”<%=Request.Form(“dia”)%>”
maxlength=”2"><input type=”text” name=”mes” maxlength=”2"
value=”<%=Request.Form(“mes”)%>” size=”2">- 19
<input type=”text” name=”ano” size=”2" maxlength=”2"
value=”<%=Request.Form(“ano”)%>”><b>
<font face=”Arial”><br>Média do último ano:</font></b>
<input type=”text” name=”media” value=”<%=Request.Form(“media”)%>”
size=”2" maxlength=”2">valores<b>
<font face=”Arial”><br>Rendimento mensal dos pais:</font></b>
<input type=”text” name=”rendimento”
value=”<%=Request.Form(“rendimento”)%>” maxlength=”7" size=”7">$00
<p align=”center”><input type=”submit” value=”Simular”
name=”submeter”><br></p>
</td>
</tr></table>
</FORM>
</center>
</div>
<%End Sub%>
78 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Este código é introduzido antes de se usarem os procedimentos
pois queremos que as variáveis sejam dadas como variáveis públicas dentro deste ficheiro ASP. Desta forma, é mais fácil tratar os
dados e escusamos de estar sempre a usar o código Request.Form
(“…..”), bastando assim apenas o nome que atribuímos a cada um
dos argumentos que são passados. A variável Data fica com uma
formatação diferente, pois queremos construir uma data real, para
que no uso da função IsDate() disponhamos à partida de algo semelhante para validação.
<%Sub dados_validar()%>
<%
session(“erro”) = “”
‘ se não for data a variável de sessão fica com o erro correspondente
if not(IsDate(data)) then
session(“erro”) = “* A data está inválida...<br>”
else
if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then
session(“erro”) = “* A média é inválida...<br>”
else
if not(IsNumeric(rendimento)) then
session(“erro”) = “* O rendimento está inválido...<br>”
end if
end if
end if
if session(“erro”)<>”” then
formulario
else
resposta
end if
%>
<%End Sub%>
Como se viu foram validadas todas as variáveis que o formulário
apanhou do utilizador, e validadas conforme aquilo que se pretendia:
a data validada como data e o rendimento e média do aluno como
números, para que não sejam aceites letras ou outros caracteres
idênticos. E no final é chamado o formulario() ou o procedimento
resposta(), conforme o que se pretende. No caso de existir algum
erro nas variáveis que foram pedidas, o utilizador é enviado novamente para o formulário, que mantém os dados anteriores, visto que
os está sempre a apanhar com Request.Form(). Caso contrário, e
visto que está tudo certo, o utilizador recebe a resposta em relação
à sua simulação. Esta resposta é dada a partir do código que vemos
a seguir.
CAPÍTULO 4: OBJECTOS 79
<%Sub resposta()%>
<%session(“erro”) = “”%>
<div align=”center”>
<center>
<table border=”0" width=”400" bgcolor=”#CED299">
<tr><td width=”100%” align=”left”>
<%idade = DateDiff(“yyyy”, data, Now)
if (idade>10 and idade<28) then%>
<p align=”center”><b><font color=”#800000" face=”Arial” size=”3"><br>
O Aluno</font>
<font face=”Arial” size=”4" color=”#FF0000"><%=nome%></font>
<font color=”#800000" face=”Arial” size=”3"> ,&nbsp;<br>com a média de </font>
<font face=”Arial” size=”4" color=”#FF0000"><%=media%></font>
<font color=”#800000" face=”Arial” size=”3">valores<br>nascido em </font>
<font face=”Arial” size=”4" color=”#FF0000"><%=data%></font>
<font color=”#800000" face=”Arial” size=”3"><br></font>
<font face=”Arial” size=”4" color=”#FF0000">
<% if ((rendimento<=80000)AND(media>11)) then
mensagem = “ tem “
else
if ((rendimento>80000 AND rendimento<100000) AND
(media>13)) then
mensagem = “ tem “
else
if ((rendimento>=100000 AND rendimento<160000) AND
(media>16)) then
mensagem = “ tem “
else
if (media>18) then
mensagem = “ tem “
else
mensagem = “ não tem “
end if
end if
end if
end if
Response.Write mensagem%>
</font>
<font color=”#800000" face=”Arial” size=”3">direito<br>à bolsa de
estudo.<br></font></b></p><br>
<%
else%>
<br><center><strong><font face=’ARIAL’ color=’red’ size=’3'>
Não é possivel concorrer à bolsa de estudo<br> com <%=idade%>
anos.</font></strong></center><br>
<%end if%>
</td></tr></table>
<br><br><a href=”cpt4-3-3.asp”>repetir a simulação</a>
</center>
</div>
<%End Sub%>
CAPÍTULO 4: OBJECTOS 81
Como podemos ver na imagem anterior, a resposta que se obteve
foi negativa, depois de se terem efectuadas as comparações com
os requisitos definidos para a atribuição de bolsa ao estudante.
Teve-se o cuidado de se criar uma tabela com um texto de resposta
por defeito, que só altera as zonas que são correspondentes aos
dados que o utilizador introduziu. Neste caso é usado o DateDiff (),
para que os alunos com uma idade não válida para as bolsas sejam
avisados disso. No caso contrário é enviada a resposta em relação
ao apoio por Bolsa de Estudo.
Introduziu-se um link para o caso do utilizador querer recomeçar a
simulação. Será aqui que tudo recomeçará, tendo em conta que a
variável de sessão tem de estar vazia, ou o último erro continuaria a
aparecer apesar de ser uma nova simulação. Por isso esta função
começa com a sessão de erro a ser limpa, pois para se ter chegado
a este ponto era porque as variáveis estavam correctas.
Depois desta explicação, podemos ver o código por completo, para
percebermos melhor o seu funcionamento.
(ficheiro cpt4-3-3.asp)
<%Sub resposta()%>
<%session(“erro”) = “”%>
<div align=”center”>
<center>
<table border=”0" width=”400" bgcolor=”#CED299">
<tr><td width=”100%” align=”left”>
<%idade = DateDiff(“yyyy”, data, Now)
if (idade>10 and idade<28) then%>
<p align=”center”><b><font color=”#800000" face=”Arial” size=”3"><br>
O Aluno</font>
<font face=”Arial” size=”4" color=”#FF0000"><%=nome%></font>
<font color=”#800000" face=”Arial” size=”3"> ,&nbsp;<br>com a média de </font>
<font face=”Arial” size=”4" color=”#FF0000"><%=media%></font>
<font color=”#800000" face=”Arial” size=”3">valores<br>nascido em </font>
<font face=”Arial” size=”4" color=”#FF0000"><%=data%></font>
<font color=”#800000" face=”Arial” size=”3"><br></font>
<font face=”Arial” size=”4" color=”#FF0000">
<% if ((rendimento<=80000)AND(media>11)) then
mensagem = “ tem “
else
if ((rendimento>80000 AND
82 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
rendimento<100000)AND(media>13)) then
mensagem = “ tem “
else
if ((rendimento>=100000 AND
rendimento<160000)AND(media>16)) then
mensagem = “ tem “
else
if (media>18) then
mensagem = “ tem “
else
mensagem = “ não tem “
end if
end if
end if
end if
Response.Write mensagem%>
</font>
<font color=”#800000" face=”Arial” size=”3">direito<br>à bolsa de
estudo.<br></font></b></p><br>
<%
else%>
<br><center><strong><font face=’ARIAL’ color=’red’ size=’3'>
Não é possível concorrer à bolsa de estudo<br> com <%=idade%>
anos.</font></strong></center><br>
<%end if%>
</td></tr></table>
<br><br><a href=”cpt4-3-3.asp”>repetir a simulação</a>
</center>
</div>
<%End Sub%>
<%Sub dados_validar()%>
<%
session(“erro”) = “”
if not(IsDate(data)) then
session(“erro”) = “* A data está inválida...<br>”
else
if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then
session(“erro”) = “* A média é inválida...<br>”
else
if not(IsNumeric(rendimento)) then
session(“erro”) = “* O rendimento está inválido...<br>”
end if
end if
end if
CAPÍTULO 4: OBJECTOS 83
if session(“erro”)<>”” then
formulario
else
resposta
end if
%>
<%End Sub%>
<%Sub formulario()%>
<p align=”center”><i><b><font size=”4" color=”#800000">Simulador de
Bolsas de Estudo</font></b></i>
<br>
<div align=”center”>
<center>
<FORM name=”bolsa” method=”POST”>
<table border=”0" width=”400" bgcolor=”#CED299"><tr>
<td width=”100%” align=”left”>
<strong><font size=”2" face=”ARIAL” color=”RED”><%=session(“erro”)%>
</font></strong>
<font face=”Arial”><b>Nome: </b></font>
<input type=”text” name=”nome” size=”44"
value=”<%=Request.Form(“nome”)%>” maxlength=”50">
<font face=”Arial”><b><br>Data de Nascimento:</b></font>
<input type=”text” name=”dia” size=”2" value=”<%=Request.Form(“dia”)%>”
maxlength=”2"><input type=”text” name=”mes” maxlength=”2"
value=”<%=Request.Form(“mes”)%>” size=”2">- 19
<input type=”text” name=”ano” size=”2" maxlength=”2"
value=”<%=Request.Form(“ano”)%>”><b>
<font face=”Arial”><br>Média do último ano:</font></b>
<input type=”text” name=”media” value=”<%=Request.Form(“media”)%>”
size=”2" maxlength=”2">valores<b>
<font face=”Arial”><br>Rendimento mensal dos pais:</font></b>
<input type=”text” name=”rendimento”
value=”<%=Request.Form(“rendimento”)%>” maxlength=”7" size=”7">$00
<p align=”center”><input type=”submit” value=”Simular”
name=”submeter”><br></p>
</td>
</tr></table>
</FORM>
</center>
</div>
<%End Sub%>
84 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<%
nome = Request.Form(“nome”)
data = Request.Form(“dia”) & “-” & Request.Form(“mes”) & “-19” &
Request.Form(“ano”)
media = Request.Form(“media”)
rendimento = Request.Form(“rendimento”)
if (Request.Form(“submeter”)=””) then
formulario
else
dados_validar
end if
%>
Foram usados os seguintes objectos e funções:
Session ()
usado neste caso para que tenhamos uma
variável que guarde o tipo de erro que foi
achado nos dados introduzidos pelo
utilizador;
DateDiff ()
DateDiff (), assim como está explicado na
tabela de funções, serve para devolver uma
diferença entre duas datas, tanto em dias,
anos, minutos, …. Neste caso usamos para
devolver os anos entre o dia de hoje, e a data
de nascimento introduzida pelo utilizador.
Esta variável é depois usada para sabermos
se o mesmo reúne condições para poder
receber resposta da aplicação;
IsDate ()
O IsDate, devolve True ou False, conforme
a data indicada seja ou não uma data válida;
IsNumeric () Como o IsDate, este também é booleano, e
indica se a variável é numérica ou não;
Request.Form () Esta é a maneira de o programa aceder aos
dados submetidos pelo último formulário.
No seguinte exemplo é criado um curso online, bastante simples,
de resposta múltipla. Este exemplo é importante, pois, caso o leitor
o compreenda terá uma boa noção das potencialidades das variáveis de sessão, e passagem de parâmetros entre vários procedimentos.
Necessitamos claro, de perguntas, respectivas respostas, validação das respostas, e uma apresentação do resultado depois do teste.
CAPÍTULO 4: OBJECTOS 85
Definimos então alguns procedimentos:
- Procedimentos de perguntas (onde teremos um formulário de pergunta e respostas, que neste exemplo são 5, devido a serem 5 perguntas);
- Um procedimento, para enviar o total do teste, e respectiva mensagem de aprovação ou reprovação.
Todos os procedimentos de perguntas terão então o aspecto do código da seguinte tabela, mas com a diferença de que cada um tem
as suas perguntas e respostas, parte essa que terá de ser alterada.
<%Sub Pergunta1()%>
<%session(“npergunta”)=1%>
<div align=”center”>
<center>
<table border=”0" width=”500" bgcolor=”#B8CFCF”>
<tr>
<td width=”100%”><b><font face=”Arial”>Pergunta &gt; <i>1 / 5<br>
<br>
</i></font></b>
<FORM name=”pergunta1" action=”cpt4-3-4.asp” method=”POST”>
<p>
<font face=”Arial”>Qual o código para escrever no browser?</font></p>
<div align=”center”>
<center>
<table border=”0" width=”300">
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta1"
name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Request.Write ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta2"
name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Session(“escrever”)</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta3"
name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Response.Write ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Não sei</font></td>
</tr>
86 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
</table>
</center>
</div>
<p align=”center”><input type=”submit” value=”Responder”
name=”submeter”></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
Podemos ver por este exemplo que o código usado é praticamente
HTML puro, com a excepção do uso de uma variável de sessão que
serve para podermos controlar em que pergunta vai o teste, de maneira que o utilizador seja enviado para a pergunta seguinte, e no
final para o resultado do teste.
Fig. 4.13 - Pergunta do ficheiro cpt4-3-4.asp
Como se pode ver este é um teste de ASP. O leitor pode fazer testes
de tudo o que quiser, e com o uso de bases de dados (a ver em
próximo capítulo), pode criar vários tipos de testes usando apenas
um procedimento para todos eles.
Será então num outro procedimento, depois de todas as perguntas
terem sido respondidas, que todas as variáveis serão limpas, de
maneira a que se possa responder a um novo teste, ou tentar nova
sorte. Nesta fase, será feita uma validação de todas as respostas e
incrementada uma variável com o total de valores do teste - alterada
consoante a qualidade das respostas dadas.
CAPÍTULO 4: OBJECTOS 87
<%Sub total_respostas ( )%>
<%session(“pergunta5”) = Request.Form(“pergunta5”)
total = 0
if session(“pergunta1”) = “resposta3” then total = total + 4
if session(“pergunta2”) = “resposta2” then total = total + 6
if session(“pergunta3”) = “resposta3” then total = total + 3
if session(“pergunta4”) = “resposta1” then total = total + 2
if session(“pergunta5”) = “resposta3” then total = total + 5
Response.Write “<center><strong>Teve “ & total & “ valores neste
teste...<strong><br><br>”
if total < 10 then
Response.Write “<strong><font size=’4' color=’RED’>REPROVADO
</font></strong>”
Else
if (total > 10 AND total <= 11) then
Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO à
tangente...</font></strong>”
Else
if (total >= 12 AND total < 17) then
Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO
</font></strong>”
Else
if (total >= 18 AND total<=20) then
Response.Write”<strong><font size=’4' color=’BLUE’>APROVADO
com distinção!</font></strong>”
end if
end if
end if
end if
%>
Como se pode observar, todas as variáveis de sessão devolvem as
respostas, que conforme estejam certas ou não irão ser
determinantes no desenvolvimento da variável local total, para a nota
final do teste online.
Observando todo o código, teremos então uma noção mais real daquilo que se pretende, pois com as primeiras linhas de código se
pode perceber como todos os procedimentos são geridos.
Fig. 4.14
88 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt4-3-4.asp)
<%Sub Pergunta1()%>
<%session(“npergunta”)=1%>
<div align=”center”>
<center>
<table border=”0" width=”500" bgcolor=”#B8CFCF”>
<tr>
<td width=”100%”><b><font face=”Arial”>Pergunta &gt; <i>1 / 5<br>
<br>
</i></font></b>
<FORM name=”pergunta1" action=”cpt4-3-4.asp” method=”POST”>
<p>
<font face=”Arial”>Qual o código para escrever no browser?</font></p>
<div align=”center”>
<center>
<table border=”0" width=”300">
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta1"
name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Request.Write ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta2"
name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Session(“escrever”)</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta3"
name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Response.Write ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta1"></td>
<td width=”93%”><font face=”Arial”>Não sei</font></td>
</tr>
</table>
</center>
</div>
<p align=”center”><input type=”submit” value=”Responder”
name=”submeter”></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
CAPÍTULO 4: OBJECTOS 89
<%Sub Pergunta2()%>
<%session(“pergunta1”) = Request.Form(“pergunta1”)
session(“npergunta”)=2%>
<div align=”center”>
<center>
<table border=”0" width=”500" bgcolor=”#B8CFCF”>
<tr>
<td width=”100%”><b><font face=”Arial”>Pergunta &gt; <i>2 / 5<br>
<br>
</i></font></b>
<FORM name=”pergunta2" action=”cpt4-3-4.asp” method=”POST”>
<p>
<font face=”Arial”>Como se cria uma variável global, acessível
por<br>todos os utilizadores?</font></p>
<div align=”center”>
<center>
<table border=”0" width=”300">
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta1"
name=”pergunta2"></td>
<td width=”93%”><font face=”Arial”>Session ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta2"
name=”pergunta2"></td>
<td width=”93%”><font face=”Arial”>Application ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta3"
name=”pergunta2"></td>
<td width=”93%”><font face=”Arial”>x = 1</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta2"></td>
<td width=”93%”><font face=”Arial”>Não sei</font></td>
</tr>
</table>
</center>
</div>
<p align=”center”><input type=”submit” value=”Responder”
name=”submeter”></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
90 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<%Sub Pergunta3()%>
<%session(“pergunta2”) = Request.Form(“pergunta2”)
session(“npergunta”)=3%>
<div align=”center”>
<center>
<table border=”0" width=”500" bgcolor=”#B8CFCF”>
<tr>
<td width=”100%”><b><font face=”Arial”>Pergunta &gt; <i>3 / 5<br>
<br>
</i></font></b>
<FORM name=”pergunta3" action=”cpt4-3-4.asp” method=”POST”>
<p>
<font face=”Arial”>Qual o servidor Internet para as ASP que é
<br>usado no Windows NT?</font></p>
<div align=”center”>
<center>
<table border=”0" width=”300">
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta1"
name=”pergunta3"></td>
<td width=”93%”><font face=”Arial”>Personal Wide Server</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta2"
name=”pergunta3"></td>
<td width=”93%”><font face=”Arial”>Apache</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta3"
name=”pergunta3"></td>
<td width=”93%”><font face=”Arial”>Internet Information Server</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta3"></td>
<td width=”93%”><font face=”Arial”>Não sei</font></td>
</tr>
</table>
</center>
</div>
<p align=”center”><input type=”submit” value=”Responder”
name=”submeter”></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
CAPÍTULO 4: OBJECTOS 91
<%Sub Pergunta4()%>
<%session(“pergunta3”) = Request.Form(“pergunta3”)
session(“npergunta”)=4%>
<div align=”center”>
<center>
<table border=”0" width=”500" bgcolor=”#B8CFCF”>
<tr>
<td width=”100%”><b><font face=”Arial”>Pergunta &gt; <i>4 / 5<br>
<br>
</i></font></b>
<FORM name=”pergunta4" action=”cpt4-3-4.asp” method=”POST”>
<p>
<font face=”Arial”>Qual a função que devolve uma diferença entre
duas datas?</font></p>
<div align=”center”>
<center>
<table border=”0" width=”300">
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta1"
name=”pergunta4"></td>
<td width=”93%”><font face=”Arial”>DateDiff ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta2"
name=”pergunta4"></td>
<td width=”93%”><font face=”Arial”>IsDate ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta3"
name=”pergunta4"></td>
<td width=”93%”><font face=”Arial”>Date ()</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta4"></td>
<td width=”93%”><font face=”Arial”>Não sei</font></td>
</tr>
</table>
</center>
</div>
<p align=”center”><input type=”submit” value=”Responder”
name=”submeter”></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
92 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<%Sub Pergunta5()%>
<%session(“pergunta4”) = Request.Form(“pergunta4”)
session(“npergunta”)=5%>
<div align=”center”>
<center>
<table border=”0" width=”500" bgcolor=”#B8CFCF”>
<tr>
<td width=”100%”><b><font face=”Arial”>Pergunta &gt; <i>5 / 5<br>
<br>
</i></font></b>
<FORM name=”pergunta5" action=”cpt4-3-4.asp” method=”POST”>
<p>
<font face=”Arial”>Como chama em ASP um procedimento chamado ‘
procedimento1’?</font></p>
<div align=”center”>
<center>
<table border=”0" width=”300">
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta1"
name=”pergunta5"></td>
<td width=”93%”><font face=”Arial”>get procedimento1</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta2"
name=”pergunta5"></td>
<td width=”93%”><font face=”Arial”>run procedimento1</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta3"
name=”pergunta5"></td>
<td width=”93%”><font face=”Arial”>procedimento1</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta5"></td>
<td width=”93%”><font face=”Arial”>Não sei</font></td>
</tr>
</table>
</center>
</div>
<p align=”center”><input type=”submit” value=”Responder”
name=”submeter”></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
CAPÍTULO 4: OBJECTOS 93
<%Sub total_respostas()%>
<%session(“pergunta5”) = Request.Form(“pergunta5”)
total = 0
if session(“pergunta1”) = “resposta3” then total = total + 4
if session(“pergunta2”) = “resposta2” then total = total + 6
if session(“pergunta3”) = “resposta3” then total = total + 3
if session(“pergunta4”) = “resposta1” then total = total + 2
if session(“pergunta5”) = “resposta3” then total = total + 5
Response.Write “<center><strong>Teve “ & total & “ valores neste
teste...<strong><br><br>”
if total < 10 then
Response.Write “<strong><font size=’4' color=’RED’>REPROVADO</
font></strong>”
Else
if (total > 10 AND total <= 11) then
Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO à
tangente...</font></strong>”
Else
if (total >= 12 AND total < 17) then
Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO
</font></strong>”
Else
if (total >= 18 AND total<=20) then
Response.Write”<strong><font size=’4' color=’BLUE’>APROVADO
com distinção!</font></strong>”
end if
end if
end if
end if
%>
<br><br><center><a href=”cpt4-3-4.asp”>recomeçar</a></center>
<%session(“pergunta1”) = “”
session(“pergunta2”) = “”
session(“pergunta3”) = “”
session(“pergunta4”) = “”
session(“pergunta5”) = “”
session(“npergunta”) = 0%>
<%End Sub%>
<%
Select case session(“npergunta”)
case 1 Pergunta2
case 2 Pergunta3
case 3 Pergunta4
case 4 Pergunta5
case 5 total_respostas
case else Pergunta1
end select
%>
94 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Foram usados os seguintes objectos e funções:
Session ()
muito usado neste exemplo, este objecto
tem tanto o número da última pergunta, para
que possamos direccionar o utilizador para
a pergunta seguinte, como as respostas das
respectivas perguntas;
Request.Form () Tal como noutros exemplos, recebe os
valores que foram enviados por formulário.
Para acabar esta parte do capítulo, vamos ver como podemos proteger as nossas páginas ASP, de maneira a só serem acedidas depois de introdução de login e password, e controlando o tempo que
estes têm de activação. Parece algo que requer alguma programação mais avançada, mas será o exemplo onde terá de ser escrito
um mínimo de código de programação. Tudo o que o leitor tem de
criar é um ficheiro, formulário onde o utilizador irá introduzir o login e
a password, a mensagem de erro, e o envio para a página principal
do site protegido, que por sua vez, só pode ser acedido depois do
login e password serem validados.
Vamos então dividir o ficheiro de entrada e validação de dados em 3
partes: a primeira parte será aquela em que serão pedidos os dados
por intermédio de um formulário, a segunda parte será a zona onde
aparecerá uma mensagem de erro, no caso de os dados estarem
errados, e a terceira a zona onde se controla qual dos procedimentos
é executado.
Vamos então ter de receber dados, que vamos introduzir em variáveis de sessão, de maneira a que possamos ter os dados activos
durante o tempo que definirmos em Session.TimeOut Quando
reiniciamos a página e esses dados estiverem incorrectos, enviamos o utilizador para uma mensagem de erro, caso contrário, será
encaminhado para a primeira página protegida. As páginas protegidas deverão então ter apenas 3 linhas de código, de maneira a compararmos o login e password que estão em variáveis de sessão.
(ficheiro cpt4-3-5.asp)
<%Sub formulario%>
<FORM action=”cpt4-3-5.asp?todo=in” method=”POST”>
<div align=”center”>
<center>
<table border=”1" width=”250" bgcolor=”#FFCCFF”>
<tr>
<td width=”100%”>
<center><font size=”4">Controlo de Acessos</font></center>
</center>
<div align=”center”>
CAPÍTULO 4: OBJECTOS 95
<table border=”0" width=”96%”>
<tr>
<td width=”50%”>
<p align=”right”><font face=”Arial”>Login:</font></td>
<center><center>
<td width=”50%”><input type=”text” name=”login” size=”8"></td>
</tr>
</center></center>
<tr>
<td width=”50%”>
<p align=”right”><font face=”Arial”>Password:</font></td>
<center><center>
<td width=”50%”><input type=”password” name=”password”
size=”8"></td>
</tr>
</table><br><input type=”submit” name=”submete”
value=”Submeter”><br>
</center>
</div>
</td>
</tr>
</table>
</center>
</div>
</FORM>
<%End Sub%>
<%Sub erro%>
<center><br><br><br>
<font face=”ARIAL” color=”RED” size=”6">ERRO, login e password errados...</font>
<br><br><a href=”cpt4-3-5.asp”>tente de novo</a></center>
<%End Sub%>
<%
session.Timeout = 4 ‘ o tempo que as sessões vão estar activas
session(“login”) = Request.Form(“login”) ‘ vamos buscar os últimos dados de login
session(“password”) = Request.Form(“password”) ‘ e de password
if Request.Querystring(“todo”) = “” then ‘ se o argumento estiver todo limpo
vamos ao formulário
formulario
else ‘ senão vamos ver o que têm as sessões no momento
if ((session(“login”)<>”xpto” and session(“password”)<>”123") AND
Request.Querystring(“todo”)=”in”) then
erro ‘ neste caso o login e password não são validados
else
Response.Redirect(“cpt4-3-5test.asp”) ‘aqui o utilizador é
validado positivamente
end if
end if
%>
96 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Foram usados os seguintes objectos e funções:
Session ()
terá as variáveis que simbolizam o login e
password. Estas serão comparadas no
início de cada página protegida, de maneira
a assegurar se o utilizador está validado ou
não;
Session.Timeout () neste exemplo este método é usado
para definirmos o tempo em que as sessões
estão activas, ou seja, os minutos em que
as sessões estão activas, depois da
inactividade ocorrente no site.
Agora que vimos o código que recebe e valida a entrada de um
utilizador vamos ver uma normal página ASP, que está protegida, a
qual só é possível ao utilizador aceder, se validada a sua entrada no
formulário. No início de todas as páginas ASP que queremos protegidas, fazemos uma comparação das variáveis de sessão de maneira a sabermos se estas são válidas ou não.
(ficheiro cpt4-3-5test.asp)
<%if ( session ( “login” ) <> “xpto” and session( “password” )<> “123” ) then
Response.Redirect(“cpt4-3-5erro.asp”)
end if%>
<center><br><br><br>
<font face=”ARIAL” color=”BLUE” size=”6">Bem vindo a esta página...</font>
</center>
Como ficou demonstrado, é simples a maneira de se poder proteger
páginas de um site. Além deste caso, o utilizador pode fazer uma
conexão a uma base de dados, e usar apenas uma variável de sessão que diz sim ou não, conforme seja validada ou não depois de
inquirida a base de dados.
4.4 Ficheiro Global.asa
Muitos programadores de ASP têm um certo receio de mexer neste
ficheiro, ou até mesmo de programar usando o mesmo. Não há que
ter receio em mexer neste ficheiro, que acima de tudo é uma
tecnologia importante para certas soluções online, e que é uma das
armas das ASP em relação a outras linguagens semelhantes. Quando entramos num site em servidor IIS existem 4 fases distintas que
vou identificar de maneira a poder continuar com o meu raciocínio:
CAPÍTULO 4: OBJECTOS 97
1. o primeiro utilizador entra e o servidor fica alerta;
2. o utilizador começa uma nova sessão, e essas sessões
que ele cria são as que utilizamos para variáveis globais, e
para definir o tempo de acção das mesmas.
3. o utilizador sai do site e a sua sessão acaba;
4. o último utilizador do site sai e o servidor Internet deixa
de estar alerta.
Depois de vistas estas 4 fases, posso agora demonstrar esta explicação do ponto de vista prático.
O ficheiro Global.Asa, é algo como que o controlador dos acessos
ao site que o programador criou, ou estiver a desenvolver. Este ficheiro tem apenas 4 funções distintas: a primeira é aquela que é
activada quando o site fica activo; a segunda é activada por cada
vez que entra um utilizador; a terceira é activada por cada vez que
sai um utilizador do site, e a quarta é activada quando o site deixa de
ter utilizadores. Desta maneira, podemos criar código dentro de cada
uma destas zonas para nosso benefício. Por exemplo, o leitor quer
que seja introduzido num ficheiro de texto o endereço IP de cada
utilizador que entra no site. Basta escrever dentro da segunda função
do ficheiro Global.Asa o código que cria essa linha no ficheiro de
controlo, para ter a certeza que cada acesso é registado. Ou se
quisermos saber quanto tempo cada utilizador passa em média no
site, basta criarmos um registo de tempo de entrada na segunda
função, e um na terceira função, e mais tarde fazermos DateDiff()
para sabermos a média que cada utilizador gasta no nosso site.
O esquema de um ficheiro Global.Asa é o seguinte:
<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
Sub Application_OnStart
End Sub
Sub Session_OnStart
End Sub
Sub Session_OnEnd
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>
CAPÍTULO 4: OBJECTOS 99
Agora para testarmos a potencialidade deste ficheiro vamos saber
quantos utilizadores estão neste momento no nosso site. Para isso
basta criarmos uma variável que se incrementa no procedimento
Session_OnStart(), e que se decrementa no Session_OnEnd(). Desta
maneira se estiverem 4 utilizadores ao mesmo tempo no site a variável será 4. Se um deles sair passará a ser 3 pois houve uma sessão que acabou. Da mesma maneira, por cada utilizador que entre
no site essa mesma variável irá ser incrementada. Passando da
teoria à prática vamos então editar o nosso ficheiro Global.Asa, que
suportará o controlo dos acessos ao site.
(ficheiro global.asa)
<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
Sub Application_OnStart
Session.Timeout = 3
Application.Lock
Application(“utilizadores”) = 0
Application.UnLock
End Sub
Sub Session_OnStart
Application.Lock
Application(“utilizadores”) = Application(“utilizadores”) + 1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application(“utilizadores”) = Application(“utilizadores”) - 1
Application.UnLock
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>
Foram usados os seguintes objectos e funções:
Session.Timeout ()
onde se define o tempo que vai
durar cada sessão. Se o utilizador
ficar inactivo durante um certo
período de tempo (em minutos), a
função Session.OnEnd() activa-se e
processa uma saída do site. Aqui va–
mos definir esse tempo em minutos;
100 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Application.Lock ()
é o método usado para trancar a
variável, de maneira que possa ser
alterada sem intervenções externas.
Um meio de protecção dos dados
que estão lá incluídos;
Application (“utilizadores”)
desta maneira obtemos uma
variável global, onde todos os
utilizadores têm acesso, de maneira
que todos podem aceder aos dados
relativos ao número de utilizadores
do site em questão;
Application.UnLock () neste método destranca-se a
variável depois da mesma ter sido
alterada.
Depois de termos este ficheiro no local certo e com o código acima
descrito, está na hora de acedermos à variável de maneira a sabermos quantos utilizadores estão online. Para isso basta apenas uma
linha de código ASP, dentro do HTML que o leitor achar apropriado
para a apresentação deste valor.
(ficheiro cpt4-3-6.asp)
<font face=”ARIAL” size=”3">Existem neste momento</font>
<font face=”ARIAL” color=”red”
size=”5"><%=Application(“utilizadores”)%></font>
<font face=”ARIAL” size=”3"> utilizadores...</font><br>
Foram usados os seguintes objectos e funções:
Application () aqui usado para podermos escrever
no browser o número de utilizadores que
estão a navegar no nosso site.
Fig. 4.17 - Imagem do ficheiro cpt4-3-6.asp
CAPÍTULO 4: OBJECTOS 101
Como podemos ver nesta imagem, existem 4 utilizadores no site. O
leitor pode obter este valor abrindo várias janelas no browser e entrar
neste mesmo site virtual.
Esta é uma das formas de usar o global.asa para nosso benefício.
Outra maneira é tentar criar um chat para os utilizadores do site. O
truque está em criarmos várias variáveis do tipo Application() e ir
actualizando cada uma delas conforme a introdução de informação
por parte dos utilizadores. Ao entrar uma nova linha de texto actualizam-se as variáveis, igualando a mais recente à imediatamente anterior e assim consecutivamente. O ficheiro global.asa vai entrar aqui
novamente - será onde as variáveis vão ser inicializadas.
Neste exemplo teremos três ficheiros: um para controlar os frames,
pois para este exemplo teremos de usar dois ficheiros em simultâneo, outro onde se mostram as frases, com um auto-refresh de 8
segundos, e outro ainda para o formulário de introdução de mensagens.
(ficheiro cpt4-3-7.html)
<HTML>
<HEAD><TITLE>Chat</TITLE></HEAD>
<frameset FRAMEBORDER=”0" BORDER=”false” framespacing=”0"
rows=”90,60">
<FRAME SRC=”cpt4-3-7top.asp” SCROLLING=”no”>
<FRAME SRC=”cpt4-3-7.asp” SCROLLING=”no”>
</FRAMESET>
</HTML>
Os frames são uma técnica para se conseguir no mesmo ecrã
visualizar várias páginas em simultâneo. Usam-se muito em sites
muito complexos, e quando se pretende dar uma sensação de televisão com vários botões para mudar de canal (neste caso para mudar
de local no site).
Nos frames, primeiro criamos a linha que define a espessura das
margens que separam as páginas, assim como os espaços, e tamanho de apresentação de cada uma das páginas.
<frameset FRAMEBORDER=”0" BORDER=”false” framespacing=”0"
rows=”90,60">
Vamos então configurar cada uma das páginas que vão ser criadas
para colocar o chat em funcionamento dentro do esquema de frames.
<FRAME SRC=”cpt4-3-7top.asp” SCROLLING=”no”>
<FRAME SRC=”cpt4-3-7.asp” SCROLLING=”no”>
102 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
E acabamos por finalizar o código HTML para a criação das frames.
A partir daqui vamos criar os ficheiros ASP que vão trabalhar com
as variáveis que guardam os textos do chat. O primeiro será aquele
que introduz a informação introduzida pelo utilizador para as variáveis globais, que vão aparecer em todas as diferentes sessões, permitindo que todos os utilizadores vejam o que todos introduzem no
chat.
(ficheiro cpt4-3-7.asp)
<body bgcolor=”BLACK”>
<%
If not Request.Form(“mensagem”)=”” THEN
APPLICATION.LOCK
Application(“linha18”) = Application(“linha17”)
Application(“linha17”) = Application(“linha16”)
Application(“linha16”) = Application(“linha15”)
Application(“linha15”) = Application(“linha14”)
Application(“linha14”) = Application(“linha13”)
Application(“linha13”) = Application(“linha12”)
Application(“linha12”) = Application(“linha11”)
Application(“linha11”) = Application(“linha10”)
Application(“linha10”) = Application(“linha9”)
Application(“linha9”) = Application(“linha8”)
Application(“linha8”) = Application(“linha7”)
Application(“linha7”) = Application(“linha6”)
Application(“linha6”) = Application(“linha5”)
Application(“linha5”) = Application(“linha4”)
Application(“linha4”) = Application(“linha3”)
Application(“linha3”) = Application(“linha2”)
Application(“linha2”) = Application(“linha1”)
Application(“linha1”) = “<B>” & Request.Form(“nick”) & “:</B> “ &
Request.Form(“mensagem”)
APPLICATION.UNLOCK
END IF
%>
<FORM NAME=”chat” ACTION=”cpt4-3-7.asp” METHOD=”post” >
<font size=”3" color=”white”>Nick: </font>
<INPUT NAME=”nick” SIZE=10 maxlength=”14"
value=”<%=Request.Form(“Nick”)%>”><br>
<font size=”3" color=”white”>Mensagem: </font>
<INPUT NAME=”mensagem” SIZE=30 maxlength=”72"><br>
<INPUT TYPE=”submit” value=”Introduzir”>
</FORM>
</body>
CAPÍTULO 4: OBJECTOS 103
Foram usados os seguintes objectos e funções:
Application (“ linha…n…”)
variáveis que guardam todas
as mensagens que vão sendo
deixadas. Cada vez que uma nova é
introduzida, todas se vão igualando
de maneira a andar uma casa para
cima.
Precisamos agora de um ficheiro que mostra os dados no ecrã
(browser). Será então o próximo ficheiro que vai tratar dessa função,
de reparar na Meta Tag usada (pelo HTML), para refrescar a página
por cada número de segundos escolhido pelo programador (neste
caso, 8 segundos).
(ficheiro cpt4-3-7top.asp)
<HTML>
<HEAD>
<META HTTP-EQUIV=”REFRESH” CONTENT=”8;cpt4-3-7top.asp”>
</HEAD>
<%=Application(“linha18”)%><BR>
<%=Application(“linha17”)%><BR>
<%=Application(“linha16”)%><BR>
<%=Application(“linha15”)%><BR>
<%=Application(“linha14”)%><BR>
<%=Application(“linha13”)%><BR>
<%=Application(“linha12”)%><BR>
<%=Application(“linha11”)%><BR>
<%=Application(“linha10”)%><BR>
<%=Application(“linha9”)%><BR>
<%=Application(“linha8”)%><BR>
<%=Application(“linha7”)%><BR>
<%=Application(“linha6”)%><BR>
<%=Application(“linha5”)%><BR>
<%=Application(“linha4”)%><BR>
<%=Application(“linha3”)%><BR>
<%=Application(“linha2”)%><BR>
<%=Application(“linha1”)%><BR>
</HTML>
O resultado é aquele que podemos ver na seguinte imagem. A introdução no formulário do anterior Nick usado serve para facilitar a
utilização pois o utilizador, em princípio, estará sempre a usar o
mesmo Nick.
CAPÍTULO 4: OBJECTOS 105
tador que está a suportar a página, podendo o webmaster de um site
criar uma página protegida para conhecer os dados da sua máquina. Estas informações são dadas como variáveis especiais do servidor, e para acedermos a elas usamos o objecto ServerVariables().
Necessitamos então de saber que tipo de variáveis de servidor
existem para podermos tirar partido das mesmas. Para obtermos
todas as que podemos obter basta corrermos o seguinte código ASP.
(ficheiro cpt4-3-8.asp)
<TABLE border=”1" bordercolor=”black” cellspacing=”0">
<TR><TD><B>Variáveis</B></TD>
<TD><B>Conteudo</B></TD></TR>
<%For Each nome In Request.ServerVariables%>
<TR><TD><%=nome%></TD>
<TD><%=Request.ServerVariables(nome)%>
</TD></TR>
<%Next %>
</TABLE>
Foram usados os seguintes objectos e funções:
For Each / Next ()
Request.ServerVariables ()
Usamos esta expressão para
percorrermos todos os eventos
possíveis com o objecto
ServerVariables;
devolve o conteúdo da informação
que pretendemos tanto do servidor
como do cliente.
Podemos pedir uma informação por
Request.ServerVariables(“HTTP_COOKIE”)
ou Request.ServerVariables(13).
Fig.4.19 - Resultado parcial do ficheiro cpt4-3-8.asp
106 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Este tipo de variáveis vão permitir ultrapassar muitas lacunas a nível
de programação de páginas dinâmicas. Da mesma maneira que
nos servimos destas variáveis para usarmos as potencialidades do
JavaScript, usamos também o método Cookies para podermos usar
os mesmos em ASP.
As variáveis de sessão resolvem muitos problemas na programação, mas o uso de cookies nunca deixa de ser uma realidade. Eles
são muito usados para adaptação de sites conforme o tipo de
utilizador. Os cookies são ficheiros criados no lado do utilizador para
guardarem variáveis que o programa necessite de ter de cada máquina que visite o site. Vamos ver como as cookies funcionam, de
uma maneira que o leitor poderá ficar com muitas ideias em relação
a soluções válidas para os sites que vai criar. Temos o exemplo de
alguns sites portugueses que dão a hipótese ao utilizador de configurar os dados que aparecem na página inicial. Isto não seria possível
sem o recurso a cookies, e o exemplo que vou demonstrar vai ser
usado para algo parecido. Pretende-se uma página onde o utilizador
configura alguns aspectos da mesma, e por cada vez que a for visitar essa configuração pessoal está activa. Isto tudo porque um ficheiro foi criado no computador do utilizador, com variáveis lá incorporadas criadas pela ASP, aquando das configurações do próprio
utilizador.
(ficheiro cpt4-3-9.asp)
olá, não é indiscrição mas será que está a usar<br>
uma máquina com as seguintes configurações:<br>
<%=Request.ServerVariables(“HTTP_USER_AGENT”)%><br>
Já agora, o seu IP não será
<%=Request.ServerVariables(“REMOTE_ADDR”)%> ?
<br><br>Obrigado pelas informações...
Pelo código anterior julgo que fica clara a maneira como se usam e
acedem às variáveis do servidor…
Os cookies têm alguns métodos que vão ser explorados neste exemplo. Os cookies aqui criados foram feitos como se de objectos se
tratassem criando-se uma estrutura OCOOKIE que detém várias
variáveis. A este ‘array’ de cookies vai-se acrescentar uma validade,
que é definida em dias, usando-se (DATE + número de dias) para a
activar.
CAPÍTULO 4: OBJECTOS 107
(ficheiro cpt4-3-10.asp)
<%if Request.Form(“alterar”)<>”” then
Response.Cookies (“OCOOKIE”)(“Titulo”) = Request.Form(“nome”)
‘criar um cookie
Response.Cookies (“OCOOKIE”)(“CorFundo”) = Request.form(“cor”)
Response.Cookies (“OCOOKIE”).Expires = DATE + 10
‘definir o tempo de activação em dias
end if%>
<body bgcolor=”<%= Request.Cookies (“OCOOKIE”)(“CorFundo”)%>”>
Olá
<font FACE=”ARIAL” color=”BROWN” size=”5"><%= Request.Cookies
(“OCOOKIE”)(“Titulo”)%></font> ...
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div align=”center”>
<center>
<table border=”3" width=”350">
<tr>
<td width=”100%”>
<form method=”POST”>
<p>O seu nome: <input type=”text” name=”nome” size=”20"></p>
<p>Cor de fundo: <select size=”1" name=”cor”>
<option selected value=”WHITE”>Branco</option>
<option value=”BLUE”>Azul</option>
<option value=”RED”>Vermelho</option>
<option value=”GREEN”>Verde</option>
</select></p>
<p align=”center”><input type=”submit” value=”alterar”
name=”alterar”></p>
</form>
<p>&nbsp;</td>
</tr>
</table>
</center>
</div>
Foram usados os seguintes objectos e funções:
Response.Cookies (“OCOOKIE”) terá as variáveis que
simbolizam o login e password. Estas serão
comparadas no início de cada página
protegida, de maneira a assegurar se o
utilizador está validado ou não;
CAPÍTULO 4: OBJECTOS 109
maneira a ficar no formato que mais nos convém. Existem vários
tipos de formato. Vamos identificar alguns e depois experimentar
com uma página onde todos estão a funcionar. Podemos então
formatar strings, números e datas:
formatDateTime(“12-01-1995 12:12:00”,1)
Obtém-se assim uma data por extenso, onde até se inclui o dia da
semana. É uma formatação útil para quando queremos uma maior
descrição de uma data, para apresentar cálculos, ou apenas para
páginas que suportam calendários feitos em ASP.
Response.Write formatCurrency(“12312321”)
Podemos formatar um qualquer número para a nossa moeda. O
resultado do número em questão será então em escudos.
Response.Write FormatNumber(“4231,22345553”,5)
Quando precisamos de obter um número e temos de definir as casas decimais, podemos usar esta função para essa mesma tarefa.
FormatPercent(15/67)
Esta função é muito útil quando fazemos estatísticas num site, ou
quando temos um gráfico, como por exemplo, de uma dada votação. Somam-se todos os votos, separam-se os que são referentes
a um assunto, e usamos esta função para sabermos a que percentagem pertence esse assunto no universo.
Server.HTMLEncode(“Hoje é dia de praia, <font color=’RED’ size=’4'>
tu vais</font> ?”)
Já alguns sites tiveram problemas nos seus dados, como Livros de
Visitas, e fóruns, devido às Tags de HTML, pois se os dados do
utilizador não forem controlados este pode alterar o funcionamento
do site, com dados abusivos, e não aceites. Para que não seja possível ao utilizador escrever Tags de HMTL a funcionar no site, usamos este método.
Server.URLEncode(http://www.joaovieira.com/)
Esta função não é muito usada, mas sempre que for preciso formatar
uma string, de maneira a ela servir como referência para outro site,
que tem espaços no link ou outra formatação estranha, usa-se este
método para se obter a string certa para esse efeito
Depois de revistos alguns tipos de formatação, vamos então escrever o nosso ficheiro exemplo, para vermos tudo a funcionar. É sempre a melhor maneira de perceber - experimentar, alterar valores ou
alterar algum código.
110 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt4-3-11.asp)
str1 = “12-01-1995 12:12:00”
Response.Write str1 & “ <strong>(não formatada)</strong><br>”
Response.Write formatDateTime(str1,1) & “ (formatada com opção 1 de
FormatDateTime)<br><br>”
str2 = “12-01-1995 12:12:00”
Response.Write str2 & “ <strong>(não formatada)</strong><br>”
Response.Write formatDateTime(str2,3) & “ (formatada com opção 3 de
FormatDateTime)<br><br>”
str3 = “12312321”
Response.Write str3 & “ <strong>(não formatada)</strong><br>”
Response.Write formatCurrency(str3) & “ (formatada)<br><br>”
str4 = “4231,22345553”
Response.Write str4 & “ <strong>(não formatada)</strong><br>”
Response.Write FormatNumber(str4,5) & “ (formatada com formatNumber
para 5 casas decimais)<br><br>”
str5 = “15/67”
Response.Write str5 & “ <strong>(não formatada)</strong><br>”
Response.Write FormatPercent(15/67) & “ (formatada com Format
Percent)<br><br>”
str6 = “Hoje é dia de praia, <font color=’RED’ size=’4'> tu vais</font> ?”
Response.Write str6 & “ <strong>(não formatada)</strong><br>”
Response.Write Server.HTMLEncode(str6) & “ (formatada com
Server.HTMLEncode)<br><br>”
str7 = “http://www.joaovieira.com/”
Response.Write str7 & “ <strong>(não formatada)</strong><br>”
Response.Write Server.URLEncode(str7) & “ (formatada com
Server.URLEncode)<br><br>”
Foram usados os seguintes objectos e funções:
FormatDateTime () Servimo-nos desta função para
formatar uma string que continha
uma data/hora;
FormatNumber ()
formatou-se um número com certas
casas decimais definidas na própria
função;
FormatPercent ()
obteve-se um valor que fez a
percentagem de um número
solitário em relação à soma de um
grupo de números;
114 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
5.1 Bases de dados
As bases de dados (BD) foram como que o grande impulsionador
da procura das ASP e outras linguagens relacionadas para a programação Internet. A grande vantagem destas linguagens é a hipótese de se aceder a bases de dados, e, por conseguinte, disponibilizar
informação dinâmica online. Desta maneira pode-se vender online,
ter revistas com informação online, abrir Bancos, Seguradoras, e
outros tipos de empreendimentos online. Não vamos propriamente
ver como se abre o maior negócio do século (deixo isso para o leitor), mas poderemos ver como se processam algumas partes desses sistemas, e como solucionar certos problemas. O livro de visitas, muito procurado, pois todos gostamos de ter um no nosso site,
é um exemplo de como podemos disponibilizar um serviço interactivo
online sem precisar de muita manutenção. Um e-zine, jornal online,
é mais um exemplo de como se podem criar pequenas comunidades dedicadas a um certo assunto.
Os sistemas de gestão de bases de dados (SGBD ou DBMS) a
utilizar com as ASP podem ser diversos. Tudo o que precisa é de ter
os drivers (ficheiros para configuração do Windows, com software
externo) necessários para se ligar via ODBC (sistema que faz uma
ponte entre bases de dados independentemente dos sistemas
operativos das mesmas). Os exemplos que vão ser demonstrados
neste livro são feitos em MSAccess, visto ser indiscutivelmente a
base de dados mais acessível para Windows (para Linux teríamos
outras soluções também muito utilizadas). De referir que via ODBC
é indiferente a base de dados em relação ao código de programação,
visto que será usado puro código SQL para qualquer tipo de
intervenção nos dados. O ODBC é o sistema (que encontramos no
control panel) para criarmos uma ligação com qualquer tipo de BD
suportado pelo servidor (ou pelo menos referente aos drivers que
estiverem instalados).
Uma base de dados é constituída por tabelas, algumas delas ligadas
entre si. Podemos, por exemplo, ter uma tabela de contactos
pessoais para guardar um código identificador, nome, telefone e email.
Ficaria qualquer coisa do tipo:
TABELA: CONTACTOS
ID Nome Telefone EMail
CAPÍTULO 5: BASES DE DADOS 115
Mas só isto não chega. Precisamos de saber que tipo de campos é
que vamos usar, e para isso teremos uma tabela onde definimos
além do tipo, o tamanho disponível para os dados:
TABELA: CONTACTOS
ID as number
Nome as varchar(50)
Telefone as varchar(14)
EMail as varchar(22)
Ficou assim criada uma tabela possível de ser usada numa base de
dados. Vamos então demonstrar esta mesma tabela mas com dados
já introduzidos depois de ter sido criada.
TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)
1
2
3
4
João
Carlos
Rui
Pedro
219886675
324444332
234343444
332442433
[email protected]
[email protected]
[email protected]
[email protected]
Pode-se ver então mais facilmente como se processa (teoricamente)
a criação de uma tabela em base de dados, e como ela comporta os
dados que lhe são fornecidos.
Agora, a maneira como estes dados são introduzidos, e como
podemos aceder aos mesmos, já requer uma linguagem própria de
bases de dados. O SQL (Structured Query Language), criada no
início dos anos 70 pela IBM, é desde então usada como standard
em todas as bases de dados relacionais até hoje criadas.
O SQL é a linguagem padrão para a definição, actualização e
pesquisa de bases de dados. Qualquer linguagem de terceira ou
quarta geração que trabalhe com bases de dados decerto que
embebe expressões de SQL, quer estejemos a falar de ambientes
de bases de dados MSAccess, Informix, SQLServer ou Oracle.
O SQL contém poucos comandos, o que faz que com alguma
experiência se possam fazer maravilhas.
O sistema é simples: as ASP usam uma conexão ODBC, que por
sua vez está ligada a uma qualquer base de dados. As ASP usam o
ADO (ActiveX Data Objects) para que com uma conexão à base de
dados possamos usufruir de várias hipóteses de como programar
116 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
com as mesmas.
A estrutura base do SQL é a seguinte:
SELECT [ DISTINCT | ALL] coluna1, coluna2, …
FROM tabela WHERE (situação) GROUP BY
HAVING
UNION | INTERSECT (usar para mais de um SELECT)
ORDER BY (ordenar por coluna)
Neste caso apenas obtemos dados, e não alteramos os dados já
existentes. Para isso é necessário outro tipo de expressões. Por
exemplo, para inserir,
INSERT INTO tabela (coluna1, coluna2, …)
VALUES (‘dados1’, ‘dados2’, …)
Para apagar os dados de uma tabela basta,
DELETE FROM tabela
Ou então se apenas pretendermos eliminar um único registo (linha),
DELETE FROM tabela WHERE coluna1 = ‘dados1’
Podemos também actualizar dados, e nesse caso escreveríamos,
UPDATE FROM tabela SET coluna1 = ‘novo_dado1’
WHERE coluna2 = ‘dado2’
No caso da tabela anteriormente descrita, se o programador quiser
saber os dados de todas as pessoas que começam com a letra J,
basta escrever a seguinte expressão SQL:
SELECT * FROM CONTACTOS WHERE nome like ‘J%’
As plicas ‘ são usadas sempre que se compara uma string. Para
valores numéricos tal já não é preciso. As datas por vezes
necessitam de #data# , como nas bases de dados da Microsoft.
CAPÍTULO 5: BASES DE DADOS 117
No caso de se querer introduzir um novo registo já será necessário
um manuseamento diferente dos dados; usaremos então o comando
INSERT - outro comando standard do SQL.
INSERT INTO CONTACTOS (ID, nome, Telefone, E-Mail)
VALUES (5, ‘Ricardo’, ‘288889999’, ‘[email protected]’)
A nossa tabela passará então a ter a seguinte estrutura:
TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)
1
2
3
4
5
João
Carlos
Rui
Pedro
Ricardo
219886675
324444332
234343444
332442433
288889999
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Podemos, para nos ajudar, contar com os seguintes operadores
válidos no SQL:
OPERADOR
=
>
<
<=
>=
<>
DESCRIÇÃO
Para igualar
Maior que…
Menor que…
Menor ou igual
Maior ou igual
Diferente
5.2 Construir uma base de dados
em MSAccess
Depois daquilo que foi visto inicialmente neste capítulo, e olhando
para o que vai ser feito, o leitor pode pensar que quase não vale a
pena conhecer mais das expressões de SQL. É um engano, pois
mais cedo ou mais tarde se o leitor não conhecer o essencial destas
expressões, o trabalho com as novas linguagens Internet decorrerá
muito mais lento e menos vantajoso.
118 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Foi adoptado para este livro a base de dados Microsoft Access, pois
é a mais acessível de todas, mas é indiferente aquando de uma
conexão via ODBC.
A ideia é criar uma base de dados para contactos. O propósito não é
propriamente a vantagem comercial, ou técnica, mas sim um
exemplo perceptível, para se usar nos exemplos de introdução ao
uso de bases de dados com ASP.
A estrutura da primeira tabela da base de dados é a seguinte :
TABELA: CONTACTOS
ID
Auto-number
Nome
Text (50)
Idade
Number (Integer)
Telefone
Text (22)
Email
Text (32) / null
Data
Date / Time
A partir daqui temos a primeira análise feita. Basta agora traduzir
isto para a base de dados MSAccess. Em Email temos null, pois
queremos que este campo possa aceitar valores nulos.
Em primeiro lugar iniciamos o programa de base de dados. O ecrã
terá as opções para criarmos um novo ficheiro, ou usarmos um já
existente. Vamos escolher a opção para iniciarmos um novo ficheiro.
Fig. 5.1 - Escolha da criação de um novo
ficheiro para base de dados em MSAccess
122 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Fica assim criada a primeira tabela da base de dados que nos vai
acompanhar no resto deste livro.
5.3 Conexão à base de dados
Normalmente a conexão às bases de dados pelas ASP é feito pelo
ADO, que por sua vez usa uma conexão ODBC. Esta conexão é
feita sem se saber se a base de dados é MSAccess ou não. O que
interessa é que a mesma seja feita com sucesso. Vai-se criar a conexão via ODBC, mas vai ser exemplificado também uma maneira
de se conectar à BD MSAccess sem ser necessário o uso do ODBC,
ligação essa mais conhecida internacionalmente por DSNLess
Connection (visto que para o uso de ODBC a conexão processa-se
com DSN=…).
Para ser feita esta conexão temos de saber onde temos o ficheiro da
BD, e o nome que achamos ser o mais fácil, ou acessível para uso
dentro da programação ASP. Neste manual vai ser livrodsn
Primeiro o leitor vai ao Control Panel (Painel de Controlo) que pode
ser acedido a partir do Start (Iniciar), como demonstra a figura seguinte.
Fig. 5.8 - Atalho para a zona onde
se encontra o controlo de ODBC
Depois de aí entrar, escolha o ícone ODBC, entrando na sua consola…
126 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Podemos então criar um objecto RecordSet com o seguinte código,
Set rs = Server.CreateObject(“ADODB.Recordset”)
Depois das fases anteriores, tudo o que tem de fazer para controlar
a BD é criar uma declaração de SQL e accionar a mesma, isto da
seguinte maneira,
SQLStmt = “SELECT … FROM …”
rs.Open SQLstmt,Conn,1,2
Desta maneira o leitor já fez uma procura na BD, apesar de não
fazer uma saída para o browser, mas isso será visto nas próximas
linhas.
A estrutura completa para uma conexão à BD, e fazer uma alteração
ou uma procura na mesma ficará da seguinte forma,
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT … FROM ….. ORDER BY ….. DESC”
rs.Open SQLstmt,Conn,1,2
A declaração de SQL é apenas um exemplo e não funciona como
está. Vamos ver exemplos válidos já a seguir. Ou se possuir conhecimentos de SQL pode tentar aquilo que quiser (lembrar que neste
momento a BD está ainda vazia).
Outra maneira de nos conectarmos à BD é introduzindo o tipo de BD
na extensão da conexão e o local onde está a mesma,
conn = “DRIVER={Microsoft Access Driver (*.mdb)};”
conn = conn & “DBQ=” & Server.Mappath(“./livro.mdb”) & “;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “Select * FROM contactos”
rs.Open SQLStmt, conn, 2, 1
Neste caso a BD está no mesmo directório e por isso na variável
DBQ não foi preciso indicar a morada onde a mesma está.
Ficam assim vistas duas maneiras de nos conectarmos à BD. Nor-
CAPÍTULO 5: BASES DE DADOS 127
malmente os sites de aluguer de espaço fazem-se pagar por cada
conexão que é feita por DSN, fazendo com que a maioria dos programadores opte por fazer uma conexão directa como no segundo caso
agora visto. O leitor irá optar por aquela que mais lhe convém, desde
que não se esqueça que se mais tarde for mudada a BD pode ter de
alterar o código em todos os ficheiros, o que com a ligação via DSN
já não seria preciso.
5.4 Inserir, apagar e actualizar dados
em base de dados
Vamos então começar por ver como podemos inserir dados na BD,
e aproveitaremos para fazer inserções de duas maneiras diferentes.
Na primeira forçamos no código a inserção dos dados, como podemos ver no exemplo seguinte:
(ficheiro cpt5-4-1.asp)
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “INSERT INTO contactos (nome, idade, telefone, email, data) “
SQLStmt = SQLStmt & “VALUES(‘Bernardo Miguel’, 12, ‘33242443’,
‘[email protected]’, now())”
rs.Open SQLstmt,Conn,1,2
Response.Write “Introduzido com sucesso...”
Foram usados os seguintes objectos/métodos:
Server.CreateObject(“ADODB.Connection”) a maneira com
que criamos o objecto de conexão à BD;
Server.CreateObject(“ADODB.Recordset”) criação do
recordset que nos permitirá trabalhar com a
BD;
conn.Open ”DSN=…” serviu para abrir a BD com a
conexão via DSN, referente à BD em
questão;
Rs.Open,…,1,2 o 1 representa o tipo de cursor (pode ser
0 – Forward Only, 1 – KeySet, 2 – Dynamic,
3 – Static) , o 2 representa o tipo de Lock da
BD (1 – Read-Only, 2 – Pessimistic,
3 – Optimistic, 4 – Batch Optimistic).
128 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Podemos também criar um ficheiro ASP onde temos um formulário
para introdução de dados por parte do utilizador, que depois é validado e introduzido na BD.
Iremos então criar alguns procedimentos para a execução deste ficheiro de introdução de dados via formulário.
Sub formulario_introducao%>
<div align=”center”>
<table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0">
<tr><td>
<form action=”cpt5-4-2.asp?fazer=introduzir” method=”POST”>
Nome: <input type=”text” name=”nome”
value=”<%=Request.Form(“nome”)%>” size=”30"><br>
Idade: <input type=”text” name=”idade”
value=”<%=Request.Form(“idade”)%>” size=”3"><br>
Telefone: <input type=”text” name=”telefone”
value=”<%=Request.Form(“telefone”)%>” size=”12"><br>
E-Mail: <input type=”text” name=”email”
value=”<%=Request.Form(“email”)%>” size=”22"><br>
<center><input type=”submit” value=”Introduzir”></center>
</form>
</td></tr></table></div>
<%End Sub%>
Assim fica criado o procedimento formulario_introducao, que é o
interface de introdução de dados para o utilizador. De reparar que foi
introduzido o Request.Form(“…”), para que cada vez que se tenha
de repetir a introdução de dados devido a um campo ser inválido, o
utilizador não tenha de introduzir tudo de novo.
O argumento para sabermos o que se vai seguir é fazer (o argumento que vem da linha de comando do link quando se chama a página
pagina.asp?fazer=...), como podemos ver neste caso ficará
fazer=introduzir, que ao iniciarmos a página validaremos para saber o
que vai ser executado, para mostrar o formulário ou receber e enviar
os dados introduzidos.
Depois da introdução dos dados, verificamos que os recebemos e
que queremos introduzir na BD, mas para isso temos de os validar
primeiro, pois certos campos têm de ter um certo número de caracteres, assim como o campo idade tem de ser numérico.
CAPÍTULO 5: BASES DE DADOS 129
Sub validar_dados()
if len(Request.Form(“nome”))>50 or len(Request.Form(“nome”))<3 then
Response.Write “<center><font color=’RED’>O nome não pode
exceder os 50 caracteres, ou ter menos de 3.</font></center>”
formulario_introducao
exit sub
else
if (len(Request.Form(“idade”))>3 or (not
isnumeric(Request.Form(“idade”)))) then
Response.Write “<center><font color=’RED’>A idade não é
válida...</font></center>”
formulario_introducao
exit sub
else
if len(Request.Form(“telefone”))>22 or
len(Request.Form(“telefone”))<6 then
Response.Write “<center><font color=’RED’>O telefone excedeu
o número de caracteres, ou tem menos de 6.</font></center>”
formulario_introducao
exit sub
else
if len(Request.Form(“email”))>32 then
Response.Write “<center><font color=’RED’>O email
excedeu o número de caracteres.</font></center>”
formulario_introducao
exit sub
end if
end if
end if
end if
introducao_dados
End Sub
Ao introduzirmos dados incorrectos este procedimento vai devolver
uma mensagem de erro
Fig. 5.14 - Aspecto do formulário do ficheiro cpt5-4-2.asp,
com um campo em que se tentam introduzir dados inválidos
CAPÍTULO 5: BASES DE DADOS 131
Depois da validação, corremos o procedimento introducao_dados
que é onde estará o código de conexão e declaração SQL, necessários para actuar na BD.
Sub introducao_dados()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “INSERT INTO contactos (nome, idade, telefone, email, data) “
SQLStmt = SQLStmt & “VALUES(‘“&Request.Form(“nome”)&”’,”
SQLStmt = SQLStmt & “ “&Request.Form(“idade”)&”,”
SQLStmt = SQLStmt & “ ‘“&Request.Form(“telefone”)&”’, “
SQLStmt = SQLStmt & “‘“&Request.Form(“email”)&”’, “
SQLStmt = SQLStmt & “now())”
rs.Open SQLstmt,Conn,1,2
Response.Write “<br><br><center>Acabou de ser introduzido um novo
contacto.<br><br>”
Response.Write “<a href=’cpt5-4-2.asp’>introduzir novo contacto</a>
</center>”
End Sub
Depois da introdução dos dados, fica a nossa página completa. Note-se que toda a introdução de dados é feita via SQL, para que no
futuro não tenha problemas de portar o código para algum sistema
diferente. Usamos o Exit Sub, para que não corra logo a seguir à
introdução dos dados, sendo nosso objectivo mostrar o texto de erro
e pedir novos dados puxando o formulário novamente.
O resultado final da nossa página é então o seguinte:
(ficheiro cpt5-4-2.asp)
<%
Sub introducao_dados()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “INSERT INTO contactos (nome, idade, telefone, email, data) “
SQLStmt = SQLStmt & “VALUES(‘“&Request.Form(“nome”)&”’,”
SQLStmt = SQLStmt & “ “&Request.Form(“idade”)&”,”
SQLStmt = SQLStmt & “ ‘“&Request.Form(“telefone”)&”’, “
SQLStmt = SQLStmt & “‘“&Request.Form(“email”)&”’, “
SQLStmt = SQLStmt & “now())”
rs.Open SQLstmt,Conn,1,2
Response.Write “<br><br><center>Acabou de ser introduzido um novo
contacto.<br><br>”
132 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Response.Write “<a href=’cpt5-4-2.asp’>introduzir novo contacto</a>
</center>”
End Sub
Sub validar_dados()
if len(Request.Form(“nome”))>50 or len(Request.Form(“nome”))<3 then
Response.Write “<center><font color=’RED’>O nome não pode
exceder os 50 caracteres, ou ter menos de 3.</font></center>”
formulario_introducao
exit sub
else
if (len(Request.Form(“idade”))>3 or (not
isnumeric(Request.Form(“idade”)))) then
Response.Write “<center><font color=’RED’>A idade não é
válida...</font></center>”
formulario_introducao
exit sub
else
if len(Request.Form(“telefone”))>22 or
len(Request.Form(“telefone”))<6 then
Response.Write “<center><font color=’RED’>O telefone excedeu
o número de caracteres, ou tem menos de 6.</font></center>”
formulario_introducao
exit sub
else
if len(Request.Form(“email”))>32 then
Response.Write “<center><font color=’RED’>O email
excedeu o número de caracteres.</font></center>”
formulario_introducao
exit sub
end if
end if
end if
end if
introducao_dados
End Sub
Sub formulario_introducao%>
<div align=”center”>
<table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0">
<tr><td>
<form action=”cpt5-4-2.asp?fazer=introduzir” method=”POST”>
Nome: <input type=”text” name=”nome”
value=”<%=Request.Form(“nome”)%>” size=”30"><br>
Idade: <input type=”text” name=”idade”
CAPÍTULO 5: BASES DE DADOS 133
value=”<%=Request.Form(“idade”)%>” size=”3"><br>
Telefone: <input type=”text” name=”telefone”
value=”<%=Request.Form(“telefone”)%>” size=”12"><br>
E-Mail: <input type=”text” name=”email”
value=”<%=Request.Form(“email”)%>” size=”22"><br>
<center><input type=”submit” value=”Introduzir”></center>
</form>
</td></tr></table></div>
<%End Sub%>
<%
if request.querystring(“fazer”) = “introduzir” then
validar_dados
else
formulario_introducao
end if
%>
O código,
if request.querystring(“fazer”) = “introduzir” then
validar_dados
else
formulario_introducao
end if
serve para sabermos qual a acção a prosseguir, pois no nosso formulário criamos o argumento fazer, para podermos controlar se
mostramos o formulário ou se vamos actuar na BD, com dados já
introduzidos.
Agora, podemos deparar com uma situação em que o utilizador quer
apagar um contacto. Nesta altura é necessário disponibilizar uma
lista de contactos existentes, de maneira ao utilizador escolher aquele
que quer apagar. Uma das maneiras possíveis (e a que vamos usar),
é a de criar uma ComboBox com todos os nomes, e um botão de
apagar junto da mesma.
Primeiro precisamos de um procedimento onde temos o formulário
que inclui a tal ComboBox e o botão para apagar.
134 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<%Sub formulario()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos”
rs.Open SQLstmt,Conn,1,2
%>
<FORM ACTION=”cpt5-4-3.asp?fazer=apagar” METHOD=”POST”>
<font face=”ARIAL” size=”2">contactos na base de dados</font><br>
<SELECT NAME=”contacto”>
<OPTION selected> — escolha — </OPTION>
<%While Not rs.EOF
%>
<OPTION VALUE=”<%= rs.Fields(“ID”) %>”><%= rs.Fields(“nome”)%>
</OPTION>
<%rs.MoveNext
Wend
rs.close%>
</SELECT>
&nbsp;&nbsp;&nbsp;<INPUT type=”submit” value=”Apagar”>
</FORM>
<%End Sub%>
Verificar que na ComboBox a tag ‘VALUE’ recebe o número do ID do
contacto, número esse que será a referência futura na declaração
de SQL, de forma a sabermos qual o contacto a eliminar.
Fig. 5.17 - Aspecto do formulário do ficheiro cpt5-4-3.asp
CAPÍTULO 5: BASES DE DADOS 135
No procedimento para apagar, tudo o que se tem a fazer é receber o
número (identificador) do contacto que pretende apagar, introduzir
esse valor na declaração de SQL, e executar a mesma. O contacto
fica então apagado, é devolvida uma mensagem ao utilizador que
diz que o processo foi executado com sucesso. Introduziu-se também um link para o caso de haver necessidade de se apagar mais
algum contacto.
<%Sub apagar_contacto%>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “DELETE FROM contactos WHERE ID = “ &
Request.Form(“contacto”)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=”ARIAL” size=”3">O contacto escolhido foi apagado...
</font></strong><br>
<br><br><a href=”cpt5-4-3.asp”>continuar a apagar</a>
<%End Sub%>
Fig. 5.18 - Aspecto da resposta do ficheiro
cpt5-4-3.asp, depois do comando apagar
136 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
O ficheiro com todo o código fica então com a seguinte estrutura:
(ficheiro cpt5-4-3.asp)
<%Sub formulario()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos”
rs.Open SQLstmt,Conn,1,2
%>
<FORM ACTION=”cpt5-4-3.asp?fazer=apagar” METHOD=”POST”>
<font face=”ARIAL” size=”2">contactos na base de dados</font><br>
<SELECT NAME=”contacto”>
<OPTION selected> — escolha — </OPTION>
<%While Not rs.EOF
%>
<OPTION VALUE=”<%= rs.Fields(“ID”) %>”><%= rs.Fields(“nome”)%>
</OPTION>
<%rs.MoveNext
Wend
rs.close%>
</SELECT>
&nbsp;&nbsp;&nbsp;<INPUT type=”submit” value=”Apagar”>
</FORM>
<%End Sub%>
<%Sub apagar_contacto%>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “DELETE FROM contactos WHERE ID = “ &
Request.Form(“contacto”)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=”ARIAL” size=”3">O contacto escolhido foi apagado...
</font></strong><br>
<br><br><a href=”cpt5-4-3.asp”>continuar a apagar</a>
<%End Sub%>
<%
if Request.querystring(“fazer”)=”apagar” then
apagar_contacto
else
formulario
end if
%>
CAPÍTULO 5: BASES DE DADOS 137
Ao criar e apagar dados em bases de dados, o utilizador começa ao
longo do tempo a necessitar de fazer actualizações nos contactos,
como o e-mail e o número de telefone. É por isso que aparece agora
o próximo ficheiro para actualizar dados já existentes. A fórmula vai
ser um pouco a mesma que foi vista. Vamos então ter a ComboBox,
só que nesta escolhemos o contacto, depois serão devolvidos os
dados desse, preparados para actualização.
Foi usado um procedimento que já tinha sido criado aquando da
inserção de novos contactos – referimo-nos à validação da informação. Vamos também usar o formulário de apresentação e recepção
dos dados, criado anteriormente, ficando por fazer apenas o código
de inicialização, e os procedimentos de alteração dos dados.
O esquema aqui vai mudar, na medida em que é necessário guardar a variável que representa a identificação da linha da tabela a
alterar (o identificador é a chave da tabela). Isto porque será feita
uma escolha num formulário. De seguida passamos para a zona
onde o utilizador poderá alterar os dados do identificador escolhido
anteriormente, e no final faz-se uma execução da alteração feita na
fase anterior, com uma declaração de UPDATE de SQL.
<%Sub alterar()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos WHERE ID=” &
session(“contacto”)
rs.Open SQLstmt,Conn,1,2%>
<div align=”center”>
<table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0">
<tr><td>
<form action=”cpt5-4-4.asp?fazer=executar” method=”POST”>
Nome : <input type=”text” name=”nome” value=”<%=rs.Fields(“nome”)%>”
size=”30"><br>
Idade : <input type=”text” name=”idade” value=”<%=rs.Fields(“idade”)%>”
size=”3"><br>
Telefone: <input type=”text” name=”telefone”
value=”<%=rs.Fields(“telefone”)%>” size=”12"><br>
E-Mail: <input type=”text” name=”email” value=”<%=rs.Fields(“email”)%>”
size=”22"><br>
<center><input type=”submit” value=”Submeter Alteração”></center>
</form>
</td></tr></table></div>
<%End Sub%>
138 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Repare-se que a maneira de obtermos o valor que vem na resposta
da execução do SQL é com rs.Fields(“..”) , ou seja,
recordset.Fields(“nome_do_campo”). Mais tarde o leitor terá de lidar
com estes dados um a um, pois a resposta de uma declaração pode
ser múltipla.
Desta maneira, os dados foram introduzidos nos campos certos no
formulário, e o utilizador terá a hipótese de os alterar. A seguir, depois da submissão desses novos dados, é preciso validar os mesmos, e se tudo estiver correcto, introduzi-los na BD, como no procedimento seguinte:
<%Sub executar_alterar%>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “UPDATE contactos SET “
SQLStmt = SQLStmt & “ nome = ‘“&Request.Form(“nome”)&”’, “
SQLStmt = SQLStmt & “idade = “&Request.Form(“idade”)&”,”
SQLStmt = SQLStmt & “ telefone = ‘“&Request.Form(“telefone”)&”’, “
SQLStmt = SQLStmt & “email = ‘“&Request.Form(“email”)&”’”
SQLStmt = SQLStmt & “ WHERE ID = “ & session(“contacto”)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=”ARIAL” size=”3">O contacto escolhido foi alterado...
</font></strong><br>
<br><br><a href=”cpt5-4-4.asp”>continuar a alterar</a>
<%End Sub%>
Toda a estrutura fica então completa, da seguinte maneira:
(ficheiro cpt5-4-4.asp)
<%Sub formulario_principal()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos”
rs.Open SQLstmt,Conn,1,2%>
<FORM ACTION=”cpt5-4-4.asp?fazer=alterar” METHOD=”POST”>
<font face=”ARIAL” size=”2">contactos na base de dados</font><br>
<SELECT NAME=”contacto”>
<OPTION selected> — escolha — </OPTION>
<%While Not rs.EOF%>
CAPÍTULO 5: BASES DE DADOS 139
<OPTION VALUE=”<%= rs.Fields(“ID”) %>”><%= rs.Fields(“nome”)%>
</OPTION>
<%rs.MoveNext
Wend
rs.close%>
</SELECT>
&nbsp;&nbsp;&nbsp;<INPUT type=”submit” value=”Alterar”>
</FORM>
<%End Sub%>
<%Sub executar_alterar%>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “UPDATE contactos SET “
SQLStmt = SQLStmt & “ nome = ‘“&Request.Form(“nome”)&”’, “
SQLStmt = SQLStmt & “idade = “&Request.Form(“idade”)&”,”
SQLStmt = SQLStmt & “ telefone = ‘“&Request.Form(“telefone”)&”’, “
SQLStmt = SQLStmt & “email = ‘“&Request.Form(“email”)&”’”
SQLStmt = SQLStmt & “ WHERE ID = “ & session(“contacto”)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=”ARIAL” size=”3">O contacto escolhido foi alterado...
</font></strong><br>
<br><br><a href=”cpt5-4-4.asp”>continuar a alterar</a>
<%End Sub%>
<%Sub validar_dados()
if len(Request.Form(“nome”))>50 or len(Request.Form(“nome”))<3 then
Response.Write “<center><font color=’RED’>O nome não pode
exceder os 50 caracteres, ou ter menos de 3.</font></center>”
Alterar
exit sub
else
if (len(Request.Form(“idade”))>3 or (not
isnumeric(Request.Form(“idade”)))) then
Response.Write “<center><font color=’RED’>A idade não é
válida.</font></center>”
Alterar
exit sub
else
if len(Request.Form(“telefone”))>22 or
len(Request.Form(“telefone”))<6 then
Response.Write “<center><font color=’RED’>O telefone excedeu
140 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
o número de caracteres, ou tem menos de 6.</font></center>”
Alterar
exit sub
else
if len(Request.Form(“email”))>32 then
%>center><font color=’RED’>O email excedeu o número de
caracteres.</font></center><%
alterar
exit sub
end if
end if
end if
end if
executar_alterar
End Sub%>
<%Sub alterar()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos WHERE ID=” &
session(“contacto”)
rs.Open SQLstmt,Conn,1,2%>
<div align=”center”>
<table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0">
<tr><td>
<form action=”cpt5-4-4.asp?fazer=executar” method=”POST”>
Nome : <input type=”text” name=”nome” value=”<%=rs.Fields(“nome”)%>”
size=”30"><br>
Idade : <input type=”text” name=”idade” value=”<%=rs.Fields(“idade”)%>”
size=”3"><br>
Telefone : <input type=”text” name=”telefone”
value=”<%=rs.Fields(“telefone”)%>” size=”12"><br>
E-Mail : <input type=”text” name=”email” value=”<%=rs.Fields(“email”)%>”
size=”22"><br>
<center><input type=”submit” value=”Submeter Alteração”></center>
</form>
</td></tr></table></div>
<%End Sub%>
<%
if len(session(“contacto”)) = 0 and len(Request.Form(“contacto”))<>0 then
session(“contacto”) = Request.Form(“contacto”)
end if
CAPÍTULO 5: BASES DE DADOS 141
select case request.querystring(“fazer”)
case “alterar” alterar
case “executar” validar_dados
case else formulario_principal
end select%>
O código,
if len(session(“contacto”)) = 0 and len(Request.Form(“contacto”))<>0 then
session(“contacto”) = Request.Form(“contacto”)
end if
é usado para que o identificador do contacto seja guardado e esteja
disponível durante as páginas, pois é com ele que podemos localizar, nas declarações de SQL, se o tamanho do mesmo é vazio, e o
retorno do formulário estiver preenchido. Vamos então preencher a
variável de sessão contacto, com o identificador que vem do formulário.
Para controlarmos qual dos procedimentos a executar, além de determinarmos a variável argumento fazer, temos que depois buscar o
valor que esta detém, e correr o procedimento que se identifica com
esse comando, com o seguinte código:
select case request.querystring(“fazer”)
case “alterar” alterar
case “executar” validar_dados
case else formulario_principal
end select
Ficam então assim descritas as três situações que o leitor vai encontrar quando começar a trabalhar com as ASP: Introduzir, apagar
e actualizar dados em BD parece ser por vezes difícil mas isso só
se pode dizer depois de conhecidos os objectivos. Por vezes para
se actualizar uma tabela é preciso percorrer outras, e o programa
terá de abrir vários recordsets e por vezes várias conexões, o que
será mais trabalhoso, e pedirá um esforço intelectual maior.
142 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
5.5 Apresentação de dados
Podemos apresentar os dados de várias maneiras mas normalmente
são usadas as tabelas de HMTL (tratadas no primeiro capítulo deste
manual) para chegarmos a esse objectivo.
Além da conexão à BD, necessitaremos então de executar declarações de SQL, como já foi feito. A diferença aqui é que vamos ter de
percorrer uma a uma e colocar os dados nos locais que nos convém.
O método movenext, que funciona com o objecto recordset, é o
passo a seguir por cada vez que queremos percorrer a resposta da
nossas declaração de SQL.
(ficheiro cpt5-5-1.asp)
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos”
rs.Open SQLstmt,Conn,1,2
%>
<table border=”0" width=”580" cellpadding=”4" cellspacing=”0">
<tr>
<td width=”170"><b>Nome</b></td>
<td width=”50" align=”right”><b>Idade</b></td>
<td width=”” align=”right”><b>Telefone</b></td>
<td width=””><b>E-Mail</b></td>
</tr>
<% cor=”99CCFF”
while not rs.EOF%>
<tr>
<td bgcolor=”#<%=cor%>”><%=Rs.Fields(“nome”)%></td>
<td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“idade”)%></td>
<td bgcolor=”#<%=cor%>”
align=”right”><%=Rs.Fields(“telefone”)%></td>
<td bgcolor=”#<%=cor%>” ><%=Rs.Fields(“email”)%></td>
</tr>
<%rs.MoveNext
if cor=”99CCFF” then
cor=”9999FF”
else
cor=”99CCFF”
end if
wend
%></table>
144 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Agora digamos que queremos criar uma tabela dinâmica, que vai
fazer uso de imagens. Neste caso para aqueles que têm e para os
que não têm e-mail. Digamos que para cada pessoa que tem e-mail
aparece uma imagem que, carregando na mesma, permite o envio
de e-mail para essa pessoa.
Para isso temos de validar o campo que devolve o e-mail, ver se
esse não está vazio, e nesse caso mostrar ou não a imagem referente a um envelope.
(ficheiro cpt5-5-2.asp)
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos”
rs.Open SQLstmt,Conn,1,2
%>
<table border=”0" width=”580" cellpadding=”4" cellspacing=”0">
<tr>
<td width=”32" align=”right”><font size=”1"><b>e-mail</b></font></td>
<td width=”170"><b>Nome</b></td>
<td width=”50" align=”right”><b>Idade</b></td>
<td width=”” align=”right”><b>Telefone</b></td>
</tr>
<% cor=”99CCFF”
while not rs.EOF%>
<tr>
<td align=”right”><%
if len(Rs.Fields(“email”))>1 then
Response.write “<a href=’mailto:”&Rs.Fields(“email”)&”’>”
Response.Write “<img border=’0' src=’carta.jpg’></a>”
end if
%></td>
<td bgcolor=”#<%=cor%>”><%=Rs.Fields(“nome”)%></td>
<td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“idade”)%></td>
<td bgcolor=”#<%=cor%>”
align=”right”><%=Rs.Fields(“telefone”)%></td>
</tr>
<%rs.MoveNext
if cor=”99CCFF” then
cor=”9999FF”
else
cor=”99CCFF”
end if
wend
%></table>
CAPÍTULO 5: BASES DE DADOS 145
Foram usados os seguintes objectos e funções:
Len ()
aqui usado para testar o tamanho do e-mail.
Se for menor que um é porque é inexistente,
e nesse caso não se mostra a imagem que
representa um envelope e respectivo link
para envio de e-mail;
<a href=”mailto:<%=Rs.Fields(“email”) %>”> desta
maneira introduzimos o e-mail que é
devolvido pela BD, e usando o comando
mailto: ele passa a usar esse link, como
envio de e-mail para o endereço definido.
Como se pode verificar foi aproveitado o código do ficheiro cpt5-51.asp. Para este caso bastou-nos alterar a ordem de apresentação
dos dados, e validar o campo de e-mail.
Fig. 5.20 - Aspecto da resposta do ficheiro cpt5-5-2.asp
Algo que é muito usado nas páginas Internet é a pesquisa nas bases
de dados da existência de um dado utilizador, e é esse exemplo que
vamos apresentar de seguida.
146 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro cpt5-5-3.asp)
<%Sub Listagem()
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM contactos WHERE nome like ‘%” &
Request.Form(“nome”) & “%’”
rs.Open SQLstmt,Conn,1,2
%>
<table border=”0" width=”580" cellpadding=”4" cellspacing=”0">
<tr>
<td width=”32" align=”right”><font size=”1"><b>e-mail</b></font></td>
<td width=”170"><b>Nome</b></td>
<td width=”50" align=”right”><b>Idade</b></td>
<td width=”” align=”right”><b>Telefone</b></td>
</tr>
<% cor=”99CCFF”
while not rs.EOF%>
<tr>
<td align=”right”><%
if len(Rs.Fields(“email”))>1 then
Response.write “<a href=’mailto:”&Rs.Fields(“email”)&”’>”
Response.Write “<img border=’0' src=’carta.jpg’></a>”
End if
%></td>
<td bgcolor=”#<%=cor%>”><%=Rs.Fields(“nome”)%></td>
<td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“idade”)%></td>
<td bgcolor=”#<%=cor%>”
align=”right”><%=Rs.Fields(“telefone”)%></td>
</tr>
<%rs.MoveNext
if cor=”99CCFF” then
cor=”9999FF”
else
cor=”99CCFF”
end if
wend
%></table>
<br><a href=”cpt5-5-3.asp”>fazer nova procura</a>
<%End Sub%>
<%Sub formulario_procura%>
<form action=”cpt5-5-3.asp?fazer=procura” method=”POST”>
String para Procura : <input type=”text” name=”nome” size=”22">
<input type=”submit” value=”Procurar”>
</form>
<%End Sub%>
<%select case request.querystring(“fazer”)
case “procura” listagem
case else formulario_procura
end select%>
148 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
5.6 Exemplos com bases de dados
Um dos exemplos mais utilizados que recorrem às bases de dados
são os famosos livro de visitas, que além de serem simples de
desenvolver, servem depois para serem aproveitados noutras
aplicações para a Internet com as ASP.
Para começar vamos criar uma tabela na nossa BD; a mesma que
usámos para os contactos, com os campos básicos para um livro
de visitas.
TABELA LIVRO_VISITAS
ID_livro as autonumber
Data_assinatura as Date/Time
Nome as Text (30)
Email as Text (30)
Texto as Memo
Agora que já temos a BD actualizada com a tabela livro_visitas
podemos iniciar a construção do esquema para o livro de visitas.
O livro de visitas não é mais que uma tabela, como as que já vimos,
com dados, mas com uma apresentação diferente. Além dessa
apresentação dos dados temos também um formulário de introdução
de dados. Um truque, se assim se pode chamar, introduzido neste
exemplo, é o de refrescar a página depois de ser submetido o
formulário, para que o argumento não fique no link de caminho do
browser. O problema de o argumento ficar no link é que ao fazer
refresh na página, os dados são introduzidos novamente, mas se
chamar a página novamente sem argumento esse problema fica
resolvido. Mas para nos apercebermos disto vamos ver o código
fonte desta página ASP que é um livro de visitas.
(ficheiro cpt5-6-1.asp)
<%
Sub Introduzir()
passa = 1
nome = left(Request.Form(“nome”),30)
nome = Replace(nome, “‘“, “”)
email = left(Request.Form(“email”),30)
email = Replace(email, “‘“, “”)
texto = Request.Form(“texto”)
texto = Replace(texto, “‘“, “”)
if (len(nome)<2) then
passa = 0
end if
CAPÍTULO 5: BASES DE DADOS 149
if (len(texto)<15) then
passa = 0
end if
If Len(email) > 0 and Len(email) < 5 Then
Passa = 0
Else
If InStr(1, email, “@”, 1) < 2 Then
Passa = 0
Else
If InStr(1,email, “.”, 1) < 4 Then
Passa = 0
End If
End If
End If
if passa=1 then
rs.Close
SQLStmt = “INSERT INTO livro_visitas (data_assinatura, nome, email,
texto) VALUES(“
SQLStmt = SQLStmt & “‘“ & now() & “‘, ‘“
SQLStmt = SQLStmt & nome & “‘, ‘“ & email & “‘, ‘“ & texto & “‘)”
rs.Open SQLstmt,Conn,1,2
Response.Redirect(“cpt5-6-1.asp”)
Else
Response.Write “<font color=’red’>os dados que tentou introduzir não
foram válidos.</font>”
end if
End Sub
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT * FROM livro_visitas ORDER BY data_assinatura
DESC”
rs.Open SQLstmt,Conn,1,2
if Request.QueryString(“fazer”)=”introduzir” then
introduzir
end if
%><p>&nbsp;</p><div align=”center”>
<table border=”0" width=”580" cellpadding=”4" cellspacing=”2"><%
while not rs.EOF%>
<tr><td bgcolor=”#C6C6C6">
<p align=”left”>Assinatura de <a href=”mailto:
<%=rs.Fields(“email”)%>”> <%=rs.Fields(“nome”)%></a></p>
<center>
<p align=”center”><%=rs.Fields(“texto”)%></p>
150 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<p align=”center”>&nbsp;</td>
</center>
</td></tr>
<%rs.MoveNext
wend
%>
<tr><td>
<form action=”cpt5-6-1.asp?fazer=introduzir” method=”POST”>
Indique o seu nome : <INPUT TYPE=”TEXT” NAME=”nome” size=”22"
maxlength=”30"><br>
o seu e-mail : <INPUT TYPE=”TEXT” NAME=”email” size=”22"
maxlength=”30"><br>
a mensagem que quer deixar :<br>
<TEXTAREA name=”texto” cols=”33" rows=”7"></TEXTAREA><br>
<input type=”submit” value=”Assinar o Livro”>
</form>
</td></tr></table></div>
Foram usados os seguintes objectos e funções:
Len ()
esta função serve aqui para podermos
medir o tamanho das strings que são
enviadas do formulário. Assim poderemos
ver se estão vazias, ou se estão dentro dos
requisitos mínimos, impostos pelo
programa;
Left ()
devolve os n caracteres da esquerda de uma
determinada string. Digamos que temos um
campo que não pode ter mais de 30
caracteres na BD e assim nós forçamos
esse limite;
Replace ()
foi aqui usado por causa das plicas ‘ , que
ao serem usadas nas declarações de SQL
dão erro, pois o próprio SQL usa as
mesmas para limitação de código;
Response.Redirect ()
o truque que aqui foi feito com
este objecto e método, era de maneira a que
o argumento ?fazer=introduzir não ficasse na
linha do URL no browser, pois no caso
do utilizador fazer refrescamento do site
com este argumento, a BD passava a ter
outro registo igual ao que já tinha sido feito.
152 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
TABELA SONDAGEM
ID_sondagem as autonumber
Resposta as Text (5)
Valor as number
Vamos então fazer um formulário que recebe o input do utilizador, e
depois vamos processar o mesmo actualizando a base de dados
consoante a resposta.
(ficheiro cpt5-6-2.asp)
<%
Sub Introduzir()
SQLStmt = “UPDATE sondagem SET valor = valor+1 WHERE
resposta =’” & Request.Form(“sondagem”) &”’”
Rs.Open SQLstmt,Conn,1,2
Response.Redirect(“cpt5-6-2.asp”)
End Sub
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
if Request.QueryString(“fazer”)=”introduzir” then
introduzir
end if
%>
<div align=”center”>
<table border=”0" width=”400">
<tr>
<td width=”100%”>
<p align=”center”><font size=”3" face=”Arial”><b>Acha que este livro
o ajudou?</b></font> </p>
<div align=”center”>
<table border=”0" width=”100">
<tr>
<td width=”26">
<form action=”cpt5-6-2.asp?fazer=introduzir” method=”POST”>
<p align=”right”><font size=”3" face=”Arial”><input type=”radio”
value=”Sim” name=”sondagem”></font></td>
<center>
<td width=”60"><font size=”3" face=”Arial”>Sim</font></td>
</tr>
</center>
<tr>
<td width=”26">
<p align=”right”><font size=”3" face=”Arial”><input type=”radio”
value=”Não” name=”sondagem”></font></td>
CAPÍTULO 5: BASES DE DADOS 153
<center>
<td width=”60"><font size=”3" face=”Arial”>Não</font></td>
</tr>
</table>
<input type=”submit” value=”Votar”></form>
<font size=”3" face=”Arial”>
<b>Resultados até ao momento :</b><br>
<%SQLStmt = “SELECT * FROM sondagem”
rs.Open SQLstmt,Conn,1,2
while not rs.EOF
Response.Write rs.Fields(“valor”) & “ respostas com “
Response.Write rs.Fields(“resposta”) & “<br>”
rs.MoveNext
wend
rs.Close
%>
</font>
</center>
</div>
<center>
</center>
</td>
</tr>
<center>
</table>
</center>
</div>
Como se pode notar nestes exemplos, a inicialização da conexão à
base de dados é sempre feita no início do código (sabendo que os
procedimentos e funções só actuam se chamados).
Fig. 5.24 - Aspecto da resposta do
ficheiro cpt5-6-2.asp - a Sondagem
154 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Como se pode ver pela imagem, a apresentação é clara e o conteúdo o essencial. O leitor pode utilizar os dados que são recolhidos da
BD para criar gráficos, ou outras formas de apresentação. A tabela
foi criada de maneira a que possa ter todo o tipo de sondagens,
independentemente do número de respostas possíveis. Depois deste
capítulo existe ainda mais uma matéria para enriquecer os seus programas com ASP que é a criação e uso de componentes, que vamos ver já nas próximas páginas.
156 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
6.1 Introdução aos Componentes
Os componentes das ASP são ficheiros ActiveX que servem para
melhorar o desempenho das páginas ASP, visto que são rápidos e
permitem o desenvolvimento de funções reutilizáveis (que desta
maneira podem ficar acessíveis para outras páginas). Se explorarmos bem o funcionamento das ASP vemos que os componentes
são uma constante nesta linguagem, pois ao usarmos o Response
ou mesmo o Request estamos já a usar componentes internos da
linguagem ASP. Desta maneira podemos muito facilmente invocar
os métodos e objectos que precisamos para construir as nossas
páginas dinâmicas.
Mas por vezes podemos querer aceder a certas funções que não
são possíveis com as ASP. Para isso podemos aceder a outras como
o Visual Basic (por exemplo), criando um componente nesta linguagem.
Neste capítulo vai-se então demonstrar como se podem programar
componentes ASP em Visual Basic 6, para posterior uso nas nossas páginas ASP.
Com o tempo, o leitor vai cada vez mais usar este tipo de programação, pois facilita a mesma, e para aqueles que vendem os seus
serviços, podem salvaguardar o seu código desta maneira.
Existem alguns componentes que vêm com as ASP, assim como o
CDO (componente de e-mail) que vem com o IIS, o TextStream,
que é próprio das ASP, e muitos outros que podem ser encontrados
na Internet. A sua grande maioria é comercial, ou seja, terá de pagar
para os poder utilizar nos seus servidores. Mas muitos outros são
grátis, e um dos locais onde pode tentar encontrá-los é em http://
www.aspfree.com ou http://www.15seconds.com . Estes sites têm
listagens dos componentes disponíveis, ordenados por temas, e por
tipo de disponibilidade (Free, Trial, Comercial, Demo, etc.).
Durante este capítulo o leitor vai aprender a instalar componentes
exteriores, desde encontrá-los na Internet, fazer o seu download e a
seguir instalá-los, sendo explicado também como instalar o seu próprio componente, criado em Visual Basic.
Depois de ter lido este livro, e ultrapassadas todas as dúvidas, o
leitor estará então preparado para programar as ASP a alto nível,
bastando apenas alguma prática adicional.
CAPÍTULO 6: COMPONENTES 157
6.2 Tratamento de ficheiros de
texto com o TextStream
Este objecto do componente FileSystemObject não necessita de
instalação pois vem já com o PWS ou IIS. Tudo o que tem de fazer é
chamar o objecto do mesmo, e utilizá-lo. Este componente serve
para o leitor usar ficheiros de texto. Algo que pode ser útil quando o
mesmo quer guardar informação de rápido acesso, ou mesmo criar
páginas HMTL no momento, do tipo dar a hipótese aos utilizadores
de criarem uma página sua em função de um template do site. Desta forma toda a página pode ser gerada com este componente e
ficar disponível no momento, e num nível mais alto, ser enviada por
attach via e-mail para o utilizador. Além destas funções o leitor pode
também fazer procura de ficheiros, e movê-los no servidor.
As tabelas abaixo servem para ter uma noção daquilo que se pode
fazer com este objecto, e quais as propriedades e métodos para tal.
TABELA DE MÉTODOS DO TEXTSTREAM
Método
Tipo
Descrição
Read
Input
Este método vai ler os caracteres um a um.
ReadLine
Input
Como o nome indica, desta forma lê-se
uma linha inteira.
ReadAll
Input
Lê-se toda a informação que está no
ficheiro.
Write
Output Escreve toda a informação que
quisermos introduzir, não mudando de
linha, sendo a informação seguinte
escrita logo a seguir a esta.
WriteLine
Output Escreve a informação enviada,
mudando de seguida de linha.
WriteBlankLines Output Introduz uma linha vazia.
Skip
Input
Salta um número específico de
caracteres.
SkipLine
Input
Muda de linha.
158 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
TABELA DE PROPRIEDADES DO TEXTSTREAM
Propriedade
Descrição
AtEndOfLine
Maneira de o leitor saber se chegou ao fim da linha.
Line
Devolve o número da linha onde vamos.
Column
Devolve o número de caracteres que foram
percorridos desde o início da linha.
AtEndOfStream Desta maneira o leitor vai saber se já chegou ao
fim do ficheiro.
Uma maneira fácil de perceber o seu processo é o de escrever e ler
as linhas de texto do ficheiro criado. Vamos então criar uma página
ASP, que faz uma emulação de um jogo que é uma história em que
cada pessoa vai acrescentando um parágrafo. No final a história até
pode ter nexo, ou pode mesmo ser a maior confusão. Mas isto serve
apenas para o leitor ter a percepção de como são usados estes
ficheiros, e como este componente funciona.
Primeiro de tudo vamos fazer uns ficheiros de teste, para nos apercebermos daquilo que vamos usar.
Para abrir uma conexão para escrita e leitura de um ficheiro vamos
usar procedimentos diferentes.
Para escrevermos num ficheiro vamos usar a estrutura,
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set
EscreveTexto
=
ObjectoFicheiro.CreateTextFile
(Server.MapPath(“ficheiro.txt”),True)
Para lermos a informação lá escrita é usada a estrutura,
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(“ficheiro.txt”),1)
CAPÍTULO 6: COMPONENTES 159
Desta maneira podemos então criar linhas de texto e lê-las logo a
seguir.
(ficheiro cpt6-2-1.asp)
<%
Response.Write “processo : Vai ser criada uma linha de texto.<br><br>”
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(“ficheiro.txt”),True)
EscreveTexto.WriteLine(“Este linha está no ficheiro de texto...”)
EscreveTexto.Close
Response.Write “processo: Escreveu uma linha de texto.<br><br>”
Response.Write “processo: Vai ler linha de texto.<br><br>”
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(“ficheiro.txt”),1)
Response.Write “processo: A linha lida é: <b>” & LerTexto.Readline & “</b>”
Set LerTexto = nothing
%>
Foram usados os seguintes objectos/métodos:
CreateObject(“Scripting.FileSystemObject”) conexão ao
componente. Desta forma ficamos com um
objecto criado com a imagem do mesmo;
CreateTextFile () forma com que se define a criação de um
ficheiro de texto;
EscreveTexto.WriteLine () Escrita de uma linha de texto,
com mudança de linha;
EscreveTexto.Close Fechar o objecto de escrita de texto;
OpenTextFile ()
Abrir o ficheiro de texto para leitura;
LerTexto.Readline () Ler uma linha do ficheiro de texto;
LerTexto = nothing
Limpar o objecto de leitura de texto.
Podemos então visualizar o resultado obtido pelo nosso exemplo,
em que na mesma ASP criamos um ficheiro de texto, com uma
linha, e logo a seguir vamos buscar essa mesma linha e escrevê-la
no browser.
CAPÍTULO 6: COMPONENTES 161
(ficheiro cpt6-2-2.asp)
<%
Sub procura_ficheiro()
Set ProcuraFicheiro =
Server.CreateObject(“Scripting.fileSystemObject”)
If Not ProcuraFicheiro.FileExists(Server.MapPath(“historia.txt”)) then
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(“historia.txt”),True)
EscreveTexto.WriteLine(“ERA UMA VEZ............”)
EscreveTexto.Close
end if
End Sub
Sub escrita_de_linha()
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set EscreveTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(“historia.txt”),8,True)
If len(Request.Form(“linha”))>1 then
EscreveTexto.WriteLine(Request.Form(“linha”))
end if
EscreveTexto.Close
End Sub
Sub leitura_de_ficheiro()
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(“historia.txt”))
While NOT LerTexto.AtEndOfStream
Response.Write “&nbsp;&nbsp;| “ & LerTexto.ReadLine & “<br>”
Wend
Set LerTexto = nothing
End Sub
Sub formulario()
%>
<br><br><p><FORM action=”cpt6-2-2.asp” method=”POST”>
Novo Parágrafo: <input type=”text” name=”linha” size=”60"
MaxLength=”140"><br>
<input type=”submit” name=”submeter” Value=”Acrescentar”>
</FORM>
</p>
<%
End Sub
162 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
If Request.Form(“submeter”) = “Acrescentar” then
escrita_de_linha
end if
procura_ficheiro
leitura_de_ficheiro
formulario
%>
Foram usados os seguintes objectos/métodos:
ProcuraFicheiro.FileExists() este comando devolve True
ou False consoante exista o ficheiro
que procuramos ou não;
len()
Foi aqui usado para termos a
certeza que a linha enviada pelo
utilizador não está vazia, e nesse
caso não é inserida uma linha em
branco no ficheiro;
LerTexto.AtEndOfStream Este código, e no contexto em
que foi inserido (no loop), vai
percorrer linha a linha,
possibilitando-nos escrever cada
linha da história, na formatação que
quisermos. Se fosse lido todo o
ficheiro de uma vez poderiamos ter
problemas de performance no
futuro.
Fig. 6.2 - Resultado do ficheiro
cpt6-2-2.asp - a história que nunca acaba
CAPÍTULO 6: COMPONENTES 163
O resultado da história nunca é igual de site para site. Cada utilizador
chega e escreve uma nova linha, e pode alterar a mesma de acordo
com a sua vontade.
Outra forma de usarmos este útil componente é na contagem dos
acessos a um site. Para isso basta-nos criar um ficheiro ASP que
pode ser incluído em qualquer lado, contando assim os acessos ao
nosso site. O esquema é muito simples. Temos o ficheiro com um
valor, tiramos o valor, incrementamos-lhe um valor, e voltamos a lá
introduzir, mas neste caso sempre a criar o ficheiro gravando o novo
por cima do antigo.
Tudo aquilo que vai ser usado foi já visto no exemplo anterior; só o
uso do objecto é que vai ser um pouco diferente, o resultado é então
o do ficheiro cpt6-2-3.asp
(ficheiro cpt6-2-3.asp)
<%
Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(“contador.txt”),1)
Valor = LerTexto.ReadLine
Set LerTexto = nothing
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(“contador.txt”),True)
EscreveTexto.WriteLine(valor+1)
EscreveTexto.Close
Response.Write “Houveram “ & (valor+1) & “ acessos...<br>”
%>
Neste caso já tínhamos de ter criado um ficheiro de texto (contador.txt)
com o valor em que queríamos inicializar a contagem, neste caso,
zero. Por cada entrada no site o valor é incrementado, podendo o
leitor testar, fazendo múltiplos refrescamentos da página.
Fig. 6.3 - Resultado do ficheiro cpt6-2-3.asp
164 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Muitas outras funcionalidades se podem dar a este componente.
Por vezes o simples envio de informação via Internet entre sites distintos necessita deste tipo de tratamento - ficheiros de informação
que são trocados, e normalmente sempre em formato ASCII.
6.3 Componentes de e-mail
Este tipo de componentes (e-mail) são muito importantes na construção de sites dinâmicos. É uma das maneiras de fazer chegar
informação ao utilizador num nível mais pessoal. Normalmente necessitamos de preencher o campo de e-mail noutros sites, pois disso depende a recepção de uma password, ou de um ficheiro que
não é possível fazer download pois tem de ser pedido aos seus responsáveis. Com estes componentes o leitor pode fazer algo semelhante. Vários componentes estão disponíveis na Internet, assim
como o ASPEmail (www.aspemail.com) ou o Jmail que são grátis e
qualquer pessoa os pode usar.
Ficam então todos os passos para termos acesso ao componente
Jmail, que existe há alguns anos e funcionou sempre na perfeição.
Para fazer download deste componente tem de se dirigir a http://
tech.dimac.net, e procurar o ficheiro w3Jmail.
Depois do download, a instalação é simples, pois trata-se de um
ficheiro executável, e não de um DLL solto. Neste site existem também exemplos de código em que se usa o Jmail. Cabe ao leitor
explorar estes pontos mais a fundo. Seja como for são aqui demonstrados dois exemplos válidos do uso deste componente.
(ficheiro cpt6-3-1.asp)
<%
Set Jmail = Server.CreateObject(“JMail.SMTPMail”)
JMail.ServerAddress = “mail.servidor.pt” ‘ aqui fica o servidor de e-mail
JMail.Sender = “[email protected]” ‘ aqui fica o endereço de quem
envia o e-mail
JMail.Subject = “Titulo do E-Mail” ‘ aqui fica o titulo do e-mail / subject
JMail.AddRecipient “[email protected]” ‘ endereço para onde
queremos enviar o e-mail
Corpo = “Texto que vai no e-mail... “ & Chr(13) & chr(12) & Chr(13) & chr(12)
corpo = corpo & Chr(13) & chr(12) & “Obrigado”
JMail.Body = corpo ‘ envio do corpo da mensagem
Jmail.Priority = 3 ‘ implementar prioridade 1-mínima 3-máxima
JMail.Execute
%>
CAPÍTULO 6: COMPONENTES 165
Foram usados os seguintes objectos/métodos :
Server.CreateObject(“JMail.SMTPMail”) Cria-se assim a
conexão ao componente de e-mail;
JMail.ServerAddress () Desta forma vamos definir o
servidor de e-mail a usar;
JMail.Sender ()
Define-se aqui qual o e-mail da
pessoa que o envia;
JMail.Subject ()
Aqui indicamos o título da
mensagem;
JMail.AddRecipient () Escrevemos aqui para quem vamos
enviar o e-mail;
JMail.Body ()
Aqui fica a construção do corpo da
mensagem;
Jmail.Priority ()
Aqui definimos a prioridade do e-mail:
1-mínimo, 2-médio, 3-máximo;
JMail.Execute ()
Só depois deste comando é que o
e-mail é enviado. Primeiro são as
configurações e depois é que é
executada a função geral.
Este exemplo tratava apenas do envio de um e-mail, sem nenhum
propósito especial. Agora imaginemos que o leitor quer ter no seu
site um ficheiro com anedotas e, para que os outros possam ter
acesso, têm de indicar o e-mail para que as mesmas lhes sejam
enviadas. Entra então assim o conceito do próximo exemplo: Temos
um campo de um formulário onde os utilizadores vão introduzir o
seu e-mail, de maneira a poderem receber um documento que contém as anedotas que eles querem ter acesso.
(ficheiro cpt6-3-2.asp)
<%
Sub enviar_piada()
Set Jmail = Server.CreateObject(“JMail.SMTPMail”)
Jmail.ServerAddress = “mail.servidor.pt”
Jmail.Sender = “[email protected]”
Jmail.Subject = “Aqui estão as piadas”
Jmail.AddRecipient request.form(“email”)
Corpo = “Aqui estão as piadas.doc em attachment. “ & Chr(13) & chr(12)
& Chr(13) & chr(12)
Corpo = corpo & Chr(13) & chr(12) & “Obrigado”
Jmail.Body = corpo
Jmail.AddAttachment “d:/piadas.doc”
Jmail.Priority = 2
Jmail.Execute
%>
166 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<br><br><br>
<p align=”center”><font face=”Arial”><b>Obrigado...</font><br>
<small>receberá um e-mail meu dentro de momentos</small>
</p>
<%
End Sub
Sub formulario()
%>
<form action=”cpt6-3-2.asp” method=”POST”>
Introduza o e-mail onde quer<br> receber as piadas: <input type=”text”
name=”email”><br>
<input type=”submit” name=”submeter” value=”Quero Receber”>
</form>
<%
End Sub
if Request.Form(“submeter”) = “Quero Receber” then
enviar_piada
else
formulario
end if
%>
Foram usados os seguintes objectos/métodos:
JMail.AddAttachment () A maneira com que
acrescentamos um ficheiro ao
nosso e-mail (via attachment).
Ficamos assim com mais conhecimentos sobre como se podem
apurar as páginas dinâmicas. As utilizações possíveis para os componentes de e-mail são imensas. Numa delas, o leitor pode criar
uma newsletter, onde todos os utilizadores estão em BD, e quando
sai uma nova notícia uma página ASP pode-se encarregar de a enviar
para todos os registados em BD. O envio de passwords para quem
as perdeu é também uma das muitas funcionalidades dadas a este
tipo de componentes. Assim como a confirmação de assinaturas e
serviços que deste componente precisem para terem alguma funcionalidade. Até mesmo o exemplo das anedotas pode ser usado para
criar uma listagem (em BD), de todos os e-mails que as solicitaram,
podendo mais tarde ser útil para a divulgação de novas, fazendo
com que o tráfego do site aumente por cada novidade que apareça.
CAPÍTULO 6: COMPONENTES 167
6.4 Criar componentes em
Visual Basic 6
Para criarmos o componente previsto necessitamos apenas de algum conhecimento de Visual Basic (VB). O Visual Basic é uma das
bases das ASP e como as duas linguagens são derivadas de VBScript
não vão existir muitos problemas. Até mesmo o leitor que já se sente confortável na programação com ASP, e que nunca usou VB, não
vai ter muitas dificuldades em aperceber-se daquilo que vai ser feito.
O exemplo que vai ser criado não é nada de muito difícil, é algo aliás
bastante simples, que serve apenas para ver como se devem criar
componentes, instalá-los e usá-los. Vamos então criar um exemplo
que usa o código já usado do Livro de Visitas, e que neste caso fica
dentro de um componente DLL para ASP. Outra particularidade deste exemplo é que vamos dar hipótese à pessoa que o estiver a usar
de poder fazer algumas alterações.
Vamos então, antes de mais, inicializar o Visual Basic (este exemplo usa o Visual Basic 6).
Ao aparecer a escolha do tipo de projecto optamos por ActiveX DLL.
Fig.6.4
- Escolha do tipo de projecto
CAPÍTULO 6: COMPONENTES 171
Private msc As ScriptingContext
Private mapplication As Application
Private mrequest As Request
Private mresponse As Response
Private mserver As Server
Private msession As Session
Private Conn As Connection
Private RS As Recordset
Podemos então reconhecer a conexão à BD e definição do Recordset
que vamos usar para aceder à BD. De resto são as inicializações
das variáveis que vão compensar os objectos das ASP.
Para definirmos os procedimentos que são acessíveis do exterior
basta definirmos se são Public ou Private.
Public Sub NomeDoProcedimento()
End Sub
Private Sub NomeDoProcedimento()
End Sub
Existem dois procedimentos base nos componentes de ASP, que
funcionam algo como os procedimentos do ficheiro Global.Asa, e
que são os seguintes:
Public Sub OnStartPage(psc As ScriptingContext)
End Sub
Public Sub OnEndPage()
End Sub
Deve ter reparado no tipo psc. Este serve para entrarmos no scripting
da linguagem ASP, que no fundo é um sistema de texto corrido, para
interpretação.
Os procedimentos que vamos usar são os seguintes:
Public Sub CorLetras(cor As String)
Vai ser usado para introduzir a cor das letras numa variável de sessão, variável essa que será posteriormente usada;
Public Sub ficheiro(ficheiro As String)
Aqui introduzimos numa variável de sessão o nome do ficheiro que
suporta o livro de visitas. Vai influenciar no redireccionamente e no
Action do formulário HTML;
172 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Public Sub CorLetrasCaixas(cor As String)
Aqui o utilizador definirá a cor das letras das mensagens deixadas
no livro de visitas;
Public Sub CorCaixas(cor As String)
Procedimento para definir a cor das caixas que suportam as mensagens;
Public Sub OnStartPage(psc As ScriptingContext)
Procedimento base que suporta tudo aquilo que deve ser inicializado
antes de se começar a correr o código;
Public Sub inicio()
Procedimento que terá as primeiras linhas de código, que antes estavam fora dos procedimentos do livro de visitas;
Private Sub Introduzir()
Este é o procedimento que já usávamos antes no livro de visitas,
aqui com algumas alterações pois temos de escrever o código todo
com Response.Write e no VB com mresponse.write;
Public Sub OnEndPage()
Este é o procedimento base que define tudo o que é feito quando se
acaba de usar o DLL. Neste caso limpamos todos os objectos que
foram criados para simular os usados nas ASP
Vamos então ver parte do que é feito no procedimento OnStartPage ():
Set msc = psc ‘chamamos o objecto de scripting inicializado
Set mapplication = msc.Application ‘ definimos como usar as variáveis
Application
Set mrequest = msc.Request ‘ definimos como usufruir do request
E o resto funciona no mesmo esquema, como o leitor pode ver a
seguir:
Set mresponse = msc.Response
Set mserver = msc.Server
Set msession = msc.Session
Nesta perspectiva quando o leitor quiser criar uma variável de sessão chamada Ficheiro com um texto ficheiro.asp faz,
msession(“Ficheiro”) = “ficheiro.asp”
CAPÍTULO 6: COMPONENTES 173
Se quisermos ter um valor inserido por um formulário com o nome
email fazemos,
Mrequest.form(“email”)
E assim para todos as outras emulações criadas para os objectos.
O leitor depois saberá qual o melhor uso a dar a cada uma. Tudo o
resto poderá ser código base do VB, que será de onde se poderá
tirar maior partido.
Vamos então ver o ficheiro livrovisitas.cls - a classe que foi criada
no VB para suportar o nosso livro de visitas.
(ficheiro livrovisitas.cls)
Private msc As ScriptingContext
Private mapplication As Application
Private mrequest As Request
Private mresponse As Response
Private mserver As Server
Private msession As Session
Private Conn As Connection
Private RS As Recordset
Public Sub CorLetras(cor As String)
msession(“CorLetras”) = cor
End Sub
Public Sub ficheiro(ficheiro As String)
msession(“Ficheiro”) = ficheiro
End Sub
Public Sub CorLetrasCaixas(cor As String)
msession(“CorLetrasCaixas”) = cor
End Sub
Public Sub CorCaixas(cor As String)
msession(“CorCaixas”) = cor
End Sub
Public Sub OnStartPage(psc As ScriptingContext)
Set msc = psc
Set mapplication = msc.Application
Set mrequest = msc.Request
Set mresponse = msc.Response
Set mserver = msc.Server
Set msession = msc.Session
174 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Set Conn = mserver.CreateObject(“ADODB.Connection”)
Conn.Open “DSN=livrodsn;”
Set RS = mserver.CreateObject(“ADODB.Recordset”)
End Sub
Public Sub inicio()
If mrequest.QueryString(“fazer”) = “introduzir” Then
Introduzir
End If
mresponse.Write “<p>&nbsp;</p><div align=’center’>”
mresponse.Write “<table border=’0' width=’580' cellpadding=’4'
cellspacing=’2'>”
SQLstmt = “SELECT * FROM livro_visitas ORDER BY data_assinatura
DESC”
RS.Open SQLstmt, Conn, 1, 2
While Not RS.EOF
mresponse.Write “<tr><td bgcolor=’” & msession(“CorCaixas”) & “‘>”
mresponse.Write “<p align=’left’><font color=’” &
msession(“CorLetrasCaixas”) & “‘>”
mresponse.Write “Assinatura de <a href=’mailto:” & RS.Fields(“email”)
& “‘>” & RS.Fields(“nome”)
mresponse.Write “</a></font></p>”
mresponse.Write “<center>”
mresponse.Write “<p align=’center’><font color=’” &
msession(“CorLetrasCaixas”) & “‘>”
mresponse.Write RS.Fields(“texto”) & “</font></p>”
mresponse.Write “<p align=’center’>&nbsp;</td>”
mresponse.Write “</center>”
mresponse.Write “</td></tr>”
RS.MoveNext
Wend
mresponse.Write “<tr><td>”
mresponse.Write “<form action=’” & msession(“Ficheiro”) &
“?fazer=introduzir’ method=’POST’>”
mresponse.Write “<font color=’” & msession(“CorLetras”) & “‘>Indique o
seu nome: </font>”
mresponse.Write ”<INPUT TYPE=’TEXT’ NAME=’nome’ size=’22'
maxlength=’30'><br>”
mresponse.Write “<font color=’” & msession(“CorLetras”) & “‘>o seu email: </font>”
mresponse.Write”<INPUT TYPE=’TEXT’ NAME=’email’ size=’22'
maxlength=’30'><br>”
mresponse.Write “<font color=’” & msession(“CorLetras”) & “‘>a
mensagem que quer deixar:</font><br>”
mresponse.Write “<TEXTAREA name=’texto’ cols=’33' rows=’7'>
CAPÍTULO 6: COMPONENTES 175
</TEXTAREA><br>”
mresponse.Write “<input type=’submit’ value=’Assinar o Livro’>”
mresponse.Write “</form>”
mresponse.Write “</td></tr></table></div>”
End Sub
Private Sub Introduzir()
passa = 1
nome = Left(mrequest.Form(“nome”), 30)
nome = Replace(nome, “‘“, “”)
email = Left(mrequest.Form(“email”), 30)
email = Replace(email, “‘“, “”)
texto = mrequest.Form(“texto”)
texto = Replace(texto, “‘“, “”)
If (Len(nome) < 2) Then
passa = 0
End If
If (Len(texto) < 15) Then
passa = 0
End If
If Len(email) > 0 And Len(email) < 5 Then
passa = 0
Else
If InStr(1, email, “@”, 1) < 2 Then
passa = 0
Else
If InStr(1, email, “.”, 1) < 4 Then
passa = 0
End If
End If
End If
If passa = 1 Then
RS.Close
SQLstmt = “INSERT INTO livro_visitas (data_assinatura, nome, email,
texto) VALUES(“
SQLstmt = SQLstmt & “‘“ & Now() & “‘, ‘“
SQLstmt = SQLstmt & nome & “‘, ‘“ & email & “‘, ‘“ & texto & “‘)”
RS.Open SQLstmt, Conn, 1, 2
mresponse.Redirect (msession(“Ficheiro”))
Else
mresponse.Write “<font color=’red’>os dados que tentou introduzir não
foram válidos.</font>”
End If
End Sub
176 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Public Sub OnEndPage()
Set msc = Nothing
Set mapplication = Nothing
Set mrequest = Nothing
Set mresponse = Nothing
Set mserver = Nothing
Set msession = Nothing
End Sub
Ficamos assim com o ficheiro que irá gerir todo o processo do componente. Tudo se passa como se fosse um ASP excepto as chamadas dos objectos base das ASP.
Para testarmos este código necessitamos de fazer Run do mesmo,
e logo de seguida ir a um ASP que busca este componente. No VB6
existe essa vantagem - não necessitamos de instalar o componente
para o testar; basta carregar em RUN no VB, ir ao browser e abrir a
página que chama o componente. Neste caso é uma página com a
seguinte estrutura:
(ficheiro cpt6-4-1.asp)
<%
Set lv = Server.CreateObject(“LivroASP.livrovisitas”)
Lv.Ficheiro(“cpt6-4-1.asp”)
lv.CorLetras(“Green”)
lv.CorLetrasCaixas(“#F60000”)
lv.CorCaixas(“#C6C6FF”)
lv.inicio
%>
Como se pode ver define-se todos os dados possíveis do componente, busca-se o componente através de Serve.CreateObject onde
a estrutura é,
Server.CreateObject(“NomeProjecto.NomeClasse”)
Depois o uso é básico e de fácil compreensão.
182 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
7.1 Introdução
Este capítulo foi introduzido neste manual, não para mais uma explicação detalhada linha a linha, mas para inspirar o leitor a desenvolvimentos mais complexos com as ASP. Vamos apresentar dois
exemplos que decerto incluem respostas para muitos problemas
que lhe são familiares.
O esquema de ambos é muito parecido, ao ponto de serem usados
ficheiros idênticos em ambas as aplicações. Estes exemplos têm
muito em comum, tais como, ficheiros, funções, métodos de busca
de dados e muito mais. Mas o mais importante é que ambos usam
apenas um ficheiro ASP e os outros são de apoio para a construção
do primeiro, que é 80% dinâmico. Teremos 3 zonas desse ficheiro, o
topo, o fundo e o centro. O centro é a zona mais dinâmica, onde
vamos escolher consoante a resposta do nosso Querystring ou
formulário, os dados a mostrar no browser.
O esquema é então sempre o seguinte:
Fig. 7.1 - Esquema dos exemplos deste capítulo
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 183
Pelo esquema vimos que existem ficheiros que estão incluídos na
ASP, isso graças ao facto de usarmos o sistema SSI (já visto neste
manual), de maneira a usarmos o comando <!—#INCLUDE
FILE=”ficheiro.inc”—> .
Desta maneira estamos livres para usar o primeiro ficheiro dinamicamente. Um exemplo de como fazer esse uso é com o argumento
que vem com o link no browser. Digamos que temos duas hipóteses:
se o argumento ‘fazer’ for sim, apresentamos o ficheiro com código
HTML a representar ‘certo’ (pode não ser um ficheiro HTML, pode ter
funções ASP), se for ‘não’, apresentamos o ficheiro ‘errado’.
Vejamos então:
No browser temos o link http://pc/livro/default.asp?fazer=sim
Teremos no código ASP o seguinte:
fazer = request.querystring(“fazer”)
<%if fazer=”sim” then%>
<!—#INCLUDE FILE=”certo.inc”—>
<%else%>
<!—#INCLUDE FILE=”errado.inc”—>
<%end if%>
E desta maneira manipulamos a apresentação, no browser, dos
dados com um só ficheiro ASP. Claro que se estiver a programar
um site com muitos acessos esta não será a maneira mais indicada,
mas se não contar com mais de mil acessos diários pode estar
descansado. Seja como for, estes exemplos servem para lhe dar a
conhecer alguns truques usados por profissionais na programação
de sites. Claro que nada disto é uma invenção de última hora, os
mesmos recursos são usados por muitos mas de maneira diferente.
7.2 A Rã – Motor de Busca
Este é sem sombra de dúvidas daqueles exemplos que muitos querem estudar e perceber como se podem ultrapassar alguns problemas. Não é nenhum exemplo para sites ‘Industriais’, mas por aqui o
leitor ficará com as ideias arrumadas e com os conhecimentos suficientes para criar algo mais avançado do que este exemplo. O esquema de uso de ficheiros foi explicado no início deste capítulo, agora precisamos é de ver como estruturar a base de dados e definir
184 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
quais as funções que vamos precisar em função dos procedimentos que o site deverá ter. Podemos então desde logo identificar algumas etapas, mas para não ficar muito confuso vamos começar pelas bases de dados, e logo de seguida esquematizar o esquema de
ficheiros que vão ser usados. Não é demais lembrar que neste capítulo não é prioridade explicar o que se faz em cada linha (apesar de
muitos pontos serem explicados) mas sim, apresentar uma solução, e demonstrar como torná-la consistente na prática.
Iremos ter então apenas uma tabela para guardar os dados que
acharmos necessários (claro que o leitor poderá criar uma BD diferente, esta serve apenas de orientação inicial).
Achou-se que para este exemplo a data, o título do site, uma descrição e a morada do próprio seriam suficientes.
Ficando o nosso ficheiro em MSAccess (o usado deste o início do
manual) com o seguinte aspecto na consola de Design.
Fig. 7.2 - A BD do motor de busca - uma única tabela
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 185
O esquema é então o seguinte:
TABELA: MOTORBUSCA
id_motor
Auto-number; o identificador do link
url
Text (250); o link da página registada
titulo
Text (80); o título da página
descricao
Memo; uma breve descrição do que trata o site
data
Date/Time; data em que foi inserido o link no
motor de busca
Podemos então começar a pensar no que vai ser preciso para por o
motor de busca a funcionar, e podemos desde já fazer uma lista de
pontos com a seguinte estrutura:
1 – Aspecto da página inicial;
2 – Formulário de procura de dados;
3 – Formulário de registo de site;
4 – Apresentação de dados;
5 – Resultado de procura de sites;
6 – Aspecto gráfico.
Como vamos usar uma só ASP para suportar todas as tarefas do
site, vamos implementar o que foi visto na lista em vários ficheiros
*.inc (pode ter outra extensão) e usá-los quando achamos necessário,
dentro da estratégia do site. Fica então assim o esquema seguinte
para se ter uma noção do que vai acontecer, e onde aparecem os
ficheiros de que falamos:
Fig. 7.3 - Esquema de ficheiros do motor de busca
186 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
Ficamos assim com uma ideia dos ficheiros que vão ser usados e
quais as hierarquias envolvidas nos mesmos. Vamos então descrever o que cada ficheiro tem:
Imagens,
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Topo.jpg
ficheiro que representa a imagem de topo do site, incluído no
código HMTL do ficheiro topo.inc
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bprocurar.gif
ficheiro que representa o botão que se carrega para pesquisarmos
no motor, usado no ficheiro procura.inc
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bregistar.gif
como o nome indica é o botão para registarmos os sites que
queiram figurar na BD do motor de busca; é chamado no ficheiro
registar.inc
Ficheiros da página,
C:\Inetpub\wwwroot\livro\motordebusca\Default.asp
ficheiro que recebe os argumentos dos formulários ou da linha de
comando do browser, e consoante o recebido consoante o ficheiro
que é demonstrado na zona central da página;
C:\Inetpub\wwwroot\livro\loja\motordebusca\Funcoes.asp
aqui existe uma função que é usada em mais que um ficheiro, cuja
função é validar as plicas usadas nas strings, para que quando
usarmos a BD não apareçam erros, visto que as mesmas são
usadas pela própria BD;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Fundo.inc
ficheiro com o desenho do fundo do site (estático a 100%);
C:\Inetpub\wwwroot\livro\motordebusca\includes\Inicial.inc
esquema inicial, se não existirem argumentos no link, será este
ficheiro a aparecer;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc
depois de submetida a string de procura, aparecem todos os sites
relacionados, e é este ficheiro que o vai fazer;
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 187
C:\Inetpub\wwwroot\livro\motordebusca\includes\Procura.inc
é simplesmente o formulário onde o utilizador vai inserir a string de
procura;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Registar.inc
este vai ser o ficheiro que tem o formulário de registo de todos os
sites que querem estar indexados no nosso motor de busca;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Topo.inc
HTML com o desenho do topo do site (também como o fundo, 100%
estático);
C:\Inetpub\wwwroot\livro\livro.mdb
ficheiro de base de dados onde figura a tabela de dados que
usamos neste exemplo.
A estrutura de directórios pode ser alterada pelo leitor desde que
todo o ambiente o acompanhe. Pretendo por ambiente referir-me à
configuração do servidor de Internet, à conexão à BD, às referências
a páginas, etc.
Agora podemos ir ver o código de todos os ficheiros e falar da função
de cada procedimento dentro dos mesmos, se esses existirem.
(ficheiro default.asp)
<!—#INCLUDE FILE=”includes/topo.inc”—>
<div align=”center”>
<table width=”600"><tr>
<td align=”top” width=”600">
<center><font size=”2" face=”Verdana”><a href=”default.asp”>página
inicial</a>&nbsp;&nbsp;&nbsp;
<a href=”default.asp?fazer=registar”>registar site
</a>&nbsp;&nbsp;&nbsp;</font></center>
<%
fazer = Request.QueryString(“fazer”) ‘ vamos buscar o argumento fazer
Select Case fazer ‘ vamos então chamar o ficheiro consoante o
argumento
Case “procura” ‘ se o argumento for procura foi submetida uma busca
‘ e se foi submetida uma busca vamos mostrar o formulário de busca
‘ e incluir a listagem de sites identificados com essa procura
%>
<!—#INCLUDE FILE=”includes/procura.inc”—>
<!—#INCLUDE FILE=”includes/listagem.inc”—>
188 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<%
Case “registar” ‘ se o argumento for este é porque vai haver um novo
registo
%>
<!—#INCLUDE FILE=”includes/registar.inc”—>
<%
Case Else ‘ se não existir argumento introduzimos a página inicial
%>
<!—#INCLUDE FILE=”includes/procura.inc”—>
<!—#INCLUDE FILE=”includes/inicial.inc”—>
<%
End Select
%>
</td>
</tr></table></div>
<p>&nbsp;</p>
<!—#INCLUDE FILE=”includes/fundo.inc”—>
O resultado do exemplo anterior está representado na figura seguinte. Reparar que neste exemplo o argumento fazer não existe, e por
isso os ficheiros introduzidos no meio do código são os correspondentes em Case Else.
Fig. 7.4 - Aspecto geral da página principal
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 189
(ficheiro funcoes.asp)
<%
‘ esta função serve exclusivamente para acrescentar uma plica
‘ por cada uma que existir nas strings a usar em declarações de SQL
Function tira_plicas(texto)
Texto = trim(texto) ‘ desta maneira tiramos os espaços em branco ao
‘ início e fim da string
texto_temp = “” ‘ esta é uma string temporária onde vamos construir
‘ uma string que não tem uma plica sozinha
For i=1 to len(texto) ‘ loop para percorrer a string
if Mid(texto,i,1)=”’” then ‘se achar plica acrescenta mais uma
texto_temp=texto_temp & “‘’”
else
texto_temp=texto_temp & Mid(texto,i,1)
end if
Next
Tira_plicas = texto_temp ‘ ao fazermos esta igualdade estamos
‘ a devolver o resultado desta função ( função corrente = valor )
End Function
%>
O ficheiro funcoes.asp é como que uma biblioteca que recorremos
que tem funções generalistas. Nestes exemplos só o usei para uma
função, mas o leitor poderá usar para vários tipos de funções.
Depois de fazermos #INCLUDE de um destes ficheiros, todas as
funções e procedimentos aí existentes são usados como se ao código
do ficheiro inicial pertencessem.
(ficheiro topo.inc)
<HMTL>
<HEADER>
<TITLE>A Rã - o novo motor de busca com ASP</TITLE>
</HEADER>
<BODY>
<div align=”center”><table width=”600">
<tr><td>
<img src=”imagens/topo.jpg”>
</td></tr>
</table></div>
Figura. 7.5 - Imagem do topo do site
190 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro fundo.inc)
<div align=”center”><table width=”600">
<tr bgcolor=”#8AC491"><td>
&nbsp;
</td></tr>
<tr><td>
<center><font size=”2" face=”ARIAL”>(1999) Portugal, todos os direitos
reservados<br>para IE4+ & NN4+</font></center>
</td></tr>
</table></div>
</BODY>
</HTML>
O ficheiro inicial representa tudo aquilo que aparece na primeira página
aquando da chamada do site. Além de incluirmos o formulário de
pesquisa pertencente ao ficheiro procura.inc, introduzimos também
inicial.inc, que é o que demonstra os últimos links registados no nosso
site.
(ficheiro inicial.inc)
<br><br>
<p><font size=”2" face=”Verdana”>Use este motor de busca, para adicionar os seus links ou procurar a página que tanto procura.
Não se esqueça de que este serviço é gratuito, por isso pode divulgá-lo
por todos os seus amigos.<br>
Agradeço a sua visita e espero que goste...
</font></p>
<br><font face=”Verdana” color=”blue”>Os últimos links adicionados
foram:</font><br><br>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT url, titulo, data, descricao “
SQLStmt = SQLStmt & “FROM motorbusca ORDER BY data DESC”
rs.Open SQLstmt,Conn,1,2
voltas=0 ‘ variável para controlamros o número de registos a mostrar
‘ na primeira página, ou, página inicial
‘ enquanto não forem demonstrados os últimos 5 links o loop executa-se
while NOT rs.EOF and voltas<5
response.write “<p><font size=’2' face=’ARIAL’>”
response.write “> <b><font size=’3'><a href=’”
response.write rs.fields(“url”) & “‘ target=’_blank’>”
response.write rs.fields(“titulo”) & “</a></font></b><br>”
response.write left(rs.fields(“descricao”),400)
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 191
‘ usa-se a função left para controlarmos o número de caracteres da
descrição
‘ que queremos ver no site
response.write “<small>submetido em “ & rs.fields(“data”)
response.write “ com o URL <a href=’” & rs.fields(“url”) & “‘
target=’_blank’>”
response.write rs.fields(“url”) & “</a></small><br>”
response.write “</font></p>”
voltas=voltas+1 ‘ incrementamos as voltas para controlo do número de
links a ver
rs.movenext ‘ movemos o cursor da Base de Dados para a próxima
posição
wend
rs.close ‘ fechamos o RecordSet
%>
(ficheiro procura.inc)
<br><div align=”center”>
<table border=”1" cellspacing=”0" cellpadding=”2" width=”400"
bordercolor=”black”><tr bgcolor=”#8AC491"><td>
<FORM action=”default.asp?fazer=procura” method=”POST”>
<font face=”ARIAL” color=”white”>&nbsp;<b>insira a string de procura
</b></font><br>
<input type=”text” name=”textoprocura”
value=”<%=request.form(“textoprocura”)%>” size=”40">
<input type=”image” border=”0" src=”imagens/bprocurar.gif”>
</FORM>
</td></tr></table></div>
Fig. 7.6 - Tabela de procura
192 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro listagem.inc)
<!—#INCLUDE FILE=”funcoes.asp”—><br><font face=”Verdana”
color=”blue”>
Resultado da
procura__________________________________________
</font><br><br>
<%
‘ usamos aqui então a função que está em funcoes.asp para
tirar as plicas
‘ da string que vem do formulário de procura
stringprocura = tira_plicas(request.form(“textoprocura”))
‘ depois da plica retirada fazemos então a declaração de SQL
para procurarmos
‘ a mesma no campo descricao
SQLStmt = “SELECT url, titulo, data, descricao FROM
motorbusca “
SQLStmt = SQLStmt & “ WHERE descricao LIKE
‘%”&stringprocura&”%’”
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = SQLStmt & “ ORDER BY data DESC”
rs.Open SQLstmt,Conn,1,2
if rs.eof then ‘ se chegarmos ao final da BD então nada existe
response.write “<p>&nbsp;</p>”
response.write “<br><br><font face=’Verdana’ size=’2'
color=’blue’><b>”
response.write “Não foram encontrados registos...</b>
</font><br>”
response.write “<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>”
end if
while NOT rs.EOF ‘ seja como for, se existir, vamos mostrar
response.write “<p><font size=’2' face=’ARIAL’>”
response.write “> <b><font size=’3'><a href=’” & rs.fields(“url”)
response.write “‘ target=’_blank’>” & rs.fields(“titulo”) & “</a>
</font></b><br>”
response.write left(rs.fields(“descricao”),400)
response.write “<br><small>submetido em “ & rs.fields(“data”)
response.write “ com o URL <a href=’” & rs.fields(“url”) & “‘
target=’_blank’>”
response.write rs.fields(“url”) & “</a></small><br>”
response.write “</font></p>”
rs.movenext
wend
rs.close
%>
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
194 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<br><br>
<div align=”center”>
<table border=”1" cellspacing=”0" cellpadding=”2" width=”400"
bordercolor=”black”><tr bgcolor=”#8AC491"><td>
<FORM action=”default.asp?fazer=registar&como=fazer” method=”POST”>
<font face=”ARIAL” color=”white”>&nbsp;<b>Insira o URL do site que quer
registar</b></font><br>
<input type=”text” name=”urlsite” value=”http://” size=”52"><br>
<font face=”ARIAL” color=”white”>&nbsp;<b>título do site</b></font>
<input type=”text” name=”titulo” size=”30"><br>
<font face=”ARIAL” color=”white”>&nbsp;<b>breve descrição
</b></font>
<br><textarea name=”descricao” cols=44 rows=3></textarea><br><br>
<center><input type=”image” border=”0" src=”imagens/bregistar.gif”>
</center>
</FORM>
</td></tr></table></div>
<%End Sub
‘ o procedimento seguinte introduz os dados do registo
Sub introduzir_registo()
‘ vamos buscar os dados introduzidos no formulário
urlsite = request.form(“urlsite”) ‘ dados do formulário no campo urlsite
titulo = request.form(“titulo”) ‘ dados do formulário no campo título
descricao = request.form(“descricao”) ‘ dados do formulário no campo
descricao
OK=1 ‘ esta variável vai controlar se aparecem erros
‘ com o valor 1, sabemos que não existem erros
‘ nos dados introduzidos em formulário
if InStr(1, urlsite, “http://”, 1)<>1 then ‘ verificamos se existe http:// na string do url
OK = 0 ‘ se introduzirmos 0 é porque já existe um erro
‘ sempre que OK ficar a zero descrevemos o erro encontrado
Response.write “&nbsp;<font color=’red’> - o link para o site não é
válido</font>”
Else
‘ vamos também certificar-nos do tamanho das strings
‘ pois estas têm de ter os requisitos que quisermos e em
conformidade com a BD
if (len(urlsite)<12 or len(urlsite)>250)then
OK = 0
response.write “&nbsp;<font color=’red’> - o link para o site não é
válido</font>”
end if
end if
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 195
if Len(titulo)<4 or len(titulo)>80 then
OK = 0
response.write “&nbsp;<font color=’red’>”
response.write “ - o título dado para o site não é válido</font>”
end if
if Len(descricao)<12 or len(descricao)>400 then
OK = 0
response.write “&nbsp;<font color=’red’>”
response.write “ - a descrição do site não é válido</font>”
end if
if (procura_repetido(urlsite)) = 1 then
OK = 0
Response.write “&nbsp;<font color=’red’>”
Response.write “ - o site que introduziu já foi registado
anteriormente</font>”
end if
if OK=1 then ‘ se OK=1 então não houve erros, vamos introduzir os dados
em BD
SQLStmt = “INSERT INTO MOTORBUSCA (url, titulo, descricao, data)
VALUES”
SQLStmt = SQLStmt & “(‘“&urlsite&”’, ‘“&titulo&”’,”
SQLStmt = SQLStmt & “ ‘“&descricao&”’, ‘“&now()&”’)”
rs.Open SQLstmt,Conn,1,2
response.write “<p><br><br><font face=’Verdana’ color=’blue’>”
response.write “O site “ & request.form(“urlsite”) & “ foi registado...</font></p>”
else ‘ no caso de haverem erros, voltamos a introduzir o formulário para
preencher
formulario_registo()
end if
End Sub%>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
‘ o nosso argumento é como, e se for fazer vamos introduzir um registo
If request.querystring(“como”)=”fazer” then
Introduzir_registo()
Else ‘ se não for introduzir vamos pedir os dados mostrando o formulário
Formulario_registo()
end if
%>
CAPÍTULO 7: EXEMPLOS REAIS 197
7.3 A Loja: Loja E-Commerce
Este exemplo terá uma estrutura mais complexa devido ao volume
de dados que estarão envolvidos, mas a nível profissional é uma
estrutura muito simples que em nada vai complicar a vida àqueles
que vivem da programação com bases de dados.
A BD terá então de ter uma tabela em que guardaremos a informação de todos os produtos, outra para a informação das encomendas recebidas, e claro a última que guarda a informação dos produtos que pertencem a cada uma das encomendas. Não vamos já
falar da maneira como organizar isso tudo a nível de programação,
mas é necessário o leitor saber o que vai ser usado neste exemplo.
O uso de ficheiros é idêntico ao do exemplo do motor de busca. Só
temos que estruturar a base de dados e definir as funções que vamos precisar em função das nossas necessidades.
Podemos ver que vamos precisar de ter produtos em BD, e temos
de os ter registados. O nome das imagens referentes a cada produto é lv seguido do identificador do mesmo - quando o programador
fizer o interface de administração do lado do servidor terá de ter em
conta este aspecto.
O esquema da base de dados é então:
TABELA: PRODUTOS
Id_produtos
Titulo
Autor
N_Paginas
Isbn
Preco
Mes_edicao
Ano_edicao
introducao
Auto-number; identificador interno da BD de
cada produto
Text (80); título do livro
Text (60); nome do autor (es) do livro
Number; número de páginas do livro
Text (25); numero de fábrica do livro, algo
como os códigos de barras
Number; o preço de venda ao público do livro
Number; o mês em que o livro foi editado
Number; o ano em que saiu o livro
Memo; uma introdução ao livro
198 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
TABELA: ENCOMENDAS
Id_encomenda Auto-number; identificador da encomenda
Data
Date/Time; data em que a encomenda foi
realizada
Nome
Text (50); nome do comprador
Morada
Text (180); morada do comprador
CP
Text (9); código postal do comprador
Localidade
Text (40); localidade
Telefone
Text (10); telefone de contacto do cliente
Email
Text (40); o e-mail do cliente
Total_valor
Number; valor total a pagar
Numero_visa
Text (16); número do cartão de crédito do
cliente
Nome_visa
Text (20); nome do portador do cartão de
crédito que vai pagar a encomenda
Data_visa
Text (5); data de validade do cartão de
crédito
O valor do total da compra é usado nesta tabela para que fique
registado o preço a pagar e não ser precisa uma pesquisa aos
produtos por cada vez que se queira saber o total final.
TABELA: PROD_ENCOMENDAS
Id_prod_encomendas
Auto-number; identificador dos
produtos encomendados referentes a cada
encomenda
Id_encomenda Number; identificador da encomenda na
tabela encomendas
Id_produto
Number; identificador dos produtos
referenciados na tabela produtos
Quantidade
Number; quantidade do produto
encomendada
Preco
Number; preço a que foi comprado o
produto
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 201
Bpagar.gif
ficheiro que representa o botão que se carrega para passarmos à
fase de finalização de pagamento de uma nova encomenda; usado
no ficheiro carrinho.inc
Carrinho.gif
como se pode prever é o desenho do carrinho de compras, que
depois de carregado faz-nos aceder à zona de produtos já escolhidos; é chamado no ficheiro topo.inc
Casa.gif
é o ficheiro que nos encaminha para a página inicial; é chamado no
ficheiro topo.inc
Pagar.gif
faz a chamada da zona onde se vãoi introduzir os dados pessoais
para finalização da compra; é chamado no ficheiro topo.inc
Ficheiros da página,
C:\Inetpub\wwwroot\livro\loja\Default.asp
ficheiro que recebe os argumentos dos formulários ou do campo de
endereço do browser, e consoante o recebido consoante o ficheiro
que é demonstrado na zona central da página;
C:\Inetpub\wwwroot\livro\loja\loja\Funcoes.asp
aqui existe uma função que é usada em mais que um ficheiro, que
tal e qual a do motor de busca é usada para validar as plicas usadas
nas strings, para que quando usarmos a BD não apareçam erros,
visto que as mesmas são usadas pela própria BD. Este código é
idêntico ao do motor de busca;
C:\Inetpub\wwwroot\livro\loja\includes\Fundo.inc
ficheiro com o desenho do fundo do site (estático a 100%);
C:\Inetpub\wwwroot\livro\loja\includes\Inicial.inc
esquema inicial. Se não existirem argumentos no link, será este ficheiro a aparecer;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc
depois de submetida a string de procura, aparecem todos os sites
relacionados, e é este ficheiro que o vai fazer;
202 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
C:\Inetpub\wwwroot\livro\loja\includes\Topo.inc
HTML com o desenho do topo do site (também como o fundo, 100%
estático);
C:\Inetpub\wwwroot\livro\loja\includes\Pagar.inc
local onde são feitos os pagamentos, aquilo a que podemos chamar
de ‘check-out‘;
C:\Inetpub\wwwroot\livro\livro.mdb
ficheiro de base de dados onde figura a tabela de dados que usamos neste exemplo.
A estrutura de directórios foi a usada para o exemplo anterior, mas o
leitor pode fazer alterações na sua estrutura desde que todo o
ambiente o acompanhe. Entendo por ambiente a configuração do
servidor de Internet, a conexão à BD, as referências a páginas, etc.
Agora podemos ver o código de todos os ficheiros e falar da função
de cada procedimento dentro dos mesmos, se esses existirem.
O resultado do ficheiro global.asa a seguir tem também tudo aquilo
que foi introduzido durante este manual, mas está em negrito aquilo
que foi criado exclusivamente para a loja.
O truque está em criar um array, que ficará dentro de uma sessão,
e desta maneira toda a informação do carrinho de compras estará
definida para cada sessão (sempre diferentes e sem possibilidade
de confusão).
Cada vez que for introduzido um produto será verificado o array para
ver se o mesmo já existe, e se existir acrescentamos mais uma
unidade. No caso de se querer introduzir a quantidade, será feita
uma alteração.
Terá de ser feito sempre um redimensionamento do array para o
mesmo funcionar na perfeição, mas isso já vai ser visto.
(ficheiro global.asa)
<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
Sub Application_OnStart
Session.Timeout = 3
Application.Lock
Application(“utilizadores”) = 0
Application.UnLock
Application(“linha1”)=””
Application(“linha2”)=””
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 203
Application(“linha3”)=””
Application(“linha4”)=””
Application(“linha5”)=””
Application(“linha6”)=””
Application(“linha7”)=””
Application(“linha8”)=””
Application(“linha9”)=””
Application(“linha10”)=””
Application(“linha11”)=””
Application(“linha12”)=””
Application(“linha13”)=””
Application(“linha14”)=””
Application(“linha15”)=””
Application(“linha16”)=””
Application(“linha17”)=””
Application(“linha18”)=””
End Sub
Sub Session_OnStart
Application.Lock
Application(“utilizadores”) = Application(“utilizadores”) + 1
Application.UnLock
‘DADOS PARA A LOJA
Dim produtos_id(0), produtos_quantidade(0)
produtos_id(0) = 0 ‘ array de produtos no carrinho de compras
produtos_quantidade(0) = 0 ‘ array com as respectivas quantidades
‘ vamos então introduzir esta informação para as sessões
‘ desta maneira cada sessão terá o seu carrinho e não
‘ existirão confusões entre clientes. São inicializados vazios
session(“matriz_produtos”) = produtos_id
session(“matriz_quantidade”) = produtos_quantidade
‘FORAM DADOS PARA A LOJA
End Sub
Sub Session_OnEnd
Application.Lock
Application(“utilizadores”) = Application(“utilizadores”) – 1
Application.UnLock
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>
204 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
(ficheiro default.asp)
<!—#INCLUDE FILE=”includes/topo.inc”—>
<div align=”center”>
<table width=”600"><tr>
<td align=”top” width=”600">
<%
‘ o sistema de busca dos argumentos é idêntico ao do motor de busca
fazer = Request.QueryString(“fazer”)
Select Case fazer
Case “carrinho” ‘ se for escolhido o carrinho vamos mostrar o carrinho
%>
<!—#INCLUDE FILE=”includes/carrinho.inc”—>
<% Case “pagar” ‘ neste caso o utilizador vai pagar o escolhido %>
<!—#INCLUDE FILE=”includes/pagar.inc”—>
<%
Case “procura” ‘ se houver procura vai-se mostrar a listagem de
resultados
%>
<!—#INCLUDE FILE=”includes/listagem.inc”—>
<%
Case Else ‘ se o argumento não existir mostramos a página inicial
%>
<!—#INCLUDE FILE=”includes/inicial.inc”—>
<%
End Select
%>
</td>
</tr></table></div>
<p>&nbsp;</p>
<!—#INCLUDE FILE=”includes/fundo.inc”—>
Fig. 7.13 - Aspecto da página inicial da Loja
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 205
A seguinte função é idêntica à do motor de busca. É uma função
para que não obtenhamos erro nas declarações de SQL
(ficheiro funcoes.asp)
<%
Function tira_plicas(texto)
texto = trim(texto)
texto_temp = “”
For i=1 to len(texto)
if Mid(texto,i,1)=”’” then
texto_temp=texto_temp & “‘’”
else
texto_temp=texto_temp & Mid(texto,i,1)
end if
Next
tira_plicas = texto_temp
End Function
%>
(ficheiro topo.inc)
<HMTL>
<HEADER>
<TITLE>A Loja - a nova loja on-line feita com ASP</TITLE>
</HEADER>
<BODY>
<div align=”center”><table width=”600">
<tr><td>
<img src=”imagens/topo.jpg”>
</td></tr>
<tr><td>
<center>
<FORM action=”default.asp?fazer=procura” method=”POST”>
<table width=”400" cellpadding=”0" cellspacing=”0" border=”0"><tr>
<td valign=”top”>
<font size=”2" face=”Verdana”><a href=”default.asp”>
<img border=”0" alt=”Voltar à página inicial” src=”imagens/casa.jpg”>
</a>&nbsp;&nbsp;&nbsp;</td>
<td valign=”top”><font size=”2" face=”Verdana”>
<a href=”default.asp?fazer=carrinho”>
<img border=”0" alt=”Ver carrinho de compras”
src=”imagens/carrinho.jpg”></a>&nbsp;&nbsp;&nbsp;</td>
<td valign=”top”><font size=”2" face=”Verdana”>
<a href=”default.asp?fazer=pagar”>
206 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
<img border=”0" alt=”Pagar e sair da loja” src=”imagens/pagar.jpg”>
</a>&nbsp;&nbsp;&nbsp;</td>
<td valign=”top” align=”right”><input type=”text” name=”textoprocura”
value=”<%=request.form(“textoprocura”)%>” size=”12">
<br>
<% ‘ a declaração em ASP anterior é para garantirmos que aparece
‘ na caixa de procura a última string
‘ queremos também manter a última escolha e por isso
‘ vamos comparar os dados deixados pelo formulário anterior
‘ garantindo que os RADIO BUTTONS estejam correctos
if request.form(“tipoprocura”)= “autor” then
autor=”checked” ‘ assim escreveremos checked
else
if request.form(“tipoprocura”)= “titulo” then
titulo=”checked”
else
autor=”checked”
end if
end if
%>
<input type=”radio” <%=autor%> value=”autor” name=”tipoprocura”>autor
<input type=”radio” <%=titulo%> name=”tipoprocura” value=”titulo”>titulo
</td><td valign=”top”>
<input type=”image” border=”0" src=”imagens/bprocurar.jpg”>
</td></tr></table>
</FORM>
</center>
</td></tr>
</table></div>
Fig. 7.14 - Aspecto do ficheiro topo.inc em separado
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 207
Ao acedermos sempre aos dados anteriores (submetidos pelo
formulário), garantimos que nunca perdemos os dados enviados, e
assim deixamos o utilizador saber qual foi a última string de procura
que fez, e de que tipo (autor ou título). Para isso basta que os campos estejam sempre iguais à informação que os mesmos enviaram
na última inserção.
(ficheiro fundo.inc)
<div align=”center”><table width=”600">
<tr bgcolor=”#409AC9"><td>
&nbsp;
</td></tr>
<tr><td>
<center><font size=”2" face=”ARIAL”>(1999) Portugal, todos os direitos
reservados<br>para IE4+ & NN4+</font></center>
</td></tr>
</table></div>
</BODY>
</HTML>
No ficheiro seguinte iremos então mostrar o último produto disponível
pois se todos os dias aparecer algo de novo será uma boa maneira
de o promover.
(ficheiro inicial.inc)
<br><br>
<p><b><font size=”2" face=”Verdana”>Use esta loja online, para procurar
e comprar o livro que tanto procura.
Não se esqueça de que este serviço é gratuito, por isso pode divulgar por
todos os seus amigos.<br>
Agradeço a sua visita e espero que goste...
</font></b></p>
<br><font face=”Verdana” color=”blue”>A mais recente novidade:
</font><br><br>
<%
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
SQLStmt = “SELECT id_produto, titulo, introducao, autor, preco “
SQLStmt = SQLStmt & “FROM produtos ORDER BY id_produto ASC”
rs.Open SQLstmt,Conn,1,2 ‘ foi executada a procura
rs.movelast ‘ vamos mover o cursor para a última posição
response.write “<p><font size=’3' face=’ARIAL’><b>”
208 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
response.write rs.fields(“titulo”) & “</b></font><br>”
response.write “<font size=’2' face=’Verdana’>escrito por <b>”
response.write rs.fields(“autor”) &”</b></font></p>”
response.write “<table><tr><td valign=’top’>”
response.write “<img border=’0’src=’imagens/produtos/lv”
response.write rs.fields(“id_produto”)&”.gif’>”
‘ da maneira anterior iremos imprimir a imagem no ecrã
‘ recorrendo ao identificador da mesma, visto o formato adoptado
‘ para os nomes das imagens ser
‘ sempre o mesmo lv(numero identificador).gif
response.write “<br><center><small><b>”
‘ vamos formatar o nosso número para a moeda local (do servidor)
response.write formatcurrency(rs.fields(“preco”))
response.write “</b></small></center>”
response.write “</font></td><td valign=’top’><font face=’arial’ size=’2'>”
response.write left(rs.fields(“introducao”),400) & “...</font><p>”
response.write “[&nbsp;
<a href=’default.asp?fazer=carrinho&como=adicionar&qual=”
response.write rs.fields(“id_produto”)&”’>”
‘ o argumento qual vai ficar com o identificador do produto
‘ mais tarde usado para introduzir no carrinho de compras
response.write “<font size=’2' face=’Verdana’>adicionar ao carrinho
</a></font>&nbsp;]</p>”
response.write “</td></tr></table>”
rs.close
%>
(ficheiro listagem.inc)
<!—#INCLUDE FILE=”funcoes.asp”—><br><font face=”Verdana”
color=”blue”>
Resultado da
procura__________________________________________
</font><br><br>
<% Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
stringprocura = tira_plicas(request.form(“textoprocura”))
SQLStmt = “SELECT id_produto, titulo, introducao, autor, isbn,” SQLStmt
= SQLStmt & “ mes_edicao, ano_edicao, n_paginas, preco FROM
produtos “
SQLStmt = SQLStmt & “ WHERE “ & request.form(“tipoprocura”)
SQLStmt = SQLStmt & “ LIKE ‘%” & stringprocura & “%’” ‘ da maneira
feita anteriormente é facultado pelo formulário de procura
‘ não só a string, mas o campo da BD que vai ser pesquisado
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 209
‘ e isso porque o VALUE do formulário tem os valores iguais
‘ aos nomes dos campos da base de dados
rs.Open SQLstmt,Conn,1,2
if rs.eof then
response.write “<p>&nbsp;</p>”
response.write “<br><br><font face=’Verdana’ size=’2'
color=’blue’><b>”
response.write “Não foram encontrados registos...</b></font><br>”
response.write “<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>”
end if
conta = 0 ‘ esta variável vai ser utilizada para que as imagens
‘ e disposição dos dados dos produtos alternem de linha em
‘ linha. Mais ou menos como o método usado para a mudança de cor
‘ por cada linha da tabela
while NOT rs.EOF
response.write “<p><font size=’3' face=’ARIAL’><b>”
response.write rs.fields(“titulo”) & “</b></font><br>”
response.write “<font size=’2' face=’Verdana’>escrito por <b>”
response.write rs.fields(“autor”)
response.write “</b><small><i>&nbsp;(ISBN:”&rs.fields(“isbn”)&”)”
response.write “</i></small></font></p>”
response.write “<table><tr>”
if conta = 0 then
response.write “<td valign=’top’><img width=’93' heigth=’103' “
response.write “border=’0’src=’imagens/produtos/lv”
response.write rs.fields(“id_produto”)&”.gif’>”
response.write “<br><center><small><b>”
response.write formatcurrency(rs.fields(“preco”))
response.write “</b></small></center>”
response.write “</td><td valign=’top’>”
response.write “<font face=’arial’ size=’2'>”
response.write left(rs.fields(“introducao”),400)
response.write “...<br><b>(&nbsp;edição de “
response.write rs.fields(“mes_edicao”)&”/”&rs.fields(“ano_edicao”)
response.write ”&nbsp;)</b></font>”
response.write “&nbsp;&nbsp;<small>livro com
“ response.write rs.fields(“n_paginas”) &” páginas.</small><p>”
response.write “[&nbsp;
<a ref=’default.asp?fazer=carrinho&como=adicionar&qual=”
response.write rs.fields(“id_produto”)&”’>”
response.write “<font size=’2' face=’Verdana’>adicionar ao “
response.write “carrinho</a></font>&nbsp;]</p>”
conta = 1 ‘ a partir daqui a próxima disposição será diferente
else
response.write “<td valign=’top’><font face=’arial’ size=’2'>”
210 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
response.write left(rs.fields(“introducao”),400)
response.write “...<br><b>(&nbsp;edição de
“&rs.fields(“mes_edicao”)&”/”
response.write rs.fields(“ano_edicao”)&”&nbsp;)</b></font>”
response.write “&nbsp;&nbsp;<small>livro com “
& rs.fields(“n_paginas”)
response.write “ páginas.</small><p>”
response.write “[&nbsp;
<a href=’default.asp?fazer=carrinho&como=adicionar&qual=”
response.write rs.fields(“id_produto”)&”’>”
response.write “<font size=’2' face=’Verdana’>adicionar ao”
response.write “carrinho</a></font>&nbsp;]</p>”
response.write “</td><td valign=’top’>”
response.write “<img width=’93' heigth=’103' border=’0' ”
response.write
“src=’imagens/produtos/lv”&rs.fields(“id_produto”)&”.gif’>”
response.write “<br><center><small><b>”
& formatcurrency(rs.fields(“preco”))
response.write “</b></small></center>”
conta = 0
end if
response.write “</td></tr></table>”
rs.movenext ‘ move-se para os dados seguintes
wend
rs.close
%>
Fig. 7.15 - Aspecto do site depois de uma
procura por ‘Internet’ em títulos
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 211
(ficheiro carrinho.inc)
<% ‘ este procedimento faz com que vejamos os dados que estão em
carrinho
Sub ver_carrinho()
Produtos_info = session(“matriz_produtos”) ‘ vamos buscar os dados
dos produtos
Quantidade_info = session(“matriz_quantidade”) ‘ e respectivas
quantidades
produtos_num = ubound(produtos_info) ‘ tirar o número de produtos
em carrinho
if produtos_num <1 then ‘ se forem menos de 1 então está vazio
response.write “<p>&nbsp</p><p>&nbsp</p><p><center>”
response.write “<font size=’4' color=’red’>o carrinho ainda está
vazio..</font>”
response.write “</center></p><p>&nbsp</p><p>&nbsp</p>”
exit sub ‘ saimos forçosamente do procedimento
end if
num_produtos = 0
‘ vamos construir a tabela
response.write “<div align=’center’>”
response.write “<table width=’600' border=’1' ”
response.write “ bordercolor=’#409AC9' cellspacing=’0'><tr>”
response.write “<td width=’20'>”
response.write “Qt.”
response.write “</td>”
response.write “<td>”
response.write “ISBN”
response.write “</td>”
response.write “<td>”
response.write “Titulo da Obra”
response.write “</td>”
response.write “<td>”
response.write “Preço”
response.write “</td>”
response.write “<td>”
response.write “Total”
response.write “</td></tr>”
response.write “<form action=’default.asp?fazer=carrinho&”
response.write “como=calcula’ method=’POST’>”
total_preco = 0 ‘ variável que vai calcular o preço total da encomenda
total_produtos = 0 ‘ vai calcular o número total de produtos
‘ não podemos usar o produtos_num pois este diz quantos
‘ produtos diferentes e não quantos produtos (quantidade)
for i=1 to produtos_num
SQLStmt = “SELECT id_produto, isbn, titulo, preco FROM produtos”
212 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
SQLStmt = SQLStmt & “ WHERE id_produto = “ & produtos_info(I)
rs.Open SQLstmt,Conn,1,2
response.write “<tr><td width=’40'><center>”
response.write “<input type=’text’ name=’quant”&i&”’ “
response.write “ value=’” & quantidade_info(i) & “‘ size=2
maxlength=2>”
response.write “</center></td>”
response.write “<td><font face=’arial’ size=’1'>”
response.write rs.fields(“isbn”)
response.write “</font></td>”
response.write “<td><font face=’arial’ size=’2'><b>”
response.write left(rs.fields(“titulo”), 34)
response.write “</b></font></td>”
response.write “<td><font face=’arial’ size=’2'>”
response.write formatCurrency(rs.fields(“preco”))
response.write “</font></td>”
response.write “<td>”
valor = (rs.fields(“preco”) * quantidade_info(i) )
response.write formatCurrency(valor)
response.write “</td></tr>”
‘ aqui vamos actualizando o valor total do preço
total_preco = total_preco + (rs.fields(“preco”)
* quantidade_info(i) )
total_produtos = total_produtos + quantidade_info(I)
rs.close
next
response.write “</table>”
response.write “<p><table width=’460' border=’1' “
response.write “ bordercolor=’#409AC9' cellspacing=’1'><tr>”
response.write “<td bgcolor=’#409AC9'>”
response.write “<font color=’white’ face=’Verdana’ size=’2'>Despesas
com “
response.write “transportes</font><br>”
response.write “<small>(600$00 por encomenda e mais 200$00 “
response.write “por cada livro )</small>”
response.write “</td>”
response.write “<td>”
session(“valor_d”) = (600+ (200*total_produtos)) ‘ esta sessão vai
‘ guardar o valor total por despesas em transportes na variável de
sessão valor_d
response.write formatCurrency(session(“valor_d”))
response.write “</td></tr><tr>”
response.write “<td bgcolor=’#409AC9'>”
response.write “<font color=’white’ face=’Verdana’ size=’2'>TOTAL
</font><br>”
response.write “<small>(transportes + livros)</small>”
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 213
response.write “</td>”
response.write “<td>”
‘ guardar na sessão valor_t, o valor total a pagar pelo cliente
session(“valor_t”) = session(“valor_d”) + total_preco
response.write formatCurrency( session(“valor_t”) )
response.write “</td>”
response.write “</tr></table></p>”
response.write “<p><input type=’image’ border=’0' src=’imagens/
brecalcular.jpg’>”
response.write “<a href=’default.asp?fazer=pagar’>”
response.write “<img border=’0' src=’imagens/bpagar.jpg’></a>”
response.write “</p></form></div>”
End Sub
‘ a seguir vamos criar o procedimento que faz os cálculos,
‘ como quando queremos 10 unidades de um produto e carregamos em
recalcular
Sub calcula()
Produtos_info = session(“matriz_produtos”) ‘ vamos buscar os produtos
em carrinho
Quantidade_info = session(“matriz_quantidade”) ‘ buscar as respectivas
quantidades
Produtos_num = ubound(produtos_info)
Passou = 0 ‘ para controlar se apareceu uma quantidade igual a 0
i = 1 ‘ vamos inicializar I a 1 para percorrermos todo o array
while i <= produtos_num
if passou=0 then
form = request.form(“quant”&i) ‘ vamos buscar o próximo valor do formulário
else ‘ se a quantidade foi igual a 0 então adiantamo-nos uma casa
mais que o usual
‘ pois a posição do momento será igual à próxima
form = request.form(“quant”&I+1)
end if
if int(request.form(“quant”&i))<>0 then ‘ se o valor do formulário for
diferente de 0
nova_quantidade = int(form) ‘ vamos aceder à nova quantidade
quantidade_info(i) = nova_quantidade ‘ introduzi-la no array
else
if (i < produtos_num) then
‘ se ainda não chegámos ao fim incrementamos a quantidade
quantidade_info(i) = quantidade_info(i+1)
for j=i to (produtos_num-1)
quantidade_info(j) = quantidade_info(j+1)
produtos_info(j) = produtos_info(j+1)
214 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
next
passou = 1
end If
‘ como vai ser alterado o tamanho do array o mesmo tem de usar redim
‘ para ser redimencionado
redim Preserve produtos_info(produtos_num-1)
redim Preserve quantidade_info(produtos_num-1)
produtos_num = ubound(produtos_info)
end if
i=i+1
wend
‘ no final actualizamos as sessões
session(“matriz_produtos”) = produtos_info
session(“matriz_quantidade”) = quantidade_info
End Sub
‘ este procedimento adiciona um produto ao carrinho de compras
Sub adicionar(qual)
Produtos_info = session(“matriz_produtos”)
Quantidade_info = session(“matriz_quantidade”)
Produtos_num = ubound(produtos_info)
Temporario = 0 ‘ esta variável temporária vai guardar os valores anteriores
if produtos_num>0 then ‘ se existirem mais de 0 produtos
for I=1 to produtos_num ‘ vamos percorrê-los
if produtos_info(i) = qual then ‘ se acharmos o produto
temporario = I
exit for
end if
next
end if
if temporario = 0 then ‘ se não for achado nenhum produto
temporario = produtos_num + 1 ‘ vamos incrementar uma posição no array
‘ esse incremento é respondido com um redimensionamento do array
redim Preserve produtos_info(temporario)
redim Preserve quantidade_info(temporario)
‘vamso buscar o identificador do produto a acrescentar
produtos_info(temporario) = qual
quantidade_info(temporario) = 1 ‘ o mesmo vai-se inicializar com o
valor 1
else ‘ senão vamos acrescentar uma unidade ao produto que já
existe em array
quantidade_info(temporario) = quantidade_info(temporario) + 1
end if
session(“matriz_produtos”) = produtos_info
session(“matriz_quantidade”) = quantidade_info
End Sub
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 215
‘ o procedimento seguinte escreve um link para se voltar à página anterior
Sub voltar()
Response.write “<p><a href=’javascript:history.go(-1)’>”
Response.write “<font face=’arial’ size=’2'><b>continuar a comprar</b>
</font></a></p>”
End Sub
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
como = Request.QueryString(“como”)
Select Case como
Case “adicionar”
voltar()
adicionar(request.querystring(“qual”))
ver_carrinho()
Case “calcula”
calcula()
ver_carrinho()
Case Else
ver_carrinho()
End Select
%>
depois de algumas escolhas
CAPÍTULO 7: EXEMPLOS REAIS 217
<td></td></tr>
<tr><td width=’150'><font face=’arial’ size=’2'><b>Nome: </b></font></td>
<td><input type=’text’ name=’nome’
value=’<%=request.form(“nome”)%>’ size=’40'></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Morada: </b></font></td>
<td><TEXTAREA name=’morada’ cols=’38'
rows=’2'><%=request.form(“morada”)%></TEXTAREA></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Código Postal: </b></font></td>
<td><input type=’text’ name=’cp’ value=’<%=request.form(“cp”)%>’
size=’20'></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Localidade: </b></font></td>
<td><input type=’text’ name=’localidade’
value=’<%=request.form(“localidade”)%>’ size=’38'></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Telefone: </b></font></td>
<td><input type=’text’ name=’telefone’
value=’<%=request.form(“telefone”)%>’ size=’10'></td></tr>
<tr><td><font face=’arial’ size=’2'><b>E-Mail: </b></font></td>
<td><input type=’text’ name=’email’
value=’<%=request.form(“email”)%>’ size=’30'></td></tr>
<tr><td bgcolor=’#409AC9'><font face=’arial’ color=’white’
size=’2'><b>Dados do Cartão VISA </b></font></td>
<td></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Nome em Visa: </b></font></td>
<td><input type=’text’ name=’nome_visa’
value=’<%=request.form(“nome_visa”)%>’ size=’26'></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Numero em Visa: </b></font></td>
<td><input type=’text’ name=’numero_visa’
value=’<%=request.form(“numero_visa”)%>’ size=’18'></td></tr>
<tr><td><font face=’arial’ size=’2'><b>Validade do Visa: </b></font></td>
<td><input type=’text’ name=’data_visa’
value=’<%=request.form(“data_visa”)%>’ size=’5'>&nbsp;(MM/AA)
</td></tr>
</table></td></tr></table>
<p><input type=’image’ border=’0' src=’imagens/bfinalizar.jpg’>
</p></form></div>
<%End Sub
‘ esta função vai validar os dados introduzidos pelo utilizador
Function validar()
OK = 1
if len(request.form(“nome”)& “<br>”)<6 or len(request.form(“nome”)&
“<br>”)>50 then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp; “
response.write “o nome está inválido</font><br>”
OK = 0
218 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
end if
if len(request.form(“morada”))<10 or len(request.form(“morada”))>180
then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp;”
response.write “ a morada não é válida</font><br>”
OK = 0
End if
if len(request.form(“cp”))<4 or len(request.form(“cp”))>9 then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp; “
response.write “o Código Postal não é válido</font><br>”
OK = 0
end if
if len(request.form(“localidade”))<3 or len(request.form(“localidade”))>40
then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp;”
response.write “ a Localidade não é válida</font><br>”
OK = 0
end if
if len(request.form(“telefone”))<9 or len(request.form(“telefone”))>10 then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp;”
response.write “ o Telefone não é válido</font><br>”
OK = 0
end if
if len(request.form(“numero_visa”))<>16 then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp;”
response.write “ o número do Visa está incorrecto</font><br>”
OK = 0
End if
if len(request.form(“nome_visa”))<3 or len(request.form(“nome_visa”))>20
then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp; o nome do
utilizador do Visa não foi aceite</font><br>”
OK = 0
End if
if len(request.form(“data_visa”))<>5 then
response.write “<font face=’arial’ color=’red’>&nbsp;&nbsp;”
response.write “ A data do Visa não está correcta</font><br>”
OK = 0
End if
Validar=OK
End Function
‘ depois de tudo validado é executado o seguinte procedimento
Sub efectuar()
SQLStmt = “INSERT INTO ENCOMENDAS (data, nome, morada, cp, “
SQLStmt = SQLSmt & “localidade, telefone,”
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 7: EXEMPLOS REAIS 219
SQLStmt = SQLStmt & “ email, total_valor, numero_visa, nome_visa,
data_visa)”
SQLStmt = SQLStmt & “ VALUES( ‘“&now()&”’,
‘“&request.form(“nome”)&”’,”
SQLStmt = SQLStmt &
“‘“&request.form(“morada”)&”’,’”&request.form(“cp”)&”’,”
SQLStmt = SQLStmt &
“‘“&request.form(“localidade”)&”’,’”&request.form(“telefone”)&”’,”
SQLStmt = SQLStmt & “‘“&request.form(“email”)&”’, “&session(“valor_t”)&” ,”
SQLStmt = SQLStmt & “‘“&request.form(“numero_visa”)
SQLStmt = SQLStmt & “‘,’”&request.form(“nome_visa”)&”’,”
SQLStmt = SQLStmt & “‘“&request.form(“data_visa”)&”’ )”
rs.Open SQLstmt,Conn,1,2
SQLStmt = “Select id_encomenda from encomendas”
rs.Open SQLstmt,Conn,1,2
rs.movelast ‘ depois de introduzido vamos buscar o identificador do mesmo
ultima_encomenda = rs.fields(“id_encomenda”)
rs.close
produtos_info = session(“matriz_produtos”)
quantidade_info = session(“matriz_quantidade”)
produtos_num = ubound(produtos_info)
num_produtos = 0
total_preco = 0
total_produtos = 0
for i=1 to produtos_num
‘ vamos buscar por cada produto o seu preço
SQLStmt = “SELECT preco FROM produtos”
SQLStmt = SQLStmt & “ WHERE id_produto =
“ & produtos_info(i)
rs.Open SQLstmt,Conn,1,2
valor = (rs.fields(“preco”) * quantidade_info(i) )
rs.close
SQLStmt = “INSERT INTO prod_encomendas (id_encomenda, “
SQLStmt = SQLStmt & id_produto, quantidade, preco)
VALUES”
SQLStmt = SQLStmt &
“(“&ultima_encomenda&”,”&produtos_info(i)&”,”
SQLStmt = SQLStmt & quantidade_info(i)&”,”&valor&”)”
rs.Open SQLstmt,Conn,1,2
next
response.write “<p>&nbsp</p><p><br><br><font face=’Verdana’
color=’blue’>”
response.write “A sua encomenda foi processada...</font></p>”
response.write “<p>&nbsp</p><p>&nbsp</p><p>&nbsp</p>”
session.Abandon ‘ vamos abandonar a sessão depois de ser feita a
compra
220 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES
‘ começando assim uma sessão nova
End Sub
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.open “DSN=livrodsn;”
Set rs = Server.CreateObject(“ADODB.Recordset”)
como = Request.QueryString(“como”) ‘ vamos buscar o argumento
Select Case como
Case “efectuar” ‘ neste caso é efectuada a compra
if (validar()=1) then ‘ se os dados ficarem validados efectua-se a
compra
efectuar()
else
formulario() ‘ senão, é mostrado novamente o formulário
end if
Case Else
Formulario() ‘ sempre que não há argumento é mostrado o formulário
End Select
%>
A imagem seguinte demonstra como somos abordados ao entrar
na zona de pagamento.
Fig. 7.18 - Introdução de dados para finalizar compra
Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
Agradecimentos:
Queria agradecer a todos aqueles que ajudaram na minha formação e
percurso profissional, onde estão incluídos: Manuel Pacheco Vieira, José
Fernando Silva, Pedro Tiago Pereira e Carlos Dias.
No estrangeiro tive o apoio de duas pessoas que me apoiaram nos meus
artigos e acreditaram nas minhas capacidades, são eles Scott Mitchell
(www.4guysfromrolla.com) e Stephen Wynkoop (www.swynk.com).
Agradeço também às centenas de pessoas que me enviam mensagens para o
e-mail todos os meses, a pedir esclarecimentos técnicos ou a agradecer pelo
código que tenho disponível no meu site (www.joaovieira.com).
A nível pessoal agradeço então às peças fundamentais na minha vida, os meus
pais, avós, Tânia Penedo e à dupla Jujinha & Ritinha.
Colecção O Melhor da Internet
Os melhores sites nacionais e internacionais
da Internet organizados por profissão
ou área de interesse
Colecção Sociedade da Informação
Os temas de fundo da Sociedade da
Informação apresentados pelos maiores
especialistas nacionais
Colecção Tecnologias
Todas as tecnologias de destaque da
Internet tratadas pela equipe de técnicos
do Centro Atlântico
Colecção Direito das Novas Tecnologias
A nova economia, dependente das tecnologias
da informação, traz consigo novos desafios e
ameaças.
Quais as respostas dos nossos Juristas, tribunais,
compêndios e legislação?
Colecção Desafios
O que nos reservam os tempos que se aproximam
em que as novas tecnologias invertem muitas das
certezas adquiridas
Colecção Soluções
Soluções práticas para resolver novas
questões levantadas pelas tecnologias
da sociedade da informação
nc
t o do Centro
C ntr o Atlântico
tâ
a p
e
r esta
s
Para encomendar
qualquerr título
queira
preencher
me
e
l por
or fax
fa ou correio
or i com
m o seu
u pa
me
folha de e
encomenda
e enviá-la
pagamento.
Título
Q n
Quant.
Pr
ç
Preço
Total
otal
O Melhor da Internet para o Direito
O Melhor da Internet para Informáticos
O Melhor da Internet para Engenheiros
O Melhor da Internet para o Marketing
O M.Internet p/ Gestores e Empresários
_____
_____
_____
_____
_____
*
*
*
*
*
Colecção Sociedade da Informação
Crónicas da InforFobia
Homo Conexus
* Ano 2000 e Informática
_____ * 1.800$ = ______
_____ * 1.950$ = ______
_____ * 1.950$ = ______
Colecção Tecnologias
* Guia do Internet Explorer versão 4
* Guia do Internet Explorer versão 5
* Guia do Netscape Communicator v 4
Agentes Inteligentes
TOP 100 Internet 1999
_____
_____
_____
_____
_____
*
*
*
*
*
950$
950$
950$
950$
950$
=
=
=
=
=
2.950$
2.950$
2.950$
2.950$
2.450$
_______
_______
_______
_______
_______
=
=
=
=
=
______
______
______
______
______
Colecção Direito das Novas Tecnologias
Direito da Informática nos tribunais .pt _____ * 2.450$ = ______
Colecção Desafios
Vertigem - Tendências para o Séc. XXI _____ * 4.950$ = ______
O Futuro da Internet
_____ * 2.950$ = ______
Colecção Soluções
O Vírus do ano 2000
O Guia do Telemóvel: 99 sugestões
_____ * 1.600$ = ______
_____ * 1.250$ = ______
* Inclui CD-ROM
TOTAL = ________
Sem Despesas de envio
As encomendas directas ao Centro Atlântico não pagam custos de portes.
SIM, desejo receber os títulos que assinalei sem qualquer despesa de envio.
• Junto envio cheque/Vale nº ____________ à ordem do Centro Atlântico
• Prefiro que debitem no meu cartão de crédito emitido em nome de
_______________________________
Número do cartão de crédito _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Validade _ _ / _ _
Nome
___________________________________________
Morada ___________________________________________
CP
________
Localidade ______________________
Tel
________________
Fax ____________________
Caso alguns dos títulos não estejam disponíveis enviaremos os que existirem em
stock e pediremos confirmação no futuro para envio dos títulos em falta.
Centro Atlântico - Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Fax. 21 - 321 01 85 ou 22 - 938 56 30
www.centroatlantico.pt/titulos
Colecção O Melhor da Internet

Documentos relacionados