Primeros pasos en ASP
Aplicaciones ASP
Una aplicación ASP, se entiende como un conjunto de instrucciones que realizan una función determinada. Más o menos compleja, más o menos detallada, más o menos registrada en unidades no volátiles, o en memoria volátil.
Las unidades no volátiles, mantienen el contenido una vez el sistema principal se reinicia. Son por ejemplo las unidades de disco.
Las unidades volátiles como la RAM, pierden el contenido de la información almacenada cuando el servidor se reinicia.
Una aplicación ASP funciona en el servidor. Accede a la memoria del servidor y utiliza lo recursos de un servidor. A la hora de programar, se deben hacer el mínimo número de consultas, accesos a memoria y en general, procesar la mínima cantidad de datos posible, ya que en un servidor generalmente el uso del mismo está compartido tanto con otros usuarios, como con otras aplicaciones.
Una aplicación ASP no puede acceder a la memoria de un cliente, ni a los recursos de un cliente, como fotos locales o datos locales, ni hacer funcionar código en su sistema. Todos los datos que obtenemos de un servidor web, son referidos al servidor web. Por ejemplo, si un servidor web nos dice que la hora es 16:44:43 es porque en la zona del servidor, son las 16:44:43, salvo que nos diga, accediendo a información adicional, que la hora local es 16:44:43.
La aplicación ASP, se inicia cuando el primer cliente accede al servidor, y termina cuando el último cliente abandona el servidor.
Dispone de objetos, como en otros lenguajes de programación. Uno de ellos es el objeto application. En el podemos almacenar variables que funcionan para cada servicio web específico. Por lo tanto, si tenemos dos servicios web funcionando en el mismo servidor, cada servidor web contará con su objeto application, y sus variables almacenadas dentro de él.
Una aplicación ASP puede dar como resultado:
-
Un código html para mostrar en el navegador del cliente.
-
Una función determinada, como tratamiento de datos o análisis de los mismos sin ser mostrada en pantallas o interfaces, como añadir datos a un fichero, o a una base de datos.
Cuando enviamos código html al cliente, hay que partir de que html es un estándar con versiones y revisiones. Hay etiquetas que conforme a las publicaciones de los/las programadores/as se dejan de emplear, porque los denominan como “obsoletos” y si bien funcionan en los navegadores, las decisiones corresponden a guías de estilo y metodologías que son convencionalismos empleados por los y las profesionales del desarrollo web para mantener un código lo más uniforme posible.
Si vas a programas aplicaciones en ASP, es conveniente que estés al tanto de las novedades que hacen los expertos en el ámbito html y asuntos relacionados.
Hay detalles que en cada navegador se interpretan de diferente manera, si bien, gran parte de los códigos son internacionales. Hay páginas que te explican muy en detalle, que etiquetas funcionan en cada navegador.
Para estos apuntes, podemos emplear dos o tres navegadores distintos para ver las diferencias que nos ayuden a elaborar un código bueno para todos ellos.
Como proyecto fin de capítulo, vamos a crear una página que cuente cuantas veces ha sido visitada tanto en términos absolutos, como en términos relativos, indicando estadísticas de los diferentes clientes que la han visitado. Es decir, cuantas veces en total ha sido visitada, y cuantas veces ha sido visitada por cada usuario o navegador. En sucesivos capítulos, podremos saber cuantos visitantes diferentes ha tenido la página, para lo cual nos hace falta conocer la IP del ordenador o un objeto llamado cookie que se almacena en el cliente y nos permite saber si el navegador ya ha visitado dichas páginas.
URL
Una url es la dirección de un recurso. Como un servicio, una imagen, o un fichero. De tal modo que “http://servidor/web/imagenes/imagen.png” es la url de la imagen indicada.http://web.com es la url de un servicio web corriendo en una máquina de la cual con esta información no tenemos más datos, pero que los podemos obtener.
Debe existir una imagen en el servidor, dentro de la carpeta root:\\web\imagenes\ con dicho nombre, para que la imagen pueda ser mostrada.
Una fallo clásico de una persona que se está iniciando en el mundo del html es realizar las pruebas con direcciones locales, para lo cual insertan como url C:\Archivos de Programa\Web\imagenes\imagen.png de su máquina local.
Luego sube la página al servidor, y verifica que está todo correcto. Ciertamente, al hacer las pruebas, el url de la imagen es C:\Archivos de Programa\Web\imagenes\imagen.png
Pero al visualizar la página desde otro terminal, la imagen se muestra como un cuadrado sin contenido. La razón, es que hemos empleado un identificador de recursos local.
La imagen para que sea visualizada por todos los que acceden al sitio web, debe estar alojada dentro del servidor web, o en algún servidor web con acceso para todos los usuarios de dicho sistema. Si nuestra aplicación web corre dentro de un entorno corporativo, y se trata de una red, pero basada en un sistema local, podemos hacer que la url sea el nombre local de la máquina o la IP de la máquina que corre el servicio. Pero si tenemos un entorno web con acceso público, lo que tenemos que insertar es un url completo, es decir, un identificador de recurso que sea accesible por cualquier usuario desde cualquier parte del mundo.
Hay varios métodos que se emplean a diario en este aspecto.
Uno es emplear la dirección de recursos de otros.
Ejemplo. Vemos una imagen que nos parece acorde con nuestro contenido. Con buena voluntad, y pensando que hacemos un favor al autor original, añadimos en nuestra página la url de la imagen original. Vamos al código fuente de la página, buscamos el url de la imagen y lo copiamos a nuestro desarrollo.
Esta solución, no corresponde con ningún contenido de buenas prácticas en programación, por varias razones.
El propietario/a del copyright del recurso es el autor o autora de la web original o en su caso, el propietario o propietaria del recurso original, por lo tanto es el/la único/a capaz de difundirla, por lo que cualquier ayuda a su difusión debe ser acordada con dicha persona o entidad.
Además, en caso de cambiar la ubicación o el nombre del recurso original, perdemos la posibilidad de seguirlo mostrando en nuestro sitio, y saldría como un cuadrado gris sin el contenido correcto.
Esta solución, tiene además, connotaciones técnicas importantes.
Esta estructura de contenidos remotos, hará trabajar al servidor remoto siempre que nuestro servidor tenga una petición.
En un límite, el servidor remoto se podría colapsar, incluso sin recibir ninguna petición de página, al recibir numerosas peticiones de dicha imagen.
En un entorno industrial, una web es un producto completo y una imagen dentro de la web es un componente. Si una empresa se dedica a fabricar máquinas completas y sus clientes comienzan a pedirle arandelas, todo el knowhow de como hacer las máquinas lo pierde.
Por esta razón, debemos utilizar nuestros propios contenidos, imágenes y documentos.
Cuando queramos publicitar el contenido de otros, lo mejor es apuntar con un enlace a su contenido completo, lo cual a día de hoy es ético y estructuralmente correcto.
Otro método, como hemos comentado, es solicitar al/la autor/a el empleo de dicho recurso, y con una autorización escrita, publicarlo en nuestro sitio, empleando nuestros propios recursos, es decir, nuestro servidor, y más exactamente, nuestro servicio web, con nuestro espacio de disco, memoria y procesador.
Enlaces
Los enlaces a otros sitios, son básicamente la url de dicho sitio o recurso y nos permiten acceder a otros contenidos y entre todos, forman el concepto web, que es un término anglosajón que significa red o tela de araña. El concepto es que todos los recursos estén identificados y sean accesibles desde otros recursos para permitir un acceso global a la red. Si disponemos de un recurso, pero no está identificado, entonces , salvo que le des a otra persona la dirección, será difícil que sea accesible por todos de manera natural.
En los buscadores , en inglés “Search Engines” hay herramientas que documentan el contenido de la web y lo hacen accesible para todos a partir de criterios de búsqueda
Page Rank
Page Rank o ubicación en buscadores, es un método que emplean los buscadores para ubicar antes o después, páginas con el mismo contenido.
En sus orígenes, Google utilizaba un criterio de menciones para ubicar más arriba o más abajo las páginas web. De esta manera, cuantas más páginas webs, citaban tus contenidos, más arriba estaba tu page rank, como símbolo de que tu contenido servía como fuente para muchas otras páginas y/o desarrollos.
Fuentes primarias
El concepto de citar las fuentes se ha perdido de manera muy amplia en la web, lo cual conlleva serios riesgos para la integridad de la información. Numerosas páginas que indican cifras o textos, sin indicar la fuente, da como resultado una multiplicidad de resultados. Si buscamos en un buscador la densidad del acero, encontraremos varios valores, y en una diversidad de unidades. kg/cm3, T/m3, lbs/sqi , por lo que siempre que podamos, citaremos nuestras fuentes para que quien quiera investigar sobre el tema, disponga de fuentes primarias. Si todas las webs, apuntan a una fuente primaria, esa fuente primaria se puede revisar y adaptar a diferentes tipos de unidades, clasificaciones y otros métodos que hacen que el resultado sea mejor.
Si empleamos fuentes y no las citamos, no existirá un concepto que en industria y en general en desarrollo se denomina “trazabilidad” que es la capacidad de evaluar cada paso, sus métodos y resultados, así como conceptos como orígenes de materiales y fuentes, en un proceso que consta de varios pasos y diversidad o unicidad de orígenes.
Código Fuente
Una página web tiene dos aspectos. El aspecto mostrado al cliente, que es el aspecto que se muestra en la pantalla del navegador, y el aspecto de trabajo, o lo que llamamos código fuente. El código fuente es visible desde los navegadores a través de los menús contextuales o en las herramientas del navegador. Nos permite ver qué etiquetas hemos enviado o ha recibido el cliente, de la misma manera que visualizar los contenidos, como textos, cifras, url’s de imágenes o url’s de otros servicios web, lo que llamamos comúnmente “enlaces” a otros sitios. En estos apuntes vamos a trabajar con el código fuente, para tratar de mostrarlo de la mejor manera posible en la pantalla del navegador.
Creación de un programa en ASP.
Los programas en ASP se crean en ficheros de texto, con extension .asp.
Los navegadores generalmente y salvo que se les indique otra configuración, atienden al fichero default.asp de un directorio raíz. De esta manera, los ficheros default son necesarios si solamente indicamos un directorio.
Si indicamos un directorio con un fichero, por ejemplo http://localhost/prueba.asp, podremos visualizar lo que contiene el fichero prueba. Si solamente indicamos http://localhost, lo que nos mostrará es el fichero default.asp de dicha carpeta. Si no hay fichero default.asp, dará un error y mostrará un mensaje en el navegador del cliente.
Instrucciones
En ASP, los comandos o instrucciones van entre los símbolos <% comando o instrucción %>. Cualquier texto contenido dentro de los símbolos, no es enviado al navegador del cliente, sino que se elabora y prepara en el servidor.
Si por ejemplo, tenemos el siguiente código
<%visitas=1000%>
<%visitas=visitas+1%>
<%response.write(“visitas”)%>
Lo que obtenemos en el navegador es una cifra entera, en particular el número 1001.
Si visualizamos el código fuente, no veremos ni la variable visitas, ni response.write, sino solamente la cifra 1001.
Si creamos un fichero de texto y damos a guardar como, default.asp, dentro del directorio raíz del servicio web localhost, podremos visualizar el contenido de dicho fichero al abrir la url http://localhost
Ejemplo.
<!DOCTYPE html>
<HTML>
<BODY>
<center>Hola Mundo</center>
</BODY>
</HTML>
Ese fichero, da como resultado la pantalla
Si empleamos código ASP, el resultado es el siguiente.
<!DOCTYPE html>
<HTML>
<BODY>
<%mensaje="Hola Mundo ASP son las " & time()%>
<CENTER><%response.write(mensaje)%></CENTER>
</BODY>
</HTML>
Si has hecho el ejercicio, notarás que el reloj está detenido en el momento en el que la instrucción
<%mensaje="Hola Mundo ASP son las " & time()%> llamó a la función time(), que devuelve la hora, minuto y segundo del tiempo del servidor.
Variables en ASP
En ASP se pueden definir variables. Dependiendo de su ambito, pueden permanecer un carga, es decir, en una solicitud de una página, o durante la permanencia de un usuario en un servidor web.
Para definirlas empleamos el método
Dim a , b para definir las variable a y b.
a=1000
b=a
response.write(b)
El resultado de esta operación es la cifra 1000 en la pantalla.
Estructura del código
El código en computación general, se lee de izquierda a derecha y de arriba a abajo.
Se emplean caracteres que no tienen otra función que hacer más legible el contenido.
Retornos de carro, Tabulaciones, espacios en blanco.
Una página web original html en sus orígenes solo podía mostrar los caracteres según los iba leyendo.
A día de hoy, con las capas y las estructuras de bloques, podemos mostrar textos en la posición que necesitemos.
En general, el código ASP se lee de manera secuencial, para lo cual debemos organizar los códigos para que se traten de manera secuencial.
El código se apoya en la tabulación, que permite crear estructuras como indicamos a continuación
<div class=”a”>
<div class=b”>
<div class=”c”>Contenido 1</div>
<div class=”c”>Contenido 2</div>
<div class=”c”>Contenido 3</div>
</div>
<div class=b”>
<div class=”c”>Contenido 4</div>
<div class=”c”>Contenido 5</div>
<div class=”c”>Contenido 6</div>
</div>
</div>
Con la apropiada asignación de clases en CSS, obtenemos en pantalla una matriz de tres columnas y dos filas con los textos indicados.
El concepto para este punto son las tabulaciones y los retornos de carro. Organizamos el código para que pueda ser leído fácilmente, incluso después de compilado y mostrado. Se añaden miles y miles de tabulaciones y retornos de carro para permitir saber por ejemplo que </div> corresponde a cada <div> De esta manera, los cierres están debajo de cada apertura. Misma situación con otras estructuras como condiciones IF ELSE y bucles FOR/WHILE que veremos en siguientes puntos.
Hay webs que llevan al límite la eficiencia, y no solo eliminan las tabulaciones sino que también eliminan los retornos de carro y los espacios en blanco entre etiquetas consecutivas, que para el navegador son caracteres sin significado. De esta manera, representan en una única línea, todos los caracteres de una página web completa.
<HTML><BODY><p class=”txt”>Contenido</p></BODY></HTML>
Con este mecanismo consiguen ahorrar datos en el envío al cliente, minimizando ancho de banda y por lo tanto empleando menos recursos del sistema en términos generales.
Comentarios
ASP resulta de la unión de html y Visual Basic. Html tiene sus propios métodos para comentar código, de la misma manera que Vbasic tiene sus métodos para comentar código.
En html, los comentarios van entre los símbolos <!-- comentario – >. Los comentarios en html, no se muestran al cliente en la pantalla, pero llegan al navegador, por lo que un usuario avanzado puede visualizarlos. Cualquier comentario interno no debe ser llevado a la capa de html para evitar su visualización por parte de los clientes.
En ASP los comentarios no llegan al cliente.
Son instrucciones internas para el la programadora que nos permiten realizar un seguimiento de las variables en tiempo de depuración. Para ello empleamos el símbolo <%’ línea comentada %>
Sirve tanto para crear comentarios, como par anular la función en casos de depuración.
Cuando depuramos una aplicación, introducimos acciones adicionales para conocer el estado de las variables, es decir sus valores o contenidos. En esa etapa podemos emplear lineas comentadas. Una vez subimos el texto final al servidor publico, las líneas de depuración se retiran para minimizar el espacio en disco, y por lo tanto el ancho de banda que emplea la aplicación.
El símbolo ‘ dentro de una línea de código, implica que toda la línea está comentada.
Atención a las líneas. Algunos editores de texto, emplean el método de mostrar las líneas largas en varias líneas. Si comentas una línea en un editor que tiene una configuración así, estarás comentando todas las líneas hasta el siguiente retorno de carro.
Ejemplo.
En este código, la función IF ELSE permite saber si ciertas variables tienen unos valores u otros, mostrando la cifra “1” en caso afirmativo.
Como vemos, la línea 4 está quebrada, por lo que una parte se muestra en la línea 4 y otra parte se muestra aparentando ser la línea 5, pero es la línea 4.
Si ampliamos la ventana del editor, vemos lo que ocurre.
De esta manera, si comentamos la línea 4, todo su contenido no se gestiona en el servidor.
Si nuestro editor de texto dispone de la opción de quebrar líneas o partir líneas o algo semejante, podemos activarlo o desactivarlo, pero las líneas de código van a ser lo que el servidor lee entre el inicio de línea y el siguiente retorno de carro. El retorno de carro es un carácter invisible que el editor introduce al pulsar la tecla Enter o Intro, cuando vas escribiendo.
Condiciones de contorno. Estructuras IF ELSE
Las condiciones de contorno son evaluaciones que hace el programa de las variables que se le presentan. De esta manera, podemos evaluar situaciones como las siguientes:
<%IF a=1 THEN%>
<%b=2%>
<%END IF%>
Esta estructura aplica el valor 2 a la variable b si la variable a vale 1.
<%IF a=1 THEN%>
<%b=2%>
<%ELSE%>
<%b=3%>
<%END IF
Esta estructura aplica el valor 2 a la variable b si la variable a vale 1 y aplica el valor 3 si la variable a no vale 1.
Si lo que necesitamos es aplicar el valor 3 si la variable a vale 3, entonces podemos proceder de esta manera:
<%IF a=1 THEN%>
<%b=2%>
<%ELSE%>
<%IF a=3 THEN%>
<%b=3%>
<%END IF%>
<%END IF%>
La razón de emplear constantemente los símbolos <% y %> es porque en una implementacion real, va a estar mezclado el contenido html con el contenido asp, por lo que otra solución será esta:
<%
IF a=1 THEN
b=2
ELSE
IF a=3 THEN
b=3
END IF
END IF
%>
Con un único inicio y fin de código ASP para ese bloque de instrucciones. De esta manera, todo el contenido entre los símbolos de código, es código.
De esta manera se eliminan 24 caracteres del cómputo general de la página, sin embargo podría ser más difícil hacer un seguimiento de las zonas ASP y las zonas html del fichero.
Otro ejemplo. IF ELSE con textos.
<%
a=request(“a”)
b=request(“b”)
if a>b then
mensaje=”A es mayor que B”
else
if a=b then
mensaje=”A es igual a B”
else
if a<b then
mensaje=”A es menor que B”
end if
end if
end if
%>
<HTML>
<BODY>
<CENTER><%=mensaje%></CENTER>
</BODY>
</HTML>
Como se aprecia, una parte del código está antes del inicio del HTML, lo cual no es apreciable desde el punto de vista del cliente, ya que el cliente solo recibe <HTML> como incio del fichero y lee la frase contenida en la variable “mensaje”.
En esta versión, hemos empleado el signo = para sustituir a la función response.write. En html así como en ASP, el espacio en disco y los datos transmitidos son un bien muy preciado. Si una función, como response.write se puede reemplazar por otra función que es el signo “=”, es algo a tener en cuenta para los miles de millones de webs que se alojan a diario en el mundo.
Esta página recibe dos valores a y b, los compara y resuelve la relación entre ambos valores, mayor, menor o igual.
La recepción de los valores, se puede realizar de varias maneras. 7
Una de ellas es mediante el url.
La url
“http://servidor/web/prueba.asp?a=5&b=2”
envía los valores a=5 y b=2 a la página anteriormente mostrada.
Por lo tanto,podemos añadir un enlace con dicha url que transmita los valores a variables en servidores remotos, incluso ajenos a nuestro servicio.
Formularios
Los formularios son una manera de organizar la información para ser enviada a un servidor.
Un formulario nos permite enviar datos a variables ASP de manera invisible, de manera semi oculta, o de manera visible.
La manera invisible, es crear en el formulario una variable de sesión
El fichero “origen.asp” y “destino.asp” deben estar en la misma carpeta para este ejemplo.
En sucesivas versiones podemos poner el origen y el destino en carpetas separadas, incluso en servicios separados, e incluso en servidores separados.
###Inicio del fichero “origen.asp”
<%
session(“a”)=5
session(“b”)=2
%>
<HTML>
<BODY>
<FORM ACTION=”destino.asp” METHOD=POST>
<INPUT TYPE=SUBMIT VALUE=”Enviar”><INPUT>
</FORM>
</BODY>
</HTML>
### Fin del fichero
En recepción, mostramos a continuación como se leerían las variables, las cuales se pasan a variables locales y se realizan las operaciones pertinentes.
###Inicio del fichero “destino.asp”
<%
a=session(”a”)
b=session(“b”)
if a>b then
mensaje=”A es mayor que B”
else
if a=b then
mensaje=”A es igual a B”
else
if a<b then
mensaje=”A es menor que B”
end if
end if
end if
%>
<HTML>
<BODY>
<CENTER><%=mensaje%></CENTER>
</BODY>
</HTML>
###Fin del fichero
Esta manera es completamente invisible tanto para usuarios estándar como para usuarios avanzados, ya que las variables se encuentran en el servidor, el cual no es accesible por mecanismos convencionales.
La manera semi-oculta es empleando la opcion method=POST
Si las variables no son confidenciales, podemos guardarlas en un campo hidden del formulario.
<FORM ACTION=”destino.asp” METHOD=POST>
<INPUT type=hidden name=a value=”5”></INPUT>
<INPUT type=hidden name=b value=”2”></INPUT>
<INPUT TYPE=SUBMIT VALUE=”Enviar”><INPUT>
</FORM>
En este formulario las variables a y b se transmiten a la página de manera oculta para el usuario estándar, ya que un usuario avanzado podrá visualizar el código fuente incluso manipularlo a su criterio.
Método accesible y visible.
<HTML>
<BODY>
<FORM ACTION=”destino.asp” METHOD=POST>
<INPUT type=TEXT class=”textbox” name=a value=”5”></INPUT>
<INPUT type=TEXT class=”textbox” name=b value=”2”></INPUT>
<INPUT TYPE=SUBMIT VALUE=”Enviar”><INPUT>
</FORM>
</BODY>
</HTML>
Si añadimos la etiqueta DISABLED a cada TEXT, conseguiremos que los campos no sean modificables por el usuario, quedando en gris y sin posibilidad de hacer click.
<HTML>
<BODY>
<FORM ACTION=”destino.asp” METHOD=POST>
<INPUT type=TEXT DISABLED class=”textbox” name=a value=”5”></INPUT>
<INPUT type=TEXT DISABLED class=”textbox” name=b value=”2”></INPUT>
<INPUT TYPE=SUBMIT VALUE=”Enviar”><INPUT>
</FORM>
</BODY>
</HTML>
En un documento de CSS podemos añadir las caractrerísticas que necesitemos de los textbox.
Un método de envío, que además es visible por la url, es el siguiente
<HTML>
<BODY>
<FORM ACTION=”destino.asp”>
<INPUT type=TEXT DISABLED class=”textbox” name=a value=”5”></INPUT>
<INPUT type=TEXT DISABLED class=”textbox” name=b value=”2”></INPUT>
<INPUT TYPE=SUBMIT VALUE=”Enviar”><INPUT>
</FORM>
</BODY>
</HTML>
Retirando el METHOD=POST lo que conseguimos es llamar al fichero “destino.asp” por la Url, mostrando lo siguiente en la ventana de recepción
http://servidor/web/formulario/destino.asp?a=5&b=2
Finalmente, el método más clásico para un formulario, es que el usuario pueda introducir los datos que se van a elaborar.
<HTML>
<BODY>
<FORM ACTION=”destino.asp”>
<INPUT type=TEXT class=”textbox” name=a value=”5”></INPUT>
<INPUT type=TEXT class=”textbox” name=b value=”2”></INPUT>
<INPUT TYPE=SUBMIT VALUE=”Enviar”><INPUT>
</FORM>
</BODY>
</HTML>
BUCLES
Los bucles son estructuras que permiten recorridos, es decir, darle a una o varias variables valores diferentes, para acceder a posiciones distintas en una misma página.
FOR NEXT
Si disponemos de una tabla con 1000 valores, definida originalmente como Dim tabla(1000), y nos encargan representarla, podemos hacer una estructura como sigue:
En Vbasic, generalmente las tablas disponen de posición 0 hasta la n-1, siendo n el número de posiciones en total.
<%Dim tabla(1000)%>
<%
for a=0 to 999
tabla(a)=(a*a)
next
%>
<HTML>
<BODY>
<%
for a=0 to 999
%>
<div><p class=”txt”><%=tabla(a)%></p></div>
<%next%>
</BODY>
</HTML>
En este ejemplo se aprecia la complejidad de trabajar con dos lenguajes simultáneamente,Vbasic y html.
Si la tabla es bidimensional Dim tabla(100,50), podemos proceder de la siguiente manera.
<%Dim tabla(100,50)%>
<%
for a=0 to 99
for b=0 to 49
tabla(a,b)=(a*b)
next
next
%>
<HTML>
<BODY>
<%
for a=0 to 99
for b=0 to 49
%>
<div><p class=”txt”>Posición <%=a%>,<%=b%>:<%=tabla(a,b)%></p></div>
<%next
next%>
</BODY>
</HTML>
Dando como resultado una columna con 5000 filas mostrando las variables a, b y el contenido de la posición que es el producto de a*b.
Si tenemos una tabla tridimensional, de 10 filas, 5 columnas y 20 niveles,
<%Dim tabla(10,5,20)%>
<%
for a=0 to 9
for b=0 to 4
for c=0 to 19
tabla(a,b,c)=(a*b*c)
next
next
next
%>
<HTML>
<BODY>
<%
for a=0 to 9
for b=0 to 4
for c=0 to 19
%>
<div><p class=”txt”>Posición <%=a%>,<%=b%>,<%=c%>:<%=tabla(a,b,c)%></p></div>
<%next
next
next%>
</BODY>
</HTML>
Atención. Si empleamos demasiadas filas, columnas y niveles, el sistema nos devolverá un mensaje de error por superar el límite del búfer de respuesta. Estos límites está configurados para una operación normal del servidor. Si los modificamos, restamos recursos a otros puntos del servidor, por lo que intentaremos en la medida de lo posible mantener las configuraciones de fábrica, salvo que nuestra experiencia nos permita saber perfectamente lo que modificamos y los resultados que obtenemos.
WHILE WEND
Los bucles WHILE WEND permiten la realización de iteraciones sobre unas variables que modifican sus valores para acceder a un conjunto de datos diverso.
Por ejemplo, la función bidimensional del ejemplo anterior con un bucle while, queda como sigue
<%Dim tabla(100,50)%>
<%
a=0
while a<100
b=0
while b<50
tabla(a,b)=(a*b)
b=b+1
wend
a=a+1
wend
%>
<HTML>
<BODY>
<%
a=0
while a<100
b=0
while b<50%>
<div><p class=”txt”>Posición <%=a%>,<%=b%>:<%=tabla(a,b)%></p></div>
<%b=b+1
wend
a=a+1
wend%>
</BODY>
</HTML>
Este bucle recorre la tabla de la misma manera, con la consideración que tenemos las asignaciones de incremento de valor de los cursores a y b manuales.
En el siguiente ejemplo es una matriz tridimensional con cursores a,b,c con recorrido completo.
<%Dim tabla(10,5,20)
a=0
while a<10
b=0
while b<4
c=0
while c<20
tabla(a,b,c)=(a*b*c)
c=c+1
wend
b=b+1
wend
a=a+1
wend
%>
<HTML>
<BODY>
<%
a=0
while a<10
b=0
while b<4
c=0
while c<20%>
<div><p class=”txt”>Posición <%=a%>,<%=b%>,<%=c%>:<%=tabla(a,b,c)%></p></div>
<%c=c+1
wend
b=b+1
wend
a=a+1
wend%>
</BODY>
</HTML>
Asignando un fichero de estilo CSS, podemos conseguir el texto en el formato que queramos mostrar.
Funciones Vbasic
Las funciones VBasic, las puedes encontrar en un editor de Microsoft, accediendo a la ventana de Macros. Ahí, ayudándote de las grabadoras de Macros, puedes conseguir la función asociada a la mayoría de las funciones. Grabas la macro, haces la acción que necesites, y luego ves el código generado. De esa manera dejamos de saturar internet con consultas , cuando los medios locales son operativos y suficientes para resolver muchas de las dudas.
Aquí os muestro algunas de las funciones, con ejemplos de código 100% funcionales, es decir, si lo copias y o pegas en un fichero funciona perfectamente.
Función Int()
La función int(a), convierte un número con decimales en un número entero.
<%
Dim a,b
a=8.5
b=int(a)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado a=<%=a%> b=<%=(b)%></p></div>
</BODY>
</HTML>
Atención a los puntos y las comas, porque el resultado de esta operación en el navegador es:
Resultado a=8,5 b=8
Es decir , le pasamos a la variable 8.5 y el navegador nos muestra 8,5.
Funcion Round()
La funcion Round() redondea un número con decimales a un entero con decimales de la precisión que le indiquemos.
<%
Dim a,b,c,d
a=8.666
b=round(a)
c=round(a,0)
d=round(a,1)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado a=<%=a%>, b=<%=b%>, c=<%=c%>, d=<%=d%> </p></div>
</BODY>
</HTML>
El navegador muestra la siguiente cadena de texto con el resultado.
Resultado a=8,666, b=9, c=9, d=8,7
Función Randomize, Rnd .
La funcion randomize emplea una variable que cambia entre 0 y 1 de manera aleatoria, con un número de decimales.
La funcion Rnd devuelve el valor. La función Randomize no devuelve ningún valor, pero hace que la variable que devuelve Rnd cambie de una vez para la siguiente, empleando una función con semilla variable que permite obtener diferentes resultados en diferentes iteraciones.
<%
Dim a,b,c,d
a=Rnd
b=Rnd*10
c=int(b)
d=int(a)
Dim e,f,g,h
Randomize
e=Rnd
f=Rnd*10
g=int(f)
h=int(e)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado a=<%=a%>, b=<%=b%>, c=<%=c%>, d=<%=d%> </p></div>
<div><p class=”txt”>Resultado e=<%=e%>, f=<%=f%>, g=<%=g%>, h=<%=h%> </p></div>
</BODY>
</HTML>
En este ejemplo, la primera iteración tiene el siguiente resultados
Resultado a=0,7055475, b=5,33424, c=5, d=0
Resultado e=0,3749898, f=4,656489, g=4, h=0
La segunda petición de la página, obtiene el siguiente resultado.
Resultado a=0,7055475, b=5,33424, c=5, d=0
Resultado e=0,2146962, f=5,559046, g=5, h=0
Como vemos, las variables a,b,c,d quedan estáticas y las variables e,f,g,h van cambiando con la ayuda de la función Randomize
Función Mid()
La funcion Mid(a,b), devuelve una cadena cortada, comenzando en un carácter indicado (a), y con la longitud indicada (b).
<%
Dim a,b,c,d
a="asdfghjklñ"
b=mid(a,1,2)
c=mid(a,5,3)
d=mid(a,8,1)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado a=<%=a%>, b=<%=b%>, c=<%=c%>, d=<%=d%> </p></div>
</BODY>
</HTML>
El resultado es el siguientes
Resultado a=asdfghjklñ, b=as, c=ghj, d=k
Función len()
La fución len() devuelve la longitud de una cadena de caracteres.
<%
Dim a,b,c,d
a="asdfghjklñ"
b=len(a)
c=len(b)
d=len(a&b&c)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado a=<%=a%>, b=<%=b%>, c=<%=c%>, d=<%=d%> </p></div>
</BODY>
</HTML>
Resultado en pantalla:
Resultado a=asdfghjklñ, b=10, c=2, d=13
Fechas y horas
En una aplicación es interesante conocer los días y las horas a las que ocurren los eventos. De la misma manera que podemos conocer cuando han ocurrido, podemos programarlos. Vamos a mostrar algunas funciones y luego hacemos un código que muestre todas ellas.
Función Date()
La
función date() devuelve una cadena con la hora en el ámbito del
servidor. Es decir, si el servidor está en Estados Unidos nos
ofrecerá la hora local del Estado en el que se encuentre el
servidor.
<%
Dim fecha, anyo, mes, dia, nombre_mes
fecha=date()
anyo=year(fecha)
mes=month(fecha)
dia=day(fecha)
nombre_mes=monthname(mes)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado fecha=<%=fecha%> dia=<%=(dia)%> mes=<%=(mes)%> año=<%=(anyo)%> Mes=<%=(nombre_mes)%></p></div>
</BODY>
</HTML>
Función Time()
La funcion Time() devuelve la hora del servidor.
<%
Dim hora_actual_completa, fragmento_hora, fragmento_minuto, fragmento_segundo
hora_actual_completa=time()
fragmento_hora=hour(hora_actual_completa)
fragmento_minuto=minute(hora_actual_completa)
fragmento_segundo=second(hora_actual_completa)
%>
<HTML>
<BODY>
<div><p class=”txt”>Resultado hora_actual_completa=<%=hora_actual_completa%> fragmento_hora=<%=fragmento_hora%> fragmento_minuto=<%=fragmento_minuto%> fragmento_segundo=<%=fragmento_segundo%></p></div>
</BODY>
</HTML>
Otros ejemplos de uso.
De esta manera, la siguiente página, muestra un mensaje entre cinco posibles de manera aleatoria.
<!DOCTYPE html>
<html>
<style>
</style>
<body>
<%
Dim max,min
max=5
min=1
Randomize
norden=(Int((max-min+1)*Rnd+min))
if norden=1 then
mensaje="Cada día enseña algo nuevo a alguien que no sabe"
else
if norden=2 then
mensaje="Trabaja siempre que puedas en algo que te guste"
else
if norden=3 then
mensaje="Resuelve problemas incluso aun cuando pienses que no tienes problemas"
else
if norden=4 then
mensaje="Si empleas los medios que tienes para mejorar algo, en el futuro podrás emplear medios mejores"
else
if norden=5 then
mensaje="Caminar es cuestión de dar un paso y luego otro"
end if
end if
end if
end if
end if%>
<center><%response.write(mensaje)%></center>
</body>
</html>
El ejemplo mostrado, realiza comprobaciones, para conocer en qué posición se encuentra la variable norden, la cual empleamos para saber que mensaje mostrar. El ejemplo utiliza una única variable en memoria, “mensaje” la cual se reserva mientras se prepara la página.
Las comprobaciones requieren tiempo de microprocesador, por lo que muchas comprobaciones, además de mucho tiempo de micro, resultan en un código complejo de seguir.
Vamos a hacer una versión, con la misma funcionalidad, pero empleando una tabla en memoria y sin comprobaciones.
<%
Dim tabla(5)
mensaje="Cada día enseña algo nuevo a alguien que no sabe"
tabla(1)=mensaje
mensaje="Trabaja siempre que puedas en algo que te guste"
tabla(2)=mensaje
mensaje="Resuelve problemas incluso aun cuando pienses que no tienes problemas"
tabla(3)=mensaje
mensaje="Si empleas los medios que tienes para mejorar algo, en el futuro podrás emplear medios mejores"
tabla(4)=mensaje
mensaje="Caminar es cuestión de dar un paso y luego otro"
tabla(5)=mensaje
max=5
min=1
Randomize
norden=(Int((max-min+1)*Rnd+min))
%>
<!DOCTYPE HTML>
<HTML>
<STYLE>
</STYLE>
<BODY>
<%=norden%>
<%mensaje=tabla(norden)%>
<center><%response.write(mensaje)%></center>
</BODY>
</HTML>
Este código, permite limitar tanto la complejidad del código como el tiempo de ejecución, con la contraprestación de emplear 5 posiciones de memoria simultáneamente, en lugar de una sola.
Este ejemplo permite numerosas mejoras que vamos a ver a continuación.
Visualización.
Para interpretar mejor el código, y para depurar es interesante dividir el código en partes funcionalmente dependientes. De esta manera, podemos crear dos ficheros, con el siguiente contenido.
Fichero 1.
Nombre del fichero: cada_dia_tabla_version_dos_ficheros.inc
Ruta: misma ruta que fichero con el mismo mombre en .asp
<%
Dim tabla(5)
mensaje="Cada día enseña algo nuevo a alguien que no sabe"
tabla(1)=mensaje
mensaje="Trabaja siempre que puedas en algo que te guste"
tabla(2)=mensaje
mensaje="Resuelve problemas incluso aun cuando pienses que no tienes problemas"
tabla(3)=mensaje
mensaje="Si empleas los medios que tienes para mejorar algo, en el futuro podrás emplear medios mejores"
tabla(4)=mensaje
mensaje="Caminar es cuestión de dar un paso y luego otro"
tabla(5)=mensaje
max=5
min=1
Randomize
norden=(Int((max-min+1)*Rnd+min))
mensaje=tabla(norden)
%>
Fichero 2.
Nombre del fichero: cada_dia_tabla_version_dos_ficheros.inc
Ruta: misma ruta que fichero con el mismo mombre en .inc
<!--#include file="cada_dia_tabla_version_dos_ficheros.inc"-->
<!DOCTYPE HTML>
<HTML>
<STYLE>
</STYLE>
<BODY>
<center><%response.write(mensaje)%></center>
</BODY>
</HTML>
Como se aprecia, el contenido del fichero ASP es más sencillo, escueto y legible.
Si hay un problema en el tratamiento de la tabla, sabemos que el problema estará probablemente en el .inc, en lugar de en el .asp, por lo que nos facilitamos las tareas de búsqueda y localización de fallas, que son los problemas cuando por ejemplo en lugar de escribir <%=mensaje%>, escribes <%=memsaje%>. Es una “avería” típica cuando estás programando, ya que el editor son tus propios dedos y confundir una letra con otra tiene el resultado de que en la pantalla no se lea el mensaje.
Por lo tanto, dividir los ficheros en parte funcional y contenido web es algo a considerar cuando editas un contenido ASP. Ya que como hemos dicho el servidor no traslada al cliente nada del fichero .inc.
Objetos en ASP
Server
El objeto server contiene información relativa al servidor. En este caso vamos a emplear su característica MapPath() que nos devuelve la ruta de inicio al root del servicio web.
Se trata de un dato interno al servicio, por lo que no debe trascender al lado del cliente.
Session y Application
Vamos a continuar con los objetos session y application.
Para ello, vamos a hacer una web muy sencilla, que nos permita contar el número de veces que ha sido enviada a un navegador así como el número de veces que ha sido mostrada en cada navegador.
Para ello, necesitamos dos navegadores diferentes, para que entendamos qué significa el objeto session, que acompaña al objeto application.
El objeto session, almacena variables que corresponden a la sesión del usuario. La sesión del usuario comienza cuando el/la usuario/a solicita una página del servidor y termina cuando el/la usuario/a abandona el servidor, o tras un tiempo de inactividad que denominamos timeout.
El objeto response, nos sirve entre otros para controlar la url de la ventana, así como para escribir en la ventana textos que necesitemos mostrar, por ejemplo textos mientras depuramos la aplicación. Este mismo objeto nos permite enviar las conocidas cookies al navegador.
Vamos a ver un ejemplo de código para que entendamos como funcionan y como se usan algunos de sus campos.
<%variable_local=Application(“variable_app”)%>
Esta instrucción, pasa a una variable local, una variable global del objeto application. Como hemos dicho, el objeto application funciona dentro de nuestra root del servicio web y hay un objeto application para todo el root. Mientras haya un cliente conectado al servidor, estas variables permanecerán en la memoria del servidor.
Por lo tanto, cuando todos los clientes abandonan un servicio web, las variables desaparecen y para volver a utilizarlas hay que volver a cargarlas.
<%variable_local=Session(“variable_sess”)%>
Esta instrucción, pasa a una variable local, una variable global del objeto session. Como hemos dicho, el objeto session funciona dentro de nuestra root y hay un objeto session para cada navegador conectado al servicio web. Mientras hagamos click en páginas de ese servicio web, las variables session se mantienen activas en la memoria del servidor.
El objeto session, se puede reiniciar mediante la función session.abandon. Las variables del objeto session desaparecen.
La función application.abandon no existe en ASP.
Si configuramos el objeto session, con la opción session.timeout=1, entonces cada minuto que el usuario no utilice el sistema, este perderá datos como login y otros asuntos que podemos configurar. Esta función es buena para que si un usuario se marcha de su puesto de trabajo, la sesión se bloquee automáticamente, impidiendo que otros pueda acceder a su información que podría ser confidencial.
También es bueno para que el servidor no almacene de manera indefinida las sesiones en la memoria eliminando paulatinamente las sesiones que permanecen inactivas.
Una sesión inactiva es aquella que no hace cambios en el servidor.
Por lo tanto estar escribiendo un texto en el cliente, no implica mantener la sesión activa. En algunos sitios web, los cuadros de texto te permiten escribir miles de caracteres y cuando terminas de escribirlos la sesión ha finalizado, por lo que tienes que volver a escribirlos por segunda vez.
Por lo tanto, cada vez que un usuario entra a un servicio web, hay que cargarle las variables session de manera explícita, para que las pueda utilizar.
Proyecto fin de capítulo
Vamos a hacer un trabajo que emplee algunas de las funciones y objetos que hemos comentado.
Consiste en contar las veces que una página es solicitada así como cuantas páginas se han solicitado todas las páginas en un servicio web y en todo el servidor, desde el inicio de la aplicación.
Si lo añadimos en cada página, podemos contar cuantas páginas se han solicitado en todo el servicio. Y si hacemos transferencia de datos entre servicios, podemos comunicar el número de páginas que se han mostrado en total en cualquiera de los servicios, visualizando porcentajes y estadísticas básicas.
Vamos a emplear dos métodos de comunicación.
El primero comunicación en anillo. Este método permite transmitir datos entre servidores al mismo nivel. Con la elaboración de este ejercicio, el capíotulo se da por comprendidol
Subir nota.
Si queremos subir nota en este aspecto, podemos hacer el siguiente trabajo. Requiere más recursos, pero a quien le guste el asunto, lo hará con agrado.
Vamos a practicar un método más elaborado y requiere de un número de servidores más grande, para visualizar la potencia de este entorno de programación.
Emplearemos transmisión en árbol, lo cual es muy útil cuando hay servidores a diferentes niveles y nos permite elaborar la estructura en árbol, la cual permite un crecimiento de la infraestructura muy fácil y rápido, empleando nodos que reciben y ofrecen datos a sus nodos del nivel inferior.
En este caso vamos a poner en marcha 30 servidores en 30 servicios diferentes. Cada servicio va a proporcionar a su nodo principal las visitas, cada nodo principal le va a transmitir las visitas de los otros nodos, de tal manera que habrá una red completa con información actualizada.
Los nodos se conectarán de manera dinámica con un nodo central que establecerá la arquitectura del sistema de manera desatendida. El nodo central intercambiará con los nodos solicitantes claves e instrucciones para realizar las conexiones, que quedarán en memoria mientras el equipo esté funcionando. Cuando el equipo se reinicia, vuelve a establecer conexión y reanuda la comunicación.
Crearemos unas ventanas para producir visitas automáticas de tal modo que cada hora se actualicen todos los datos del sistema automáticamente.
Ficheros 1 y 2.
Ruta: root del servicio web http://iserver
Nombre del fichero: default.asp
Nombre del fichero: default2.asp
Ficheros 3 y 4.
Ruta: root del servicio web http://127.0.0.1
Nombre del fichero: default.asp
Nombre del fichero: default2.asp
Ficheros 5 y 6.
Ruta: root del servicio web http://localhost
Nombre del fichero: default.asp
Nombre del fichero: default2.asp
<%
session.timeout=1
visitas_app=request("visitas_app")
if visitas_app<>"" then
application("visitas_app")=0
end if
visitas_sess=request("visitas_sess")
if visitas_sess<>"" then
session("visitas_sess")=0
end if
if visitas_app<>"" or visitas_sess<>"" then
response.redirect("default.asp")
end if
visitas_app=application("visitas_app")
if visitas_app="" then
visitas_app=1
else
visitas_app=visitas_app+1
end if
application("visitas_app")=visitas_app
visitas_sess=session("visitas_sess")
if visitas_sess="" then
visitas_sess=1
else
visitas_sess=visitas_sess+1
end if
session("visitas_sess")=visitas_sess
cadena1=""
cadena2=""
cadena2=""
application_visitas_server_total=application("visitas_server_total")
application_visitas_servicio1_total=application("visitas_servicio1_total")
application_visitas_servicio2_total=application("visitas_servicio2_total")
application_visitas_servicio3_total=application("visitas_servicio3_total")
if application_visitas_server_total<>"" and application_visitas_server_total<>0 then
porcentaje1=round((100*application_visitas_servicio1_total/application_visitas_server_total),1)
else
porcentaje1=0
end if
a=int(porcentaje1/10)
for t=1 to 10
if a<=t then
cadena1=cadena1& "O"
end if
next
if application_visitas_server_total<>"" and application_visitas_server_total<>0 then
porcentaje2=round((100*application_visitas_servicio2_total/application_visitas_server_total),1)
else
porcentaje2=0
end if
a=int(porcentaje2/10)
for t=1 to 10
if a<=t then
cadena2=cadena2& "O"
end if
next
if application_visitas_server_total<>"" and application_visitas_server_total<>0 then
porcentaje3=round((100*application_visitas_servicio3_total/application_visitas_server_total),1)
else
porcentaje3=0
end if
a=int(porcentaje3/10)
for t=1 to 10
if a<=t then
cadena3=cadena3& "O"
end if
next
%>
<!DOCTYPE html>
<html>
<body>
<link rel="stylesheet" href="estilo.css">
<div class="todo_pantalla">
<div class="marco_acceso">
<div class="titulo_entrada">
<p class="titulo">PLATAFORMA WEB PARA DESARROLLO DE APLICACIONES</p>
<p class="titulo">SITIO WEB <%=mid(Server.MapPath("/"),23,1)%></p>
</div>
<div class="titulo_entrada">
<p class="titulo">Visitas servidor <%=application("visitas_server_total")%>, <%=application("fecha_visitas_server_total")%> </p>
<p class="titulo">Desglose</p>
<p class="titulo">Servicio 1 :<%=application("visitas_servicio1_total")%> - <%=porcentaje1%>%, <%=cadena1%></p>
<p class="titulo">Servicio 2 :<%=application("visitas_servicio2_total")%> - <%=porcentaje2%>%, <%=cadena2%></p>
<p class="titulo">Servicio 3 :<%=application("visitas_servicio3_total")%> - <%=porcentaje3%>%, <%=cadena3%></p>
<p class="titulo">Visitas application <%=application("visitas_app")%> </p>
<p class="titulo">Visitas sesión <%=session("visitas_sess")%> </p>
</div>
<div class="titulo_entrada">
<a class="link-text" target="_blank" href="default.asp">Nueva ventana de esta misma página en este mismo sitio</a><br>
<a class="link-text" target="_blank" href="default2.asp">Nueva ventana en otra página del mismo sitio</a><br>
<a class="link-text" target="_self" href="http://iserver/default.asp">Página de sitio 1</a><br>
<a class="link-text" target="_self" href="http://127.0.0.1/default.asp">Página de sitio 2</a><br>
<a class="link-text" target="_self" href="http://localhost/default.asp">Página de sitio 3</a><br>
<a class="link-text" target="_self" href="contabiliza.asp">Contabilizar total de accesos</a><br>
<a class="link-text" target="_self" href="default.asp?visitas_app=0">Reiniciar contador application</a><br>
<a class="link-text" target="_self" href="default.asp?visitas_sess=0">Reiniciar contador session</a><br>
<a class="link-text" target="_self" href="default.asp?visitas_sess=0&visitas_app=0">Reiniciar ambos contadores</a><br>
</div>
</div>
</div>
</body>
</html>
El siguiente fichero, realiza un recorrido por los servidores, preguntando el número de páginas que han mostrado, guardando los datos de un servidor para el siguiente y actualizando los datos de cada servidor cuando ha terminado el ciclo.
Es decir, realiza dos vueltas, una para preguntar a cada uno cuantas páginas ha mostrado ( páginas con el sistema de contabilización que hemos diseñado, ya que el servidor incorpora otro sistema de contabilización).
Además realiza una segunda vuelta actualizando a cada servidor el número de páginas total.
Nombre del fichero: contabiliza.asp
Ruta: root de cada servidor
Descripción. Emplea variables locales para pasar entre servidores y una variable de application para mostrar en todo momento la última cuenta realizada mostrando la fecha y hora.
<%
visitas_servicio1_total=request("visitas_servicio1_total")
visitas_servicio2_total=request("visitas_servicio2_total")
visitas_servicio3_total=request("visitas_servicio3_total")
visitas_server_total=request("visitas_server_total")
servers_actualizados=request("servers_actualizados")
if servers_actualizados="" then
servers_actualizados=0
end if
if visitas_server_total<>"" then
application("visitas_server_total")=visitas_server_total
if servers_actualizados="" then
servers_actualizados=1
else
servers_actualizados=servers_actualizados+1
end if
else
visitas_server_total=0
end if
visitas_server_actual=application("visitas_app")
nserver=int(mid(Server.MapPath("/"),23,1))
if nserver=1 then
visitas_servicio1_total=visitas_server_actual
else
if nserver=2 then
visitas_servicio2_total=visitas_server_actual
else
if nserver=3 then
visitas_servicio3_total=visitas_server_actual
end if
end if
end if
if servers_actualizados<4 then
if visitas_servicio1_total<>"" and visitas_servicio2_total<>"" and visitas_servicio3_total<>"" then
visitas_server_total=int(visitas_servicio1_total)+int(visitas_servicio2_total)+int(visitas_servicio3_total)
if nserver=1 then
application("visitas_servicio1_total")=visitas_servicio1_total
application("visitas_servicio2_total")=visitas_servicio2_total
application("visitas_servicio3_total")=visitas_servicio3_total
application("visitas_server_total")=visitas_server_total
application("fecha_visitas_server_total")=date() & time()
response.redirect("http://iserver/contabiliza.asp?visitas_servicio1_total="&visitas_servicio1_total&"&visitas_servicio2_total="&visitas_servicio2_total&"&visitas_servicio3_total="&visitas_servicio3_total&"&visitas_server_total="&visitas_server_total&"&servers_actualizados="&servers_actualizados&"")
else
if nserver=2 then
application("visitas_servicio1_total")=visitas_servicio1_total
application("visitas_servicio2_total")=visitas_servicio2_total
application("visitas_servicio3_total")=visitas_servicio3_total
application("visitas_server_total")=visitas_server_total
application("fecha_visitas_server_total")=date() & time()
response.redirect("http://iserver/contabiliza.asp?visitas_servicio1_total="&visitas_servicio1_total&"&visitas_servicio2_total="&visitas_servicio2_total&"&visitas_servicio3_total="&visitas_servicio3_total&"&visitas_server_total="&visitas_server_total&"&servers_actualizados="&servers_actualizados&"")
else
if nserver=3 then
application("visitas_servicio1_total")=visitas_servicio1_total
application("visitas_servicio2_total")=visitas_servicio2_total
application("visitas_servicio3_total")=visitas_servicio3_total
application("visitas_server_total")=visitas_server_total
application("fecha_visitas_server_total")=date() & time()
response.redirect("http://iserver/contabiliza.asp?visitas_servicio1_total="&visitas_servicio1_total&"&visitas_servicio2_total="&visitas_servicio2_total&"&visitas_servicio3_total="&visitas_servicio3_total&"&visitas_server_total="&visitas_server_total&"&servers_actualizados="&servers_actualizados&"")
end if
end if
end if
else
if nserver=1 then
response.redirect("http://127.0.0.1/contabiliza.asp?visitas_servicio1_total="&visitas_servicio1_total&"&visitas_servicio2_total="&visitas_servicio2_total&"&visitas_servicio3_total="&visitas_servicio3_total&"")
else
if nserver=2 then
response.redirect("http://localhost/contabiliza.asp?visitas_servicio1_total="&visitas_servicio1_total&"&visitas_servicio2_total="&visitas_servicio2_total&"&visitas_servicio3_total="&visitas_servicio3_total&"")
else
if nserver=3 then
response.redirect("http://iserver/contabiliza.asp?visitas_servicio1_total="&visitas_servicio1_total&"&visitas_servicio2_total="&visitas_servicio2_total&"&visitas_servicio3_total="&visitas_servicio3_total&"")
end if
end if
end if
end if
else
response.redirect("default.asp")
end if
%>
Este procedimiento se realiza en un terminal o cuenta de administrador, ya que contiene datos explícitos sobre servidores, visitas y parámetros que no son públicos en un servicio web.
Los tres ficheros de cada servidor son exactamente idénticos de un servidor para el siguiente, por lo que es una solución ampliable y dan como resultado las siguientes ventanas, que dependiendo de las acciones de los/las usuarios/as, muestran informaciones diferentes.
Haciendo click en cada enlace de la parte inferior, podemos navegar entre los tres servidores, visualizando las peticiones de página que se han hecho tanto en la sesión, como en la aplicación.
También podemos reiniciar los contadores, lo cual hemos implementado con un enlace a la misa página, enviando las variables visitas_app=0 y visitas_sess=0.
Pulsando en el enlace Contabilizar total de accesos, actualiza los contadores de los tres servidores así como la fecha de actualización, un dato de referencia, para cuando automaticemos, podamos grabar los datos a un fichero o base de datos de manera diaria, semanal y mensual y presentar una gráfica con toda la información.
Cuando un navegador cierra todas sus ventanas, el objeto session se reinicia de manera automática. En las pruebas que hemos realizado, el objeto application no se reinicia al cerrar la última ventana del último cliente, situación que podría condicionar la memoria del servidor en sucesivas solicitudes desde otros servicios web.
Si esperamos 1 minuto, la sesión finaliza de manera automática. En un sitio web con acceso restringido, podríamos devolver al usuario a la pantalla de inicio para que vuelva a autenticarse, con el objeto de que si una persona se ausenta, su sesión quede protegida.
Como veis, el sistema es un sistema de gestión de la información muy completo. Podemos hacer análisis muy amplios sobre cantidades de información muy diversas siempre que las podamos hacer llegar a un servidor ASP.
Comentarios
Publicar un comentario