Está en la página 1de 47

ASP (ACTIVE SERVER PAGES)

Introducción
La filosofía de ASP resulta muy sencilla, en pocas palabras se puede definir de la siguiente
forma: las páginas ASP, también llamadas páginas activas, son páginas que contienen código
HTML, script de cliente y un script que se ejecuta en el servidor, dando como resultado código
HTML. Por lo tanto al cargar una página ASP en nuestro navegador, en realidad no estamos
cargando la página ASP como tal, sino el resultado de la ejecución de la página ASP, es decir
la salida de la página ASP, y como se ha apuntado anteriormente se trata de código HTML. Es
decir, son páginas que se ejecutan en el servidor enviando como resultado al cliente código
HTML.

Antes de seguir vamos a definir de forma sencilla lo que se considera un lenguaje de script o
de secuencia de comandos. Un lenguaje de script es un subconjunto de otro lenguaje más
general y que se utiliza para un entorno muy determinado, en este caso el entorno es la Web.

Una página ASP podrá contener los siguientes elementos: texto, componentes ActiveX, código
HTML y comandos de script. Este script puede ser de dos tipos: script de cliente o script de
servidor. El script de servidor es la nueva idea que introduce ASP, se debe tener en cuenta que
en el script de servidor se tiene acceso a diferentes objetos y no está orientado a eventos.

El script de servidor utilizado en ASP utiliza la misma sintaxis que el script de cliente, la
diferencia está en que con ASP el script de servidor es compilado y procesado por el servidor
Web antes de que la página sea enviada al navegador.

ASP no es un lenguaje de script, ASP ofrece un entorno para procesar scripts que se
incorporan dentro de páginas HTML, es decir, un entorno de procesamiento de scripts de
servidor.

La propia Microsoft define ASP de la siguiente manera: "...es un entorno de secuencias de


comandos en el lado del servidor que puede utilizar para crear y ejecutar aplicaciones de
servidor Web dinámicas, interactivas y de alto rendimiento...".

Realmente, ASP es un componente (asp.dll) que se instala en un servidor Web y cuya misión
es la de procesar ficheros que terminan con la extensión .asp y transmitir el resultado al cliente
que solicitó la página ASP.

El script de servidor incluido en una página ASP empieza a ejecutarse cuando un navegador
solicita el archivo .asp al servidor Web. El servidor Web llama entonces a ASP, el cual lee el
archivo solicitado de arriba a abajo, ejecuta los comandos y envía una página HTML al
explorador. ASP incluye un motor de interpretación de scripts del lado del servidor.

Las páginas ASP son ficheros con la extensión asp. Crear un fichero .asp resulta muy sencillo,
se puede crear a partir de una página HTML existente, simplemente renombrando el fichero
.html o .htm a un fichero .asp. Para hacer esta página ASP disponible para los usuarios de la
Web, el fichero .asp se debe almacenar en un directorio de publicación en Internet, se debe
tener en cuenta que el directorio virtual asociado debe tener permisos de ejecución de
secuencias de comandos.

Aportaciones de ASP
En este apartado se comentan las aportaciones que ofrece ASP desde su primera versión, es
decir, se trata de aportaciones muy genéricas de la tecnología ASP.

1
Para entender las aportaciones que ofrecen las páginas ASP se deben tener en cuenta una
serie de características del protocolo HTTP (HyperText Transfer Protocol). Se dice que le
protocolo HTTP es un protocolo sin estado, es decir, no se puede mantener un estado entre
diferentes peticiones. El protocolo HTTP se basa en el paradigma cliente/servidor o
petición/respuesta.

Se deben tener en cuenta un par de puntos a la hora de establecer la comunicación entre


clientes (navegadores Web) y servidores (servidores Web) del protocolo HTTP:

• Después de realizar una petición el cliente se desconecta del servidor y espera una
respuesta. El servidor debe restablecer la conexión después de que haya
procesado la petición.

• El servidor y el cliente sólo se tienen en cuenta durante la conexión, después, se


olvidan el uno del otro. Por esta razón, ni el cliente ni el servidor pueden retener
información entre diferentes peticiones o a través de diferentes páginas Web. Sin
embargo, ASP permite al servidor almacenar información, o mantener el estado,
entre las diferentes peticiones del cliente.

El cliente y el servidor Web se comunican utilizando cabeceras HTTP, estas cabeceras son
colecciones de datos que intercambian el cliente y el servidor para asegurar que la transacción
es coherente y completa. Como petición del usuario se envía una cabecera y el servidor
interpreta esta cabecera y envía una respuesta HTTP cuyo cuerpo sería el contenido del
recurso demandado por el cliente.

ASP permite al desarrollador intervenir en todo el proceso de comunicación del protocolo


HTTP. Los objetos integrados dentro de ASP Request y Response interactúan con las
peticiones y respuestas del protocolo HTTP, respectivamente.

Dentro de los objetos integrados de ASP podemos encontrar la forma de acceder al servidor,
obtener información del mismo, así como del usuario. Y también se permite, como se había
comentado anteriormente, mantener el estado entre diferentes peticiones del cliente.

Se puede considerar ASP como una nueva (aunque ya no tan nueva) aproximación a la
creación de páginas web complejas que pueden acceder a bases de datos o a otros objetos del
servidor. Ofrece lo siguiente:

• Independencia del navegador, ASP puede ejecutar complejas operaciones en el


servidor y enviar solamente los resultados al cliente.

• Construcción de páginas basadas en bases de datos que permiten realizar


operaciones sobre las bases de datos del servidor de forma bastante sencilla.

• Es una de las soluciones más versátiles para el desarrollo de aplicaciones en el


entorno de Internet/Intranet.

• Desarrollo de complejas aplicaciones Web.

• Facilidad de uso de componentes de terceras partes ejecutándose en el servidor,


es decir, se pueden utilizar componentes para liberarnos de realizar tareas
complejas. Estos componentes se deben registrar en el servidor y podrán ser
utilizados desde el script correspondiente. Estos componentes se denominan
componentes ActiveX de servidor.

• Posibilidad de definir páginas ASP transaccionales para realizar todas las


operaciones contenidas en la misma dentro de una transacción.

• Una tecnología en constante evolución y mejora.

2
Creación de una página ASP
La creación de páginas ASP se puede llevar a cabo con cualquier editor de textos (p.e. bloc de
notas de Windows). Una vez que se crea el archivo ASP lo único que debemos hacer es
colocarlo en un directorio virtual (el raíz también se considera virtual) de nuestro servidor web
Internet Information Services.

Primer contacto con ASP


Procederemos por tanto a crear nuestra primera página ASP, que llamaremos ejemplo1.asp y
la colocaremos en c:\InetPub\wwwRoot\. El documento en cuestión es:

<HTML>
<HEAD>
<TITLE>Primer contacto con ASP</TITLE>
</HEAD>
<BODY>
<FONT FACE="Verdana,Arial" SIZE=2>
<%
Response.Write("Son las " & Time & " del día " & Date)
%>
</FONT>
</BODY>
</HTML>

Para ejecutar este archivo, simplemente escribimos en nuestro navegador favorito


http://localhost/ejemplo1.asp y si todo ha funcionado correctamente nos mostrará una página
HTML con la hora y la fecha.

Comandos script
Los comandos script de una página ASP deben escribirse entre medias de dos etiquetas que
permiten indicar al servidor web que se trata de un comando script que hay que ejecutar antes
de devolver el valor de la página al navegador web.

La sentencia general es la siguiente

<% (comandos) %>

Los comandos añadidos pueden ser una o más líneas, pudiendo escribirse en una misma
página ASP tantos comandos como sea necesarios en bloques diferentes delimitados por los
signos de entrada <% y de salida %>.

Toda página ASP debe tener la extensión .asp. En caso contrario, IIS no detectará que se trata
de una página ASP y se encargará de pasar la página web tal cual al navegador, sin ejecutar
ningún script ni secuencia.

Declaración del lenguaje de codificación


Un aspecto algo más avanzado en la creación de páginas ASP, es el que tiene que ver con la
declaración del lenguaje de codificación con el cuál vamos a trabajar.

La declaración debe añadirse al principio de la página ASP, y consiste en el uso de la siguiente


instrucción:

<@ LANGUAJE=”VBScript” %>

Si deseamos escribir páginas ASP y realizar algún comentario que sirva de soporte o ayuda a
otro programador que pueda utilizar la página ASP que un día nosotros programamos, ya sea
para mejorarla o modificar algún aspecto, debemos hacer uso de la palabra reservado REM o
del apóstrofe ‘. Estos dos comandos, se utilizan para comentar una línea de código
determinada y evitar así que sea ejecutada por el servidor web.

3
Veamos otro ejemplo de ASP más complejo que el anterior (ejemplo2.asp). En este ejemplo,
trataremos de mostrar el uso de la directiva de especificación del lenguaje, los comentarios y
anticipamos algunos comandos que veremos posteriormente.

<HTML>
<HEAD>
<TITLE>Ejemplo 2 ASP</TITLE>
</HEAD>
<BODY>
<%@ LANGUAGE="VBScript" %>
<%
Rem Producto de 5 x 4 x 3 x 2 x 1

'Variable auxiliar
IntCant=1
for I = 1 to 5
' Almacenamos la cantidad en una variable auxiliar
intCant = intCant * I
next
%>
'No es un comentario, no está entre las etiquetas de ejecución

Cantidad final (5 x 4 x 3 x 2 x 1) = <% =IntCant %>


</BODY>
</HTML>

Como podemos ver tras ejecutar el ejemplo (http://localhost/ejemplo2.asp) tenemos un


comentario que está fuera de las etiquetas de ejecución y por lo tanto es interpretado como si
de texto HTML se tratara. (Recordatorio: todo lo que está fuera de <% %> se interpreta como
HTML).

Una forma de realizar un poco de programación estructurada a la hora de programar con ASP
es realizar la declaración del lenguaje y de las variables justo al inicio de la página ASP y antes
de comenzar a escribir el contenido de la página web, como se muestra en el siguiente ejemplo
(ejemplo3.asp):

<%@ LANGUAGE="VBScript" %>


<%
A="ejemplo"
%>

<HTML>
<HEAD>
<TITLE>Ejemplo 3 ASP</TITLE>
</HEAD>
<BODY>
<%
Response.Write("Esto es un <B>" & A & "</B> en ASP" & "<BR>")
%>
</BODY>
</HTML>

Como podemos ver (http://localhost/ejemplo3.asp), podemos inicializar parámetros dentro de


una página ASP para luego rescatarlos, modificarlos o tratarlos dentro de la misma página.

Creación de una página HTML en ASP


Si echamos la vista atrás y le ponemos un poco de imaginación comprobaremos que es posible
crear una página HTML en ASP sin necesidad de ir entremezclando etiquetas de HTML con
secuencias de comandos ASP, esto es (ejemplo4.asp):

4
<%@ LANGUAGE="VBScript" %>
<%
A="ejemplo"

Response.Write("<HTML>")
Response.Write("<HEAD>")
Response.Write("<TITLE>Ejemplo 4 ASP</TITLE>")
Response.Write("</HEAD>")
Response.Write("<BODY>")
Response.Write("Esto es un <B>" & A & "</B> en ASP" & "<BR>")
Response.Write("</BODY>")
Response.Write("</HTML>")
%>

Directivas ASP
Existen diferentes directivas a declarar dentro de una página ASP. Ya hemos visto algunas de
estas directivas, si bien es necesario diferenciarlas e indicar claramente sus cometidos. De esta
manera, tenemos las siguientes directivas:

<%@ palabra_clave %>

Esta forma de representar la directiva le indica a ASP la información que necesita para
procesar una página ASP. Las palabras clave que podemos distinguir en este caso son las
siguientes:

• LANGUAGE, establece el lenguaje script que usa la página (VBScript, JScript,…)


• CODEPAGE, establece el código de juego de caracteres de la página ASP.
• LCID, establece el identificador local de la página.
• TRANSACTION, permite indicar que la página será ejecutada bajo una ejecución
transaccional.
• ENABLESESSIONSTATE, permite especificar si una página ASP usa el estado de
sesión o no. Por defecto, siempre que se invoca una página ASP se crea un objeto
Session, pero puede ocurrir que no sea necesario establecer sesión con los
usuarios, por ejemplo, si el contenido de la página es estático o no precisa enviar
cookies. Para evitar que ASP abra una sesión basta con escribir en la primera línea
de la página la siguiente directiva: <%@ EnableSessionState=False %>
Estos valores se ponen dentro de la misma directiva separados por espacios en blanco.

<% =variable %>

Esta directiva se utiliza para indicar o asignar el valor de una variable, o para obtener el valor
que almacena esta variable (es lo mismo que Response.Write variable). Un ejemplo de esta

<% cadena=”valor” %>


<% =cadena %>

directiva es:

La ejecución de la segunda sentencia imprimiría el valor de la variable cadena en el navegador.

Dos páginas, un mismo cometido


Podemos utilizar una página ASP apara inicializar y almacenar valores que puedan ser
modificados en la ejecución de otra página ASP. El siguiente ejemplo está formado por dos
páginas ASP (ejemplo5a.asp y ejemplo5b.asp), la primera inicializa los valores de las variables

5
y pasa estos valores a una segunda página que es la encargada de resolver los datos pasados
por la primera y comprobar si se cumplen las condiciones establecidas en el código.

(ejemplo5a.asp)

<%
'ejemplo5a.asp
RANDOMIZE
Dim Valor
Valor = (Rnd * 100) + 1
Session("Valor") = Valor
Response.Redirect "ejemplo5b.asp"
%>

Lo primero que hace este script es llamar al generador de números aleatorios y generar un
número entre 1 y 100, asignárselo a una variable de sesión (lo veremos más adelante, pero
comentar que se tratan de variables que son comunes a una sesión de un cliente) y llamar a la
otra página ASP.

(ejemplo5b.asp)

<%@ LANGUAGE=VBScript %>


<HTML>
<HEAD>
<TITLE>EjemploASP5b</TITLE>
</HEAD>
<BODY>
<BR>
<P>
<FONT FACE=Verdana COLOR=Red SIZE=3>
<CENTER><B>Valor almacenado:</B></CENTER>
</FONT>
</P>
<BR>
<P>
<FONT FACE=Verdana SIZE=2 COLOR=Green>
<CENTER>Este ejemplo, muestra un valor aleatorio entre 1 y
100</CENTER>
</FONT>
</P>
<%
‘Recuperamos el valor de la variable de sesión
Dim Valor
Valor = Session("Valor")
Response.Write ("<BR><P><FONT FACE=Verdana SIZE=2 COLOR=Blue>
<CENTER>El valor almacenado es " & Int(Valor) &
"</CENTER></FONT></P>")
%>
<P>
<A href="ejemplo5a.asp">
<FONT FACE=Verdana SIZE=2>
<CENTER>Haga clic aquí para mostrar otro valor</CENTER>
</FONT>
</A>
</P>
</BODY>
</HTML>
En este segundo script se lee la variable de sesión y se muestra en el navegador previa
conversión a entero, luego se incluye un enlace para volver a ejecutar el ejemplo.

6
El lenguaje VBScript
Introducción
Para desarrollar aplicaciones ASP se debe utilizar un lenguaje de script como puede ser
VBScript, JavaScript/Jscript, Perl, etc; no debemos olvidar que ASP sólo nos ofrece un entorno
para que se ejecute el script de servidor, ASP por si sólo no es un lenguaje de script.

Los lenguajes de script que se pueden utilizar directamente y que son interpretados por ASP
sin necesidad de ningún intérprete adicional son VBScript y JScript, si se quiere utilizar otro
lenguaje se deberá instalar el intérprete correspondiente.

Debido a que el lenguaje por defecto de las páginas activas es VBScript, ha sido este lenguaje
de script el elegido para este tema, y durante todo el presente curso se utilizará VBScript.

VBScript (Visual Basic Script) es un subconjunto de lo que se denomina VBA (Visual Basic for
Application) que, a su vez es un subconjunto del lenguaje Visual Basic. VBScript
fundamentalmente se emplea para integrarse dentro de páginas HTML para ampliar las
características de un sitio Web.

Características generales de VBScript


En este apartado se enumeran brevemente algunas de las características más destacables del
lenguaje de secuencias de comandos VBScript:

• Manejo de arrays: se pueden manipular arrays de hasta 60 dimensiones.


• Colecciones: se crean colecciones definidas por el usuario.
• Tipos de datos: sólo existe el tipo Variant, aunque también existen subtipos. Un tipo
Variant es una clase especial de tipo de datos que puede contener diferentes tipos de
información, dependiendo de cómo se utilice. El tipo Variant se comportará como un
tipo determinado dependiendo del contexto en que se utilice.
• Depuración: no existe propiamente un entorno de depuración para VBScript, aunque
las últimas versiones de Internet Explorer incluyen un depurador.
• Gestión de errores: se puede acceder al objeto Err y usar la instrucción On Error
Resume Next.
• Acceso a archivos locales: no está permitido para evitar los posibles daños en la
máquina del cliente, pero si se puede acceder al sistema de archivos del servidor
mediante el objeto FileSystemObject.
• Tipos definidos por el usuario: no se permiten.
• Soporta la definición de clases con propiedades (atributos) y métodos, pero no permite
definir eventos como ocurre con Visual Basic.
• Ofrece una serie de objetos dentro de la librería de script: Dictionary, FileSystemObject,
RegExp..., estos objetos los veremos con detalle en siguientes capítulos.

Declaración de variables
Sólo existe un tipo de datos, el tipo Variant. Este tipo de datos puede contener diferentes
subtipos. El subtipo dependerá del contexto en el que se esté utilizando el tipo Variant.

Una variable es un puntero que hace referencia a una posición de memoria a la que se le
puede asignar un valor o recuperar un valor, a dicha variable se le puede asignar el tipo que
queramos, haciendo uso del operador =.

VBScript no requiere que se declaren las variables, aunque (como somos buenos
programadores) resulta muy útil que sean declaradas al principio de la página ASP para
mejorar la depuración o modificaciones que se puedan realizar en un futuro. Si utilizamos la
declaración <% Option Explicit %> antes de cualquier otro comando ASP o etiqueta

7
HTML, estaremos obligándonos a declarar todas las variables que utilicemos dentro del
documento. (OBLIGATORIO hacerlo para TCI)

<% Dim Variable %>

Las declaraciones de variables se realizan con la palabra reservada Dim.

Existen varias restricciones sobre el nombre de las variables, deben comenzar con un carácter
alfabético (incluido _ ), no pueden contener un punto y no deben superar los 255 caracteres.

Tal y como comentamos anteriormente se puede asignar cualquier valor a una variable escalar:

• Los valores de cadena se asignan entre comillas Variable = "Cadena"


• Los valores numéricos se asignan sin comillas Variable = 77
• Los valores de fecha se asignan entre almohadillas Variable = #10-2-2004#

Para declarar una variable como un array (vector) se debe indicar entre paréntesis el número
de elementos que va a contener. Así, si queremos declarar un array de 11 elementos,
escribiremos lo siguiente:

Dim vector(10)

Todos los arrays en VBScript son de base cero, es decir, el primer elemento es el cero, por lo
que si escribimos 10 en realidad se está indicando que va a tener el array 11 elementos. Para
asignar un valor a una entrada de un vector:

vector(0) = 10
vector(1) = 20
vector(2) = 30

Lo mismo para recuperar un valor almacenado, para recuperar el segundo elemento y el


decimoprimero:

segundo = vector(2)
undecimo = vector(10)

Si queremos declarar una array de dos dimensiones separaremos por comas el número de filas
y el de columnas que tendrá la matriz. Se pueden declarar arrays de hasta 60 dimensiones,
aunque normalmente lo máximo son 3 o 4 dimensiones. Así por ejemplo, si queremos declarar
una matriz bidimensional con 6 filas y 11 columnas:

Dim matriz(5,10)

Esta forma de declarar vectores y matrices es estática, es decir, si decimos que va a tener 11
elementos, no podemos asignarle 21, cosa que si podríamos hacer si usamos la declaración
ReDim. La declaración inicial de la matriz no debe incluir el número de elementos:

Dim vectordinamico()

Para utilizar el array dinámico debemos redimensionarlo, usamos ReDim (tened en cuenta que
se pierden todos los elementos que hubiesen almacenados):

ReDim vectordinamico(10)

Si no nos interesa que se pierdan lo elementos que tenemos almacenados podemos usar
Preserve, es decir:

ReDim preserve vectordinamico(10)

8
Aunque este apartado está dedicado a las variables en general, al hablar de los array vamos a
comentar de forma breve alguna de las sentencias y funciones que ofrece VBScript para
manipular y utilizar variables de tipo array:

• IsArray: función que devuelve verdadero o falso dependiendo si la variable es un


array o no (ej: If IsArray(variable) Then ...).
• Erase: sentencia que elimina el contenido de un array liberando la memoria
ocupada por cada uno se sus elementos (ej: Erase variable).
• LBound: función que devuelve el índice menor de un array.
• UBound: función que devuelve el índice mayor de un array.
• Array: función que devuelve una variable array con todos los elementos que se le
pasan por parámetro. Ej.:
Dim A
A = Array(10,20,30)
B = A(2) ' el valor de B es 30

Constantes
Son variables que permanecen inalterables, se usa CONST para definirlas:

Const constante = “Texto que nunca cambia”

Alcance de las variables


El alcance de una variable y su ámbito de definición dentro de la ejecución de una página ASP,
se define como la parte de los comandos del script que tienen acceso a dicha variable. De esta
manera, una variable declarada dentro de un procedimiento o proceso tiene un alcance local.

La variable es creada y destruida cada vez que el proceso es ejecutado y finaliza su ejecución,
respectivamente. Por esa razón, no puede ser accedida desde ningún proceso externo
(veremos procedimientos que lo permiten).

Una variable declarada fuera de un proceso o procedimiento, tiene un alcance global, siendo
accesible y modificable desde cualquier comando script de la página ASP.

En la declaración de variables, podemos declarar variables locales y globales con el mismo


nombre, aunque no es nada recomendable por problemas de comprensión dentro del código,
sin embargo, el valor modificado en una variable local de igual nombre que una variable global
dentro de un procedimiento, sólo afectará al valor de la variable modificada.

Para entender el ámbito o alcance de las variables, haremos caso a los siguientes ejemplos:
(ejemplo6.asp)
<%@ LANGUAGE=”VBScript” %>
<%
intCant = 8
Call Resta
Response.Write intCant

Sub Resta
IntCant = intCant - 4
End Sub
%>

En este ejemplo tenemos que destacar varias cosas:

• VBScript no es “case sensitive”, es decir, es lo mismo intCant que IntCant.


• Las distintas sentencias se separan mediante saltos de línea, no con punto y coma.

9
• Si declaramos intCant = 8 al principio lo estamos haciendo como global, por lo que
al utilizar el mismo nombre de variable dentro del procedimiento Resta estamos
actuando directamente sobre dicha variable, por lo que el valor devuelto es 4.

El siguiente ejemplo cambia este comportamiento:


(ejemplo7.asp)
<%@ LANGUAGE="VBScript" %>
<%
Dim intCant
intCant = 8
Call Resta
Response.Write intCant

Sub Resta
Dim intCant
IntCant = intCant - 4
'intCant valdría -4 porque se inicializa a 0 por defecto
End Sub
%>

En este ejemplo declaramos intCant como global de nuevo (no podemos inicializarlo en la
declaración, porque el lenguaje no lo permite) , con la salvedad de que dentro del
procedimiento también lo estamos declarando, por lo que se crea una nueva variable con el
mismo nombre y ahora al terminar el procedimiento se elimina la variable de dicho
procedimiento y el valor anterior sigue siendo 8.

Alcance de las variables entre páginas


El alcance global de una variable permite acceder a ella dentro de una página ASP
únicamente, sin embargo, y debido al diseño de una página o conjunto de páginas ASP,
podemos querer hacer accesible una variable a más de una página ASP, para que sea
heredada y utilizada por otra página ASP en la que se declaró.

Este alcance de variables permite extender el valor de una variable o de un conjunto de


variables a más de una página ASP.

ASP permite dos objetos en los cuales, se pueden almacenar los valores de las variables.
Estos objetos son el objeto sesión (Session) y el objeto aplicación (Application).

Variables de sesión
Permiten almacenar la información necesaria para una determinada sesión de usuario. Las
variables almacenadas en el objeto Session no se descartan cuando el usuario pasa de una
página a otra dentro de la aplicación, si no que dichas variables persisten durante todo el
tiempo que el usuario tiene acceso a las páginas de la aplicación. También se pueden utilizar
los métodos de Session para terminar explícitamente una sesión y establecer el periodo de
tiempo de espera de inactividad de las sesiones.

Las variables de Session de un cliente solo pueden ser accedidas por ese cliente.

El servidor crea automáticamente el objeto Session cuando un usuario que no tenga


actualmente una sesión, solicita una página Web de la aplicación. El servidor elimina un cliente
bien cuando desde una pagina ASP se invoca el método Abandon o bien cuando este cliente
lleva 20 minutos sin actividad en nuestra aplicación.

Para crear variables de sesión lo hacemos así: Session("Nomvariable") = valor

Ejemplo: <% Session("Color")="Rojo" %>

Para recuperar ese valor: <%= Session("Color") %>

10
Variables de aplicación
Se utiliza para compartir información entre todos los usuarios de una aplicación. Entendiendo
por una aplicación ASP todos los archivos .asp de un directorio virtual y sus subdirectorios.

Para crear variables de sesión lo hacemos así: Application("Nomvariable") = valor

Ejemplo: <% Application("Titulo") = "Rojo" %>

Para recuperar ese valor: <%= Application("Titulo") %>

Operadores en VBScript

Operadores aritméticos

Descripción Símbolo Expresión de ejemplo Resultado


Exponente ^ 2^4 16
Multiplicación * 2*4 8
División / 5/2 2.5
División entera \ 5\2 2
Resto Mod 5 Mod 2 1
Suma + 2+2 4
Resta - 7-2 5
Concatenación cadenas &, + "Hola, " & "mundo" "Hola, mundo"
Menos unario - -(2+4) -6

Operadores de comparación
Estos operadores se utilizan para comparar dos expresiones, devolviendo un valor lógico que
evalúa si la comparación es verdadera o falsa.

Descripción Símbolo Expresión de ejemplo Resultado

Igualdad = 2=2 Verdadero


Desigualdad <> 2 <> 2 Falso
Menor que < 2<2 Falso
Mayor que > 3>2 Verdadero
Menor o igual que <= 2 <= 2 Verdadero
Mayor o igual que >= 1 >= 2 Falso
Set a = document
Equivalencia entre referencias a objetos Is Verdadero
a Is document

Operadores lógicos
Estos operadores permiten comprobar a la vez varios resultados lógicos:

Descripción Símbolo Expresión de ejemplo Resultado


Negación Not Not (2 = 2) Falso
AND And (2 = 2) And (2 >= 0) Verdadero
OR Or (2 = 2) Or (2 <> 2) Verdadero
OR exclusivo Xor (2 = 2) Xor (2 >= 0) Falso
Igualdad lógica Eqv (2 = 2) Eqv (2 <> 2) Falso
Implicación lógica Imp (2 = 2) Imp (3 <> 2) Verdadero

11
Estructuras de control
Como en cualquier lenguaje tenemos estructuras condicionales y bucles.

Condicionales
IF SELECT CASE

If condición Then Select Case variable


sentencias Case valor1
ElseIf condición Then sentencias
sentencias Case valor2
Else sentencias
sentencias Case Else
End If sentencias
End Select

Bucles
WHILE UNTIL

Do While condición Do Until condición


sentencias sentencias
Loop Loop

FOR FOR EACH

For contador=inicio To fin Step incremento For Each indice in vector


sentencias sentencias
Next Next

Para romper un bucle debemos indicar la palabra reservada EXIT seguida del tipo de bucle
(EXIT DO, EXIT FOR).

Literales
VBScript presenta los literales que se comentan a continuación.

• Empty: esta palabra reservada es utilizada para indicar el valor no inicializado de


una variable.
• Nothing: esta palabra reservada es utilizada para destruir una variable que
representa a un objeto y de esa forma liberar la memoria que utiliza.
• Null: se utiliza para indicar que una variable no tiene datos válidos, no se debe
confundir con el literal Empty.
• True: representa al valor booleano verdadero y su valor es -1.
• False: representa al valor booleano falso y su valor es 0.

Subprogramas
Existen dos tipos de subprogramas en VBScript, las subrutinas (o procedimientos) y las
funciones. La diferencia entre ambos, al igual que en lenguajes como C, es que las subrutinas
no devuelven valores, mientras que las funciones sí.

Subrutinas

Sub NombreSubrutina (argumento1, argumento2)


sentencias
End Sub

12
Existen dos formas de llamar a una subrutina:

Call NombreSubrutina(argumento1, argumento2)


NombreSubrutina argumento1, argumento2

Funciones

Function NombreFuncion(argumentos)
sentencias
End Function

Para llamar a una función:

resultado = NombreFuncion(argumentos)

Para abandonar un subprograma se emplea EXIT FUNCTION o EXIT SUB según sea el caso.

Veamos un ejemplo de declaración e invocación de una función.

<%@ LANGUAGE = “VBScript”


Option Explicit
Sub suma(argumento1)
Response.Write “<B>” & argumento1+intcant & “</B>”
End sub

Dim intcant
intcant = 4
suma(4)
%>

Directivas de preprocesamiento
Dentro de las páginas ASP se pueden realizar inclusiones de archivos del servidor (al igual que
en C++ con los #include), es decir, se puede insertar información en una página ASP antes de
su procesamiento, de hay el nombre del presente apartado. Para ello se utiliza la directiva de
preprocesamiento #INCLUDE que tiene la siguiente sintaxis:

<!--#INCLUDE FILE="nombrearchivo"-->

Los archivos incluidos no requieren una extensión especial. Un archivo incluido puede, a su
vez, incluir otros archivos. Un archivo no puede incluirse así mismo.

ASP incluye los archivos antes de ejecutar cualquier script, ya que, como se ha dicho
anteriormente, es una directiva de preprocesamiento. De esta forma el siguiente código
generará un error ya que la variable nombreFichero no tendrá ningún valor.

<% nombreFichero="/miWeb/incluido.asp"%>
<!--INCLUDE FILE="<%=nombreFichero%>"-->

Clases y objetos
La principal diferencia entre las clases y objetos de VBScript y Visual Basic es que no nos es
posible declarar y por tanto, usar eventos para las clases. Para crear una clase la sintaxis es:

Class nombre
sentencias
End Class

13
Dónde nombre es el nombre de la clase y sentencias son todas las declaraciones de atributos de
la clase y la implementación de los métodos de la misma.

Para declarar los atributos de una clase utilizamos la siguiente sintaxis:

Private|Public nombreVariable

Con Public o Private indicamos si el atributo es visible o no desde fuera de la clase,


respectivamente.

Normalmente en VBScript los atributos de las clases se denominan variables.

Los métodos de una clase pueden ser tanto procedimientos (Sub) como funciones (Function) y
que se pueden definir como privados o públicos, al igual que ocurría con las variables de la
clase. Si no se indica Private o Public el método será tomado como privado, sin embargo en las
variables de la clase si es necesario indicar Private o Public.

Un método si es público (Public) también puede ser el método por defecto (Default). Un método
por defecto es aquel que se lanza sobre el objeto sin necesidad de especificarlo, sólo se puede
especificar un método por defecto, si se intenta indicar más de uno se producirá un error. La
sintaxis general para declarar un método es la siguiente.

Si es un procedimiento:

[Public [Default]| Private] Sub nombre [(lista de parámetros)]


[sentencias]
[Exit Sub]
End Sub

Si es una función:

[Public [Default] | Private] Function nombre [(lista de parámetros)]


[sentencias]
[nombre = expresión]
[Exit Function]
End Function

Veamos un “sencillo” ejemplo de declaración y uso de clases:

(classej9.asp)

<%
Class Sencilla
Private numero
Public Function devuelveNumero()
devuelveNumero=numero
End Function
Public default Sub incrementa(inc)
numero=numero+inc
End Sub
Public Sub decrementa(dec)
numero=numero-dec
End Sub
End Class
%>

14
(ejemplo9.asp)

<%@ LANGUAGE="VBScript" %>


<% Option Explicit %>
<!--#include file="classej9.asp"-->
<HTML>
<HEAD>
<TITLE>Ejemplo 9 ASP</TITLE>
</HEAD>
<BODY>
<%
Dim objSencilla
Set objSencilla = New Sencilla
objSencilla(2)
Response.Write objSencilla.devuelveNumero & "<br>"
objSencilla.decrementa(4)
Response.Write objSencilla.devuelveNumero
%>
</BODY>
</HTML>

El resultado de la ejecución de estas líneas es 2 y -2, ya que en un principio el atributo numero


es como si tuviera asignado el valor cero. También se puede observar la forma en la que se
utiliza el método por defecto incrementa.

Para destruir un objeto y de esa forma liberar la memoria que utiliza debemos asignarle el
literal Nothing. La sintaxis general para destruir objetos es:

Set nombreObjeto = Nothing

Hemos comentado que una diferencia que tiene VBScript con Visual Basic en cuanto a la
implementación de clases se refiere es que en VBScript no se permite declarar eventos para
las clases, pero existe una excepción.

Hay dos eventos especiales que están asociados a la clase y se trata de los eventos
Initialize y Terminate. El evento Initialize se lanza cuando se crea una instancia de
una clase, es decir, cuando se crea un objeto. El evento Terminate se lanza cuando se
destruye un objeto de la clase. La sintaxis de los eventos Inicialize y Terminate es la que se
muestra a continuación:

Private Sub Class_Initialize


[sentencias]
End Sub

Private Sub Class_Terminate


[sentencias]
End Sub

El método Initialize se puede utilizar para tareas de inicialización, como puede ser inicializar los
atributos de una clase con unos valores determinados. El método Terminate se puede utilizar
para realizar funciones de "limpieza" cuando se destruye un objeto de una clase.

Otras funciones en VBScript


En este apartado se recogen una serie de funciones de VBScript que pueden resultar bastante
útiles, no se entra en detalle sino que se ofrece una visión general de las mismas, está
realizado al estilo de una referencia rápida, agrupando cada una de las funciones atendiendo a
al papel que desempeñan y a su utilidad.

15
Funciones para consultar variables

Funciones que devuelven un valor booleano tras consultar el tipo y contenido de la de variable
que se pasa como parámetro. Por ejemplo IsDate() devolverá verdadero si la variable que se
pasa como parámetro es una fecha.
IsEmpty, IsDate, IsNumeric, IsObject, IsNull

Funciones utilizadas para la manipulación de cadenas

Todas estas funciones reciben como parámetro una cadena de caracteres y realizan alguna
operación con ella devolviendo el resultado correspondiente.

• InStr: devuelve la posición de la primera ocurrencia de una cadena dentro de otra.


• Len: devuelve el número de caracteres de una cadena.
• LCase: devuelve una cadena convertida en minúsculas.
• UCase: devuelve una cadena convertida en mayúsculas.
• Left: devuelve los caracteres especificados desde la parte izquierda de la cadena.
• Rigth: igual que la función anterior pero desde la parte derecha de la cadena.
• Mid: devuelve los caracteres indicados de una cadena desde una posición inicial
determinada.
• Split: devuelve un array de cadenas resultantes de dividir una cadena atendiendo a
un separador definido.
• Space: devuelve una cadena de caracteres blancos según el parámetro indicado,
esta es la única función de este apartado que no recibe una cadena como
parámetro.
• StrReverse: devuelve una cadena con los caracteres un orden inverso.
• LTrim: devuelve una cadena a la que se le eliminan los espacios a la izquierda.
• RTrim: devuelve una cadena a la que se le eliminan los espacios a la derecha.
• Trim: devuelve una cadena a la que se le eliminan los espacios a la derecha y a la
izquierda.

Funciones matemáticas

• Cos: devuelve el coseno de un ángulo.


• Sin: devuelve el seno de un ángulo.
• Tan: devuelve la tangente de un ángulo.
• Exp. devuelve el número e elevado a una potencia.
• Log: devuelve el logaritmo de un número.
• Sqr: devuelve la raíz cuadrada de un número.
• Randomize: incializa la generación de números aleatorios.
• Rnd: devuelve un número aleatorio.

Funciones para dar formatos

• FormatCurrency: da formato de tipo monetario.

• FormatDateTime: para dar formato a fecha o a la hora.

• FormatPercent: da formato a los tantos por ciento.

• FormatNumber: da formato a valores numéricos.

16
Funciones de fecha/hora

• Date: devuelve la fecha actual del sistema.

• Time: devuelve la hora actual del sistema.

• DateAdd: devuelve una fecha a la que se le ha añadido un intervalo de tiempo


especificado.

• DateDiff: devuelve el número de intervalos entre dos fechas.

• DatePart: devuelve una parte determinada de la fecha indicada.

• DateValue: devuelve una variable del subtipo Date a partir de la cadena


especificada por parámetro.

• Day: devuelve el día del mes de la fecha que se pasa por parámetro.

• Month: devuelve el mes de la fecha que se pasa por parámetro.

• MonthName: devuelve el nombre del mes de la fecha que se pasa por parámetro.

• Now: devuelve la fecha y hora actual del sistema.

• WeekDay: devuelve el día de la semana que se corresponde con la fecha indicada.

• WeekDayName: devuelve el nombre del día de la semana que se corresponde con


la fecha indicada.

• Year: devuelve el año de la fecha indicada.

• Hour: devuelve la hora del tiempo indicado.

• Minute: devuelve los minutos del tiempo indicado.

• Second: devuelve los segundos del tiempo indicado.

• TimeValue: devuelve una variable de subtipo Date a partir de la cadena


especificada por parámetro.

17
El modelo de objetos de ASP
ASP nos proporciona una serie de objetos integrados, a los que siempre tenemos acceso sin
necesidad de instanciarlos, son objetos que constituyen lo que se denomina el modelo de
objetos de ASP. Estos objetos son bastante interesantes ya que gran parte de la programación
de aplicaciones ASP se basa en la utilización de los mismos.

Estos objetos ponen a disposición del programador una serie de métodos y propiedades que
pueden ser utilizados desde el script de servidor, es decir, son directamente accesibles y
manipulables desde VBScript. Cada uno de estos objetos cubre unas funciones determinadas.

Antes de comenzar a explicar cada unos de los objetos integrados se considera necesario
repasar el concepto de objeto, método y propiedad dentro del entorno de la programación
orientada a objetos y desde el punto de vista que nos interesa, es decir desde las páginas
activas de servidor.

Un objeto es un componente que posee una serie de comportamientos y que tiene un estado.
El estado de un objeto se encuentra definido por sus propiedades y sus comportamientos a
través de los métodos. Un objeto puede contener otros objetos.

Cada objeto tiene unas propiedades que definen sus atributos. Las propiedades de un objeto
nos indican algo sobre el objeto o sus contenidos. Las propiedades diferencian un objeto de
otro y determinan su estado y características. Los métodos que poseen los objetos definen su
comportamiento interno y frente a otros objetos.

Los objetos integrados además de poseer métodos y propiedades, también ofrecen


colecciones. Una colección es un grupo de objetos del mismo tipo. Un objeto y una colección
son ambos contenedores, pero de distinto tipo. Un objeto contendrá cero o más colecciones de
diferente tipo, mientras que una colección contendrá cero o más objetos de naturaleza similar.

Por ejemplo, ASP ofrece el objeto Request que contiene diferentes propiedades y colecciones
de distinto tipo. Una de estas colecciones es la colección Form, esta colección contiene
información sobre los elementos del formulario que se ha enviado. Aquí se puede observar la
diferencia entre objetos y colecciones en ASP, un objeto puede siempre contener otro nivel de
información variada pero las colecciones no.

La mayoría de los objetos integrados de ASP proporcionan colecciones. Una colección es una
estructura de datos, similar a una matriz, que almacena cadenas, números, objetos y otros
valores. A diferencia de las matrices, las colecciones se amplían y reducen automáticamente al
recuperar o almacenar elementos. La posición de un elemento también cambia al modificar la
colección. Es posible tener acceso a un elemento de una colección por su clave de cadena
única, por su índice (posición) en la colección o si se iteran todos los elementos de la colección.

El acceso a las colecciones, su sintaxis y utilización la veremos según vayamos avanzando en


el temario con distintos ejemplos.

Todas las colecciones ofrecen una serie de métodos comunes a todas ellas y son los
siguientes:

• Count: devuelve número de elementos contenidos en la colección.

• Item: devuelve el elemento que se corresponde con el índice o cadena clave que
se pasa por parámetro.

• Key: devuelve el nombre de una clave dado su índice.

• Remove: elimina un elemento determinado de la colección, del que indicamos su


clave o índice. La colección debe ser de escritura.

• RemoveAll: elimina todos los elementos presentes en una colección. Al igual que el
método anterior requiere que la colección sea de escritura.

18
Las colecciones comienzan en el índice 1, a diferencia de los arrays, que empiezan en el índice
cero.

Antes de poder utilizar un objeto se debe instanciar, es decir, crear el objeto y asignárselo a
una variable que va a representar una instancia de ese objeto, en realidad, hasta que no se
instancia un objeto, el objeto no existe. Pero en el caso de los objetos integrados no hay que
instanciarlos, se puede considerar que son creados al iniciar la ejecución la aplicación ASP.

Los objetos que pertenecen al modelo de objetos de ASP 3.0 son siete, cinco de los cuáles,
vamos a ver:

• Response: mediante este objeto podremos enviar datos al cliente que recibirá en
HTML y controlar la salida que el usuario va a recibir en su navegador Web. En el
tema anterior ya hemos utilizado este objeto para escribir diferentes resultados en
la página ASP.

• Request: este objeto lo vamos a utilizar para recuperar información del usuario. El
objeto Request se utiliza sobre todo para recuperar información de formularios y de
las cadenas de consulta (QueryString) del cliente (el navegador Web), toda esta
información se guarda dentro de las colecciones del objeto Request, que veremos
detenidamente en su momento. Podemos decir que el objeto Response y Request
son complementarios, ya que el primero lo utilizamos para enviar información al
navegador y el segundo para obtener información del mismo.

• Application: este objeto representa a la aplicación ASP y es utilizado para


almacenar información a nivel de aplicación, es decir, variables globales que son
comunes a toda la aplicación ASP. Este objeto tiene dos eventos asociados al
inicio de la aplicación ASP y a la finalización de la ejecución de la aplicación.

• Session: representa una sesión de un usuario (navegador Web) con una


aplicación ASP, es utilizado para almacenar información específica de cada
usuario conectado a una aplicación ASP. La información contenida en el objeto
Session es particular para cada usuario y no se puede intercambiar.

• Server: mediante este objeto podemos acceder a los recursos del servidor Web,
permite crear objetos registrados en el servidor y que pueden ser de diverso tipo,
desde objetos pertenecientes a componentes de servidor que se ofrecen con ASP
hasta componentes desarrollados por nosotros mismos o terceras partes. Este
objeto es de difícil clasificación y muchas veces se define como un objeto de
utilidades.

Objeto Response
El Objeto response se usa para enviar resultados al navegador cliente o establecer valores de
Cookies de usuario.

Colecciones

Este objeto contiene una única colección llamada Cookies, que permite crear y asignar valores
a una cookie. Una cookie, físicamente, es un fichero que se escribe en la máquina local del
cliente que se conecta a un sitio Web y que contiene información relativa a la conexión.

Existen varios usos prácticos de las cookies, a continuación se van a comentar los más
destacados:

• Para almacenar información acerca de las preferencias del cliente que se conecta
a nuestro sitio Web, por ejemplo el color seleccionado de la página, el tipo de letra,
etc.

• Para conservar información personal, no sensible, del usuario, como puede ser el
nombre, el país de origen, código postal, el número de veces que ha accedido a
nuestro sitio Web, etc.

19
Por lo tanto el uso de cookies nos puede permite personalizar las páginas ASP según el cliente
que se haya conectado atendiendo a sus preferencias y datos personales. Por ejemplo
podemos saludar al usuario con su nombre y asignar al color de fondo de la página su color
favorito o también podremos indicarle el número de veces que ha accedido a nuestro sitio Web.

Para crear una cookie se utiliza la siguiente sintaxis;

Response.Cookies(NombredelaCookie)=ValordelaCookie

Si la cookie ya existe modifica su valor. La sintaxis general de una cookie es la que se muestra
a continuación:

Response.Cookies(cookie)[(clave).atributo]=valor

Donde cookie, es el nombre de la cookie a la que hacemos referencia, clave es un parámetro


opcional que se utiliza cuando la cookie es un diccionario, es decir puede contener diferentes
datos, y atributo especifica una propiedad de la cookie. Las propiedades (atributo) que poseen
las cookies son:

• Expires: sólo de escritura, indica la fecha en la que caduca la cookie. Si no se


especifica ningún valor, por defecto caduca cuando termina la sesión.
• Domain: sólo de escritura, especifica a que dominio es enviada la cookie. Por
defecto será el nombre del dominio del servidor del que proviene la cookie.
• Path: sólo de escritura, indica la ruta del servidor de la que proviene la cookie. Si
no se especifica, por defecto se toma la ruta de la página ASP que generó la
cookie.
• Secure: sólo de escritura, para indicar si la cookie es segura.
• HasKeys: sólo de lectura, especifica si la cookie tiene claves, es decir, si es un
diccionario.

Si queremos crear una cookie que tenga claves, por ejemplo que contenga los datos nombre,
apellidos y edad, y que caduque a finales del 2005 se debería escribir:

<%
Response.Cookies("datosPersonales").Expires= #December 31, 2005#
Response.Cookies("datosPersonales")("nombre")="Jose"
Response.Cookies("datosPersonales")("apellidos")="Garcia"
Response.Cookies("datosPersonales")("edad")=24
%>

El siguiente ejemplo muestra como crear dos cookies y luego leerlas.

(ejemplo10.asp)

<%@ LANGUAGE="VBScript" %> <% Option Explicit %>


<HTML>
<HEAD><TITLE>Ejemplo 10 ASP</TITLE></HEAD>
<BODY>
<% Response.Cookies("miCookie")("login") = "milogin"
Response.Cookies("miCookie")("password") = "mipassword"
Dim Valor
For Each Valor in Request.Cookies("miCookie")
Response.Write Valor & ": " &
Request.Cookies("miCookie")(Valor) & "<BR>"
Next %>
</BODY>
</HTML>

20
Propiedades

Response.Buffer = False | True

Cuando ASP procesa una página cualquiera, va ejecutando comandos, adjunta código HTML,
lee ficheros de inclusión, etc., y todo eso, hasta que la respuesta está completa lo va
guardando en un buffer. A este proceso se le denomina buffering. Cuando la composición del
fichero de respuesta está completa, o entre los comandos ejecutados encuentra una llamada a
los métodos Flush o End, ASP concluye el proceso de buffering, envía el fichero de respuesta
al cliente y vacía el buffer, quedando a la espera del siguiente proceso.

La propiedad Buffer sirve para intervenir en el proceso de buffering. Si el valor de Buffer es


True, el servidor enviará el contenido del buffer a la salida, pero si es False, el proceso de
buffering no se realiza. Esto significa que no es posible cambiar la propiedad después de que el
servidor haya enviado la respuesta. Si se quiere evitar el buffering, habrá que hacerlo antes de
que éste comience, por lo que la instrucción deberá ser la primera de todas.

Response.CacheControl = "Public" | "Private"

Esta propiedad permite a los servidores proxy guardar o no en su caché una copia de la
respuesta ASP.

Para evitar que el proxy copie en su cache las respuestas de nuestros ASP, se puede utilizar la
propiedad Response.CacheControl . Hay otras dos propiedades: Response.Expires y
Response.ExpiresAbsolute que controlan las caches, pero éstas lo hacen sobre las del
navegador.

Response.Charset("String")

Esta propiedad añade el nombre de la tabla de caracteres al contenido del objeto Response,
concretamente como parámetro de content-type. El valor por defecto es ISO-LATIN-1
(excepto en entornos Macintosh).

Hay que tener en cuenta que como argumento se puede escribir cualquier cosa, y aunque no
sea válido, ASP no emite ningún mensaje de error, simplemente no surtirá el efecto deseado.

Response.ContentType("String")

Esta propiedad especifica el tipo de contenido del request HTTP, que puede incluir un
tipo/subtipo en la cabecera de la respuesta. El tipo siempre es de contenido general y el
subtipo es específico. El valor por defecto es text/HTML. Tiene que ir antes de que se defina la
cabecera de la página.

Por ejemplo, el siguiente código produce una hoja de cálculo Excel en el navegador, siempre
que Excel esté instalado en la máquina del cliente, claro.

(ejemplo11.asp)

<%@ LANGUAGE="VBScript"%> <% Option Explicit %>


<% Response.ContentType = "application/vnd.ms-excel" %>
<HTML>
<HEAD><TITLE>Ejemplo 11 ASP</TITLE></HEAD>
<BODY>
<TABLE>
<TR><TD>Valor de la celda A1</TD>
<TD>Valor de la celda B1</TD></TR>
<TR><TD>Valor de la celda A2</TD>
<TD>Valor de la celda B2</TD></TR>
</TABLE>
</BODY>
</HTML>

21
Response.Expires

La propiedad Expires indica el número de minutos que deben transcurrir antes de que la copia
de la respuesta en las caches del navegador sea eliminada.

Response.ExpiresAbsolute

Funciona igual que la anterior, pero en lugar de indicar el número de minutos que deben
transcurrir antes de que las caches del navegador expiren, indica la fecha y hora exacta en
que eso ocurrirá.

Response.IsClientConnected = True | False

Con esta propiedad se puede saber si el cliente continua conectado al servidor desde la última
vez que se utilizó la propiedad Response.Write, es decir desde la última vez que nuestra
aplicación ha escrito algo en la pantalla del cliente. Puede ser muy útil si el proceso solicitado
va a ser muy trabajoso para el servidor, por ejemplo una consulta a una DB que devolverá gran
cantidad de datos. Si se verifica que el servidor a perdido la conexión con el cliente, es inútil
hacer todo el trabajo solicitado por éste, ya que no se podrá enviar el resultado, y además el
servidor entrará en una fase de reintentos sucesivos, hasta que el tiempo de cierre de sesión
especificado en su configuración se cumpla. Si eso ocurre con muchos procesos a la vez, el
servidor puede bloquearse.

Response.Status = "Status"

Esta propiedad especifica el valor de la línea de estado HTTP devuelta por el servidor.
Normalmente consiste en la dirección IP del cliente que ha provocado el estado, seguida de
una breve descripción de error. Esto hay que escribirlo antes que cualquier otra línea de la
página.

Si se desea impedir el acceso a la aplicación a una máquina cuyo IP sea, por ejemplo,
125.125.125.125 escribiremos:

<% Dir_IP = Request.ServerVariables("REMOTE_ADDR")

If Dir_IP = "125.125.125.125" Then


Response.Status = "403 Acceso prohibido"
Response.Write Response.Status
Response.End
End If
%>
<HTML> <HEAD><TITLE>PRUEBA</TITLE></HEAD> <BODY> .. ..

Esto mismo se puede configurar en el servidor de forma fija, en el apartado de seguridad de la


aplicación.

Métodos

Response.AddHeader "Nombre", "Valor"

Este método permite añadir una nueva cabecera a la respuesta HTTP. Una vez que la
cabecera ha sido creada, no es posible borrarla. El nombre dado a la nueva cabecera no puede
contener ningún carácter de subrayado ( _ )

<% Response.AddHeader "MiCabecera", "PRUEBA" %>

Response.AppendToLog("String")

Mediante este método se puede añadir una cadena al registro que se genera con cada request
en el fichero de logs del IIS.

22
Response.BinaryWrite(Data)

Escribe la salida HTTP en binario (no en modo string como lo hace Response.Write), y sin
aplicar ninguna conversión de página de caracteres.

Response.Clear

Este método se utiliza para borrar cualquier contenido del buffer de salida. No elimina las
cabeceras HTTP, solamente el contenido que va entre los elementos <BODY> y </BODY> Si el
buffer ya está vacío debido a que previamente se ha invocado Response.Buffer=False, se
produce un error de ejecución.

Response.End

Cuando se invoca este método el servidor detiene el proceso de la página ASP actual y envía
al cliente el contenido del buffer de salida, siempre que Response.Buffer=True. El resto de
instrucciones no se procesará.

Response.Flush

Este método provoca el envío inmediato al cliente del contenido del buffer de salida, en lugar
de hacerlo al concluir el proceso completo de la página, y continuando después con el resto de
instrucciones normalmente. Si el buffer está vacío debido a que previamente se ha invocado
Response.Buffer=False, se produce un error de ejecución.

Response.Write

El método Write escribe una cadena de resultado en el navegador cliente (Nota: cuando se usa
la sintaxis <%=variable%> estamos usando implícitamente el método Response.Write).

<% Response.Write "<center>Hola mundo</center>" %>

Response.Redirect

El método Redirect hace que el explorador se conecte con una dirección URL diferente.

Debemos usar este método antes de enviar cualquier resultado al navegador cliente, en caso
contrario produce un error.

<% Response.Redirect "www.url.es"%>

Objeto Request
El Objeto Request recupera los valores que el cliente pasa al servidor durante una petición
HTTP.

Propiedades

Request.TotalBytes

Esta propiedad, de solo lectura, indica el número total de bytes enviados por el cliente al
servidor en el cuerpo de la llamada HTTP (CONTENT_LENGHT).

Colecciones

Dependiendo de la forma en que enviemos los datos al servidor tendremos que utilizar una u
otra de las diversas colecciones del objeto Request. Las más típicas son:

• FORM recupera datos enviados desde un formulario mediante el método POST.


• QUERYSTRING recupera datos enviados como cadena de consulta HTTP (GET).
• COOKIES recupera los valores de las Cookies.
• CLIENTCERTIFICATE Certificado del cliente.

23
• SERVERVARIABLES Variables del servidor.

Ejemplos

Request.Form(“clave”)

Para el caso del POST.

Con Form.Count obtenemos la cantidad de elementos enviados.

Supongamos que enviamos la información desde el siguiente formulario (ejemplo12.html):

<form method="POST" action="ejemplo12.asp" >


<p>Nombre: <input type="text" name="Nombre"></p>
<p>Nacionalidad: <input type="text" name="Nacionalidad"></p>
<p><input type="submit" value="Enviar" name="Enviar"></p>
</form>

En nuestra página "ejemplo12.asp" podríamos usar la siguiente secuencia:

Su nombre es: <%=request.form("Nombre")%> <br>


Su nacionalidad: <%=request.form("Nacionalidad")%>

Request.QueryString(“clave”)

Para el caso del GET.

Supongamos que enviamos la información desde el siguiente formulario (ejemplo13.html):

<form method="GET" action="ejemplo13.asp" >


<p>Nombre: <input type="text" name="Nombre"></p>
<p>Nacionalidad: <input type="text" name="Nacionalidad"></p>
<p><input type="submit" value="Enviar" name="Enviar"></p>
</form>

En nuestra página "ejemplo13.asp" podríamos usar la siguiente secuencia:

Su nombre es: <%=request.querystring("Nombre")%> <br>


Su nacionalidad: <%=request.querystring ("Nacionalidad")%>

Request.Cookies(“clave”)

Las cookies son ficheros que se instalan en el disco duro del ordenador del cliente y que
permite almacenar información sobre un determinado usuario, como por ejemplo su login y su
password de acceso a un determinado sitio web.

La colección Cookies asigna datos a una cookie existente, y si éste no existe, crea una nueva
donde almacena estos datos. (Más adelante vemos un ejemplo de uso).

Request.ClientCertificate(“clave”)

Esta colección tiene utilidad si estamos escribiendo una aplicación que utiliza el protocolo
Secure Socket Layers (SSL). Este protocolo, que da una mayor seguridad en las transacciones
electrónicas, se invoca con el prefijo https:// en lugar del típico http://, y está basado en el
envío de certificados electrónicos del servidor al cliente para asegurar la identidad del mismo.

Un certificado es como un registro que contiene los siguientes campos:

• Certificate Contiene el certificado completo. Se recibe en binario.


• SerialNumber Contiene el número de serie del certificado.
• Subject Información sobre el sujeto certificado.

24
• Issuer Información sobre el emisor del certificado.
• ValidFrom Fecha desde la que es válido el certificado.
• ValidUntil Fecha de expiración del certificado.
• Flags Hay dos flags :
• CertPresent Indica que el certificado se recibe de un cliente conocido.
• UnrecognizedIssuer Indica que el certificado se recibe de un cliente desconocido.

Request.ServerVariables(“Variable”)

Esta colección contiene el valor de las variables de entorno del servidor. Hay muchas, y
posiblemente no las utilices nunca, por lo que sólo se mencionarán algunas. Los valores del
argumento "Variable" pueden ser, entre otros, los siguientes:

• ALL_HTTP Muestra todas las cabeceras HTTP enviadas por el cliente.


• ALL_RAW Recupera todas las cabeceras en formato raw (transparente, sin
codificar).
• AUTH_PASSWORD Es el password dado por el cliente durante el diálogo de
autenticación.
• AUTH_TYPE Muestra el método de autenticación que utiliza el servidor.
• AUTH_USER Nombre del usuario dado durante el diálogo de autenticación en
modo raw.
• CONTENT_TYPE Tipo de datos del contenido
• HTTP_<HeaderName> El valor almacenado en la cabecera HeaderName.
• QUERY_STRING Es la información contenida en la cadena a continuación del
interrogante (?).
• REMOTE_ADDR Dirección IP del host (máquina del cliente) que hace la petición
de la página.
• REMOTE_HOST Nombre del host que hace la petición.
• REMOTE_USER Nombre del usuario.
• REQUEST_METHOD Método empleado para hacer una petición (POST o GET)
desde un formulario.
• SERVER_PORT Número del puerto por el que la petición ha sido enviada.
• SERVER_NAME Nombre del host servidor, DNS, alias o dirección IP.
• HTTP_REFERER Contiene el nombre de la página desde donde el cliente ha
saltado a la nuestra. Sólo funciona si el salto ha sido mediante un link. No contiene
nada si el cliente ha escrito directamente nuestra dirección en su navegador.

El siguiente ejemplo muestra el contenido de todas y cada una de las variables de entorno.

(ejemplo14.asp)

<HTML>
<HEAD>
<TITLE>Ejemplo 14 ASP</TITLE>
</HEAD>
<BODY>
<TABLE>
<TR>
<TD><FONT FACE=Verdana SIZE=1 COLOR=#336699>
<B>Nombre de las Variables</B>
</FONT></TD>

25
<TD><FONT FACE=Verdana SIZE=1 COLOR=#336699>
<B>Valores Devueltos por el Servidor</B>
</FONT></TD>
</TR>

<% For Each Variable in Request.ServerVariables %>


<TR>
<TD><FONT FACE=Verdana SIZE=1 COLOR=#996699>
<% =Variable %>
</FONT></TD>

<TD><FONT FACE=Verdana SIZE=1 COLOR=#0000FF>


<% If Request.ServerVariables(Variable)="" Then
Response.Write "Vacío"
Else
Response.Write Request.ServerVariables(Variable)
End If
%>
</FONT></TD>
</TR>
<% Next %>
</TABLE>
</BODY>
</HTML>

Métodos

Request.BinaryRead(Count)

Este método recupera los datos que han sido enviados al servidor desde el cliente formando
parte de una petición HTTP POST (por ejemplo, con un formulario).

El argumento Count es obligatorio. Antes de que el método sea ejecutado, Count contiene el
número de bytes que tienen que ser leídos. Después de la ejecución contiene el actual número
de bytes leídos. Se utiliza poco, y su principal uso es cuando se envía (upload) un fichero, para
comprobar que llegó completo.

Objeto Application
Una aplicación ASP se puede definir de manera sencilla como un conjunto de páginas activas
de servidor que tiene una función común y que comparten un lugar de almacenamiento de
variables común.

Una aplicación ASP se define a partir de un directorio o directorio virtual en un sitio Web. Se
debe indicar el punto de inicio de la aplicación ASP, a partir de ese punto de inicio todas las
páginas ASP formarán parte de la aplicación ASP y compartirán un mismo contexto.

El objeto Application se utiliza para compartir información entre todos los usuarios de una
aplicación (entendemos por una aplicación ASP todos los archivos .asp de un directorio virtual
y sus subdirectorios).

Application(“visitas”) = 0

También se pueden almacenar objetos dentro del objeto Application, para ello se debe utilizar
esta otra sintaxis:

Set Application("NombreObjeto")=Server.CreateObject("Componente")

26
Colecciones

Application.Contents( )

Contiene una colección de todos los elementos que han sido creados y añadidos al objeto
Application. Los elementos se pueden añadir a la lista mediante asignación directa de
variables, o bien con el objeto Server y su método CreateObject.

Application.StaticObject( )

Esta es una colección de todos los ítems creados en el objeto Application utilizando un
elemento HTML: <OBJECT> En este caso, la asignación de valores a los ítems no se hace
desde código ASP, sino en HTML y desde el fichero global.asa.

Métodos

Como varios usuarios pueden compartir un objeto Application, existen los métodos Lock y
Unlock para asegurar la integridad del mismo (varios usuarios no puedan modificar una misma
propiedad al mismo tiempo).

Application.Lock

El método Lock asegura que sólo un cliente puede modificar o tener acceso a las variables de
Application al mismo tiempo.

Application.Unlock

El método Unlock desbloquea el objeto Application para que pueda ser modificado por otro
cliente después de haberse bloqueado mediante el método Lock. Si no se llama a este método
de forma explícita, el servidor Web desbloquea el objeto Application cuando el archivo .asp
termina o transcurre su tiempo de espera.

Ejemplo (ejemplo8.asp):

<%@ LANGUAGE="VBScript" %>


<HTML>
<HEAD>
<TITLE>Ejemplo 8 ASP</TITLE>
</HEAD>
<BODY>
<% Application.Lock
Application("visitas") = Application("visitas")+1
Application.Unlock
%>
<p>Eres el visitante numero <%= Application("visitas") %> </p>
</BODY>
</HTML>

En el ejemplo anterior el método Lock impide que más de un cliente tenga acceso a la variable
Visitas al mismo tiempo. Si la aplicación no se hubiera bloqueado, dos clientes podrían intentar
incrementar simultáneamente el valor de la variable Visitas. El método Unlock libera el objeto
bloqueado de forma que el próximo cliente puede incrementar la variable.

En el objeto Application pueden almacenarse matrices, pero estas son almacenadas como un
objeto, es decir, no podemos almacenar o recuperar un solo elemento de la matriz, si no que
cargaremos o recuperaremos la variable con la matriz completa.

Application.Contents.Remove( )

Este método se utiliza para eliminar un elemento específico de la colección


Application.Contents. El elemento que se desea eliminar puede referenciarse de dos
maneras: por su nombre o por su número dentro de la colección, teniendo presente que la

27
numeración comienza en el 1. Si se referencia por su nombre, éste deberá escribirse entre
comillas dobles (" ").

Application.Contents.RemoveAll( )

Éste método elimina TODOS los elementos de la colección Application.Contents().

Eventos

Application_OnStart Application_OnEnd

Estos eventos se controlan en el fichero global.asa, y debe existir uno por cada aplicación que
se ejecute en el servidor, cada uno en el directorio virtual donde ésta resida. El evento
Application_OnStart ocurre antes de comenzar cualquier sesión de usuario, y cuando se haya
desconectado el último usuario, ocurrirá Application_OnEnd.

Objeto Session
Al igual que ocurría con el objeto Application, el objeto Session nos va a permitir almacenar
información entre diferentes páginas ASP incluidas en una misma aplicación ASP. La diferencia
con el objeto Application se encuentra en el ámbito de las variables, cada variable del objeto
Session es particular a una sesión de un usuario determinado, no a toda la aplicación. De esta
forma, cada usuario tendrá sus variables y sus valores, sin dar lugar a problemas de
concurrencia, tampoco se podrá acceder a distintas variables de sesión, cada usuario tiene su
espacio de almacenamiento.

Las variables de aplicación son valores globales y comunes a toda la aplicación, y las variables
de sesión son particulares para cada usuario de la aplicación.

El objeto Session permite almacenar la información necesaria par una sesión de usuario contra
nuestra aplicación ASP. Las variables que almacenemos en el objeto Session no se pierden al
cambiar de página, si no que se mantienen hasta que el cliente sea eliminado por el servidor.

Las variables de Session de un cliente solo pueden ser accedidas por ese cliente.

El servidor crea automáticamente el objeto Session cuando un usuario que no tenga


actualmente una sesión solicita una página Web de la aplicación.

El servidor elimina un cliente bien cuando desde una pagina ASP se invoca el método Abandon
o bien cuando este cliente lleva 20 minutos sin actividad en nuestra aplicación.

Creación de una variable de Session

Ejemplo:

<% Session("Color")="Rojo" %>

Para recuperar ese valor:

<% ColorSeleccionado=Session("Color") %>

En el objeto Session pueden almacenarse matrices, pero estas son almacenadas como un
objeto, es decir, no podemos almacenar o recuperar un solo elemento de la matriz, si no que
cargaremos o recuperaremos la variable con la matriz completa.

Colecciones

Session.Contents()

Contiene una colección de todos los elementos que han sido creados y añadidos al objeto
Session. Los elementos se pueden añadir a la lista mediante asignación directa de variables, o
bien con el objeto Server y su método CreateObject.

28
Session.StaticObjects()

Esta es una colección de todos los elementos creados en el objeto Session utilizando un
elemento HTML: <OBJECT> En este caso, la asignación de valores a los elementos no se
hace desde código ASP, sino en HTML y desde el fichero global.asa.

Propiedades

Session.CodePage

Esta propiedad especifica al servidor que página de código de caracteres debe utilizar para
mostrar las páginas ASP invocadas desde el cliente. Por defecto, y si no se define otro valor
para esta propiedad, el servidor utilizará la página predeterminada en el sistema. El cambio de
página solamente estará activo el tiempo que dure la sesión. Esta propiedad puede ser muy útil
para convertir textos escritos en una lengua diferente a la que utilizan los clientes.

Session.LCID

La propiedad LCID utiliza el número identificador de localización para dar en varios formatos, la
fecha, hora y localizador específicos de un lugar o región. El número identificador de
localización únicamente define una situación geográfica. Por ejemplo el identificador de España
es el 2048, el de Francia es el 1036, etc.

Session.SessionID

Proporciona un identificador de sesión para el usuario actual. Este identificador es generado


por el servidor, y consiste en un número del tipo largo (long)

Session.Timeout

Especifica el número de minutos que tienen que pasar, mientras la sesión está inactiva, para
darla por terminada, siendo el valor por defecto de 20 minutos. Esto significa que si el usuario
no refresca la página, solicita otra o hace cualquier transacción la sesión es automáticamente
cerrada y los recursos que tuviese asignados, recuperados. Este tiempo también es posible
establecerlo de forma fija en las configuraciones de la aplicación en el propio IIS.

Métodos

Session.Abandon

Destruye todos los objetos y variables almacenados en el objeto Session.

<% Session.Abandon %>

Session.Contents.Remove()

Este método se utiliza para eliminar un elemento específico de la colección Session.Contents.


El elemento que se desea eliminar puede referenciarse de dos maneras: por su nombre o por
su número dentro de la colección, teniendo presente que la numeración comienza en el 1. Si se
referencia por su nombre, éste deberá escribirse entre comillas dobles(" ").

Session.Contents.RemoveAll()

Éste método elimina TODOS los elementos de la colección Session.Contents(). En este caso
no hay que referencia ningún nombre ni número.

Eventos

Session_OnStart Session_OnEnd

Estos eventos se controlan en el fichero global.asa, y debe existir uno por cada aplicación que
se ejecute en el servidor, cada uno en el directorio virtual donde ésta resida. El evento
Session_OnStart ocurre justo antes de que el servidor haya creado el objeto Session.

29
Session_OnStart, que se activará tantas veces como usuarios haya conectados a la
aplicación. Cuando un usuario cierra la aplicación voluntariamente, o bien transcurre un tiempo
predefinido sin hacer ninguna transacción, se disparará Session_OnEnd.

(ejemplo17.asp)

<%@Language=VBScript %>
<%
If Request.Form("configurar") <> "" Then
Session("colorLetra")=Request.Form("colorLetra")
Session("colorFondo")=Request.Form("colorFondo")
Session("tamLetra")=Request.Form("tamLetra")
Session("tipoLetra")=Request.Form("tipoLetra")
End if
%>
<HTML>
<HEAD><TITLE>Ejemplo 17 ASP</TITLE></HEAD>
<BODY bgcolor="<%=Session("colorFondo")%>">
<font face="<%=Session("tipoLetra")%>"
size="<%=Session("tamLetra")%>"
color="<%=Session("colorLetra")%>">Texto de muestra</font>
<br>
<br>
<table border="0">
<form action="<%=Request.ServerVariables("SCRIPT_NAME")%>"
method="post">
<tr>
<td>
<font face="<%=Session("tipoLetra")%>"
size="<%=Session("tamLetra")%>"
color="<%=Session("colorLetra")%>">Color de fondo:
</font>
</td>
<td>
<select name="colorFondo">
<option value="green">Verde
<option value="black">Negro
<option value="white">Blanco
<option value="red">Rojo
<option value="blue">Azul
</select>
</td>
</tr>
<tr>
<td>
<font face="<%=Session("tipoLetra")%>"
size="<%=Session("tamLetra")%>"
color="<%=Session("colorLetra")%>">Tipo de letra:
</font>
</td>
<td>
<select name="tipoLetra">
<option value="courier">Courier
<option value="arial">Arial
<option value="verdana">Verdana
<option value="timesroman">TimesRoman
<option value="Bookman Old Style">Bookman Old Style
</select>
</td>
</tr>

30
<tr>
<td>
<font face="<%=Session("tipoLetra")%>"
size="<%=Session("tamLetra")%>"
color="<%=Session("colorLetra")%>">Color de letra:
</font>
</td>
<td>
<select name="colorLetra">
<option value="green">Verde
<option value="black">Negro
<option value="white">Blanco
<option value="red">Rojo
<option value="blue">Azul
</select>
</td>
</tr>
<td>
<font face="<%=Session("tipoLetra")%>"
size="<%=Session("tamLetra")%>"
color="<%=Session("colorLetra")%>">Tamaño de letra:
</font>
</td>
<td><input type="text" name="tamLetra"
size="2" maxlength="1"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="configurar"
value="Enviar Cambios">
</td>
</tr>
</table>
</BODY>
</HTML>

El ejemplo que acabamos de ver es un resumen de varias cosas que hemos visto hasta ahora,
el uso de formularios y request, el operador distinto, la sentencia if y las variables de sesión.
Además, podemos ver que en el action, hacemos referencia al nombre de este script para que
se vuelva a ejecutar el propio script, al hacer clic en enviar cambios.

Objeto Server
El objeto Server nos proporciona acceso a métodos y propiedades del servidor.

Propiedades

Server.ScriptTimeout

Especifica la cantidad máxima de tiempo que puede tardar la ejecución de una secuencia de
comandos (Tiempo máximo que puede tardar en ejecutarse una página dada).

<% Server.ScriptTimeout = 120 %>

Métodos

Server.CreateObject("ObjectID")

Este es, probablemente, uno de los métodos más importantes de ASP, ya que permite al
usuario crear instancias a otros objetos (componentes ActiveX o componentes creados por el

31
usuario), que al igual que los ya existentes intrínsecamente en ASP, tienen sus propias
colecciones, eventos, métodos y propiedades asociadas con ellos.

ObjectID es el identificativo del tipo de componente que queremos crear, nos viene
suministrado por el fabricante del componente, es un argumento obligatorio.

<% Set Tabla = CreateObject("ADODB.Recordset") %>

En el caso de que una variable vaya a recibir un objeto hay que anteponer la palabra reservada
Set, tal como se muestra.

Server.Execute("Ruta")

Permite llamar desde una página ASP a otra página ASP. Cuando la página llamada concluye
su proceso, el control vuelve a la página llamadora. Es un efecto parecido al que se consigue
con los ficheros de inclusión . Básicamente se diferencia de los include en que no pasa a
formar parte del mismo fichero en el momento de ser procesado, sino que se ejecuta un
segundo fichero por separado y con otro nombre.

No debe confundirse con los métodos Server.Transfer o Response.Redirect ya que con ellos
el control no vuelve a la página llamadora, y el proceso concluye en la página llamada.

Server.GetLastError( )

Ver el objeto ASPError

Server.HTMLEncode("String")

Con este método se puede convertir un string codificado en HTML, y por tanto ejecutable por
los navegadores, en código solamente visible pero no ejecutable por los navegadores.
Escapa los TAGS para que aparezcan como literales, y no código.

<% Response.Write Server.HTMLEncode("Un <BR> que no funciona") %>

Este sería el código interno obtenido, visible en formato HTML pero no ejecutable como tal:
Esto es un &lt;BR&gt; que no funciona

Server.MapPath("Ruta")

Traza un mapa de rutas físicas (absolutas) partiendo de rutas virtuales (relativas) de ficheros
que se encuentren dentro del árbol de directorios declarados como parte de la estructura del
servidor web.

Server.Transfer("Ruta")

Permite llamar desde una página ASP a otra página ASP. Cuando la página llamada concluye
su proceso, el control no vuelve a la página llamadora, y concluye en la página llamada.

No confundir con el método Response.Redirect que funciona de modo similar, pero partiendo
de otro objeto. El proceso de transferencia de una página a otra es completo, incluyendo todos
los objetos y variables que hayan sido creados en la página llamadora como si se tratase de la
misma, aunque con otro nombre de página.

Server.URLEncode("String")

Este método puede convertir un string conteniendo una dirección URL en formato ASCII a
formato URL-Encoded.

<%Response.Write Server.URLEncode("http://www.sitio.es/manual.asp")%>

Este sería el código interno obtenido URL-encoded, que es precisamente con el que trabajan
internamente los navegadores, aunque habitualmente se vea de otra forma (formato ASCII).

32
http%3A%2F%2Fwww%2Esitiouv%2Ees%2Fmanual%2Easp

Como se ve, la conversión lo que hace es transformar cualquier cosa que no sea una letra o un
número en su código hexadecimal separados por el signo %

En el ejemplo 18 se muestra la utilización del método CreateObject para utilizar un componente


de VBScript.

<%Set objfichSist=Server.CreateObject("Scripting.FileSystemObject")
Set fichero= objfichSist.GetFile("c:\windows\win.ini")%>
Fecha creación: <%=fichero.DateCreated%><br>
Nombre: <%=fichero.Name%><br>
Tamaño: <%=fichero.Size%><br>
Tipo: <%=fichero.Type%><br>
<%Set fichero=Nothing
Set objfichSist=Nothing%>

33
El fichero GLOBAL.ASA
El fichero GLOBAL.ASA (ASA, Active Server Application, aplicación activa de servidor o mejor
aplicación ASP), que tanto hemos mencionado hasta ahora en este capítulo, es un fichero
opcional que se encuentra en el directorio raíz de la aplicación ASP y que está relacionado de
forma directa con los objetos integrados Application y Session. Este fichero, que debe ser único
para cada aplicación ASP, tiene varias funciones:

• Definir como son tratados los eventos de los objetos Session y Application. Como
hemos comentado en el apartado anterior.

• Permitir crear objetos con el ámbito de aplicación y sesión.

• Inicializar y crear variables en el ámbito de la sesión y aplicación.

El fichero GLOBAL.ASA podrá contener:

• Información acerca del tratamiento de los eventos de los objetos Session y


Application.

• Declaraciones de objetos mediante la etiqueta <OBJECT>.

La estructura general de GLOBAL.ASA es la siguiente:

<SCRIPT LANGUAJE=VBScript RUNAT=Server>


SUB Application_OnStart
......
END SUB
SUB Session_OnStart
......
END SUB
SUB Session_OnEnd
......
END SUB
SUB Application_OnEnd
......
END SUB
</SCRIPT>

Si se escribe script fuera de las etiquetas <SCRIPT></SCRIPT> o se declara un objeto que no


tiene ámbito de sesión o de aplicación se producirá un error.

Tampoco se pueden incluir ficheros de ningún tipo mediante el uso de la directiva INCLUDE.

El lenguaje de secuencias de comandos a utilizar se indica en el atributo LANGUAGE de la


etiqueta <SCRIPT>, y también se debe indicar en que lugar se ejecutará el script, esto se
consigue a través del atributo RUNAT de la etiqueta <SCRIPT>, en realidad este atributo sólo
tiene un valor posible: Server, es decir, el script se ejecutará en el servidor.

Para declarar objetos mediante la etiqueta <OBJECT>, para que tengan el ámbito de sesión o
aplicación se deberá seguir la siguiente sintaxis:

<OBJECT RUNAT=Server SCOPE=Ambito ID=Identificador


{PROGID="IDprog"|CLASSID="IDclase"}>
........
</OBJECT>

La declaración de los objetos deberá ir fuera de las etiquetas de script. Los objetos declarados
de esta forma no se crearán hasta que el servidor procese una secuencia de comandos en el
que se haga referencia a ellos. Así se ahorran recursos, al crearse sólo los objetos que son
necesarios.

34
Estos objetos pasaran a formar parte de la colección StaticObjects del objeto Application.

El parámetro Ambito especifica el ámbito del objeto, podrá tener los valores Session o
Application; Identificador especifica un nombre para la instancia del objeto; IDprog e IDclase
para identificar la clase del objeto.

La propiedad SCOPE de la etiqueta <OBJECT> de HTML, tiene un valor de ámbito más,


además de los de sesión y de aplicación, y se trata del ámbito de página SCOPE="PAGE". El
ámbito de página indica que el objeto que se instancie sólo existirá en el página actual, pero
este ámbito no se puede utilizar en el fichero global.asa sino que se puede utilizar en cualquier
página ASP. Sin embargo en las páginas ASP no se puede utilizar la etiqueta <OBJECT> con
el ámbito de aplicación o de sesión, únicamente se pueden instanciar objetos con ámbito de
página.

El siguiente código dentro del fichero GLOBAL.ASA crearía un objeto Connection de ADO con
ámbito de sesión.

<OBJECT RUNAT=Server
SCOPE=Session ID=conexion
PROGID="ADODB.Connection">
</OBJECT>

Para utilizar este objeto posteriormente dentro de una página ASP, por ejemplo, para ejecutar
una sentencia SQL sobre la conexión con la base de datos, bastaría con escribir lo que indica
el siguiente ejemplo:

<%conexion.Execute "DELETE FROM Usuarios WHERE id<10"%>

Es decir, accedemos directamente al nombre del objeto, que será el indicado en la propiedad
ID de la etiqueta <OBJECT>.

Veamos el código de un fichero GLOBAL.ASA concreto.

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">


Sub Application_OnStart
Application("variableUno")="valor"
Application("variableDos")=2
Application("variableTres")=True
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>
<OBJECT RUNAT="Server"
SCOPE="Application" ID="conex" PROGID="ADODB.Connection">
</OBJECT>
<OBJECT RUNAT="Server"
SCOPE="Application" ID="recordset" PROGID="ADODB.RecordSet">
</OBJECT>

Cuando se inicie la aplicación ASP correspondiente se crearán tres variables de aplicación que
pasarán a formar parte de la colección Contents, también se crean dos objetos a nivel de
aplicación que pasarán a formar parte de la colección StaticObjects.

El fichero global.asa sólo se ejecutará si se ha indicado el punto de inicio de la aplicación


correspondiente.

En el ejemplo 16 se muestra una página ASP que accede a las colecciones del objeto
Application para comprobar las variables de aplicación creadas en el fichero global.asa
anterior, también se muestra como acceder y utilizar un objeto definido a nivel de aplicación.

35
(ejemplo16.asp)

<%@ Language=VBScript %> <% Option Explicit %>


<HTML>
<HEAD><TITLE>Ejemplo 16 ASP</TITLE></HEAD>
<BODY>
Número de elementos de la colección Contents:
<b><%=Application.Contents.Count%></b><br>
<%
Dim variable
For Each variable in Application.Contents
Response.Write variable & " = " &
Application.Contents(variable) & "<br>"
Next
%>

<br>
Número de elementos de la colección StaticObjects:
<b><%=Application.StaticObjects.Count%></b><br>
<%
Dim objeto
For Each objeto in Application.StaticObjects
Response.Write objeto & "<br>"
Next
%>
</BODY>
</HTML>

La siguiente figura ilustra perfectamente el comportamiento de los eventos que se producen:

36
Fuentes de datos ODBC
La administración de orígenes de datos ODBC (Open Database Connectivity) es una utilidad
general de Windows NT. Permite que las aplicaciones accedan a los datos usando SQL como
lenguaje estándar.

Se administran a través de la ventana ODBC del Panel de Control.

Se pueden configurar tres diferente fuentes de datos ODBC, la forma más interesante es la de
DSN del Sistema, que presenta la ventaja de poder ser accedida por cualquier usuario, siendo
el tipo usado en aplicaciones ASP.

Para declarar una base de datos ODBC haremos doble clic en el icono Fuentes de Datos
ODBC que encontraremos en el panel de control de Windows (Inicio->Configuración->Panel de
Control), una vez abierto el programa nos situaremos en la pestaña DSN de Sistema.

Pulsaremos el botón AGREGAR para añadir una nueva fuente de datos, lo que nos llevara a la
pantalla de controladores.

37
En esta ventana elegiremos el driver adecuado para la tecnología de la base de datos que
queremos tratar desde nuestras páginas ASP y pulsaremos finalizar. La siguiente pantalla que
se nos muestra nos pedirá la ubicación física de nuestra base de datos y el nombre ODBC con
el que queremos acceder a ella.

Nombre de origen de datos: Es el nombre simbólico de nuestra base de datos, será el que
utilicemos desde ASP para referirnos a ella.

Descripción: Es una descripción de la base de datos

Base de datos: Es el camino físico de la base de datos, para establecerlo pulsaremos el botón
SELECCIONAR y mediante un explorador elegiremos nuestra fuente de datos.

Una vez hecho esto pulsaremos el botón ACEPTAR y ya tendremos nuestra base de datos
disponible para su uso desde nuestras aplicaciones Web.

Una vez definido un DSN para abrir la BD asociada sólo hay que indicar el nombre al invocar el
método Open de la conexión.

ASP permite acceder de forma directa a la BD sin necesidad de definir un DSN, para ello, lo
único que tenemos que conocer es la ubicación de la BD en el servidor y la cadena de
conexión necesaria para acceder a la BD.

Mediante ADO podemos decidir el tipo de acceso que vamos a realizar, con o sin DSN.

ActiveX Data Object (ADO)


Una de las características más interesantes de ASP es su facilidad para el manejo de bases de
Datos que residen en el servidor. Esto lo conseguimos mediante el uso de ADO (ActiveX Data
Object) de una forma fácil, rápida y con un mínimo consumo de recursos del sistema.

ADO usa ODBC para el acceso a bases de datos. lo que nos independiza de la tecnología de
las mismas. Esto implica que podemos cambiar la tecnología de la base de datos y si
mantenemos la misma estructura de datos, nuestras aplicaciones desarrolladas con ADO
pueden seguir funcionando sin cambiar ni una sola línea de código.

38
Para desarrollo podemos crear nuestras fuentes de datos en Microsoft Access, pero en
entornos de producción con gran afluencia de clientes deberemos de usar gestores de bases
de datos más potentes, como Oracle, Microsoft SQL Server, etc...

ADO esta formado por varios objetos organizados de forma jerárquica (cada uno de ellos con
sus métodos y propiedades específicos) de los cuales vamos a estudiar los mas interesantes.

• Connection: Nos proporciona una conexión a una base de datos ODBC desde una
página ASP. Esta conexión nos permitirá efectuar las operaciones que deseemos
sobre la base de datos. Es el objeto primario de ADO, ninguno de los otros objetos
puede existir si éste no es declarado de forma explicita o implícita. La conexión
terminará cuando nosotros la cerremos explícitamente con el método close o bien
cuando termine la ejecución de la página ASP.

• Error: Es una colección en la que se almacenaran los posibles errores del objeto

• Command: Representa un comando SQL que se ejecuta contra la base de datos


declarada en el objeto Connection. Si el resultado de ese comando es un conjunto
de datos, estos se almacenarán en un objeto de tipo Recordset.

• Recordset: Representa una tabla o el resultado de una consulta ejecutada contra


la base de datos. Va a ser nuestro interfaz natural contra la base de datos. Como
en todo modelo relacional, los datos se nos presentaran en filas y columnas.

• Field: El objeto Field representa la información relativa a un campo de un


Recordset. Contiene la colección Fields que representa todos los campos de la
tabla, cada miembro de esa colección es un objeto de tipo Field.

• Parameter: Es un parámetro para ser usado en un objeto command.

• Property: Características de un objeto.

Podemos ver la siguiente figura, en la que se muestra la relación entre estos componentes:

39
Como se puede observar en la figura hay tres objetos que se diferencian del resto, es decir, los
objetos: Connection, Command y Recordset. Estos objetos son los principales dentro de ADO,
y se pueden crear fuera de la jerarquía de la figura, y se pueden manejar sin tener que
interactuar con un intermediario. Estos tres objetos se crearán mediante el método
CreateObject del objeto Server, al igual que hacíamos con el resto de los componentes de
servidor, el resto de los objetos de ADO se crean a partir de estos tres.

Objeto Connection (propiedades y métodos)


Hemos comentado que el objeto Connection nos proporciona una conexión a una base de
datos desde una página ASP; ahora vamos a ver como se usa , así como sus propiedades y
métodos.

Para establecer la conexión lo primero que hacemos es crear el Objeto Connection por medio
de la propiedad CreateObject de objeto Server:
<% Set conexion=Server.CreateObject("ADODB.Connection")%>

Una vez establecida la instancia del objeto pasamos a configurarlo mediante sus distintas
propiedades y métodos.

Propiedades

ConnectionString

Especifica la referencia a la base de datos con la cual queremos conectar, conteniendo en una
cadena de texto la información necesaria para efectuar esa conexión mediante parejas de
valores separadas por " ; ".

Los valores que podemos asignar son:

• Data Source: DSN=Nombre ODBC de la Base de Datos


• Usuario: UID=Nombre de Usuario
• Password: PWD=Password del usuario para la base de datos

Ejemplo:
<% conexion.ConnectionString="DSN=MIOdbc;UID=luis;PWD=1234" %>

Mode

Especifica los permisos de la conexión.

Algunos de los valores mas habituales que podemos asignar son:

1 Establece permiso sólo de Lectura


2 Establece permiso sólo de Escritura
3 Establece permiso de Lectura/Escritura

Ejemplo: <% conexion.Mode=3 %>

Metodos

Open

Abre la conexión con los parámetros especificados en las propiedades: <%conexion.open%>

Close

Cierra el objeto: <% conexion.close %>

40
BeginTrans

Abre una transacción; todas las operaciones que realicemos a partir de ese momento no serán
efectivas hasta que no cerremos la transacción: <% conexion.BeginTrans %>

CommitTrans

Cierra una transacción haciendo efectivos los cambios efectuados dentro de ella:
<% conexion.CommitBeginTrans %>

RollBackTrans

Deshace todos los cambios efectuados en la base de datos desde el inicio de la transacción.
<% conexion.RollBackTrans %>

Execute

Ejecuta una sentencia SQL contra la base de datos.


<% Set resultado=conexion.execute (“Select * from Tabla”) %>

Objeto Error (propiedades y métodos)


El objeto Error contiene la colección Errors, que es la encargada de almacenar los errores que
se pudieran producir durante la ejecución de operaciones contra Bases de Datos.

Propiedades

Count

Cantidad de errores

Description

Descripción del error.

Number

El numero de error.

SQLState

Código de error SQL.

Metodos

Clear

Elimina los datos del objeto Error.

Ejemplo:

Examinamos los posibles datos de la colección Errors


.......
.......
Miconexion.open
If Miconexion.Errors.Count > 0 then
For each error in Miconexion.errors then
Response.write Error.Number & " = " & Error.Description
Next
End if

41
Objeto RecordSet
El objeto Recordset es el interfaz entre los datos obtenidos de nuestras consultas sobre las
tablas y nuestras páginas asp. Representa una tabla organizada en filas (registros) y columnas
(campos).

La propiedades y métodos de Recordset son muchos, en este capitulo vamos a ver los mas
interesantes, para hacerlo un poco mas sencillo de entender vamos a verlos agrupados por la
funcionalidad que nos ofrecen.

Definición del tipo de Cursor


Entendemos como cursor el puntero que nos permite desplazarnos por los registros del
Recordset. Dependiendo del tipo elegido determinaremos los desplazamientos y cambios
realizables en los datos.

El tipo de cursor lo definiremos mediante la propiedad CursorType, los posibles valores son:

Denominación Valor Características


Es el cursor por defecto, sólo nos permite recorrer la tabla
de forma secuencial (no se puede volver hacia atrás) y no
adOpenForwardOnly 0 permite modificaciones en los registros. Por contra es el
de menos consumo. No vemos los cambios realizados en
la tabla por otro Recordset.
Nos permite movernos en los dos sentidos, si permite
modificaciones en los registros. Vemos los cambios
adOpenKeyset 1
realizados en la tabla por otro Recordset a excepción de
las nuevas altas.
Nos permite movernos en los dos sentidos, si permite
adOpenDynamic 2 modificaciones en los registros. Vemos Todos los
cambios realizados en la tabla por otro Recordset.
Nos permite movernos en los dos sentidos, no permite
adOpenStatic 3 modificaciones en los registros. No vemos los cambios
realizados en la tabla por otro Recordset.

Definición del tipo de Cerrojo


Entendemos como cerrojo el tipo de bloqueo que efectuaremos en la base de datos cuando
modifiquemos un Recordset, a fin de evitar que dos o mas usuarios accedan a modificar un
mismo registro a la vez.

El tipo de cerrojo lo definiremos mediante la propiedad LockType, los posibles valores son:

Denominación Valor Características


adLockReadOnly 1 Por defecto, no permite al usuario modificar los datos de la tabla.
Cuando se abra la tabla nadie mas podrá hacerlo, este modo nos
adLockPessimistic 2
asegura la plena integridad de los datos.
Cierra la tabla a los demás usuarios cuando se invoque al método
adLockOptimistic 3 Update del objeto Recordset, de este modo la Base de datos
quedará bloqueada menos tiempo que con el método anterior.

Moviéndose por los datos del Recordset


Método Características
Move N Mueve el cursor N hacia abajo si es positivo y hacia arriba si es negativo
MoveFirst Mueve el cursor al primer registro del Recordset
MoveLast Mueve el cursor al ultimo registro del Recordset
MoveNext Mueve el cursor un registro hacia adelante
MovePrevious Mueve el cursor un registro hacia atrás

42
Propiedades Características
PageSize Establece el numero de registros por página del Recordset
Mueve el cursor al primer registro de dicha página
AbsolutePage
(es necesario definir anteriormente el PageSize)
Contiene el numero de páginas del Recordset, tomando como base
PageCount
PageSize
AbsolutePosition Mueve el cursor al número de registro especificado
Contiene el numero de registros del Recordset
RecordCount
(No funciona con el cursor adOpenForwardOnly RecordCount).
BOF Toma el valor True cuando estamos en el primer registro del Recordset
EOF Toma el valor True cuando estamos en el ultimo registro del Recordset

Modificando los datos

Método Características
AddNew Abre un nuevo registro en el Recordset para introducir datos
Delete Elimina el registro actual
Update Actualiza un registro del Recordset tras haberlo modificado

Abriendo y cerrando el Recordset

Método Características
Abre el Recordset y almacena en el resultado de sql contra la
Open Sql, conexion
conexion
Close Cierra el Recordset

Ejemplo de listado de un Recordset:

<%
SQLtxt = "SELECT Producto, Cantidad, Precio FROM almacen”
Set rs = CreateObject("ADODB.Recordset")
rs.Open SQLtxt, "DSN=Mibase"
%>
<table>
<%
Do While NOT rs.EOF
%>
<tr>
<td><% = rs("Producto")%></td>
<td><% = rs("Cantidad")%></td>
<td align="right"><% = FormatCurrency(rs("Precio"))%></td>
</tr>
<%
rs.MoveNext
Loop
rs.Close
</table>
%>

43
Ejemplos de Operaciones Básicas

Establecer conexión

<%
'Creamos el objeto conexión
Set Conexion = Server.CreateObject("ADODB.Connection")

'Abrimos la BD donde realizaremos las operaciones


Conexion.Open "Mibase"
%>

Consulta

<%
'Creamos la sentencia SQL que ejecutaremos en la BD
sSQL="Select * From Clientes Order By nombre"

'Ejecutamos la orden
Set RS = Conexion.Execute(sSQL)
%>
Inserción

<%
'Ahora creamos la sentencia SQL
sSQL="Insert Into Clientes (nombre,telefono) values
('" & nombre & "','" & telefono & "')"

'Ejecutamos la orden
set RS = Conexion.Execute(sSQL)
%>

Borrado

<%
'Ahora creamos la sentencia SQL
sSQL="Delete From Clientes Where nombre='" & nombre & "'"

'Ejecutamos la orden
set RS = Conexion.Execute(sSQL)
%>
Actualización

<%
'Ahora creamos la sentencia SQL
sSQL="Update Clientes Set telefono='" & telefono & "'
Where nombre='" & nombre & "'"

'Ejecutamos la orden
set RS = Conexion.Execute(sSQL)
%>
Cerrar Conexión

<%
'Cerramos la conexión
Conexion.Close
%>

44
Ejemplo de Lectura de una Tabla con una BD Access
<%
Dim BDD ' variable que se encargara de la base de datos
Dim TABLA ' variable que se encarga de la tabla

'creamos los objetos que manejan la base de datos y la tabla


Set BDD = Server.CreateObject("ADODB.Connection")
Set TABLA = Server.CreateObject("ADODB.Recordset")

'abrimos la base de datos


BDD.Open("PROVIDER=Microsoft.Jet.OLEDB.4.0;
DATASOURCE="+ Server.MapPath("temas.mdb"))
'abrimos la tabla
TABLA.Open "TemasMusicales", BDD

' indicamos el nombre de la tabla y la base de datos


' ahora recorremos toda la tabla y mostramoslos datos
While NOT TABLA.EOF
'recorre la tabla hasta que EOF sea verdadero
Response.Write "titulo:" & TABLA("Titulo") & "<br>"
Response.Write "genero:" & TABLA("Genero") & "<br>"
Wend

'cerramos todo y liberamos los objetos TABLA.Close BDD.Close


Set BDD = Nothing
Set TABLA = Nothing
%>

Si queremos conectarnos a Access en vez de a través de OLE DB como en el caso anterior, a


través de una cadena simple de conexión, la apertura se realizaría:

<%
'abrimos la base de datos
BDD.Open ("DRIVER=<Microsoft Access Driver (*.mdb)>;
DBQ=" + Server.MapPath("temas.mdb"))
%>

Conexión con SQL Server


El ejemplo anterior se realizaría exactamente de la misma forma si la BD elegida hubiese sido
SQL Server en lugar de Access, con la salvedad de la cadena de parámetros para la conexión
con la BD. Veamos como se haría en este caso.

A través de OLE DB

<%
'abrimos la base de datos
BDD.Open
("PROVIDER=SQLOLEDB;UID=;PWD=;DATABASE=Temas;SERVER=MiServer")
%>

Con cadena de conexión

<%
'abrimos la base de datos
BDD.Open
("DRIVER=<SQLServer>;SERVER=MiServer;UID=;PWD=;DATABASE=Temas;")
%>

45
Ejemplo de uso de ASP+ADO
A continuación vamos a presentar varios ejemplos de uso de ASP para acceder a bases de
datos. El primero de ellos va a acceder a una simple tabla en Access. Creamos un origen de
bases de datos hasta donde se encuentre el archivo de base de datos biblioteca.mdb, luego
abrimos el archivo fconsu.html en el navegador y ejecutamos alguna consulta.

fconsu.html

<html>
<head><title>Formulario para consulta sencilla</title></head>
<body>
<h3 align="center">Ejemplo de consulta sencilla</h3>
<form method="POST" action="consultasencilla.asp">
<table border="1" width="100%">
<tr>
<td width="16%">Titulo:</td>
<td width="84%"><input type="text"
name="titulo" size="55"></td>
</tr>
<tr>
<td width="16%">
<input type="submit" value="Enviar" name="B1"></td>
<td width="84%">
<input type="reset" value="Restablecer" name="B2">
</td>
</tr>
</table>
</form>
</body>
</html>

consultasencilla.asp

<html>
<head><title>Ejemplo de consulta sencilla</title></head>
<body bgcolor="#808000">
<center>
<table border="1" width="62%" bgcolor="#008000">
<tr>
<td width="100%">
<p align="center">
<font color="#FFFFFF">Resultados de su consulta</font>
</td>
</tr>
</table>
</center>
<%
ctitulo = request.form("titulo")
set rs = createobject("ADODB.Recordset")
sqltxt = "select titulo,autor
from libros where titulo like '%"&ctitulo&"%'"
rs.open sqltxt,"DSN=biblioteca"
%>

46
<%
if rs.eof then
%>
<h3 align="center">
<font color="#FF0000">No hay datos ...
</font>
</h3>
<%
else
%>
<table border="0" width="100%">
<tr>
<th width="33%" valign="middle"
align="center" bgcolor="#008080">
<font color="#000000">Titulo</font></th>
<th width="33%" valign="middle"
align="center" bgcolor="#008080">
<font color="#000000">Autor</font></th>
</tr>
<%
do while not rs.eof
%>
<tr>
<td width="33%" valign="middle"
align="center" bgcolor="#FFFFFF">
<font color="#000000"><%=rs("Titulo")%></font></td>
<td width="33%" valign="middle"
align="center" bgcolor="#FFFFFF">
<font color="#000000"><%=rs("Autor")%></font></td>
</tr>
<%
rs.movenext
loop
rs.close
end if
%>
</table>
<p align="center"><a href="fconsu.html">Otra vez</a></p>
</body>
</html>

47

También podría gustarte