Programação Web com ASP - Active Server Pages

Tamanho: px
Começar a partir da página:

Download "Programação Web com ASP - Active Server Pages"

Transcrição

1 Centro Atlântico Programação Web com ASP - Active Server Pages

2

3 João Vieira Centro Atlântico Programação Web com ASP - Active Server Pages Edições Centro Atlântico Portugal/2000

4 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, Matosinhos Tel /9 Fax Rua da Misericórdia, Lisboa Tel Fax Portugal Fotolitos: Centro Atlântico Impressão e acabamento: Rolo & Filhos 1ª edição: Janeiro de 2000 ISBN: Depósito legal: /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 Home- Pages pretendidas.

5 Dedico este livro aos meus pais, Maria de Jesus S. R. Sousa Vieira, António Tiago Vieira

6

7 Índice 1. Introdução às Active Server Pages 1.1 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 Expressões e Operadores 2.1 Os primeiros passos Exemplo: Olá Portugal Exemplo: Olá Portugal com variável Exemplo: Cálculo de variáveis Exemplo: Código ASP embebido em HMTL IF, THEN, ELSE, END IF Exemplo: Comparação entre variáveis FOR, WHILE, CASE Exemplo: Comparação de variáveis com ciclos Exemplo: Select Case Exemplo: Contadores ASP embebidos em HMTL Exemplo: HMTL embebido em contadores ASP Variáveis Tabela de Operadores Exemplo: Comparação de variável entre valores Exemplo: Utilização de todos os operadores 38

8 3. Funções 3.1 Tabela de funções base das ASP As nossas funções Exemplo: Nº dias até o ano Exemplo: Validar o Exemplo: Criar uma ComboBox a partir de um array Exemplo: Criar um gráfico em HTML a partir de um array Uso de SSI (Server Side Includes) com as nossas funções Exemplo: Uso de um ficheiro externo com SSI Exemplo: Ficheiro com todas as funções Exemplo: ASP que usa o ficheiro com todas as funções Objectos 4.1 Tabela de Objectos Variáveis globais e de sessão Interagir com o utilizador Exemplo: Responder ao utilizador com os dados recolhidos Exemplo: Validar formulário Exemplo: Curso online Exemplo: Protecção de páginas com password Ficheiro global.asa Exemplo: Quantos utilizadores estão a visitar a página Exemplo: Chat em Browser Cookies, dados do utilizador e do servidor Exemplo: Recolher dados do utilizador Exemplo: Páginas personalizadas Formatação de strings 108

9 5. Bases de dados 5.1 Bases de Dados / SQL Construir uma base de dados em Microsoft Access Conexão à base de dados Inserir, apagar e actualizar dados em bases de dados Exemplo: Inserir dados Exemplo: Eliminar dados Exemplo: Actualizar dados Apresentação de dados Exemplo: Listar dados em tabela Exemplo: Listar dados com imagens Exemplo: Listar dados a pedido Exemplos com bases de dados Exemplo: Livro de Visitas Exemplo: Sondagens de opinião Componentes 6.1 Introdução aos Componentes Tratamento de ficheiros de texto com o TextStream Exemplo: História sem fim Exemplo: Contador de acessos Componentes de Exemplo: Envio de com attachment Criar componentes em Visual Basic Exemplo: Componente Livro de Visitas Exemplos reais 7.1 Introdução A Rã: Motor de Busca A Loja: Loja E-Commerce 197

10 Rece Re Peça gratuitamente o seu e-book Receba gratuitamente, por , 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 geral@centroatlantico.pt ou por correio para, Centro Atlântico Ap V. N. Famalicão

11 Introdução às Active Server 1 Pages 1.1 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 23

12 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 ( e 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'

13 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.

14 14 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Esquema geral do funcionamento das ASP Não existem requisitos em relação aos browsers a usar para aceder aos sites criados em ASP, pois todo o código é interpretado pelo servidor de Internet, e aquilo que chega ao utilizador final é puro HTML gerado pelas ASP. Com a experiência, e futuros testes, vai entender todos estes aspectos que tenho vindo a mencionar. A nível de hardware, o programador tanto pode ter o seu computador pessoal em casa para trabalhar nos exemplos deste livro, como trabalhar directamente no próprio servidor online. O importante é que a partir do momento que disponibilize a sua página online, opte em vez do PWS (Personal Web Server), pelo IIS (Internet Information Server), pois este é mais seguro, mais potente, e suporta melhor múltiplos sites, além de que para controlar os acessos, configurar e controlar o seu servidor de Internet necessita mesmo do IIS (por isso indicado para situações a nível profissional). Todo o código que é criado em PWS funciona em IIS, quando não são usados componentes externos (DLL); a partir desse momento é necessário instalar os mesmos na máquina para onde se está a exportar o código. De outra forma, basta o leitor copiar os ficheiros que criou para um ou outro sistema, que o mesmo aceita e interpreta da mesma maneira. Claro que tem de ter em atenção outros aspectos como a localização das bases de dados, as suas conexões, e componentes extra (tudo isto visto nos próximos capítulos). Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'

15 CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 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( ) </SCRIPT> Este código formata o valor 10000, para que fique $00.

16 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'

17 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 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 ; aparecer-lhe-ão informações do PWS, da mesma maneira que se escrevesse no address link do seu browser localhost.

18 18 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Página principal do servidor Internet PWS, depois de instalado Mas para os exemplos deste livro eu criei um directório semi-virtual para trabalhar os meus ficheiros. Para tal segui os seguintes passos: 1. Criar um directório dentro de c:\inetpub\wwwroot\ (ex. c:\inetpub\wwwroot\livro\) 2. Entrar na consola do PWS 3. Parar os serviços, clicando em Stop 4. Clicar no icon da lista da esquerda que tem o nome de Advanced 5. Carregar em Add para se acrescentar novo directório semi-virtual 6. Em Directory Fazer browse até ao directório criado na linha Em Alias escrever o nome a usar logo a seguir de (ex. livro) 8. Carregar em OK 9. Na lista do lado esquerdo, carregar em Main 10. Reiniciar os serviços de Internet, carregar em Start 11. Fica então instalado o primeiro servidor virtual Internet no seu PC (ex. Não se esqueça de que os ficheiros de ASP só funcionam dentro do directório que é criado para esse destino, e configurado por defeito ou por si. Mas tudo isto está acessível nos manuais do software. Irei então começar a demonstrar o aspecto do código 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'

19 CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 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 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'

21 CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 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 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= ><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= ><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'

23 CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 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: 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.

24 24 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Este é também daqueles que todos os que estão dentro do assunto conhecem. Tem muitos artigos, de vários tipos, e um motor de busca que vai pesquisar vários sites de ASP. Este site, no início, era dos melhores, tinha muita informação e muito bem estruturada. Está vocacionado para tudo o que tiver a haver com Windows NT, e devido ao IIS4 também tem muito bons artigos de ASP. Tenho uma coluna minha lá, onde poderá recolher algumas ideias de ASP. Este site cresceu muito, e muito depressa, por isso julgo ser a causa dos atrasos na sua actualização. Indiscutivelmente um site a não perder. Foi também graças a este site que consegui alcançar os objectivos, nas empresas onde trabalhei com ASP. Tem muita informação, artigos e código. Se por lá passar vai notar que tenho lá alguns artigos. Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'

25 CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 25 É um grupo de sites, que se dedicam às ASP, tem também muitos recursos, apesar de estarem a ser ultrapassados por sites mais recentes como o Aspin. Este site é bastante recente e já cheguei a visitá-lo quase todos os dias. Está muito bem organizado e tem bastantes temas por onde pode pesquisar. Este é daqueles sites que quando começar a programar ASPs com alguma assiduidade irá com certeza visitar. Eles obrigam os seus autores a escreverem os artigos em exclusividade, sendo por isso daqueles sites onde os artigos lá publicados não são lidos em mais lado nenhum.

26

27 Expressões e Operadores Os primeiros passos Exemplo: Olá Portugal Exemplo: Olá Portugal com variável Exemplo: Cálculo de variáveis Exemplo: Código ASP embebido em HMTL IF, THEN, ELSE, END IF Exemplo: Comparação entre variáveis FOR, WHILE, CASE Exemplo: Comparação de variáveis com ciclos Exemplo: Select Case Exemplo: Contadores ASP embebidos em HMTL Exemplo: HMTL embebido em contadores ASP Variáveis Tabela de Operadores Exemplo: Comparação de variável entre valores Exemplo: Utilização de todos os operadores 38

28 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). <%response.write Olá Portugal %> (ficheiro cpt2-1-1.asp) 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. <% pais = Portugal response.write Olá & pais %> (ficheiro cpt2-1-2.asp) 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 &

29 CAPÍTULO 2: EXPRESSÕES E OPERADORES 29 Fig Resultado dos ficheiros cpt1-4-1.asp e cpt1-4-2.asp Se quisermos usar variáveis numéricas, e calcular algo com elas, temos então o exemplo seguinte: <% a = 10 b = 2 response.write a * b %> (ficheiro cpt2-1-3.asp) Como já deve ter verificado, este tipo de linguagem usa variáveis (também elas dinâmicas) que não necessitam de inicialização, podendo ser criadas em qualquer momento. Apesar de haver uma maneira em que o é obrigado a fazer (com Explicit) mas só se assim o definir. Outro ponto bastante agradável é de que não necessita de marcadores para definir o final de cada linha. Por exemplo, em a=10. Não é necessário ponto e vírgula ou outro qualquer marcador para terminar uma linha de código. (ficheiro cpt2-1-4.asp) <% iniciar a variável cptvar= passear %> <HTML> <BODY> <FONT SIZE= 6 >Eu hoje fui <%=cptvar%>, para o Alentejo </FONT> </BODY> </HTML>

30 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. <% 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 %> (ficheiro cpt2-2-1.asp)

31 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 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.

33 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.

34 34 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Resultado do ficheiro cpt2-3-3.asp (ficheiro cpt2-3-4.asp) <% contador = 1 while contador<8 %><FONT face= ARIAL size= <%=contador%> >TESTE</FONT><BR> <%contador=contador + 1 wend %> Neste caso, foi-se alterar uma opção das Tags de HTML, para que não fosse preciso repetir a mesma 8 vezes. Este é já um pensamento a seguir pelo programador de ASP - tentar evitar escrever muitas linhas de código, e sim optimizar ao máximo todas as funções que vier a criar. Fig Resultado do ficheiro cpt2-3-4.asp

35 CAPÍTULO 2: EXPRESSÕES E OPERADORES 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 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.

37 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: <% a = 10 b = 20 c = Teste If a > 9 AND a <=20 then Response.write (a) está entre 9 e 20 <br> End if %> (ficheiro cpt2-5-1.asp) Nos operadores aritméticos temos então uma outra tabela: TIPO DE OPERADOR ^ DESCRIÇÃO Usado para expoente, (Para o caso de 2 6, 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 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 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.

39 Funções Tabela de funções base das ASP As nossas funções Exemplo: Nº dias até o ano Exemplo: Validar o Exemplo: Criar uma ComboBox a partir de um array Exemplo: Criar um gráfico em HTML a partir de um array Uso de SSI (Server Side Includes) com as nossas funções Exemplo: Uso de um ficheiro externo com SSI Exemplo: Ficheiro com todas as funções Exemplo: ASP que usa o ficheiro com todas as funções 58

40 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 Abs() Array() Descrição Esta função serve para devolver números absolutos, sejam eles de que tipo forem. Ex. variavel = Abs(23.34) devolve variavel = Abs(-23.34) devolve 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

41 CAPÍTULO 3: FUNÇÕES 41 Asc() Atn() CBool() CByte() CCur() CDate() CDbl() Chr() CInt() CLng() Devolve o número ASCII de um caracter Ex. variavel1 = Asc( C ) devolve 67 variavel2 = Asc( 1 ) devolve 49 Serve para calcular o arco-tangente de um valor Ex. Atn(1) devolve 0, 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 Transforma qualquer valor (do tipo não Byte) para o tipo Byte Ex. CByte( ) devolve 225 Idêntico a CByte(), mas neste caso para o tipo de moeda usado. 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 Converte um valor (do tipo não Double) para o tipo Double 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 Converte um valor (do tipo não Intenger) para o tipo Integer Converte um valor (do tipo não Long) para o tipo Long Cos() Devolve o coseno de um ângulo

42 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() CStr() Date() DateAdd() DateDiff() Converte um valor (do tipo não Single) para o tipo Single Converte um valor (do tipo não String) para o tipo String Ex. CStr(123) devolve uma string 123 Devolve a Data corrente no servidor Internet Ex. response.write Date() 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 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

43 CAPÍTULO 3: FUNÇÕES 43 DatePart() DateSerial() DateValue() Day() Exp() Filter() É 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 Devolve uma data para especificados ano, mês e dia Devolve uma data válida daquela que é pedida Devolve o dia do mês de uma data Ex. Day( 31-Set-2000 ) devolve 31 Devolve a exponencial de um valor 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 $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() Hex() Hour() InStr() Devolve a referência a um objecto Transforma um valor para resultado hexadecimal Devolve a hora de uma expressão Ex. Hour(Now()) devolve a hora do momento 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 44 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES InStrRev() IsArray() IsDate() IsEmpty() IsNull() IsNumeric() IsObject() Join() LBound() LCase() Left() Len() 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 Devolve True ou False em relação a uma variável, validando-a no caso de ser ou não um array Devolve True ou False em relação a uma string, validando-a no caso de esta ser do tipo Date ou não Valida uma variável, para ver se a mesma está ou não vazia Valida uma variável para ver se a mesma é Null ou não Valida uma string/valor para ver se o mesmo é numérico ou não Valida um Objecto, certificando-se se o mesmo o é ou não 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. Devolve o menor valor da dimensão de um array 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 Devolve o tamanho de uma string Ex. Len( Vamos programar ASP. ) devolve 20

45 CAPÍTULO 3: FUNÇÕES 45 Log() LTrim() Mid() Minute() Month() MonthDate() Now() Oct() Replace() RGB() Right() Rnd() Round() Devolve o logaritmo de um dado número Devolve uma string sem espaços do lado esquerdo Ex. LTrim( Isto é um teste. ) devolve Isto é um teste. 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 Devolve o minuto de uma data/hora 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 Devolve o nome do mês (por extensão) Ex. MonthDate(10) devolve Outubro Devolve a data e hora corrente Devolve o valor octal de um dado número Altera certo caracter/string por outro dado Ex. replace( yyxiixppx22fxjx, X, P ) devolve yypiipppp22fpjp 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 Funciona como a função Left() mas a contar da direita Retorna um valor aleatório Faz arredondamento a valores numéricos Ex. Round(23,77) devolve 24

46 46 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Second() Sgn() Sin() Space() Split() Sqr() StrComp() StrReverse() String() Tan() Devolve os segundos de uma dada hora Devolve o sinal de um valor Ex. Sgn(2) devolve 1 Sgn(-12) devolve 1 Sgn(0) devolve 0 Devolve o seno de um ângulo indicado Introduz um dado número de espaços numa string Ex. response.write Teste & Space(12) & Feito devolve Teste Feito 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. Devolve a raiz quadrada de um valor 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 Devolve uma string dada, invertendo-a Ex. StrReverse( ) devolve Devolve repetidamente um caracter escolhido um número de vezes definido Ex. String( C,10) devolve CCCCCCCCCC Devolve a tangente de um determinado número

47 CAPÍTULO 3: FUNÇÕES 47 Time() TimeSerial() TimeValue() TypeName() UBound() Ucase() VarType() WeekDay() Devolve a hora do sistema Devolve uma hora para hora, minuto e segundos especificados Devolve uma hora válida daquela que é pedida 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 Devolve o maior valor da dimensão de um array Devolve uma string em upper case Ex. LCase( Estamos em Setembro. ) devolve ESTAMOS EM SETEMBRO. 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 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 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 %>

49 CAPÍTULO 3: FUNÇÕES 49 Foram usadas as seguintes funções: IsDate() para nos certificarmos se a dada data tinha realmente um formato válido de data; DateDiff() 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 ); Now() 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 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 é 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 s introduzidos sejam o mais correctos.

50 50 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt3-2-2.asp) <% Function valmail( ) início da função se o tamanho do for menor que 5 dificilmente será válido(a@a.c) If Len( ) <= 5 Then Valmail=False else se não existir também não é válido If InStr(1, 1) < 2 Then valmail=false Else o ponto final é também importante If InStr(1, ,., 1) < 4 Then Valmail=False Else Valmail=True End If End If End If End Function final da função if valmail( o_meu_ @algum_ .com ) then Response.Write O o_meu_ @algum_ .com é válido.<br> Else Response.Write O o_meu_ @algum_ .com não é válido.<br> End if if valmail( tentar@iludir ) then Response.Write O tentar@iludir é válido.<br> Else Response.Write O 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 normal InStr() muito usado para nos certificarmos da existência do 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 s que receber como input.

51 CAPÍTULO 3: FUNÇÕES 51 Fig Resultado do ficheiro cpt3-2-2.asp Como se pode ver mais nitidamente na figura, os s que foram usados para testar foram validados correctamente, pelo menos dentro das regras que foram pré-definidas. O leitor pode alterar as regras para a validação do . Outro ponto que por vezes nos toca é referente à criação dinâmica de ComboBox. Estas caixas, usadas em formulários do HTML, têm um aspecto conhecido por todos os programadores: carrega-se num botão que faz aparecer uma lista com várias opções. Neste exemplo será criada uma função para criar essa caixa (ComboBox) a partir de um array. No capítulo de bases de dados, esta mesma função é alterada para se poder criar com dados retirados de uma base de dados real. Neste momento é criada uma ComboBox. O código HTML é simples de se perceber. Em relação ao ciclo FOR, este vai-se repetindo enquanto não chegar ao limite do tamanho do Array com a função Ubound().

52 52 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <%@ Language= VBScript %> <% Function criacaixa() %><select size= 1" name= nome ><% For I=0 to UBound(ardados) %> <option><%=ardados(i)%></option> <% Next %></select><% End Function (ficheiro cpt3-2-3.asp) Dim ardados(3) inicialização de array Ardados(0) = Alentejo Ardados(1) = Minho Ardados(2) = Algarve Ardados(3) = 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 Resultado do ficheiro cpt3-2-3.asp

53 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() %>

54 54 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Os gráficos foram criados de uma maneira mais primária por assim dizer, pois existe a hipótese de se utilizar componentes comerciais que criam ficheiros de extensão GIF em tempo real com todo o tipo de gráficos que se podem encontrar, por exemplo, no Microsoft Excel. Desta maneira, os gráficos são de barras e muito mais rápidos a processar. Fig Resultado do ficheiro cpt3-2-4.asp Como se pode ver pela imagem, o gráfico é coerente, e as barras percebem-se bastante bem. O programador pode controlar melhor o tamanho do gráfico, pode usar imagens ou mesmo outras cores. A imagem que podemos ver é o resultado do gráfico no Internet Explorer (IE). No Netscape o resultado é algo diferente, mas isso tem a haver com a maneira como esse traduz o código HTML em relação às tabelas. Mas no resultado percebe-se sempre o mesmo, por isso não existem problemas em usar este tipo de código para gerar gráficos de barras. 3.3 Uso de SSI (Server Side Includes) com as nossas funções Os SSI, vão ser certamente algo que o leitor vai usar bastante, pois além de poder separar o código HTML em vários ficheiros, e estruturar a página principal da maneira que lhe convém (dinamicamente), pode ter algo como que uma biblioteca de funções própria. Digamos que o programador tem várias funções que usa normalmente nos sites

55 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.

56 56 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Depois de criado um ficheiro para os topos de todas as páginas ASP, criamos um ficheiro como exemplo para usar esse outro. É um ficheiro simples, que serve apenas para demonstrar as potencialidades do uso de SSI. (ficheiro cpt3-3-1.asp) <! #INCLUDE FILE= cpt3-3-1.inc > <p> Aqui poder-se-á escrever qualquer código HTML,<br> ou até mesmo de ASP. </p> Fig Resultado do ficheiro cpt3-3-1.asp Para perceber melhor a grande vantagem das SSI vamos criar um ficheiro ASP com todas as funções que foram criadas neste capítulo, e usá-las todas na mesma página, sem termos de ter todo o código das funções na ASP que programamos.

57 CAPÍTULO 3: FUNÇÕES 57 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 (ficheiro cpt3-3-2.asp) Function valmail( ) If Len( ) <= 5 Then valmail=false else If InStr(1, 1) < 2 Then valmail=false Else If InStr(1, ,., 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 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 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_ @algum_ .com ) then Response.Write O o_meu_ @algum_ .com é válido.<br> Else Response.Write O o_meu_ @algum_ .com não é válido.<br> End if if valmail( tentar@iludir ) then Response.Write O tentar@iludir é válido.<br> Else Response.Write O 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 %>

59 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 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.

60

61 Objectos Tabela de Objectos Variáveis globais e de sessão Interagir com o utilizador Exemplo: Responder ao utilizador com os dados recolhidos Exemplo: Validar formulário Exemplo: Curso online Exemplo: Protecção de páginas com password Ficheiro global.asa Exemplo: Quantos utilizadores estão a visitar a página Exemplo: Chat em Browser Cookies, dados do utilizador e do servidor Exemplo: Recolher dados do utilizador Exemplo: Páginas personalizadas Formatação de strings 108

62 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 Response Métodos e suas funções 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.

63 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 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 TextStream 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. CreateTextFile método de criação de ficheiros de texto. OpentextFile método de leitura dos ficheiros de texto.

65 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 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 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.

67 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.

68 68 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt4-2-3.asp) Podemos ver que a variável de sessão trazida da página anterior é <strong><font face= ARIAL color= RED size=3><%=session( Teste )%> </font></strong> Aqui nada de novo a não ser a maneira como foi acedida a sessão criada no ficheiro anterior. Não parece nada de especial mas de certeza que vai usar muitas vezes nas suas páginas ASP. Nos seminários da Microsoft, os seus apresentadores aconselham sempre o mínimo uso destas variáveis, para que não atrapalhem a performance do servidor Web. Não aconselho que isto seja levado à risca, mas se estiver de posse de um servidor que tem uma média de acessos diários, aí a recomendação da Microsoft deve ser levada mais a sério. Caso contrário, e por experiência própria, não existem motivos de preocupação se usar este tipo de variáveis em excesso. Fig Resultado do ficheiro cpt4-2-2.asp Fig Resultado do ficheiro cpt4-2-3.asp

69 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 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 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 Application( Teste2 ) Application.UnLock serve para trancar a variável aos utilizadores, de maneira a poder ser alterada a variável; da mesma maneira que se usa as Sessions, pode-se criar uma variável e aceder à mesma; usado para depois que é alterada a variável, tirando o Lock. Fig Resultado do ficheiro cpt4-2-4.asp

71 CAPÍTULO 4: OBJECTOS 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 Application( Teste2 ) Application.UnLock serve para trancar a variável aos utilizadores, de maneira a poder ser alterada a variável; da mesma maneira que se usa as Sessions, pode-se criar uma variável e aceder à mesma; usado para depois que é alterada a variável, tirando o Lock.

72 72 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt4-3-1.asp) 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>! Foram usados os seguintes objectos e funções: Request.Form(...) mecanismo para ir buscar os dados que vinham do formulário anterior onde estava o método POST. Fig Resultado do ficheiro cpt4-3-1.html Nesta primeira imagem vemos o formulário em que o utilizador vai introduzir os seus dados, e temos a imagem que mostra os dados que o mesmo disponibilizou. Fig Resultado do ficheiro cpt4-3-1.asp

73 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 Resultado inicial do ficheiro cpt4-3-2.asp

74 74 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Resultado final do ficheiro cpt4-3-2.asp Como se pode ver por estas duas últimas imagens, o resultado é o mesmo, com a grande diferença que neste segundo exemplo usamos sempre o mesmo ficheiro. Isto pode ser bom para poupança de recursos, mas para sites com muitos acessos pode dar os seus problemas, visto que com muitos acessos deve-se separar o mal pelas aldeias, e ter vários ficheiros ASP a tratar dos dados. Já foi visto como criar um formulário, como obter os dados aí criados, como os mostrar no browser, mas, falta ainda, tratar os dados e validá-los de forma aos mesmos preencherem os requisitos que pretendemos para uma qualquer aplicação. Digamos que temos um site que serve para simular uma atribuição de bolsa de estudo. Pretendemos o nome do aluno, a data de nascimento, a média do último ano e o rendimento mensal dos pais. Vamos criar uma fórmula (de forma alguma a usada na realidade), onde todos os alunos online podem ficar a saber se vale a pena candidatarem-se ou não. Vamos então dizer ao aluno que tem hipótese ao candidatar-se num dos seguintes casos: - rendimento mensal dos pais menor ou igual a $00 e média maior que 11 valores;

75 CAPÍTULO 4: OBJECTOS 75 - rendimento mensal entre $00 e $00 e média maior que 13 valores; - rendimento mensal entre $00 e $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 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%>

77 CAPÍTULO 4: OBJECTOS 77 Fig Resultado do formulário do ficheiro cpt4-3-3.asp Como o leitor deve ter reparado foram introduzidos como variáveis por defeito alguns Request.Form (), isto porque não queremos que o utilizador perca os dados por cada vez que faça um erro ou que queira voltar atrás, na sua simulação. Desta forma garantimos que os dados estão sempre nos sítios certos. No caso de se recomeçar uma simulação, por defeito os Headers dos ficheiros HTML ficam em branco à espera de novo Submit do formulário. A variável session( erro ) serve para mostrar uma mensagem de aviso em relação aos dados que foram introduzidos incorrectamente, que tentamos manter cada vez que tudo estiver validado e correcto, para que quando se recomece o formulário ainda lá esteja essa mesma mensagem. Assim, com este código, ficamos com um formulário que além de receber input do utilizador, envia os dados para uma nova fase, que é a fase de validação. Para validar-mos estes dados precisamos de os receber, e para isso foi usado no código inicial o seguinte código: nome = Request.Form( nome ) data = Request.Form( dia ) & - & Request.Form( mes ) & -19 & Request.Form( ano ) media = Request.Form( media ) rendimento = Request.Form( rendimento )

78 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.

79 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">, <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>= 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%>

80 80 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Resultado de validação do ficheiro cpt4-3-3.asp Na imagem anterior, obteve-se uma resposta do formulário em relação à média que o utilizador introduziu, que não sendo válida, pede para que seja corrigida. Este tipo de correcção é feito também para outras variáveis, e o procedimento em si é o mesmo, mas com mensagens de erro diferentes, correspondendo a cada uma das situações de validação. Fig Resultado de resposta do ficheiro cpt4-3-3.asp

81 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">, <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 82 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES rendimento<100000)and(media>13)) then mensagem = tem else if ((rendimento>= 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

83 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 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 () DateDiff () IsDate () IsNumeric () usado neste caso para que tenhamos uma variável que guarde o tipo de erro que foi achado nos dados introduzidos pelo utilizador; 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; O IsDate, devolve True ou False, conforme a data indicada seja ou não uma data válida; 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.

85 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 > <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 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> </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 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.

87 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 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 > <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> </td> </tr> </table> </center> </div> <%End Sub%>

89 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 > <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> </td> </tr> </table> </center> </div> <%End Sub%>

90 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 > <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> </td> </tr> </table> </center> </div> <%End Sub%>

91 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 > <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> </td> </tr> </table> </center> </div> <%End Sub%>

92 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 > <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> </td> </tr> </table> </center> </div> <%End Sub%>

93 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 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 >

95 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 é end if end if %> validado positivamente

96 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:

97 CAPÍTULO 4: OBJECTOS 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>

98 98 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Como podemos ver tem apenas 4 procedimentos que são percorridos em determinadas situações. Este ficheiro tem de estar localizado no directório principal do site, usando o esquema que temos vindo a seguir ficará em c:\inetpub\wwwroot\livro\ Fig Como deve estar configurado o nosso directório virtual, onde queremos ter o site Fig Directório onde o ficheiro global.asa tem de ficar em função do site virtual da imagem anterior

99 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 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 Imagem do ficheiro cpt4-3-6.asp

101 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 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>

103 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.

104 104 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Imagem geral do chat O ficheiro global.asa oferece aos programadores um vasto conjunto de possibilidades. No caso do número de utilizadores em simultâneo, o programa pode além de os contabilizar, guardar o valor num ficheiro de texto ou numa base de dados, assim como todos os dados das máquinas dos mesmos. As opções são várias, cabendo ao programador conhecer o funcionamento deste ficheiro, e usufruir ao máximo das suas potencialidades. 4.5 Cookies, dados do Utilizador e do servidor É muito vulgar as empresas quererem controlar os acessos aos seus sites, nomeadamente terem acesso ao IP das pessoas que os visitam, os sites de onde vêm, e até o tempo gasto nas páginas. Normalmente a melhor maneira de recolher dados do lado do cliente é usando JavaScript, mas esta tecnologia está sempre dependente da capacidade de interpretação dos browsers. As ASP têm uma alternativa para recolher este tipo de dados (apesar de não se conseguir todos os que se conseguem com JavaScript), que se usam muito nestas ocasiões. Essas alternativas ASP além de recolherem dados do lado do cliente, também disponibilizam dados do compu-

105 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 Resultado parcial do ficheiro cpt4-3-8.asp

106 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.

107 CAPÍTULO 4: OBJECTOS 107 (ficheiro cpt 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> </p> <p> </p> <p> </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> </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;

108 108 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Response.Cookies ( OCOOKIE )( ) neste exemplo este método é usado para definirmos nomes de cookies em "2º grau" - podemos ter várias variáveis associadas a um mesmo cookie; Response.Cookies ( OCOOKIE ).Expires Com o método Expires pode-se definir quando é que o cookie deixa de estar activo. Fig Resultado parcial do ficheiro cpt asp As cookies têm alguns inconvenientes, pois qualquer utilizador mais experiente pode acedê-las e apagar aquilo que foi criado. Por isso, não se recomenda muito o uso das mesmas para sites críticos. Consideram-se sites críticos aqueles que movimentam dados de muita importância, e que têm uma acção determinante para os utilizadores e para a própria empresa proprietária do site. 4.6 Formatação de strings Quando temos uma string é normal querermos alterá-la, pois o formato com que nos chega pode não ser o apropriado para os nossos fins. Temos então nessa altura que alterar (formatar) essa string de

109 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: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( ) 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, ,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( 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 110 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt asp) str1 = :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: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 = Response.Write str3 & <strong>(não formatada)</strong><br> Response.Write formatcurrency(str3) & (formatada)<br><br> str4 = 4231, 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 = 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;

111 CAPÍTULO 4: OBJECTOS 111 Server.HTMLEncode () Server.URLEncode () formatou-se assim todo o código HTML; obteve-se uma string válida de se usar num qualquer link de um qualquer browser.?????? Fig Resultado parcial do ficheiro cpt asp E assim fica arrumado mais um capítulo. Vimos que qualquer tipo de formatação pode ser da maior importância, pois os problemas de validação, e não só, assim o exigem. Poderíamos ter quase um livro só para formatação de strings, números, datas etc. Porque por vezes só queremos os minutos, ou só os segundos, ou as horas e segundos, e depois calcular o maior, etc. Mas julgo que aqui ficam as bases para o leitor se poder desenvolver neste assunto com maior liberdade e criatividade.

112

113 Bases de dados Bases de Dados / SQL Construir uma base de dados em Microsoft Access Conexão à base de dados Inserir, apagar e actualizar dados em bases de dados Exemplo: Inserir dados Exemplo: Eliminar dados Exemplo: Actualizar dados Apresentação de dados Exemplo: Listar dados em tabela Exemplo: Listar dados com imagens Exemplo: Listar dados a pedido Exemplos com bases de dados Exemplo: Livro de Visitas Exemplo: Sondagens de opinião 152

114 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 e- mail. Ficaria qualquer coisa do tipo: TABELA: CONTACTOS ID Nome Telefone

115 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) 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) as varchar(22) 1 João Joao@joao.pt 2 Carlos Carlos@carlos.pt 3 Rui Rui@rui.pt 4 Pedro Pedro@pedro.pt 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 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.

117 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, ) VALUES (5, Ricardo, , Ricardo@ricardo.pt ) A nossa tabela passará então a ter a seguinte estrutura: TABELA: CONTACTOS ID as number Nome as varchar(50) Telefone as varchar(14) as varchar(22) 1 João Joao@joao.pt 2 Carlos Carlos@carlos.pt 3 Rui Rui@rui.pt 4 Pedro Pedro@pedro.pt 5 Ricardo Ricardo@ricardo.pt 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 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) 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 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 Escolha da criação de um novo ficheiro para base de dados em MSAccess

119 CAPÍTULO 5: BASES DE DADOS 119 Depois de iniciarmos a opção anterior, fica então a opção de escolhermos o local onde vai ficar o ficheiro, e qual o nome a dar ao mesmo. Neste livro o ficheiro vai-se chamar livro.mdb Fig Local onde fica o ficheiro e seu nome A zona de trabalho do MSAccess aparece, e deparamo-nos com uma pequena consola vazia, onde a opção mais visível será NEW (dentro da zona de Tables, como ilustra a seguinte figura). Fig Aspecto da consola de manutenção e criação da base de dados

120 120 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Carregamos em NEW, e vamos escolher a opção Design View como maneira esquemática da criação da tabela que pretendemos para a base de dados. Fig Escolha de esquema para a criação da tabela CONTACTOS Criamos então a estrutura pretendida neste exercício, da tabela CONTACTOS. O esquema a criar é como o que está na figura. Não há muito a explicar no funcionamento do MSAccess neste campo, mas qualquer manual, ou site sobre este tipo de base de dados explica o que for necessário. Não esquecer de definir o campo a permitir aceitar valores nulos, pois nem todas as pessoas têm e- mail. Para isto basta na parte debaixo do esquema de criação da tabela, e no tab General, um YES no campo que diz Allow Zero Length. Se o leitor não quiser ter problemas na programação, e para estar mais à vontade, pode repetir este passo para todos os campos (excepto na chave primária, como é óbvio). Fig Esquema da tabela CONTACTOS no MSAccess

121 CAPÍTULO 5: BASES DE DADOS 121 Ao sair depois da criação do esquema da BD, será pedido o nome da tabela. Neste livro o nome adoptado para esta será o de CON- TACTOS. Para melhor percepção dos exemplos que iremos apresentar, será melhor o leitor iniciado nas ASP, criar os ficheiros e tabelas de acordo com este manual. Fig Escolha do nome a dar à tabela CONTACTOS Depois fica então acessível na consola do MSAccess a tabela que foi então criada. Ficamos assim com uma base de dados já algo estruturada. Fig Tabela CONTACTOS acessível no MSAccess depois de criada Normalmente, nas bases de dados empresariais, as tabelas são criadas com comandos do tipo CREATE TABLE que só por si daria para mais um capítulo, por isso também a adopção do MSAccess, que cria toda a estrutura depois de termos feito apenas alguns esquemas a nível visual.

122 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 Atalho para a zona onde se encontra o controlo de ODBC Depois de aí entrar, escolha o ícone ODBC, entrando na sua consola

123 CAPÍTULO 5: BASES DE DADOS 123 Fig Escolha do ícone que simboliza a entrada para a zona de controlo ODBC Escolha nos Tabs superiores a opção System DSN, podendo ver as ligações que já estão criadas. O mais normal é o leitor não ter nenhuma, mas isso não é problema pois o que interessa é que aquela que deseja criar fique lá disponível. Fig Zona onde se vai criar o identificador da conexão ODBC para o uso da BD em ASP

124 124 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES O leitor carrega em ADD, para inicializar o processo de criação da conexão. Fig Escolha do tipo de BD, para conexão Na imagem anterior o leitor poderia escolher em vez do MSAccess outras BD, como por exemplo, Oracle, SQL Server, Informix ou mesmo um ficheiro de Excel. Neste exemplo vamos escolher o MSAccess, mas caso a opção fosse outra seria nesta altura que deveria tomar essa decisão, e depois ir criar a ligação com base num ficheiro diferente do MSAccess. A chamada que vai ser feita das ASP com queries vai aceder a tabelas e colunas, independentemente da base de dados em questão. No entanto, para utilização de funções especiais não conformes a norma ANSI do SQL, temos que ter consciência que tal pode não ser compatível com outras bases de dados. Por exemplo, no Oracle, pode-se usar to_char () e to_date (), mas não funcionam noutras bases de dados. Fig Zona de criação da conexão à BD

125 CAPÍTULO 5: BASES DE DADOS 125 Dentro da zona de criação da conexão, o programador vai ter de seguir 2 passos importantes e nem por isso (ter em atenção a figura anterior) muito complexos. 1 Criar um nome para aceder à conexão, neste caso livrodsn 2 Carregar no botão SELECT e escolher o ficheiro da base de dados, neste caso livro.mdb Fig Imagem da consola depois de criada a conexão Depois destes passos, se aparecer livrodsn como na imagem anterior, a conexão está feita, e o leitor pode preparar-se para programar em ASP com acesso à BD. A maneira mais usual de se conectar à BD é por via do DSN, onde se indica neste caso o nome da conexão que foi criado livrodsn. O primeiro passo será criar um objecto de conexão à BD, Set Conn = Server.CreateObject( ADODB.Connection ) Depois deste passo vamos usar o método open, próprio do objecto que foi criado, Conn.open DSN=livrodsn; Desta maneira acabámos de fazer uma conexão à BD. Tudo o que agora é preciso é de uma maneira de podermos trabalhar os dados referentes à BD que está nessa conexão. Vamos então usar o RecordSet, mais um tipo de objectos, mas desta maneira, para o controlo de dados.

126 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-

127 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, , data) SQLStmt = SQLStmt & VALUES( Bernardo Miguel, 12, , bernardo@bernardo.pt, 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 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> <input type= text name= value= <%=Request.Form( )%> 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.

129 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( ))>32 then Response.Write <center><font color= RED >O 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 Aspecto do formulário do ficheiro cpt5-4-2.asp, com um campo em que se tentam introduzir dados inválidos

130 130 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Erro de validação do campo idade do ficheiro cpt5-4-2.asp Depois de tudo validado o utilizador poderá repetir novamente, devido à inclusão de um link que dá essa hipótese. Fig Mensagem de confirmação de introdução de dados do ficheiro cpt5-4-2.asp

131 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, , data) SQLStmt = SQLStmt & VALUES( &Request.Form( nome )&, SQLStmt = SQLStmt & &Request.Form( idade )&, SQLStmt = SQLStmt & &Request.Form( telefone )&, SQLStmt = SQLStmt & &Request.Form( )&, 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, , data) SQLStmt = SQLStmt & VALUES( &Request.Form( nome )&, SQLStmt = SQLStmt & &Request.Form( idade )&, SQLStmt = SQLStmt & &Request.Form( telefone )&, SQLStmt = SQLStmt & &Request.Form( )&, SQLStmt = SQLStmt & now()) rs.open SQLstmt,Conn,1,2 Response.Write <br><br><center>acabou de ser introduzido um novo contacto.<br><br>

132 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( ))>32 then Response.Write <center><font color= RED >O 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

133 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> <input type= text name= value= <%=Request.Form( )%> 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 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> <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 Aspecto do formulário do ficheiro cpt5-4-3.asp

135 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 Aspecto da resposta do ficheiro cpt5-4-3.asp, depois do comando apagar

136 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> <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 %>

137 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 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> <input type= text name= value= <%=rs.fields( )%> size= 22"><br> <center><input type= submit value= Submeter Alteração ></center> </form> </td></tr></table></div> <%End Sub%>

138 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 & = &Request.Form( )& 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%>

139 CAPÍTULO 5: BASES DE DADOS 139 <OPTION VALUE= <%= rs.fields( ID ) %> ><%= rs.fields( nome )%> </OPTION> <%rs.movenext Wend rs.close%> </SELECT> <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 & = &Request.Form( )& 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 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( ))>32 then %>center><font color= RED >O 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> <input type= text name= value= <%=rs.fields( )%> 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

141 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 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> </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( )%></td> </tr> <%rs.movenext if cor= 99CCFF then cor= 9999FF else cor= 99CCFF end if wend %></table>

143 CAPÍTULO 5: BASES DE DADOS 143 Foram usados os seguintes objectos e funções: Rs.Fields() a maneira com que podemos aceder aos dados dentro dos campos que pretendemos; Rs.Movenext () usamos este método para podermos movimentar o cursor que anda pela base de dados. O resultado é aquele que se pode ver na imagem seguinte - uma estrutura apresentável, que pode servir de Report para muitos tipos de dados. Repare no truque da mudança de cor por linha, para facilitar a pesquisa dos dados. Fig Aspecto da resposta do ficheiro cpt5-5-1.asp O código, if cor= 99CCFF then cor= 9999FF else cor= 99CCFF end if é então o pequeno truque para que possamos alternar as cores das linhas. Iniciamos a variável cor com um valor, e, dentro do loop, vamos validar a mesma, de maneira que ela troque pela cor oposta.

144 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 . Digamos que para cada pessoa que tem aparece uma imagem que, carregando na mesma, permite o envio de para essa pessoa. Para isso temos de validar o campo que devolve o , 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> </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( ))>1 then Response.write <a href= mailto: &Rs.Fields( )& > 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>

145 CAPÍTULO 5: BASES DE DADOS 145 Foram usados os seguintes objectos e funções: Len () aqui usado para testar o tamanho do . 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 ; <a href= mailto:<%=rs.fields( ) %> > desta maneira introduzimos o que é devolvido pela BD, e usando o comando mailto: ele passa a usar esse link, como envio de para o endereço definido. Como se pode verificar foi aproveitado o código do ficheiro cpt asp. Para este caso bastou-nos alterar a ordem de apresentação dos dados, e validar o campo de . Fig 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 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> </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( ))>1 then Response.write <a href= mailto: &Rs.Fields( )& > 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%>

147 CAPÍTULO 5: BASES DE DADOS 147 O resultado deste exercício pode ser visto nas imagens seguintes, onde vamos experimentar o código com a introdução de jo que por sua vez vai listar todas as ocorrências do mesmo. Fig Aspecto do formulário do ficheiro cpt5-5-3.asp Fig Aspecto da resposta do ficheiro cpt5-5-3.asp, depois da procura de todas as ocorrências com jo Ficam assim demonstrados alguns exemplos para disponibilizar os dados na Internet usando as ASP. Muitas podem ser as formas de combinar as ASP com o código HTML, mas isso já pertence ao desenvolvimento profissional das aplicações que irá desenvolver depois de ler este manual.

148 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) 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. <% Sub Introduzir() passa = 1 nome = left(request.form( nome ),30) nome = Replace(nome,, ) = left(request.form( ),30) = Replace( ,, ) texto = Request.Form( texto ) texto = Replace(texto,, ) if (len(nome)<2) then passa = 0 end if (ficheiro cpt5-6-1.asp)

149 CAPÍTULO 5: BASES DE DADOS 149 if (len(texto)<15) then passa = 0 end if If Len( ) > 0 and Len( ) < 5 Then Passa = 0 Else If InStr(1, 1) < 2 Then Passa = 0 Else If InStr(1, ,., 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, , texto) VALUES( SQLStmt = SQLStmt & & now() &, SQLStmt = SQLStmt & nome &, & &, & 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> </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( )%> > <%=rs.fields( nome )%></a></p> <center> <p align= center ><%=rs.fields( texto )%></p>

150 150 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <p align= center > </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 <INPUT TYPE= TEXT NAME= 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.

151 CAPÍTULO 5: BASES DE DADOS 151 Fig Aspecto da resposta do ficheiro cpt5-6-1.asp - O Livro de Visitas E assim fica o Livro de Visitas concluído. O leitor nesta altura terá concerteza menos dificuldades em assimilar tudo aquilo que vai sendo feito no código, por isso não nos preocupamos com grandes explicações nestes exemplos finais. Algo que muitas empresas cada vez mais anseiam em ter nos seus sites são as sondagens de opinião - uma maneira de conhecerem as tendências, que em muito pode ajudar no diálogo com o consumidor. Vamos então ver os conceitos básicos para criar uma sondagem de opinião, e deixar o utilizador saber qual está a ser a tendência. A estrutura vai ser bastante simples: Temos um pequeno formulário com duas hipóteses, onde vamos usar radiobuttons, muito usados no HTML. Estes botões vão ter neste exemplo duas hipóteses, Sim ou Não, e vai ser aí que a nossa sondagem se vai centrar. Temos então a pergunta e as possíveis respostas. Temos de ter uma nova tabela na base de dados que vai ter de ser actualizada por cada vez que alguém escolher uma das hipóteses. Vamos então começar por construir a tabela que não vai ter mais de três campos.

152 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>

153 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 Aspecto da resposta do ficheiro cpt5-6-2.asp - a Sondagem

154 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.

155 Componentes Introdução aos Componentes Tratamento de ficheiros de texto com o TextStream Exemplo: História sem fim Exemplo: Contador de acessos Componentes de Exemplo: Envio de com attachment Criar componentes em Visual Basic Exemplo: Componente Livro de Visitas 173

156 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 ) 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 ou 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.

157 CAPÍTULO 6: COMPONENTES 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 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 WriteLine 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. 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 158 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES TABELA DE PROPRIEDADES DO TEXTSTREAM Propriedade AtEndOfLine Line Column AtEndOfStream Descrição Maneira de o leitor saber se chegou ao fim da linha. Devolve o número da linha onde vamos. Devolve o número de caracteres que foram percorridos desde o início da linha. 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)

159 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.

160 160 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Resultado do ficheiro cpt6-2-1.asp E desta maneira vamos então criar a ASP da história que nunca acaba. A estrutura é um pouco básica, mas que necessita de explicação prévia. Passamos então à sua estruturação: 1. Formulário para input do utilizador; 2. Procedimento de escrita de nova linha para a história; 3. Procedimento de leitura de texto; 4. Procedimento para saber se já existe ficheiro. O facto de procurarmos se já existe um ficheiro de história deve-se ao facto de que o FileSytem devolve erro se não encontrar o ficheiro. Desta forma criamos um por cada vez que ele não existir. A maneira de sabermos se o ficheiro existe é de usar o próprio componente e usar um método chamado FileExists. Assim, poderemos então construir todo o código.

161 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 & 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 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 Resultado do ficheiro cpt6-2-2.asp - a história que nunca acaba

163 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 Resultado do ficheiro cpt6-2-3.asp

164 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 Este tipo de componentes ( ) 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 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 ASP ( 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 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 JMail.Sender = remetente@servidor.pt aqui fica o endereço de quem envia o JMail.Subject = Titulo do aqui fica o titulo do / subject JMail.AddRecipient receptor@servidor.pt endereço para onde queremos enviar o Corpo = Texto que vai no ... & 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 %>

165 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 ; JMail.ServerAddress () Desta forma vamos definir o servidor de a usar; JMail.Sender () Define-se aqui qual o da pessoa que o envia; JMail.Subject () Aqui indicamos o título da mensagem; JMail.AddRecipient () Escrevemos aqui para quem vamos enviar o ; JMail.Body () Aqui fica a construção do corpo da mensagem; Jmail.Priority () Aqui definimos a prioridade do 1-mínimo, 2-médio, 3-máximo; JMail.Execute () Só depois deste comando é que o é enviado. Primeiro são as configurações e depois é que é executada a função geral. Este exemplo tratava apenas do envio de um , 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 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 , 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 = seu @seuservidor.pt Jmail.Subject = Aqui estão as piadas Jmail.AddRecipient request.form( ) 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 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 meu dentro de momentos</small> </p> <% End Sub Sub formulario() %> <form action= cpt6-3-2.asp method= POST > Introduza o onde quer<br> receber as piadas: <input type= text name= ><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 (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 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 s 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.

167 6.4 Criar componentes em Visual Basic 6 CAPÍTULO 6: COMPONENTES 167 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 Escolha do tipo de projecto

168 168 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Vamos então definir as propriedades do projecto que iniciámos. Para isso vamos ao menu do VB e escolhemos Project > Properties. Fig Abrir Propriedades do projecto A partir daqui aparece uma consola de configuração como a da próxima figura. Fig Consola de propriedades do projecto

169 CAPÍTULO 6: COMPONENTES 169 Ao estarmos na consola de propriedades do projecto mudamos o nome do projecto para LivroASP. Claro que o leitor pode criar o projecto com o nome que mais lhe convenha. Depois disto carregamos em OK e vamos então mudar o nome da nossa classe, que é criada por defeito aquando da iniciação do ActiveX DLL project, para livrovisitas (visto ser este o nosso objectivo). Fig Alterar o nome da nossa classe para livrovisitas Mas é necessária haver uma interacção entre ASPs e a DLL que vamos criar, pois as mesmas só interagem com DLLs específicas. Temos então de ir buscar uma referência para o VB saber que está a compilar para o propósito que temos em vista. Fig Entrar na consola de referências

170 170 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Depois de entrarmos na consola de referências vamos então escolher duas referências: Microsoft Active Server Pages Object Library (tem de se escolher sempre independentemente do tipo de projecto para ASP) e Microsoft ActiveX Data Objects 2.1 Library (escolhemos para este caso pois vamos usar bases de dados, caso contrário seria desnecessário). Fig Referências necessárias para este projecto Depois de escolhidas as referências, e de termos seguido as passagens já referidas, vamos então começar a criar as primeiras linhas de código VB para o nosso componente. Antes de tudo vamos criar uma tabela de dados que julgamos serem válidos para dar hipótese do Livro de Visitas ser configurável por pessoas estranhas ao código do componente. Digamos que o utilizador tem de ter a hipótese de usar um ficheiro com o nome que quiser para usar o componente, a cor das caixas onde estão as mensagens, e a cor das letras do site, e das caixas. Desta maneira o utilizador do componente tem hipótese de configurar os dados à sua vontade. No VB precisamos de configurar certos objectos que nas ASP temos como certos, para que os precisamos de inicializar no VB - falamos de Response, Request, Session etc. Para isso temos de inicializar todas as chamadas dos objectos das ASP, e para isso temos o seguinte código,

171 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 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

173 CAPÍTULO 6: COMPONENTES 173 Se quisermos ter um valor inserido por um formulário com o nome fazemos, Mrequest.form( ) 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. 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 (ficheiro livrovisitas.cls) 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 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> </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( ) & > & 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 > </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 e- mail: </font> mresponse.write <INPUT TYPE= TEXT NAME= 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'>

175 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,, ) = Left(mrequest.Form( ), 30) = Replace( ,, ) 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( ) > 0 And Len( ) < 5 Then passa = 0 Else If InStr(1, 1) < 2 Then passa = 0 Else If InStr(1, ,., 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, , texto) VALUES( SQLstmt = SQLstmt & & Now() &, SQLstmt = SQLstmt & nome &, & &, & 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 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.

177 CAPÍTULO 6: COMPONENTES 177 Fig Aspecto do livro de visitas depois de correr o código no VB e aberta a página ASP Não esquecer que a partir do momento que o leitor carregar em Stop, o componente deixa de funcionar na ASP. Se vir que o mesmo está finalizado, chega a hora de o compilar, criar um verdadeiro ficheiro DLL, e instalá-lo no servidor onde o quer ter a funcionar. Para compilar o componente basta seguir os seguintes passos: 1. Ir a File > Make Fig Fazer a compilação do projecto

178 178 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 2. Escolher o nome a dar ao componente (ficheiro DLL) Fig Escolher o nome do ficheiro 3. O directório do componente fica então, Fig Directório onde está o componente criado

179 CAPÍTULO 6: COMPONENTES Instalação do componente, depois de escolhido o directório onde o guardar (lembrar que o componente LivroASP.DLL pode ser usado separado. Pode copiar esse ficheiro para outro servidor e usá-lo então). O directório escolhido para ter os componentes foi D:\InetPub\WWWRoot\Componentes\LivroASP.DLL Fig Directório onde foi colocado o componente para entrar em produção Depois de introduzido o componente no directório escolhido para produção, vamos, dentro desse mesmo directório, correr a seguinte linha de comando em, Start > Run D:\InetPub\WWWRoot\Componentes\regsvr32 LivroASP.DLL Fig Instalar o componente

180 180 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Depois de correr a linha descrita é devolvida uma mensagem de sucesso, depois da qual temos o nosso componente acessível no nosso servidor. Fig Resposta de instalação com sucesso do componente O ficheiro regsvr32 costuma estar em C:\Windows\System. Caso contrário faça um Find, pois este está por defeito instalado no Windows. Está agora disponível este componente para qualquer site que queira instalar no seu servidor. Se quiser pode disponizá-lo para outros servidores, bastando levá-lo e instalá-lo lá. De lembrar que este tipo de componentes por vezes necessita de outros, e neste caso os ficheiros base (RunTime) do VB, tais como: Microsoft Visual Basic 5 Runtime Msvbvm50.exe Microsoft Visual Basic 6 Runtime Vbrun60.exe Disponíveis em ms_dload.shtml ou no site da Microsoft. Se o seu componente não funcionar noutro servidor, faça uma instalação dos componentes (RunTime) indicados acima. No Windows 98 não tem problemas com esta situação, seja como for fica assim então o aviso. Estes ficheiros encontram-se também ou na máquina que tem o VB instalado, ou em sites de programação na Internet. Podem estar disponíveis como ficheiros executáveis, ou como componentes soltos, que se instalam da mesma maneira que o componente que criámos neste capítulo.

181 Exemplos reais Introdução A Rã: Motor de Busca A Loja: Loja E-Commerce 197

182 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 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'

183 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 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 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 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'

185 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 Esquema de ficheiros do motor de busca

186 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'

187 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> <a href= default.asp?fazer=registar >registar site </a> </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 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> </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 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'

189 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 Imagem do topo do site

190 190 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro fundo.inc) <div align= center ><table width= 600"> <tr bgcolor= #8AC491"><td> </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'

191 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 > <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 Tabela de procura

192 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> </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> </p><p> </p><p> </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'

193 CAPÍTULO 7: EXEMPLOS REAIS 193 Com as listagens recebemos a string de procura e fazemos uma pesquisa com base na mesma. Se introduzirmos Internet, obtemos um resultado como o da imagem seguinte. Fig Resultado da procura feita por Internet nos sites existentes em BD (ficheiro registar.inc) <% esta primeira função vai ver se o site que queremos registar já existe Function procura_repetido( link ) SQLStmt = SELECT url FROM MOTORBUSCA WHERE url = &link& rs.open SQLstmt,Conn,1,2 if rs.eof then se não existir esse link rs.close procura_repetido = 0 a função devolve o número 0 else caso contrário rs.close procura_repetido = 1 a função acha e devolve 1 end if End Function no procedimento seguinte é posto o formulário de registo no browser para preenchimento Sub formulario_registo()%>

194 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 > <b>insira o URL do site que quer registar</b></font><br> <input type= text name= urlsite value= size= 52"><br> <font face= ARIAL color= white > <b>título do site</b></font> <input type= text name= titulo size= 30"><br> <font face= ARIAL color= white > <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, 1)<>1 then verificamos se existe 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 <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 <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'

195 CAPÍTULO 7: EXEMPLOS REAIS 195 if Len(titulo)<4 or len(titulo)>80 then OK = 0 response.write <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 <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 <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 %>

196 196 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Formulário de registo de site No caso de um dos campos que vem do formulário não ter a informação correcta, além de não ser introduzido, são mostradas mensagens de erro tal como se vê na figura seguinte pois o url não é válido. Fig Erro dado devido ao URL não ser válido Depois de uma correcta introdução de dados obtemos uma mensagem de aprovação. Fig Resposta depois do registo efectuado 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'

197 CAPÍTULO 7: EXEMPLOS REAIS 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 198 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES TABELA: ENCOMENDAS Id_encomenda Data Nome Morada CP Localidade Telefone Total_valor Numero_visa Nome_visa Data_visa Auto-number; identificador da encomenda Date/Time; data em que a encomenda foi realizada Text (50); nome do comprador Text (180); morada do comprador Text (9); código postal do comprador Text (40); localidade Text (10); telefone de contacto do cliente Text (40); o do cliente Number; valor total a pagar Text (16); número do cartão de crédito do cliente Text (20); nome do portador do cartão de crédito que vai pagar a encomenda 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'

199 CAPÍTULO 7: EXEMPLOS REAIS 199 Fig A relação das tabelas da BD da nossa loja Vamos então indicar quais os aspectos principais deste site: 1 Aspecto da Página inicial; 2 Formulário de procura de produtos; 3 Apresentação de resultados da procura; 4 Carrinho de compras - criação e actualização; 5 Saída e pagamento; 6 Aspecto gráfico. Neste site também vamos usar uma só ASP (como no motor de busca) para suportar todas as tarefas do site. Vamos implementar então mais uma lista de vários ficheiros *.inc (não esquecer que podem ter outra extensão) e usá-los quando acharmos necessário, dentro do contexto do site. O esquema de ficheiros deste site é então o seguinte:

200 200 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fig Esquema de ficheiros da loja Vamos então descrever qual a participação que cada ficheiro tem neste site: Imagens, Topo.jpg ficheiro que representa a imagem de topo do site; incluído no código HMTL do ficheiro topo.inc, tal como no motor de busca, claro que com a particularidade de ser uma imagem diferente; Bprocurar.gif ficheiro que representa o botão que se carrega para fazermos procura de um livro; é usado no ficheiro topo.inc Brecalcular.gif é o botão que refaz os cálculos no nosso carrinho de compras depois de introduzido novo produto, ou de termos alterada alguma quantidade; é chamado no ficheiro carrinhor.inc Bfinalizar.gif ficheiro que representa o botão que se carrega para finalizarmos uma compra online; usado no ficheiro pagar.inc 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'

201 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 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'

203 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 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> </p> <! #INCLUDE FILE= includes/fundo.inc > Fig 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'

205 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 <% 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 funcoes.asp) (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> </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> </td> <td valign= top ><font size= 2" face= Verdana > <a href= default.asp?fazer=pagar >

206 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> </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 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'

Programação Web com ASP - Active Server Pages

Programação Web com ASP - Active Server Pages Centro Atlântico 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

Leia mais

Construção de um website em ASP

Construção de um website em ASP 1 O HTML em 12 passos ASP: Expressões e operadores Funções Objectos Bases de Dados Construção de um website em ASP Avaliação 2 1 HTML versus ASP (2 horas) Conhecer o HTML em 12 passos Extensões, interpretadores

Leia mais

FICHEIROS COM EXEMPLOS

FICHEIROS COM EXEMPLOS FICHEIROS COM EXEMPLOS Envie um e-mail* para software@centroatlantico.pt para conhecer os endereços de Internet de onde poderá fazer o download dos fichei Reservados todos os direitos por Centro Atlântico,

Leia mais

Módulo 3936 ASP.NET. Financiado pelo FSE

Módulo 3936 ASP.NET. Financiado pelo FSE 2 EISnt Centro de Formação Profissional, Engenharia Informática e Sistemas, Novas Tecnologias, Lda Avª D. João I, nº 380/384 Soutelo 4435-208 Rio Tinto Portal Internet : www.eisnt.com E-Mail : formação@eisnt.com

Leia mais

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2 SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2 1.1 Introdução... 2 1.2 Estrutura do IP... 3 1.3 Tipos de IP... 3 1.4 Classes de IP... 4 1.5 Máscara de Sub-Rede... 6 1.6 Atribuindo um IP ao computador... 7 2

Leia mais

O que é o JavaScript?

O que é o JavaScript? JavaScript Introdução O JavaScript é utilizado por milhões de páginas na web para melhorar o design, validar forms, e muito mais O JavaScript foi inicialmente desenvolvido pela Netscape e é a linguagem

Leia mais

Impressão do Manual do Utilizador

Impressão do Manual do Utilizador bibliopac Interface WWW Versão 2003 Guia de instalação rápida Junho 2003 ATENÇÃO! Impressão do Manual do Utilizador No CD de instalação está disponível o ficheiro Interface WWW Manual.PDF. Este manual,

Leia mais

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP AGRUPAMENTO DE ESCOLAS DE SANTA COMBA DÃO CURSO PROFISSIONAL DE TÉCNICO DE GESTÃO E PROGRAMAÇÃO DE SISTEMAS INFORMÁTICOS 2012-2015 PROGRAMAÇÃO E SISTEMAS DE INFORMAÇÃO MÓDULO 2 Mecanismos de Controlo de

Leia mais

Manual de Utilizador. Disciplina de Projecto de Sistemas Industriais. Escola Superior de Tecnologia. Instituto Politécnico de Castelo Branco

Manual de Utilizador. Disciplina de Projecto de Sistemas Industriais. Escola Superior de Tecnologia. Instituto Politécnico de Castelo Branco Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco Departamento de Informática Curso de Engenharia Informática Disciplina de Projecto de Sistemas Industriais Ano Lectivo de 2005/2006

Leia mais

geral@centroatlantico.pt www.centroatlantico.pt Impressão e acabamento: Inova 1ª edição: Novembro de 2004

geral@centroatlantico.pt www.centroatlantico.pt Impressão e acabamento: Inova 1ª edição: Novembro de 2004 FICHEIROS COM EXEMPLOS Envie um e-mail* para software@centroatlantico.pt para conhecer os endereços de Internet de onde poderá fazer o download dos ficheiros com os exemplos deste livro. Reservados todos

Leia mais

Entendendo como funciona o NAT

Entendendo como funciona o NAT Entendendo como funciona o NAT Vamos inicialmente entender exatamente qual a função do NAT e em que situações ele é indicado. O NAT surgiu como uma alternativa real para o problema de falta de endereços

Leia mais

1 2 3 W O R K S H O P 4 5 6 W O R K S H O P 7 W O R K S H O P 8 9 10 Instruções gerais para a realização das Propostas de Actividades Para conhecer em pormenor o INTERFACE DO FRONTPAGE clique aqui 11 CONSTRUÇÃO

Leia mais

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item "Sites da web".

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item Sites da web. Servidor WEB Desenvolvedores de sites que querem aprender ou testar ASP, ou mesmo profissionais que precisam desenvolver páginas ASP ou ASP.Net, não precisam necessariamente ter um servidor na web com

Leia mais

Microsoft Access 2010. Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento

Microsoft Access 2010. Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento Microsoft Access 2010 Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento 1 Principais objetos do Access Tabelas Guardam a informação da BD (Base de Dados)

Leia mais

MICROSOFT ACCESS MICROSOFT ACCESS. Professor Rafael Vieira Professor Rafael Vieira

MICROSOFT ACCESS MICROSOFT ACCESS. Professor Rafael Vieira Professor Rafael Vieira MICROSOFT ACCESS MICROSOFT ACCESS Professor Rafael Vieira Professor Rafael Vieira - Access - Programa de base de dados relacional funciona em Windows Elementos de uma Base de Dados: Tabelas Consultas Formulários

Leia mais

Desenvolvendo Websites com PHP

Desenvolvendo Websites com PHP Desenvolvendo Websites com PHP Aprenda a criar Websites dinâmicos e interativos com PHP e bancos de dados Juliano Niederauer 19 Capítulo 1 O que é o PHP? O PHP é uma das linguagens mais utilizadas na Web.

Leia mais

Instalando o Internet Information Services no Windows XP

Instalando o Internet Information Services no Windows XP Internet Information Services - IIS Se você migrou recentemente do Windows 95 ou 98 para o novo sitema operacional da Microsoft Windows XP, e utilizava antes o Personal Web Server, deve ter notado que

Leia mais

FICHEIROS COM EXEMPLOS

FICHEIROS COM EXEMPLOS FICHEIROS COM EXEMPLOS Envie um e-mail* para software@centroatlantico.pt para conhecer os endereços de Internet de onde poderá fazer o download dos ficheiros com os exemplos deste livro. Reservados todos

Leia mais

Javascript 101. Parte 2

Javascript 101. Parte 2 Javascript 101 Parte 2 Recapitulando O Javascript é uma linguagem de programação funcional Os nossos scripts são executados linha a linha à medida que são carregados. O código que está dentro de uma função

Leia mais

O código JavaScript deve ser colocado entre tags de comentário para ficar escondido no caso de navegadores antigos que não reconhecem a linguagem.

O código JavaScript deve ser colocado entre tags de comentário para ficar escondido no caso de navegadores antigos que não reconhecem a linguagem. 1 - O que é JAVASCRIPT? É uma linguagem de script orientada a objetos, usada para aumentar a interatividade de páginas Web. O JavaScript foi introduzido pela Netscape em seu navegador 2.0 e posteriormente

Leia mais

MANUAL DO ANIMAIL 1.0.0.1142 Terti Software

MANUAL DO ANIMAIL 1.0.0.1142 Terti Software O Animail é um software para criar campanhas de envio de email (email Marketing). Você pode criar diversas campanhas para públicos diferenciados. Tela Principal do sistema Para melhor apresentar o sistema,

Leia mais

ZS Rest. Manual Avançado. Instalação em Rede. v2011

ZS Rest. Manual Avançado. Instalação em Rede. v2011 Manual Avançado Instalação em Rede v2011 1 1. Índice 2. Introdução... 2 3. Hardware... 3 b) Servidor:... 3 c) Rede:... 3 d) Pontos de Venda... 4 4. SQL Server... 5 e) Configurar porta estática:... 5 5.

Leia mais

PHP() é uma linguagem de integração de servidor que permite a criação de paginas dinâmicas. Como todas

PHP() é uma linguagem de integração de servidor que permite a criação de paginas dinâmicas. Como todas O que é PHP? Acrônimo de PHP: Hipertext Language PostProcessor Inicialmente escrita para o desenvolvimento de aplicações Web Facilidade para iniciantes e recursos poderosos para programadores profissionais

Leia mais

Aplicações de Escritório Electrónico

Aplicações de Escritório Electrónico Universidade de Aveiro Escola Superior de Tecnologia e Gestão de Águeda Curso de Especialização Tecnológica em Práticas Administrativas e Tradução Aplicações de Escritório Electrónico Folha de trabalho

Leia mais

Guia de Consulta Rápida ASP. Rubens Prates. Novatec Editora. www.novateceditora.com.br

Guia de Consulta Rápida ASP. Rubens Prates. Novatec Editora. www.novateceditora.com.br Guia de Consulta Rápida ASP Rubens Prates Novatec Editora www.novateceditora.com.br Guia de Consulta Rápida ASP de Rubens Prates Copyright@2000 da Novatec Editora Ltda. Todos os direitos reservados. É

Leia mais

2.3. PHP Tipos de dados e operadores

2.3. PHP Tipos de dados e operadores Programação para Internet II 2.3. PHP Tipos de dados e operadores Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt Tipos de dados Embora não seja necessário declarar os tipos de dados das variáveis,

Leia mais

Linguagem de Programação. Introdução ao PHP. Prof Mauricio Lederer Ciência da Computação - UNIANDRADE 1

Linguagem de Programação. Introdução ao PHP. Prof Mauricio Lederer Ciência da Computação - UNIANDRADE 1 Linguagem de Programação Introdução ao PHP 1 O que é PHP? - significa: Hypertext Preprocessor - uma das linguagens mais utilizadas para web - transforma sites estáticos em dinâmicos - atualização de páginas

Leia mais

PHP. Hypertext Pre-Processor

PHP. Hypertext Pre-Processor PHP Hypertext Pre-Processor O que é o PHP? Uma linguagem de scripting é uma linguagem cujo código não tem de ser compilado para ser executado! O código escrito é interpretado em tempo de execução para

Leia mais

ZS Rest. Manual Avançado. Ementas : Email e SMS. v2011

ZS Rest. Manual Avançado. Ementas : Email e SMS. v2011 Manual Avançado Ementas : Email e SMS v2011 1. Índice 2. INTRODUÇÃO... 2 3. INICIAR O ZSRest FrontOffice... 3 1 4. CONFIGURAÇÃO INICIAL... 4 b) Configurar E-Mail... 4 c) Configurar SMS... 5 i. Configurar

Leia mais

Criando um script simples

Criando um script simples Criando um script simples As ferramentas de script Diferente de muitas linguagens de programação, você não precisará de quaisquer softwares especiais para criar scripts de JavaScript. A primeira coisa

Leia mais

2.) Listagem Página a Página

2.) Listagem Página a Página Exemplos para construção de páginas em ASP 1.) Abertura de uma Base de Dados O código necessário para fazer a abertura de uma Base de Dados Access e execução de uma string SQL é muito simples. No exemplo

Leia mais

SAFT para siscom. Manual do Utilizador. Data última versão: 07.11.2008 Versão: 1.01. Data criação: 21.12.2007

SAFT para siscom. Manual do Utilizador. Data última versão: 07.11.2008 Versão: 1.01. Data criação: 21.12.2007 Manual do Utilizador SAFT para siscom Data última versão: 07.11.2008 Versão: 1.01 Data criação: 21.12.2007 Faro R. Dr. José Filipe Alvares, 31 8005-220 FARO Telf. +351 289 899 620 Fax. +351 289 899 629

Leia mais

ASP Active Server Pages

ASP Active Server Pages ASP Active Server Pages Curso básico CURSO MASTER Pagina 1 INTRODUÇÃO A Internet é um conjunto de redes de computadores interligados pelo mundo inteiro, onde um misto de protocolos e serviços permitem

Leia mais

CONSTRUÇÃO DE BLOG COM O BLOGGER

CONSTRUÇÃO DE BLOG COM O BLOGGER CONSTRUÇÃO DE BLOG COM O BLOGGER Blog é uma abreviação de weblog, qualquer registro frequênte de informações pode ser considerado um blog (últimas notícias de um jornal online por exemplo). A maioria das

Leia mais

JSP trata-se de uma tecnologia que possibilita o desenvolvimento de páginas web dinâmicas utilizando todas as potencialidades do Java como linguagem

JSP trata-se de uma tecnologia que possibilita o desenvolvimento de páginas web dinâmicas utilizando todas as potencialidades do Java como linguagem 1 JSP trata-se de uma tecnologia que possibilita o desenvolvimento de páginas web dinâmicas utilizando todas as potencialidades do Java como linguagem orientada a objectos. Tal como em ASP e PHP, os ficheiros

Leia mais

Realizado por: Fábio Rebeca Nº6. Iuri Santos Nº8. Telmo Santos Nº23

Realizado por: Fábio Rebeca Nº6. Iuri Santos Nº8. Telmo Santos Nº23 Realizado por: Fábio Rebeca Nº6 Iuri Santos Nº8 Telmo Santos Nº23 1 Tutorial de instalação e partilha de ficheiros no Ubuntu Índice Índice... 1 Introdução... 2 Material que iremos utilizar... 3 Instalação

Leia mais

Realizado por: Fábio Rebeca Nº6. Iuri Santos Nº8. Telmo Santos Nº23

Realizado por: Fábio Rebeca Nº6. Iuri Santos Nº8. Telmo Santos Nº23 Realizado por: Fábio Rebeca Nº6 Iuri Santos Nº8 Telmo Santos Nº23 1 Tutorial de instalação e partilha de ficheiros na Caixa Mágica Índice Índice... 1 Introdução... 2 Material que iremos utilizar... 3 Instalação

Leia mais

ASP. Autor: Nicleverson Silva

ASP. Autor: Nicleverson Silva ASP Autor: Nicleverson Silva ASP Active Server Pages Curso básico CURSO MASTER Pagina 1 INTRODUÇÃO A Internet é um conjunto de redes de computadores interligados pelo mundo inteiro, onde um misto de protocolos

Leia mais

Principais Funções do VBscript

Principais Funções do VBscript Principais Funções do VBscript Funções de Data e Tempo CDate Converte uma expressão válida de horário ou data para o sutipo Date Date Retorna a data corrente do sistema Time Retorna o horário corrente

Leia mais

Para criar a conta faça clique no separador. Abre um formulário com campos que terá que preencher. Basta ir seguindo

Para criar a conta faça clique no separador. Abre um formulário com campos que terá que preencher. Basta ir seguindo CRIAR UMA CONTA DE CORREIO ELECTRÓNICO Ex: No hotmail: Abrir o Explorer Na barra de endereços escrever: http://www.hotmail.com Surge a página representada na fig.1. Fig. 1 Para criar a conta faça clique

Leia mais

Como incluir artigos:

Como incluir artigos: Como incluir artigos: O WordPress é uma ferramenta muito flexível, com muitas variações e ajustes que podem torná-lo algo muito simples e também muito sofisticado conforme os recursos que são configurados

Leia mais

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo)

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo) APOSTILA DE EXEMPLO (Esta é só uma reprodução parcial do conteúdo) 1 Índice Aula 1 - Área de trabalho e personalizando o sistema... 3 A área de trabalho... 3 Partes da área de trabalho.... 4 O Menu Iniciar:...

Leia mais

Oficina de Construção de Páginas Web

Oficina de Construção de Páginas Web COMPETÊNCIAS BÁSICAS EM TIC NAS EB1 Oficina de Construção de Páginas Web Criação e Publicação Guião Páginas WWW com o editor do Microsoft Office Word 2003 1. Introdução. 2. Abrir uma página Web. 3. Guardar

Leia mais

2 echo "PHP e outros.";

2 echo PHP e outros.; PHP (Hypertext Preprocessor) Antes de qualquer coisa, precisamos entender o que é o PHP: O PHP(Hypertext Preprocessor) é uma linguagem interpretada gratuita, usada originalmente apenas para o desenvolvimento

Leia mais

A VISTA BACKSTAGE PRINCIPAIS OPÇÕES NO ECRÃ DE ACESSO

A VISTA BACKSTAGE PRINCIPAIS OPÇÕES NO ECRÃ DE ACESSO DOMINE A 110% ACCESS 2010 A VISTA BACKSTAGE Assim que é activado o Access, é visualizado o ecrã principal de acesso na nova vista Backstage. Após aceder ao Access 2010, no canto superior esquerdo do Friso,

Leia mais

www.marketingdigitalexpress.com.br - Versão 1.0 Página 1

www.marketingdigitalexpress.com.br - Versão 1.0 Página 1 www.marketingdigitalexpress.com.br - Versão 1.0 Página 1 Remarketing é um recurso utilizado para direcionar anúncios personalizados para as pessoas que visitaram uma determinada página do seu site ou clicaram

Leia mais

Módulo 3936 ASP.NET. Financiado pelo FSE

Módulo 3936 ASP.NET. Financiado pelo FSE EISnt Centro de Formação Profissional, Engenharia Informática e Sistemas, Novas Tecnologias, Lda Avª D. João I, nº 380/384 Soutelo 4435-208 Rio Tinto Portal Internet : www.eisnt.com E-Mail : formação@eisnt.com

Leia mais

ZS Rest. Manual Profissional. Instalação do Software. v2011

ZS Rest. Manual Profissional. Instalação do Software. v2011 Manual Profissional Instalação do Software v2011 1 1. Índice 2. Introdução... 2 3. Antes de Instalar... 3 b) Ter em consideração... 3 4. Iniciar a Instalação... 4 c) 1º Passo... 4 d) 2º Passo... 5 e) 3º

Leia mais

Satélite. Manual de instalação e configuração. CENPECT Informática www.cenpect.com.br cenpect@cenpect.com.br

Satélite. Manual de instalação e configuração. CENPECT Informática www.cenpect.com.br cenpect@cenpect.com.br Satélite Manual de instalação e configuração CENPECT Informática www.cenpect.com.br cenpect@cenpect.com.br Índice Índice 1.Informações gerais 1.1.Sobre este manual 1.2.Visão geral do sistema 1.3.História

Leia mais

No VirtualBox, carregar no Botão Novo (New), que irá abrir o Assistente de Criação de Máquina Virtual para criar uma nova VM.

No VirtualBox, carregar no Botão Novo (New), que irá abrir o Assistente de Criação de Máquina Virtual para criar uma nova VM. INSTALAÇÃO E GESTÃO DE REDES INFORMÁTICAS EFA NS/NÍVEL III UFCD 5 FORMADOR: PAULO RELVAS Fontes: http://www.formatds.org/instalar-ubuntu-no-virtualbox/ MANUAL DE INSTALAÇÃO UBUNTU 8.10 SOBRE VBOX DA SUN

Leia mais

Introdução. História. Como funciona

Introdução. História. Como funciona Introdução O HTML é uma linguagem de marcação utilizada para desenvolvimento de sites. Esta linguagem surgiu junto com o HTTP, ambos possibilitaram a internet ser popularizada. História O HTML foi criado

Leia mais

Como criar e gerir um blog?

Como criar e gerir um blog? Como criar e gerir um blog? Como criar um blog? Como escrever num blog? Como visualizar o meu blog? Como apagar ou emendar um texto que já tenha sido publicado? O Sistema de Comentários Configurações Importantes!!

Leia mais

www.enviarsms.smsvianetportugal.com Descrição de Como Utilizar

www.enviarsms.smsvianetportugal.com Descrição de Como Utilizar www.enviarsms.smsvianetportugal.com Descrição de Como Utilizar Este interface de utilizador, do serviço www.smsvianetportugal.com, permite a ceder à mesma conta de cliente, que através do interface simplesms.smsvianetportugal.

Leia mais

Programação WEB. Prof. André Gustavo Duarte de Almeida andre.almeida@ifrn.edu.br docente.ifrn.edu.br/andrealmeida. Aula III Introdução PHP

Programação WEB. Prof. André Gustavo Duarte de Almeida andre.almeida@ifrn.edu.br docente.ifrn.edu.br/andrealmeida. Aula III Introdução PHP Programação WEB Prof. André Gustavo Duarte de Almeida andre.almeida@ifrn.edu.br docente.ifrn.edu.br/andrealmeida Aula III Introdução PHP Introdução PHP PHP=Hypertext Pre-Processor Linguagem de script open

Leia mais

O GUIA PRÁTICO DAS REDES LOCAIS E WIRELESS

O GUIA PRÁTICO DAS REDES LOCAIS E WIRELESS ANTÓNIO EDUARDO MARQUES O GUIA PRÁTICO DAS REDES LOCAIS E WIRELESS Portugal/2007 Reservados todos os direitos por Centro Atlântico, Lda. Qualquer reprodução, incluindo fotocópia, só pode ser feita com

Leia mais

Vamos Criar um Ponto de Restauro no Windows

Vamos Criar um Ponto de Restauro no Windows 2013-05-20 19:43:57 Olá meus caros pequenos génios informáticos. Hoje vamos continuar a ajudar-vos na protecção do vosso computador. Já falámos em melhorar o arranque do Windows, libertando-o de processos

Leia mais

Oficina de Construção de Páginas Web

Oficina de Construção de Páginas Web COMPETÊNCIAS BÁSICAS EM TIC NAS EB1 Oficina de Construção de Páginas Web Criação e Publicação Actividades de exploração Objectivo Explorar as funcionalidades essenciais do Programa, na perspectiva da construção/actualização

Leia mais

geral@centroatlantico.pt www.centroatlantico.pt Impressão e acabamento: Inova 1ª edição: Janeiro de 2004

geral@centroatlantico.pt www.centroatlantico.pt Impressão e acabamento: Inova 1ª edição: Janeiro de 2004 MANTENHA-SE INFORMADO Envie um e-mail* para software@centroatlantico.pt para ser informado sempre que existirem actualizações a esta colecção ou outras notícias importantes sobre o Outlook Express 6. Reservados

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

Na Figura a seguir apresento um exemplo de uma "mini-tabela" de roteamento:

Na Figura a seguir apresento um exemplo de uma mini-tabela de roteamento: Tutorial de TCP/IP - Parte 6 - Tabelas de Roteamento Por Júlio Cesar Fabris Battisti Introdução Esta é a sexta parte do Tutorial de TCP/IP. Na Parte 1 tratei dos aspectos básicos do protocolo TCP/IP. Na

Leia mais

MANTENHA-SE INFORMADO

MANTENHA-SE INFORMADO MANTENHA-SE INFORMADO * O leitor consente, de forma expressa, a incorporação e o tratamento dos seus dados nos ficheiros automatizados da responsabilidade do Centro Atlântico, para os fins comerciais e

Leia mais

Tutorial: Do YouTube para o PowerPoint

Tutorial: Do YouTube para o PowerPoint Autor: João Pina aragaopina@gmail.com 01-03-2010 OBJECTIVOS No final deste tutorial será capaz de: A. Retirar vídeos do YouTube; B. Converter os vídeos num formato passível de ser integrado em PowerPoint;

Leia mais

Microsoft Access: Criar consultas para um novo banco de dados. Vitor Valerio de Souza Campos

Microsoft Access: Criar consultas para um novo banco de dados. Vitor Valerio de Souza Campos Microsoft Access: Criar consultas para um novo banco de Vitor Valerio de Souza Campos Conteúdo do curso Visão geral: consultas são essenciais Lição: inclui sete seções Tarefas práticas sugeridas Teste.

Leia mais

SECUNDÁRIA DE CAMARATE DIGIT@L. Plataforma Office 365. Alojamento de ficheiros - OneDrive para Empresas

SECUNDÁRIA DE CAMARATE DIGIT@L. Plataforma Office 365. Alojamento de ficheiros - OneDrive para Empresas SECUNDÁRIA DE CAMARATE DIGIT@L Plataforma Office 365 Alojamento de ficheiros - OneDrive para Empresas Conteúdo Nota prévia... 2 Alojamento de ficheiros o OneDrive para Empresas... 2 Funcionalidades do

Leia mais

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos.

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos. JavaScript JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos. Pode ser usada dentro do próprio arquivo HTML ou estruturada em um

Leia mais

JDBC Java Database Connectivity

JDBC Java Database Connectivity 5 JDBC Java Database Connectivity Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Trabalhar com bancos de dados em aplicações web em JSP através das classes

Leia mais

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões Prof. MSc. Hugo Souza Se você precisar manter informações sobre seus usuários enquanto eles navegam pelo seu site, ou até quando eles saem

Leia mais

Conteúdo Programático de PHP

Conteúdo Programático de PHP Conteúdo Programático de PHP 1 Por que PHP? No mercado atual existem diversas tecnologias especializadas na integração de banco de dados com a WEB, sendo o PHP a linguagem que mais se desenvolve, tendo

Leia mais

Novo Formato de Logins Manual de Consulta

Novo Formato de Logins Manual de Consulta Gestão Integrada de Acessos Novo Formato de Logins Manual de Consulta Gestão Integrada de Acessos Histórico de Alterações Versão Descrição Autor Data 1.0 Versão inicial DSI/PPQ 2014-07-11 Controlo do documento

Leia mais

PRIMAVERA EXPRESS: Funcionalidades do Produto

PRIMAVERA EXPRESS: Funcionalidades do Produto PRIMAVERA EXPRESS: Funcionalidades do Produto Como efetuo a mudança de ano do Ponto de Venda? No Programa Express aceda a Tabelas Pontos de Venda Postos de Venda abrir o separador Movimentos Caixa e: -

Leia mais

AMBIENTE DE PROGRAMAÇÃO PYTHON

AMBIENTE DE PROGRAMAÇÃO PYTHON Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2003/2004 FICHA 1 AMBIENTE DE PROGRAMAÇÃO PYTHON 1.1. Objectivos

Leia mais

Scriptlets e Formulários

Scriptlets e Formulários 2 Scriptlets e Formulários Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Permitir ao aluno aprender a criar um novo projeto Java para web no Netbeans IDE,

Leia mais

bit Tecnologia ao Serviço do Mundo Rural www.ruralbit.pt

bit Tecnologia ao Serviço do Mundo Rural www.ruralbit.pt bit Tecnologia ao Serviço do Mundo Rural www.ruralbit.pt :: Ruralbit :: http://www.ruralbit.pt :: Índice :: Ruralbit :: http://www.ruralbit.pt :: Pág. 1 Introdução O Pocket Genbeef Base é uma aplicação

Leia mais

Data de Aplicação 2/04/2009

Data de Aplicação 2/04/2009 FICHA TÉCNICA Exercício nº 9 Data de Aplicação 2/04/2009 NOME DO EXERCÍCIO Instalação de Software Base DESTINATÁRIOS Duração Pré Requisitos Recursos / Equipamentos Orientações Pedagógicas OBJECTIVOS Resultado

Leia mais

Dicas para usar melhor o Word 2007

Dicas para usar melhor o Word 2007 Dicas para usar melhor o Word 2007 Quem está acostumado (ou não) a trabalhar com o Word, não costuma ter todo o tempo do mundo disponível para descobrir as funcionalidades de versões recentemente lançadas.

Leia mais

geral@centroatlantico.pt www.centroatlantico.pt Impressão e acabamento: Inova 1ª edição: Fevereiro de 2006

geral@centroatlantico.pt www.centroatlantico.pt Impressão e acabamento: Inova 1ª edição: Fevereiro de 2006 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. Nero 7 Colecção: Software Obrigatório

Leia mais

ZSRest. Manual Profissional. Comandos Rádio X64. V2011-Certificado

ZSRest. Manual Profissional. Comandos Rádio X64. V2011-Certificado Manual Profissional Comandos Rádio X64 V2011-Certificado 1 1. Índice 2. INTRODUÇÃO... 2 3. Configuração inicial... 3 4. Configurações X64... 5 a) Definições Gerais... 5 b) Documentos e Periféricos... 8

Leia mais

Manual de Administração Intranet BNI

Manual de Administração Intranet BNI Manual de Administração Intranet BNI Fevereiro - 2010 Índice 1. Apresentação... 3 2. Conceitos... 5 3. Funcionamento base da intranet... 7 3.1. Autenticação...8 3.2. Entrada na intranet...8 3.3. O ecrã

Leia mais

P S I 2. º A N O F 5 M E S T R E / D E T A L H E E P E S Q U I S A. Criar uma relação mestre-detalhe. Pesquisa de informação

P S I 2. º A N O F 5 M E S T R E / D E T A L H E E P E S Q U I S A. Criar uma relação mestre-detalhe. Pesquisa de informação P S I 2. º A N O F 5 M E S T R E / D E T A L H E E P E S Q U I S A Módulo 18 Ferramentas de Desenvolvimento de Páginas Web Criar uma relação mestre-detalhe 1. Cria uma cópia da página «listaferram.php»

Leia mais

EDITORA FERREIRA MP/RJ_EXERCÍCIOS 01

EDITORA FERREIRA MP/RJ_EXERCÍCIOS 01 EDITORA FERREIRA MP/RJ NCE EXERCÍCIOS 01 GABARITO COMENTADO 01 Ao se arrastar um arquivo da pasta C:\DADOS para a pasta D:\TEXTOS utilizando se o botão esquerdo do mouse no Windows Explorer: (A) o arquivo

Leia mais

3 Dicas MATADORAS Para Escrever Emails Que VENDEM Imóveis

3 Dicas MATADORAS Para Escrever Emails Que VENDEM Imóveis 3 Dicas MATADORAS Para Escrever Emails Que VENDEM Imóveis O que é um e- mail bem sucedido? É aquele e- mail que você recebe o contato, envia o e- mail para o cliente e ele te responde. Nós não estamos

Leia mais

Folha de Cálculo (Excel)

Folha de Cálculo (Excel) Tecnologias de Informação e Comunicação Folha de Cálculo (Excel) Professor: Rafael Vieira. 1. Introdução à folha de cálculo o nome folha de cálculo atribuído a este tipo de programas, deve-se, principalmente,

Leia mais

Web Design. Prof. Felippe

Web Design. Prof. Felippe Web Design Prof. Felippe 2015 Sobre a disciplina Fornecer ao aluno subsídios para o projeto e desenvolvimento de interfaces de sistemas Web eficientes, amigáveis e intuitivas. Conceitos fundamentais sobre

Leia mais

Múltiplos Estágios processo com três estágios Inquérito de Satisfação Fase II

Múltiplos Estágios processo com três estágios Inquérito de Satisfação Fase II O seguinte exercício contempla um processo com três estágios. Baseia-se no Inquérito de Satisfação Fase II, sendo, por isso, essencial compreender primeiro o problema antes de começar o tutorial. 1 1.

Leia mais

BEMVINDO AO ONLINE SHIPPING MANUAL

BEMVINDO AO ONLINE SHIPPING MANUAL Online Shipping BEMVINDO AO ONLINE SHIPPING MANUAL EM VIAGEM OU NO ESCRITÓRIO, O ONLINE SHIPPING LEVA-O LÁ. É ideal para empresas com um pequeno volume de envios, secretariados, receções, viajantes frequentes

Leia mais

PHP Material de aula prof. Toninho (8º Ano)

PHP Material de aula prof. Toninho (8º Ano) Na aula anterior entendemos como se faz o acesso aos nossos arquivos PHP; Como construir um script em php. Nesta aula (3) vamos entender: Como roda o PHP Inserindo comentários Visualizando páginas a partir

Leia mais

Manual Sistema de Autorização Online GW

Manual Sistema de Autorização Online GW Sistema de Autorização Online GW Sumário Introdução...3 Acesso ao sistema...4 Logar no sistema...4 Autorizando uma nova consulta...5 Autorizando exames e/ou procedimentos...9 Cancelamento de guias autorizadas...15

Leia mais

HTML / JAVASCRIPT. A versão atual é o HTML5 (seus predecessores imediatos são HTML 4.01, XHTML 1.1, etc.).

HTML / JAVASCRIPT. A versão atual é o HTML5 (seus predecessores imediatos são HTML 4.01, XHTML 1.1, etc.). HTML / JAVASCRIPT Estamos iniciando o estudo do HTML através das TAGS (comandos) para construir formulários. Isso facilitará a continuidade dos nossos estudos da linguagem de programação JavaScript, a

Leia mais

mkdir /srv/www/default/html/calculadora/imagens mkdir /srv/www/default/html/calculadora/blocos

mkdir /srv/www/default/html/calculadora/imagens mkdir /srv/www/default/html/calculadora/blocos Programando em PHP www.guilhermepontes.eti.br lgapontes@gmail.com Criando uma Calculadora Primeiramente deve se criar uma estrutura para armazenar os arquivos necessários para o funcionamento da calculadora.

Leia mais

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas Microsoft Power Point 2003 No Microsoft PowerPoint 2003, você cria sua apresentação usando apenas um arquivo, ele contém tudo o que você precisa uma estrutura para sua apresentação, os slides, o material

Leia mais

Trecho retirando do Manual do esocial Versão 1.1

Trecho retirando do Manual do esocial Versão 1.1 Trecho retirando do Manual do esocial Versão 1.1 A rotina de acesso direto ao XML do S-1000, o usuário pode encontrar na opção de cadastro de Empresas do SIP. Sempre que o usuário localizar a figura ao

Leia mais

Sistema GPB Gestão de Pombais

Sistema GPB Gestão de Pombais Sistema GPB Gestão de Pombais Manual Rápido (Versão 07.01) Janeiro de 2007 SITE : WWW.SISTEMAGP.COM EMAIL: GERAL@SISTEMAGP.COM Um produto POMOR Software de Gestão, Lda. Objectivo deste Manual Rápido Com

Leia mais

Algoritmos em Javascript

Algoritmos em Javascript Algoritmos em Javascript Sumário Algoritmos 1 O que é um programa? 1 Entrada e Saída de Dados 3 Programando 4 O que é necessário para programar 4 em JavaScript? Variáveis 5 Tipos de Variáveis 6 Arrays

Leia mais

SAMUO APP: MANUAL DO ADMINISTRADOR

SAMUO APP: MANUAL DO ADMINISTRADOR as novas tecnologias ao serviço do desenvolvimento de projectos w w w. i m a d i p. c o m CABO VERDE: REALIZAÇÃO DE UMA ACÇÃO- PILOTO PARA A MELHORIA DA GESTÃO NUM GABINETE TÉCNICO SELECCIONADO OFITEC

Leia mais

ZS Rest. Manual Profissional. BackOffice Mapa de Mesas. v2011

ZS Rest. Manual Profissional. BackOffice Mapa de Mesas. v2011 Manual Profissional BackOffice Mapa de Mesas v2011 1 1. Índice 2. Introdução... 2 3. Iniciar ZSRest Backoffice... 3 4. Confirmar desenho de mesas... 4 b) Activar mapa de mesas... 4 c) Zonas... 4 5. Desenhar

Leia mais

CRIAÇÃO E MANUTENÇÃO DE BLOGUES

CRIAÇÃO E MANUTENÇÃO DE BLOGUES CRIAÇÃO E MANUTENÇÃO DE BLOGUES CRIAÇÃO E MANUTENÇÃO DE BLOGUES Aproveitando o próprio ambiente Internet, apresentamos neste tutorial um conjunto de sugestões para criar e manter o seu blogue. Indicamos

Leia mais

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos TUTORIAL Memória Flash Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br

Leia mais

Editor HTML. Composer

Editor HTML. Composer 6 Editor HTML 6 Composer Onde criar Páginas Web no Netscape Communicator? 142 A estrutura visual do Composer 143 Os ecrãs de apoio 144 Configurando o Composer 146 A edição de Páginas 148 Publicando a sua

Leia mais