jQuery e ASP para cadastrar dados
Usar o jQuery é uma forma mais fácil de criar funcionalidades extras em seus sistemas, de animações básicas a grandes galerias de fotos, mas vamos para o nosso foco que é inserir no banco.
Criei um arquivo chamado funcao_jquery.js para colocar a função de efeito do jQuery. Para nossa aplicação usei o efeito fadeIn().
O Fade in (a função fadeIn()) serve para dar opacidade, e pode ser ajustado para ter animação. Existem três strings de velocidade predefinidas (“slow”, “def”, e “fast”), usei a slow em nossa aplicação;
fadeIn("slow");
Criei dois campos de exemplo (Nome e E-Mail) e um botão “submit“. Podem ser criados quantos necessários:
<form action="Cadastro_JQuery.asp?Cadastrar=Ok" method="post">
Nome: <input name="Nome" type="text" id="Nome" />
<br>
E-Mail: <input name="EMail" type="text" id="EMail" />
<input name="btAdd" type="submit" value="Adicionar" id="btn_enviar" />
</form>
No action do formulário coloquei uma Query “Cadastrar” com valor ok para ativar a ação do ASP (usando JScript) que segue abaixo:
<%
// Função para cadastrar no banco
if (Request.QueryString("Cadastrar") == "Ok") {
var nome = Request.Form("Nome");
var email = Request.Form("EMail");
Conexao.Execute("Insert Into Newsletter (Nome, EMail)
Values ('"+nome+"', '"+email+"')");
Response.Write("");
}
%>
Usando listas (UL>LI) eu pego as informações do banco e organizo tudo para ser mostrado ao usuário:
<%
var rs = Conexao.Execute("Select * From Teste"); // SQL para listar os dados
if (rs == null) {
Response.Write("NADA ENCONTRADO");
}
else {
while (!rs.EOF) {
Response.Write("<li>"+rs("Nome")+" : "+rs("EMail")+"</li>")
// Lista todos os cadastrados do banco
rs.MoveNext();
}
}
%>
No ASP, com JScript para verificar se existe algo no banco, eu pego o RecordSet e comparo ele com “null” e o “else” caso encontre;
if (rs == null) {
… continua o resto do código…
A mesma idéia temos para o “loop”, só que uso o End Of File (.EOF)
while (!rs.EOF) {
… continua o resto do código …
Em seqüência imprimo na tela o que foi encontrado.
O jQuery vai agir da seguinte maneira:
No botão de tipo “submit” coloquei uma ID de nome “btn_enviar”, quando o botão for clicado será enviado os parâmetros via POST para o jQuery.
$('#btn_enviar').click(function(){
var nome_post = $('#Nome').val();
var email_post = $('#EMail').val();
$.post("Cadastro_JQuery.asp?Cadastrar=Ok",{nome: nome_post, email: email_post}
Logo em seguida jogo dentro da lista (UL>LI).
$("ul li:last").after("<li>" + nome_post + " : " + email_post + "</li>").next().fadeIn("slow");
});
E finalizo limpando os campos. Veja na imagem abaixo:

Segue o link da página com o código completo e o arquivo jQuery!
Fonte: Imasters
Programação orientada a eventos e lambda function em ASP/VBScript
Programação orientada a eventos
A programação orientada a eventos, também conhecida como programação baseada em eventos, é um paradigma de programação, isto é, um estilo fundamental de se programar, no qual a execução do programa é afetada por eventos(geralmente detectados por sensores).
Esta forma de se programar é, na minha humilde opinião, a base de todos os sistemas de UI(User Interface) sofisticados. Por exemplo, aquela barrinha do MAC OSX que todos adoram e suas similares:
RocketDock
Ela nunca abre uma janela solicitando “Vá com o mouse para cima de um ícone e clique”, ela simplesmente possui um sensor que avisa “Olha, programa, detectei que o mouse entrou na posição (x,y) da barra”, ao receber esta mensagem o programa faz o zoom e mostra o label dos ícones na posição. Este parece um exemplo bobo, mas acho que ilustra bem a diferença entre a programação em lote e a programação orientada a eventos.
É importante para um programador web conhecer a programação orientada a eventos, pois uma das características mais marcantes da Web 2.0 é a grande quantidade de widgets que fazem parte das chamadas RIA(Rich Application Interface) que são aqueles programas com telas que você pensa “Que legal isso aqui!”.
Uma outra coisa importante a ser notada é que os paradigmas de programação não são mutuamente exclusivos, isto é, uma linguagem, e por conseqüência um programa, pode suportar múltiplos paradigmas. Um programa pode ser puramente em lote, puramente orientado a eventos, ou conter trechos de ambos os paradigmas. Pode-se, portanto, criar programas meio orientado a objetos/procedurais, meio orientado a eventos/lote. Um arquiteto de software experiente saberá qual o melhor paradigma a ser seguido para construir um determinado feature do programa.
Apesar desta forma de se programar poder ser executada em qualquer linguagem de programação, ela é facilitada por linguagens com noções funcionais como JScript, Lisp (a segunda linguagem mais antiga da nossa história), Haskell entre outras. Nos exemplos a seguir mostrarei como programar:
- Utilizando-se apenas VBScript.
- Fazendo um bridge simples com JScript para utilizar a noção de lambda que ela possui (um bom exercícío aqui é utilizar a noção de lambda do Python para alcançar o mesmo objetivo).
Nota: O segundo exemplo é um dos motivos pelos quais julgo o ASP extremamente versátil, pois ele mostra uma aplicação do conceito exposto no primeiro artigo.
Função lambda
Para aqueles que ainda não foram apresentados, a função lambda é um feature interessante que nasceu com o Lisp e permite você definir e utilizar funções em tempo de execução. Esta é uma das características que facilitaram o desenvolvimento de AI(Artificial Intelligence) (pense em um algorítimo recursivo que gera, interpreta e executa funções para gerar, interpretar e executar funções e vai aprendendo alguma coisa importante durante o processo).
Mãos à massa
Utilizando-se a classe CustomEvent(versão sem comentários) que escrevi para o AXE(ASP Xtreme Evolution), mas que funciona out-of-the-box e tem licensa MIT:
<% class CustomEvent public classType public classVersion public Owner private Handlers public Arguments private sub Class_initialize() classType = typename(Me) classVersion = "1.0.0" set Handlers = Server.createObject("Scripting.Dictionary") set Arguments = Server.createObject("Scripting.Dictionary") end sub private sub Class_terminate() Handlers.removeAll() Arguments.removeAll() set Handlers = nothing set Arguments = nothing end sub public sub addHandler(fn) select case typename(fn) case "JScriptTypeInfo" set Handlers.item(fn.toString()) = fn case else set Handlers.item(fn) = getRef(fn) end select end sub public sub removeHandler(fn) set Handlers.item(fn) = nothing Handlers.remove(fn) end sub public sub fire() dim fn : for each fn in Handlers Handlers.item(fn)(Me) next end sub public function revealArguments() revealArguments = "" dim arg : for each arg in Arguments revealArguments = revealArguments & ", " & arg next revealArguments = mid(revealArguments, 3) end function end class %> <script language="javascript" runat="server"> function lambda(f) { if(/^function\s*\([ a-z0-9.$_,]*\)\s*{[\S\s]*}$/gim.test(f)) { eval("f = " + f.replace(/\r/g, '').replace(/\n/g, '')); return f; } else { return function() {}; } } </script>Você pode criar eventos nas suas classes como no exemplo de classe abaixo, que será utilizada nos exemplos 1 e 2:<% class ClassWithEvents public classType public classVersion public onComplimentBefore' [1] public onComplimentAfter private sub Class_initialize() classType = typename(Me) classVersion = "1.0.0" set onComplimentBefore = new CustomEvent : set onComplimentBefore.Owner = Me' [2] set onComplimentAfter = new CustomEvent : set onComplimentAfter.Owner = Me end sub private sub Class_terminate() set onComplimentBefore = nothing' [3] set onComplimentAfter = nothing end sub public sub compliment(firstname, lastname, nickname) onComplimentBefore.Arguments.item("firstname") = firstname' [4] onComplimentBefore.Arguments.item("lastname") = lastname onComplimentBefore.Arguments.item("nickname") = nickname call onComplimentBefore.fire()' [5] Response.write("Method compliment called." & vbNewline) call onComplimentAfter.fire() end sub end class %>
Exemplo 1
Utilizando a classe que possui eventos para criar objetos com eventos em VBScript:
<code><pre><%
sub ev_onComplimentBefore(ev)' [6]
Response.write("Event onComplimentBefore has been fired.
I was really expecting this method to say:
'Hello World " & ev.Arguments.item("firstname") & " " &
ev.Arguments.item("lastname") & " (" & ev.Arguments.item("nickname") & ")'" & vbNewline)
end sub
sub ev_onComplimentAfter(ev)
Response.write("Event onComplimentAfter has been fired" & vbNewline)
end sub
dim CwE : set CwE = new ClassWithEvents
call CwE.onComplimentBefore.addHandler("ev_onComplimentBefore")' [7]
call CwE.onComplimentAfter.addHandler("ev_onComplimentAfter")
call CwE.compliment("Fabio", "Nagao", "nagaozen")
set CwE = nothing
%></pre></code>
O código acima deve escrever na tela do seu navegador:
Event onComplimentBefore has been fired. I was really expecting this method to say: ‘Hello World Fabio Nagao (nagaozen)’
Method compliment called.
Event onComplimentAfter has been fired
Seguem abaixo as notas de rodapé [#] que deixei no código fonte:
- Definindo os eventos.
- Inicializando os eventos como tipo CustomEvent e atribuindo um ponteiro à instância da classe através da propriedade Owner.
- Liberando os eventos criados na etapa 2 da memória.
- Definindo os argumentos do evento.
- Avisando o sensor que ocorreu um evento.
- Configurando ações para um determinado evento.
- Configurando o sensor para observar um evento.
Exemplo 2
Ok, o exemplo 1 foi legal, mas a maioria das pessoas acostumadas com programação orientada a eventos vai reclamar daquelas subrotinas da nota [6]. O que é natural, pois aquilo é pouquíssimo intuitivo. Afinal de contas, se os eventos estão relacionados ao objeto e somente a ele, porque não os definir dentro do próprio objeto? Bom, isso é verdade, o problema é que o VBScript não possui nenhum método para fazer isso dentro do objeto. Aqui, novamente IMHO(In My Humble Opinion), as alternativas naturais seriam:
* ou extender a classe ClassWithEvents para outra classe que possuísse as definições das ações do evento e depois criar uma instância dessa nova classe, o que é impossível pela noção de objetos do VBScript;
* ou utilizar a noção de lambda function, que também não existe no VBScript.
Então, o que fazer? Se render às limitações expressivas da linguagem? Jamais! Afinal de contas, não adianta mudar de linguagem, pois qualquer linguagem sempre tem limitações, não é verdade?
A solução, dentro do ASP, é mais fácil do que se imagina. Você fala JScript? Python? Haskell? Nossa, o ASP também! Essas linguagens possuem uma capacidade expressiva funcional? Siiim! Pronto, resolvido o problema!
Explicando melhor: Para aqueles que ainda não perceberam, juntamente com a definição da classe CustomEvent, criei também uma função global em javascript (que é a mesma coisa que JScript) chamada lambda. Essa função recebe a definição de uma função, interpreta e retorna a função interpretada. Javascript é uma linguagem tão bonita que incorporou o conceito de lambda ao seu núcleo e portanto ela usa lambda sem ter uma palavra reservada para isso (diferentemente do Python). Esta função, dentro do ASP, não é global apenas para o JScript, ela é global para a aplicação inteira, isto é, você pode invocar ela do VBScript. Com essa nova função em mãos, podemos transformar o exemplo 1 no seguinte:
<%
dim CwE : set CwE = new ClassWithEvents
call CwE.onComplimentBefore.addHandler(lambda("function(ev){ Response.write('Event onComplimentBefore has been fired. I
was really expecting this method to say: \'Hello World ' + ev.Arguments.item('firstname') + ' ' +
ev.Arguments.item('lastname') + ' (' + ev.Arguments.item('nickname') + ')\'\r\n') }"))
call CwE.onComplimentAfter.addHandler(lambda("function(ev){ Response.write('Event onComplimentAfter has been fired') }"))
call CwE.compliment("Fabio", "Nagao", "nagaozen")
set CwE = nothing
%>
Que também imprime a mesma mensagem do exemplo 1 na tela do navegador. Convenhamos, ficou bem melhor agora, não? Muito mais intuitívo também.
Resumo da história
O paradigma de programação orientada a objetos aplicado juntamente com o de programação orientado a eventos, permite ao programador criar ambientes que se assemelham muito à forma que compreendemos os objetos e eventos no nosso mundo físico. Por exemplo, estamos acostumados a atravessar a rua quando o semáforo está verde e a parar quando está vermelho. Um programador, ao tentar modelar este ambiente, pode criar, por exemplo, as classes “Pedestre” e “Semáforo”. O “Pedestre” tem um método “.andarPara(local)” que diz para ele ir para algum local. Este método, possui um sensor “onSemáfaroVermelho” que aciona o procedimento “.parar”, quando o sensor do pedestre receber “onSemáfaroVerde” do “Semáforo”, então ele chama “.andarPara(local)” novamente.
ASP: Excluindo arquivos de forma inteligente
Caros, por esses dias precisei gerar um arquivo PDF para o usuário baixar, mas enfrentei um problema. Ao gerar o PDF diretamente no navegador utilizando BinaryWrite e alterando o ContentType da página, encontrei muitos erros devido às configurações em navegadores distintos.
Para não depender do navegador do usuário, resolvi gerar os arquivos em uma determinada pasta no servidor, redirecionar a página para o usuário baixar o arquivo e executar uma rotina que apagasse os arquivos de tempos em tempos.
Desenvolvi essa página ASP onde determinei em constantes o “tempo de vida” dos arquivos. É necessário agendar essa rotina para ser executada no servidor.
Segue abaixo o código ASP utilizado:
<%
´Constante que determina o "tempo de vida" dos arquivos
const TEMPO_DE_VIDA = 20
´Constante que determina a unidade do "tempo de vida"
´yyyy - Year´
´q - Quarter
´m - Month
´y - Day of year
´d - Day
´w - Weekday
´ww - Week of year
´h - Hour
´n - Minute
´s - Second
const TEMPO_DE_VIDA_UN = "n"
´variável para
dim pasta
pasta = Server.MapPath("./arquivos/")
´Declara o File System Object
set fso = server.CreateObject("Scripting.FileSystemObject")
´GetFolder retorna a pasta passada por parâmetro
set fsoP = fso.getFolder(pasta)
´fsoP.files contem todos os arquivos da pasta
for each arq in fsoP.files
´Escreve na tela o nome do arquivo e sua data de criação.
Response.Write(arq.name&" - criado em "&arq.dateCreated&".<br />")
´Caso o "tempo de vida" do arquivo tenha passado o tempo permitido, o arquivo é deletado
if DateDiff(TEMPO_DE_VIDA_UN,arq.dateCreated,now) > TEMPO_DE_VIDA then
´Escreve na tela o nome do arquivo deletado
Response.Write(arq.name&" deletado.<br/>")
´Deleta o arquivo
arq.Delete
end if
next
´Libera variáveis da memória
set pasta = nothing
set arq = nothing
set fsoP = nothing
set fso = nothing
%>
Seguem alguns dos atributos do file (arq) que podem ajudá-los no critério para exclusão dos arquivos.
Attributes (pode ser setado)
Atributos do arquivo. Pode ser um ou mais dos seguintes valores:
- 0 = Arquivo normal
- 1 = Arquivo somente leitura
- 2 = Arquivo oculto
- 4 = Arquivo de sistema
- 16 = Pasta ou diretório
- 32 = Arquivos alterados desde o último backup
- 1024 = Link ou atalho
- 2048 = Arquivo compactado
DateCreated
Retorna a data e a hora em que o arquivo foi criado.
DateLastAccessed
Retorna a data e a hora em que o arquivo foi acessado.
DateLastModified
Retorna a data e a hora da última vez que o arquivo foi modificado.
Drive
Retorna a letra do drive em que o arquivo está.
Name (pode ser setado)
Nome do arquivo.
ParentFolder
Retorna o caminho complete da pasta onde o arquivo está.
Path
Retorna o caminho complete do arquivo no servidor.
Size
Retorna o tamanho, em bytes, do arquivo.
Type
Retorna o tipo do arquivo.
ASP: Paginação estilo wp-PageNavi (Plugin do WordPress)
Sabemos que existem várias formas de paginação com ASP, mas consegui, de um modo extremamente compacto, desenvolver uma paginação estilo a wp-PageNavi, que é um Plugin que uso e que vários blogueiros usam no WordPress. Usei um pouco de CSS, mas que não vem ao caso, e banco MySQL. Vamos lá, então!!
O banco MySQL fica assim:
Nome da Tabela: TabelaDados
Coluna 01: Codigo – INT(1) NOT NULL, PRIMARY, AUTO
Coluna 02: Unidade – VARCHAR(5) NULL
Coluna 03: Nome – VARCHAR(100) NULL
Criamos uma estrutura simples de página HTML para receber as informações, ficando assim:
<%@ Language="VBScript" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Paginando Dados</title>
</head>
<style type="text/css">
.table {border: 1px solid #FF9933;}
.table td {border: 1px solid #FF9933;}
.pagNumberMark {background: #B5C905; font: 12px Arial; color: #FFFFFF;}
.pagNumber {background: #333333; font: 12px Arial; color: #FFFFFF;}
.fonteBr {font: 14px Arial; color: #FFFFFF;}
.fontePr {font: 12px Arial; color: #000000;}
.fontePontos {border: 1px solid #333333; font: 14px Arial; color: #000000;
background: #FFFFFF;}
a {text-decoration: none;}
.fonte {font: 12px Arial; color: #FFFFFF;}
</style>
<body>
Abaixo da tag <body> vamos criar as tabelas necessárias. Em particular criei uma tabela com duas linhas e, na primeira linha, criei uma tabela com duas linhas e 3 colunas para colocar as informações do banco. Façam como acharem melhor.
Fiz minha conexão com o banco e logo abaixo criei um RecordSet para meu SQL, limitei 15 linhas por página e usei o CursorLocation = 3.
Usei o PageCount para saber quantas páginas foram criadas, assim posso usar essa informação em qualquer lugar da aplicação.
<table width="600" border="0" align="center" cellpadding="0" cellspacing="0">
<%
Dim Conexao
Set Conexao = Server.CreateObject("Adodb.Connection")
Conexao.ConnectionString = "Driver=MySQL ODBC 3.51 Driver; DataBase=xxxxxxx;
Server=xxxxxx; Uid=xxxx; PassWord=xxxxx;"
Conexao.Open
Dim Rs_DADOS, PagNav, TotalPag
Dim Anterior, Proximo, Jo, PaginaVisita
Set Rs_DADOS = Server.CreateObject("Adodb.RecordSet")
Conexao.CursorLocation = 3
Rs_DADOS.PageSize = 15
Rs_DADOS.Open "Select Codigo, Unidade, Nome From TabelaDados Order By Nome Desc",Conexao
If Rs_DADOS.Eof Then
Response.Write("<tr><td height=""28"" align=""center"">LISTA VAZIA</td></tr>")
Else
PagNav = CInt(Request.QueryString("Pages"))
If (PagNav = 0) Then : PagNav = 1 : End If
Rs_DADOS.AbsolutePage = PagNav
TotalPag = Rs_DADOS.PageCount
%>
<tr>
<td><table class="table" width="600" border="0" cellspacing="0" cellpadding="0">
<tr class="fonteBr">
<td width="145" height="36" align="center" bgcolor="#FFBA75"><strong>CÓDIGO</strong></td>
<td width="334" align="center" bgcolor="#FFBA75"><strong>NOME</strong></td>
<td width="119" align="center" bgcolor="#FFBA75"><strong>UNIDADE</strong></td>
</tr>
Criei um While baseado na função AbsolutePage, assim posso ter controle também das páginas, para quando eu quiser voltar ou avançar. A variável PagNav está tendo o valor da página atual.<% While Not Rs_DADOS.Eof And Rs_DADOS.AbsolutePage = PagNav %> <tr class="fontePr"> <td height="27" align="center"><% Response.Write(Rs_DADOS("Codigo")) %></td> <td align="center"><% Response.Write(Rs_DADOS("Nome")) %></td> <td align="center"><% Response.Write(Rs_DADOS("Unidade")) %></td> </tr> <% Rs_DADOS.MoveNext : Wend Anterior = PagNav - 1 Proximo = PagNav + 1 If (Anterior <= 0) Then : Anterior = 1 : End If If (Proximo > TotalPag) Then : Proximo = TotalPag : End If %> </table></td> </tr>Agora abaixo tem a arte mais complicada e chata de se aplicar.<tr> <td height="28"> </td> </tr> <tr> <td align="center"><table width="457" height="41" border="0" cellpadding="0" cellspacing="4"> <tr> <td width="300" height="30" align="center" class="fontePr"><% If Request.QueryString("Pages") = "" Then Response.Write("Página 1 de "&TotalPag) Else Response.Write("Página "&Request.QueryString("Pages")&" de "&TotalPag) End If %></td> <td width="42" align="center" class="pagNumber"><a href="?Pages=1" class="fonte"> « Início </a> <% PaginaVisita = CInt(Request.QueryString("Pages")) If PagNav > 1 Then Response.Write("<td width=""36"" align=""center"" "& _ "class=""pagNumberMark""><a href=""?Pages="&Anterior&""" "& _ "style=""font: 12px Arial; color: #FFFFFF;""> « </a></td>") End If If PagNav > 5 Then Response.Write("<td width=""28"" align=""center"" class=""fontePontos""> ... </td>") End If %>
Eu limitei para aparecer cinco links por, [1] [2] [3] [4] [5], isso logo nos primeiros IF’s, os outros são para quando for uma menor quantidade de registro, exemplo [19] [20] [21], que não tem cinco links.
Segue o final do código:
Caso o conteúdo fique com 5 páginas ou abaixo
<%
If PagNav <= 5 Then
If TotalPag >= 5 Then
For Jo = 1 To 5
If PagNav = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
Else
For Jo = 1 To TotalPag
If PagNav = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
End If
End If
%>
Aqui é caso fique mais de 5 páginas ele vai colocando o seletor de páginas no meio e abrindo a paginação
<%
If PagNav > 5 Then
PagNav = PagNav + 4
Pg = PagNav
MaxB = Request.QueryString("Pages") - 1
If (MaxB + 1) = TotalPag Then
For Jo = MaxB To (Pg - 4)
If PaginaVisita = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
ElseIf (MaxB + 2) = TotalPag Then
For Jo = MaxB To (Pg - 3)
If PaginaVisita = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
Else
For Jo = (MaxB - 1) To (Pg - 2)
If PaginaVisita = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
End If
End If
If (TotalPag <> PaginaVisita) And (TotalPag >= 5) Then
Response.Write("<td width=""28"" align=""center"" class=""fontePontos""> ... </td>")
End If
%>
<td width="34" align="center" class="pagNumberMark"><a href="?Pages=<% Response.Write(Proximo) %>
" class="fonte"> » </a></td>
<td width="42" align="center" class="pagNumber"><a href="?Pages=<% Response.Write(TotalPag) %>
" class="fonte"> Final » </a></td>
</tr>
</table></td>
</tr>
<%
End If
Set Rs_DADOS = Nothing
%>
</table>
</body>
</html>
O resultado final é:

Repare que uso muito os IF’s para saber se é menor que 5, maior que 5 e por aí vai.
O código não é tão difícil quando você começa a utilizar ele com frequência, aprenderá com o tempo!!
Baixe aquio código completo!
ASP: Bloqueando endereços IP
Para bloquear IP, antes iremos verificar o endereço IP de um visitante, que é um processo muito simples, já que existem duas variáveis de servidor que nos oferecerão diretamente esta informação.
Existem dois modos de navegação do usuário. Ele pode ter vindo de um Proxy ou em um browser que não usa Proxy. No primeiro caso sabemos que ele está vindo de um Proxy, através do HTTP_X_FORWARDED_FOR do objeto Request da coleção servervariaveis.
' recupera IP do visitante 'O visitante pode acessar por proxy, então pego a IP que estiver utilizando ip = request.ServerVariables("HTTP_X_FORWARDED_FOR") 'Se não vier do proxy, recupera ip do visitante if ip ="" then ip = Request.ServerVariables("REMOTE_ADDR") end ifSe quisermos evitar que um visitante navegue em nossas páginas com um IP, simplesmente temos que verificar com um IF que esse IP que queremos bloquear não é o do visitante.if ip = "127.0.0.1" then response.write ("bloqueio") end if
A variável REMOTE_ADDR devolve o endereço IP do Host remoto que faz a requisição, já o HTTP_X_FORWARDED_FOR irá dizer se usuário está atrás de um servidor proxy. Você deve usar este primeiro e se os resultados forem valor nulo ou “desconhecido”, então use Request.ServerVariables ["REMOTE_ADDR"] para determinar o endereço IP.
Imagine uma lista de IPs que desejamos bloquear. Inserimos um simples array contendo os IPs que queremos bloquear e faremos um loop para percorrê-lo, de modo que possamos verificar se o IP do usuário está na lista de IP´s a serem bloqueados.
'lista de ips bloqueados
dim ip_bloqueados(5)
ip_bloqueados(0) = "61.254.40.22"
ip_bloqueados(1) = "62.454.40.25"
ip_bloqueados(2) = "62.254.40.17"
ip_bloqueados(3) = "65.105.61.13"
ip_bloqueados(4) = "108.210.161.1"
for each ip_atual in ips_bloqueadas
'se o ip do visitante ,estiver na lista
if ip = ip_atual then
response.redirect " no_access. asp"
end if
next
O código abaixo irá detectar endereço de IP do visitante e verificar se
deve fazer o bloqueio de endereços IP. Se o endereço corresponde a
qualquer um de nossa matriz, o nosso visitante será redirecionado para
a página "no_access.asp".
<%
'declara variaveis
Dim sIP
Dim sIParray(5)
'endereços IP k serão bloqueados no array
sIParray(0) = "61.254.40.22"
sIParray(1) = "62.454.40.25"
sIParray(2) = "62.254.40.17"
sIParray (3) = "65.105.61.13"
sIParray (4) = "108.210.161.1"
'Recupera o endereço IP dos visitantes
sIP = Request.ServerVariables("REMOTE_ADDR")
' Loop através dos IPs banidos usando a função UBound
For i = 0 to UBound(sIParray)
'Verifica se o endereço IP corresponde a qualquer dos IPs bloqueados
If sIP = sIParray(i) Then
Response.Redirect "no_access.asp"
End If
Next
%>
Cadastrar, Listar, Editar e Excluir dados de um XML com ASP
Cadastrando
Primeiro temos que ter o XML pronto, como um Banco de Dados com suas “Colunas” já estruturadas. Adicionei três tags a ele e uma principal, as tags são nome, email e telefone, junto com a tag usuario, que fecha o registro e junto com a tag cadastro que chega o “pacote”. Então vamos lá:
Banco.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<cadastro>
<usuario>
<nome>teste nome</nome>
<email>teste email</email>
<telefone>teste telefone</telefone>
</usuario>
</cadastro>
Deixei a estrutura fixa, já com as tags nome, email e telefone, já preenchidas para só seguirem a base, saber do que cada elemento é composto.
XML criado então é só criar uma página chamada Cadastro.asp, dentro dela criar um formulário com os campos de Nome, E-Mail e Telefone e um botão para salvar, tudo em tags HTML mesmo.
Na mesma página fiz uma otimização, coloquei o código de cadastramento em ASP dentro da mesma página e ativei o script através do click do botão “Enviar”, finalizando fica assim:
Cadastro.asp
<%@ Language=”VBScript” %>
<html>
<body>
<a href=”Cadastro.asp”>CADASTRAR</a> – <a href=”Listar.asp”>LISTAR</a>
<br><br>
<form action=”Cadastro.asp” method=”post”>
<b>Nome: </b><input type=”text” name=”Nome”><br>
<b>E-Mail: </b><input type=”text” name=”EMail”><br>
<b>Telefone: </b><input type=”text” name=”Telefone”><br>
<input type=”submit” value=”Cadastrar” name=”btCad”>
</form>
</body>
</html>
<%
‘ Cadastrando dentro do arquivo XML
If Request.Form(”btCad”) = “Cadastrar” Then
Dim Nome, EMail, Telefone, Banco
Nome = Request.Form(”Nome”)
EMail = Request.Form(”EMail”)
Telefone = Request.Form(”Telefone”)
Banco = Server.MapPath(”Banco.xml”)
Set DocMT = Server.CreateObject(”Microsoft.XMLDOM”) ‘ Criando Objeto
DocMT.Load(Banco)
Set RaizXML = DocMT.documentElement
Set CriarReg = DocMT.createElement(”usuario”)
RaizXML.appendChild(CriarReg)
‘ Funcção para criar objetos dentro do XML
Function AlimentarXML(NomeElemento, NomeVariavel)
Set Campo = DocMT.createElement(””&NomeElemento&””)
Campo.Text = NomeVariavel
CriarReg.appendChild(Campo) ‘ Linha de criação de Objetos
End Function
Call AlimentarXML(”nome”, Nome)
Call AlimentarXML(”email”, EMail)
Call AlimentarXML(”telefone”, Telefone)
DocMT.Save(Banco)
Response.Write(”<script>alert(’Cadastrado com Sucesso!’);location=’Cadastro.asp’</script>”)
Set DocMT = Nothing
End If
%>
Para ficar mais fácil, deixei o código todo comentado, mas algumas linhas serão esclarecidas:
Para inserir dados no XML, usei o Microsoft.XMLDOM para conexão. Em cada inserção adiciono uma tag usuario com essa linha abaixo:
Set CriarReg = DocMT.createElement(“usuario”)
Como são três tags para ser alimentadas usei uma função de minha autoria para fazer esse trabalho, a [cor2]AlimentarXML[/cor2] e adiciono com a linha Call AlimentarXML(“nome”, Nome) e salvo tudo através do DocMT.Save(Banco) e pronto, é só testar e ver se o XML está sendo manipulado corretamente:
OBS: Quando testei no meu localhost, o arquivo Cadastro.asp deu erro de acesso. Teste ele em um servidor web e funcionou, caso isso aconteçam com vocês também.
De primeira, vamos organizar o arquivo Visualizar.xsl:
Visualizar.xsl
<?xml version=”1.0″?>
<xsl:stylesheet xmlns:xsl=”http://www.w3.org/TR/WD-xsl”>
<xsl:template match=”/”>
<center>
<font color=”#000000″ size=”2″ face=”MS Sans Serif”>Visualizando Dados</font>
<table width=”465″ border=”1″ cellspacing=”0″ cellpadding=”0″>
<tr>
<td width=”117″ height=”22″><div align=”center”><strong>Nome</strong></div></td>
<td width=”125″><div align=”center”><strong>E-mail</strong></div></td>
<td width=”107″><div align=”center”><strong>Telefone</strong></div></td>
<td width=”106″><div align=”center”><strong>Ações</strong></div></td>
</tr>
<xsl:for-each select=”cadastro/usuario”>
<tr align=”center”>
<td height=”22″><xsl:value-of select=”nome”/></td>
<td><xsl:value-of select=”email”/></td>
<td><xsl:value-of select=”telefone”/></td>
<td><a><xsl:attribute name=”href”>Editar.asp?nome=<xsl:value-of select=”nome”/><xsl:value-of select=”link”/></xsl:attribute>Editar</a>/<a><xsl:attribute name=”href”>Listar.asp?nome=<xsl:value-of select=”nome”/><xsl:value-of select=”link”/></xsl:attribute>Apagar</a></td>
</tr>
</xsl:for-each>
</table>
</center>
</xsl:template>
</xsl:stylesheet>
Com o stylesheet (que não vem ao caso explicar no momento) vamos fazendo a estrutura de visualização de todos os elementos da tag usuario através de um for-each assim:
<xsl:for-each select=”cadastro/usuario”> e fechando com </xsl:for-each>
Pegamos o valor dos elementos com essa estrutura aqui: <xsl:value-of select=”nome_da_tag”/>.
Usamos o atributo <xsl:attribute name=”href”> para gerar links, no nosso caso para excluir e editar (que não será mostrado nesse artigo).
Em uma página chamada Listar.asp criamos os objetos para chamar o XML e o XSL e integrá-los com o transformNode:
Set XMLDOC = Server.CreateObject(“Microsoft.XMLDOM”)
XSLDOC.Load(Server.MapPath(“Visualizar.xsl”))
Response.Write(XMLDOC.transformNode(XSLDOC))
Listar.asp
<%@ Language="VBScript" %>
<html>
<body>
<a href="Cadastro.asp">CADASTRAR</a> - <a href="Listar.asp">LISTAR</a>
<br><br>
<%
Set XSLDOC = Server.CreateObject("Microsoft.XMLDOM") ' Criando Objeto
Set XMLDOC = Server.CreateObject("Microsoft.XMLDOM") ' Criando Objeto
Listando Dados
XMLDOC.Load(Server.MapPath("Banco.xml"))
XSLDOC.Load(Server.MapPath("Visualizar.xsl"))
Response.Write(XMLDOC.transformNode(XSLDOC))
Deletando Dados
If CStr(Request.QueryString("Nome")) <> "" Then
Banco = Server.MapPath("Banco.xml") ' Chamando o Arquivo XML para sofrer alteração
XMLDOC.Load(Banco)Set RaizXML = XMLDOC.documentElement
Set AlterarReg = RaizXML.selectSingleNode("usuario[nome='"&Request.QueryString("nome")&"']")
RaizXML.removeChild(AlterarReg) ' Linha de remoção de ObjetosXMLDOC.Save(Banco)
Response.Write("<script>alert('Deletado com Sucesso!');location='Listar.asp'</script>")
End IfSet XSLDOC = Nothing
Set XMLDOC = Nothing
%>
</body>
</html> Uma observação: tentei fazer o mais fácil possível para garantir um bom entendimento na hora da programação. Qualquer alteração no código para facilitar os comandos será bem-vinda, então vamos lá.
Criem um arquivo chamado Editar.asp e nele serão lidas todas as tags que contém no arquivo Banco.xml , mas com a querystring passada pelo arquivo Ler.asp que criamos no artigo anterior. Vamos só alterar uma única tag, um único nó do XML. Lembrando que usei uma tag "nome": mas vocês poderiam criar uma tag "id" e colocar números seqüenciais ou randômicos, a escolha fica a critério.Vamos primeiro listar todos os registros.<%@ Language="VBScript" %><% Dim Banco : Banco = Server.MapPath("Banco.xml")
Set XMLDOC = Server.CreateObject("Microsoft.XMLDOM") Set objLER = Server.CreateObject("Microsoft.XMLDOM") XMLDOC.Load(Banco) Set objLER = XMLDOC.getElementsByTagName("*")%>
Logo abaixo desse script vamos criar o formulário com um “for” fazendo a varredura nas tags para pegar só o valor de tag citado na querystring passada:
%>
<b>Nome: </b><input type=”text” name=”Nome” value=”<% Response.Write(objLER.Item(i).Text) %>”><br>
<b>E-Mail: </b><input type=”text” name=”EMail” value=”<% Response.Write(objLER.Item(i+1).Text) %>”><br>
<b>Telefone: </b><input type=”text” name=”Telefone” value=”<% Response.Write(objLER.Item(i+2).Text) %>”><br>
<%
End If
Next
%>
<input type=”submit” value=”Editar” name=”btEdt”>
</form>
</body>
</html>
Reparem a linha onde temos If objLER.Item(i).Text = “”&Request.QueryString(“nome”)&”" Then, é ela que está “selecionando” a tag que quero mostrar.
E por fim a edição:
For i = 0 To (objLER.length – 1)
If objLER.Item(i).Text = “”&CampoUpdate&”" Then
objLER.Item(i).Text = Nome
objLER.Item(i+1).Text = EMail
objLER.Item(i+2).Text = Telefone
End If
Next
XMLDOC.Save(Banco)
Response.Write(“<script>alert(‘Editado com Sucesso!’);location=’Listar.asp’</script>”)
Set objLER_upDate = Nothing
End If
Set objLER = Nothing
Set XMLDOC = Nothing
%>
Coloquei a querystring passada em um campo hidden e joguei ele dentro de um “for“, como fiz no formulário, em seguida troquei os valores pelas variáveis em seqüência, Nome, EMail e Telefone, salvei com o método XMLDOC.Save e passei um alert em JavaScript e pronto!!
Esse tipo de utilização do XML serve para coisas pequenas, por exemplo, um combo de país, cidades de um determinado estado, cores, dentre outros.
Trabalhando com sessions no ASP
Uma session serve para armazenar informações que serão posteriormente utilizadas/manipuladas no site. O ASP possibilita o uso de sessions através do objeto session.
Um exemplo de uso de sessions são sites com controle de login e senha, onde quando você realiza o login, você permanecerá logado enquanto continuar navegando no site.
Veja como é fácil trabalhar com sessions no ASP:
Criando uma session:
session("htmlstaff") = "OK"
Neste exemplo, a session recebe o nome de “htmlstaff”.
Na página, recuperariamos esta session da seguinte forma:
htmlstaff = session("htmlstaff")
response.write htmlstaff
Criando uma session com data/hora para expiração:
session.timeout = 10
session("htmlstaff") = "OK"
Neste exemplo, a session expiraria em 10 minutos.
Obs.: Por padrão, caso não seja declarado o session.timeout, a expiração de uma session demorará 20 minutos.
Deletando uma session específica:
session.contents.remove("htmlstaff")
Ou você pode deletar todas as sessions de uma só vez usando o método abandon:
session.abandon
Para maiores informações sobre o objeto session, acesse:
http://www.w3schools.com/ASP/asp_sessions.asp
Condicionais if, elseif e else no ASP
Os condicionais if, elseif e else servem para checar se uma determinada condição é satisfeita pela script. Pode parecer difícil de entender, mas vejamos alguns exemplos práticos para ver que é bem simples o uso dos mesmos:
<% variavel = "1" if variavel="1" then response.write "Verdadeiro" end if %>
No exemplo acima é utilizado o if (que em português quer dizer “se”) para checar se variável é igual a 1. Neste caso, temos exibido como resultado na página: “Verdadeiro”.
<% variavel = "1" if variavel="2" then response.write "Verdadeiro" else response.write "Falso" end if %>
No exemplo acima é utilizado o if para checar se variável é igual a 2, caso ela não seja, ela caí então na condição else (que em português quer dizer “senão”). Neste caso, temos exibido como resultado na página: “Falso”.
<% variavel = "2" if variavel="1" then response.write "Variável = 1" elseif variavel="2" then response.write "Variável = 2" else response.write "Variável diferente de 1 e 2" end if %>
No exemplo acima é utilizado o if para checar se variável é igual a 1, caso ela não seja, é então checado na condição elseif (que em português quer dizer “senão se”) se ela é igual a 2, caso ela não seja, ela caí então na condição else. Neste caso, temos exibido como resultado na página: “Variável = 2″.
