Conferencia ASP 3: objeto de aplicación y objeto de sesión
Autor:Eve Cole
Fecha de actualización:2009-05-30 19:58:17
En la conferencia anterior, aprendimos sobre la recopilación de datos de formulario, la recopilación de datos de QueryString y la recopilación de datos de ServerVariables del objeto Solicitud. Antes de continuar con el siguiente estudio, se recomienda que se relaje primero, porque el objeto Aplicación que se presentará a continuación es relativamente abstracto y es posible que no pueda distinguir las cosas cuando lo comprenda por primera vez. Recuerde: cuando no pueda encontrarlo, no piense demasiado en cuál es el objeto Aplicación. Como dice el viejo refrán, primero aprende a usarlo.
1. Comprenda el objeto Aplicación. Para refrescar tu mente, veamos una rutina de contador (debes ejecutarla para entenderla):
Primero edite un archivo wuf16.htm:
<html>
<cuerpo>
Ejemplo de registro del número de clics en una página: <a href="wuf17.asp">wuf17.asp</a>
</cuerpo>
</html>
El código de wuf17.asp es el siguiente:
<% @LANGUAGE = VBScript %>
<% 'wuf17.asp: registra el número de visitas a una determinada página (principio contrario)
Opción explícita
Dim CountWeb
CountWeb = Solicitud.ServerVariables("SCRIPT_NAME")
'Esto garantiza que cada página tenga una variable única para evitar confusiones.
%>
<HTML><CUERPO>
<%
Respuesta.Escribir CountWeb & "<Br><Br>" & vbcrlf
Application.Lock 'Por favor lea la explicación
Aplicación(CountWeb) = Aplicación(CountWeb) + 1 'Acumulador, suma 1 al número de clics
Aplicación.Desbloquear
Response.Write "El número total de clics en esta página antes de cerrar y reiniciar el servidor WEB es: " & Aplicación (CountWeb)
%>
</BODY></HTML>
Cuando se ejecuta este programa, para la mayoría de las personas, solo hay una máquina, que es tanto el servidor web como el cliente. Entonces sólo puede imaginar una situación como esta: sus dos archivos de página de inicio están ubicados en un servidor web lejano y una avalancha de usuarios nacionales y extranjeros acceden a ellos a través de navegadores. Una vez que cada usuario haga clic, el valor de Aplicación (CountWeb) se incrementará en 1 y, mientras el servidor que almacena el archivo wuf17.asp no esté cerrado, la Aplicación (CountWeb) continuará acumulándose. Pero tenga en cuenta que si el servidor se apaga y luego se reinicia, la Aplicación (CountWeb) comenzará a contar desde 0 nuevamente (estoy confundido, dije por qué el número de visitas a mi página es siempre de un dígito). Para evitar este tipo de situación de conteo que siempre comienza desde cero, debe guardar el valor de la Aplicación (CountWeb) antes de que se apague el servidor y sacarlo la próxima vez que sea necesario, para que pueda acumularse secuencialmente. Para hacerlo, escuche Decompose después de N veces.
La siguiente pregunta es ¿qué significa Application.Lock y UnLock? Simplemente asumimos que una gran cantidad de usuarios están visitando la página y que el clic de cada usuario hará que la Aplicación (CountWeb) aumente en 1. Piénselo, ¿no sería esto un desastre (¡Qué! ¿Puedo? No lo pienses, debes ser tú (sólo tú eres el único que patrocina la página de inicio), por lo que debe haber una regla de "primero en llegar, primero en ser atendido". Cuando un usuario visita la página y necesita modificar el valor de la Aplicación (CountWeb), use el método Lock para bloquearla y evitar que otros usuarios la modifiquen. Una vez completada la modificación, desbloquéela.
¿Ha visto en el ejemplo anterior que el objeto Aplicación proporciona información compartida (Aplicación (CountWeb)) a todos los usuarios y está orientado a todos los usuarios (el acceso de cada usuario hará que el contador aumente en 1)? El objeto Aplicación también tiene dos eventos, el evento Application_OnStart y el evento Application_OnEnd (no se confunda, este es solo un concepto inicial en los lenguajes de programación orientados a objetos. La sintaxis al usarlo es la siguiente:
<IDIOMA DE ESCRITURA=VBScript RUNAT=Servidor>
SubAplicación_OnEnd
'Cuando se cierre el servidor WEB, se activará el evento Application_OnEnd
'Es decir, el programa ejecutará el código colocado aquí
'Entonces, antes de cerrar el servidor, podemos cambiar el valor de Aplicación (CountWeb) en wuf17.asp aquí.
'Guárdelo, por ejemplo, en un archivo de texto.
Subtítulo final
Subaplicación_OnStart
'Cuando el primer usuario navega por la página web ASP, se activará el evento Application_OnStart, pero cuando otros usuarios naveguen en el futuro, este evento no ocurrirá.
'Es decir, el programa ejecutará el código colocado aquí
'Entonces, el valor de Aplicación (CountWeb) guardado en el archivo de texto se puede leer aquí.
Subtítulo final
</SCRIPT>
El siguiente es un ejemplo para ilustrar cómo utilizar los eventos. La función de este programa es contar el número total de clics en todas las páginas del sitio.
El código del archivo wuf18.asp (otros archivos de páginas del sitio son similares a este archivo):
<% @LANGUAGE = VBScript %>
<% Opción explícita
'Todos los archivos de página del sitio deben incluir esta oración <!--#include file="wuf19.asp"-->%>
<!--#include file="wuf19.asp"-->
<HTML><CUERPO>
El número total de visitas a todas las páginas del sitio antes de que el servidor se apague y se reinicie: <%= Aplicación("CountAll") %>
</BODY></HTML>
Código del archivo wuf19.asp:
<% ' wuf19.asp
Bloqueo de aplicación
Aplicación("ContarTodo") = Aplicación("ContarTodo") + 1
Aplicación.Desbloquear
%>
Los archivos wuf18.asp y wuf19.asp se encuentran en el mismo directorio. Código del archivo global.asa:
Nota: El controlador de eventos debe guardarse como un archivo de texto llamado "global.asa" y debe colocarse en el directorio raíz de la ruta virtual (generalmente en el mismo directorio que el archivo index.htm o default.htm, por ejemplo: Tome mi máquina como ejemplo. En términos de rutas absolutas, global.asa se coloca en c:InetPubhome, mientras que wuf18.asp y wuf19.asp se colocan en c:InetPubhomeasp. Sólo ruta. Se permite que exista un archivo global.asa.
<IDIOMA DE ESCRITURA=VBScript RUNAT=Servidor>
'global.asa - wuf18.asp El nombre del archivo en el paquete de descarga es 18global.asa, que debe cambiarse al usarlo.
Subaplicación_OnStart
'Cuando el primer usuario navega por la página web, establezca el valor inicial del contador en 0.
'Cuando otros usuarios naveguen en el futuro, el siguiente código ya no se ejecutará.
Bloqueo de aplicación
Aplicación("ContarTodo") = 0
Aplicación.Desbloquear
Subtítulo final
</SCRIPT>
Explore wuf18.asp para ver los resultados de la ejecución. Parece que no es difícil aprender a utilizar el objeto Aplicación.
2. Comprenda el objeto Sesión. Con el objeto Aplicación anterior como presagio, el objeto Sesión es mucho más fácil. Es similar al objeto Aplicación, excepto que solo se usa para registrar información relacionada con un solo usuario. Está orientado a un solo usuario, por lo que podemos usar el objeto Sesión para almacenar información sobre un solo usuario.
Al igual que el objeto Aplicación, el objeto Sesión también tiene dos eventos: el evento Session_OnStart y el evento Session_OnEnd. La sintaxis de uso es similar a la del objeto Aplicación.
Vale la pena mencionar que antes de utilizar el objeto Sesión, debe confirmar que la función Cookie del navegador esté habilitada (la configuración predeterminada está bien).
A continuación se muestra un ejemplo. Los requisitos para el archivo global.asa son los mismos que los anteriores, por lo que global.asa en el ejemplo anterior será sobrescrito por global.asa en este ejemplo.
<IDIOMA DE ESCRITURA=VBScript RUNAT=Servidor>
' global.asa - wuf20.asp El nombre del archivo en el paquete de descarga es 20global.asa
SubSession_OnStart
Session("In") = Now 'Función Ahora obtiene la hora actual
Subtítulo final
SubSession_OnEnd
Sesión("Fuera") = Ahora
Bloqueo de aplicación
Aplicación("Fuera") = Sesión("Fuera")
Aplicación("En") = Sesión("En")
Aplicación(“Fuera”).Desbloquear
Subtítulo final
</SCRIPT>
Archivo wuf20.asp:
<%@ Idioma=VBScript %>
<HTML>
<CUERPO>
<% 'wuf20.asp
Response.Write "Configuración de tiempo de espera predeterminada:" & Session.Timeout & "Minutos<Br>"
Sesión.Tiempo de espera = 1
Response.Write "La hora a la que ingresó a este sitio:" & Session("In") & "<Br>"
Response.Write "Actualice esta página en 1 minuto" & "<Br><Br>"
si no está vacío (aplicación ("fuera")), entonces
Response.Write "La última vez que ingresó a este sitio:" & Aplicación("In") & "<Br>"
Response.Write "La última vez que abandonó este sitio:" & Application("Out") & "<Br>"
Respuesta.Escribe "Tiempo de navegación (minutos):" &_
Datediff("n",Aplicación("Entrada"),Aplicación("Salida")) & "<Br><Br>"
Terminar si
si está vacío (sesión ("fuera")), entonces
Response.Write "El valor de Session(""Out"") antes y después de la actualización está vacío" & "<Br>"
Terminar si
%>
</CUERPO>
</HTML>
Cuando el usuario navega por la página web por primera vez, ocurre el evento Session_OnStart. El programa registra el momento en que el usuario ingresa a la página web. Sin embargo, el evento Session_OnEnd no ocurre en este momento, por lo que la Aplicación ("Out"). El valor está vacío y el programa no muestra el tiempo de navegación.
Sabemos que la vida útil del objeto Aplicación es desde el primer usuario que navega por la página web hasta que se apaga el servidor. La vida útil del objeto Sesión es desde la primera vez que el usuario navega por la página web (el inicio de la sesión) hasta el final de la sesión. Entonces, ¿cuándo termina la sesión? Específicamente en este ejemplo, Session.Timeout = 1 establece el tiempo de espera de la sesión en 1 minuto, es decir, si no se proporciona ninguna solicitud al servidor web durante 1 minuto, la sesión caduca, lo que provoca que la sesión finalice y se produzca el evento Session_OnEnd. y el programa ejecuta el código en Session_OnEnd. Aquí colocamos los tiempos de entrada y salida en Aplicación ("In") y Aplicación ("Out") respectivamente, porque una vez finalizada la sesión, el objeto Sesión ya no existirá. Verificamos esto al final del código.
De esta rutina, podemos ver:
1. Los objetos de aplicación y los objetos de sesión tienen vidas útiles diferentes.
2. El objeto Session es para un solo usuario y su valor se almacena en el cliente. La navegación de otros usuarios no tiene ningún impacto en el objeto Session de un solo usuario. Un único usuario sólo puede leer y escribir el valor de su propio objeto Session (por ejemplo: Session("In")).
3. Tenga en cuenta la representación de comillas dobles en Response.Write: (""Out"").
4. Recordatorio especial: este programa no es práctico y solo sirve para depurar (solo es adecuado para que lo navegue un solo usuario). Piense por qué es así. La respuesta está al final de este artículo.
Consejo: preste atención a las características del objeto Aplicación.
3. Un ejemplo clásico: cómo mostrar la cantidad de personas en línea en una página web. En el siguiente ejemplo, la Aplicación ("Online") se usa para almacenar la cantidad de personas en línea y la Aplicación ("CountAll") se usa para. almacenar el número total de visitantes.
Principio: cuando un nuevo usuario navega por una página web, se produce el evento Session_OnStart, el número de usuarios en línea aumenta en 1 y el número de usuarios visitantes también aumenta en 1. Cuando un usuario se va, el evento Session_OnEnd ocurre después de que se agota el tiempo de espera de la sesión y la cantidad de personas en línea se reduce en 1.
El código Global.asa es el siguiente:
<IDIOMA DE ESCRITURA=VBScript RUNAT=Servidor>
'Global.asa-wuf21.asp
Subaplicación_OnStart
Bloqueo de aplicación
'Lea el valor inicial de Aplicación("CountAll") aquí
Aplicación.Desbloquear
Subtítulo final
SubSession_OnStart
Bloqueo de aplicación
Solicitud("En línea") = Solicitud("En línea") + 1
Aplicación("ContarTodo") = Aplicación("ContarTodo") + 1
Aplicación.Desbloquear
Subtítulo final
SubSession_OnEnd
Bloqueo de aplicación
Solicitud("En línea") = Solicitud("En línea") - 1
Aplicación.Desbloquear
Subtítulo final
SubAplicación_OnEnd
Bloqueo de aplicación
'La aplicación ("CountAll") debe guardarse en el archivo aquí
Aplicación.Desbloquear
Subtítulo final
</SCRIPT>
El código Wuf21.asp es el siguiente:
<%@ Idioma=VBScript %>
<HTML>
<CUERPO>
<%Sesión.Tiempo de espera = 5%>
<P>Número de personas en línea: <%= Solicitud("Online")%></P>
<P>Número total de visitantes: <%= Aplicación("CountAll")%></P>
</CUERPO>
</HTML>
Tenga en cuenta que esta rutina se compara con wuf17.asp. Este último cuenta el número de clics, mientras que el primero cuenta el número de visitantes.
Respuesta: Dado que el objeto Aplicación se aplica a todos los usuarios, en el caso de múltiples usuarios, la navegación de otros usuarios también cambiará los valores de Aplicación ("In") y Aplicación ("Out").