Você está em: Principal › Artigos › ASP 3.0 › Capítulo 08 : 04
Lição 064 - Capítulo 08 - O objeto Application
Conforme descrito anteriormente, podemos utilizar o objeto Application para compartilhar informações entre todos os usuários de um determinado aplicativo. Um aplicativo Web baseado no ASP é definido como todos os arquivos .asp em uma pasta virtual e seus subdiretórios. Como o objeto Application pode ser compartilhado por mais de um usuário, existem os métodos Lock e Unlock para garantir que vários usuários não tentarão alterar uma propriedade ao mesmo tempo.
Itens do objeto Application podem ser variáveis necessárias para todos os usuários que acessam uma aplicação, como por exemplo a cotação do dólar ou o índice de poupança. Também podemos utilizar o objeto Application para criar uma instância de um componente que fornece uma determinada funcionalidade utilizada pela nossa aplicação Web.
Uma aplicação Web é inicializada quando qualquer uma de suas páginas ASP for acessada. A partir do momento em que a primeira página ASP for acessada, o objeto Application estará disponível e quaisquer valores que tenham sido definidos por este objeto, estarão disponíveis para todos os usuários que acessarem a aplicação.
O diagrama da Figura 8.9, demonstra a relação entre o objeto Application, o servidor Web e as diversas aplicações Web hospedadas no servidor.
Figura 8.9 Relação entre o objeto Application, o servidor Web e as diversas aplicações.
Cada aplicação Web possui seu próprio objeto Application e informações disponíveis no objeto Application podem ser acessadas por quaisquer usuário que estiverem acessando a aplicação. Também podemos notar, na Figura 8.9, que em um mesmo servidor Web podemos ter várias aplicações Web.
Agora passaremos a estudar os eventos, coleções e métodos do objeto Application.
Eventos do objeto Application:
Na Tabela 8.1 temos a descrição dos eventos do objeto Application.
OnStart Ocorre quando a aplicação Web é iniciada (quando a primeira página da aplicação é acessada), antes da página solicitada pelo usuário seja interpretada e antes que qualquer objeto Session tenha sido criado, por isso que o objeto Session pode utilizar valores armazenados no objeto Session. Este evento pode ser utilizado para inicializar variáveis, criar objetos ou rodar código necessário à inicialização da aplicação.
OnEnd Ocorre quando a aplicação Web é finalizada. Isto acontece após o encerramento do último objeto Session e depois que o código para o evento Session_OnEnd é executado. Todas as variáveis existentes são retiradas da memória quando a aplicação é encerrada. O encerramento da seção normalmente ocorre, quando somente existia um usuário conectado e o mesmo fecha o Navegador ou acessa outro site ou outra aplicação dentro do mesmo site.
Tabela 8.1 Os eventos do objeto Application.
O código para os eventos onStart e onEnd deve ser colocado no arquivo global.asa. Agora passaremos a estudar a utilização destes dois eventos.
Evento Application_OnStart
Sintaxe para o evento OnStart:
' Código para o evento OnStart. . .
A seguir temos um exemplo de definição de código para o evento OnStart. Neste exemplo são criadas duas variáveis de nível de aplicação. Uma com a estação do ano e outra com cotação do dólar.
Application("EstacaoAno") = "Inverno"
Application("CotDolar") = 1.77
Uma das principais utilização do evento Application_OnStart é para a criação e inicialização de variáveis em nível de aplicação ou até mesmo objetos, como por exemplo, uma conexão com um Banco de dados.
Para criar uma variável em nível de aplicação, utilizamos a seguinte sintaxe:
Application("Nome_da_Variável") = Valor_da_Variável
As variáveis EstacaoAno e CotDolar podem ser acessadas, por qualquer usuário, em qualquer página ASP da aplicação Web, pois são variáveis de nível de Aplicação, tecnicamente falando, diríamos que são variáveis de nível do objeto Application.
Um detalhem importante a ser lembrado é que não é apenas no evento Application_OnStart que podemos definir variáveis de nível de aplicação. Em qualquer página ASP podemos definir uma variável que estará disponível para todos os usuários da aplicação. Para isso utilizamos a mesma sintaxe utilizada no arquivo global.asa, conforme indicado abaixo:
Para acessar os valores das variáveis do objeto Application é muito simples, basta utilizar a sintaxe:
<% = Application("Nome_da_Variável") %>
Vamos a um exemplo prático. Vamos supor que tenham sido definidas três variáveis no evento Application_OnStart da aplicação Web denominada Capitulo8, conforme indicado na Listagem 8.2, onde temos o arquivo global.asa para a aplicação Capitulo8.
Listagem 8.2 – Arquivo global.asa onde são definidos 3 variáveis de nível de aplicação.
2 Sub Application_OnStart
3 Application("Mensagem")= "Bem vindo ao site da empresa ABC LTDA !"
5 Application("CotAM")= 1.50
7 Application("CotPM")= 2.00
Neste exemplo de arquivo global.asa, no evento Application_OnStart, definimos as variáveis Mensagem CotAM e CotPM. Estas são variáveis do objeto Application, portanto disponíveis para qualquer página da aplicação.
Agora vamos criar uma página ASP que faz uso destas variáveis. A página usa_appvar.asp irá detectar a hora do dia. Até às 11:59 será apresentada a mensagem "Bom Dia" e será informado a cotação do dólar armazenada na variável CotAM. A partir de 12:00 será apresentada a mensagem Boa Tarde e será informada a cotação do dólar armazenada na variável CotPM. Em ambos os casos será emitida a mensagem contida na variável Mensagem.
Na Listagem 8.3 temos o código para a página usa_appvar.asp.
Listagem 8.3 – Utilizando variáveis do objeto Application.
4 <TITLE> Utilizando variáveis em nível de aplicação !!</TITLE>
10 If hora_dia<12 Then
11 Response.Write "<HR>"
12 Response.Write "Bom Dia ! <BR>"
13 Response.Write "Cotação do dólar: " & Application("CotAM") & "<BR>"
14 Response.Write Application("Mensagem")
15 Response.Write "<HR>"
17 Response.Write "<HR>"
18 Response.Write "Boa tarde ! <BR>"
19 Response.Write "Cotação do dólar: " & Application("CotPM") & "<BR>"
20 Response.Write Application("Mensagem")
21 Response.Write "<HR>"
Observe que utilizamos a função hour(Time( )). Como parâmetro para a função hour, passamos a função Time. A função Time captura a hora do Servidor Web e a função Hour retira apenas o valor numérico da hora.
Observe que para ter acesso a uma variável do objeto Application é só utilizar a sintaxe:
Application("Nome_da_Variável").
Ao visualizarmos o arquivo da Listagem 8.3, antes do meio-dia, obteremos o resultado indicado na Figura 8.10.
Figura 8.10 Resultado obtido antes do meio-dia.
Já ao visualizarmos o arquivo da Listagem 8.3, após o meio-dia, obteremos o resultado indicado na Figura 8.11.
Figura 8.11 Resultado obtido após o meio-dia.
A possibilidade de criar variáveis no evento Application_OnStart é bastante interessante, principalmente pelo fato que estas variáveis estarão disponíveis para qualquer usuário que acessar a aplicação Web.
Porém não estamos limitados a criação de variáveis simplesmente. Podemos criar objetos no evento OnStart. Por exemplo, posso criar um objeto do tipo ADODB.Connection e utilizar o método Open do mesmo. Com isso estou disponibilizando uma conexão de Banco de dados para todas as páginas da minha aplicação. Esta técnica apresenta, dentre outras, duas vantagens importantes:
Na Listagem 8.4, temos um exemplo de conexão criada no evento Application_OnStart.
Listagem 8.4 – Criando uma conexão no evento Application_OnStart.
12 Set Application("conn")=Server.CreateObject("ADODB.Connection")
13 Application("conn").ConnectionString = "PROVIDER=MICROSOFT.JET.OLEDB.4.0;
14 Application("conn").Open
Para que o objeto conn seja uma conexão do objeto Application, e com isso disponível para todas as páginas da aplicação, devemos utilizar a sintaxe indicada na Listagem 8.4, ou seja:
Desta forma, precisamos utilizar Application("Nome_do_Objeto"), pois se utilizarmos simplesmente o nome do objeto, a mesma não será pertencerá ao objeto Application e não estará disponível em todas as páginas. O mesmo é válida na definição da propriedade ConnectionString e na utilização do método Open.
Agora que criamos uma conexão no evento OnStart, podemos utilizar esta conexão em qualquer página da aplicação. Vamos a um exemplo de página ASP que utiliza esta conexão.
Na Listagem 8.5 temos uma página ASP que utiliza a conexão criada no evento OnStart. Observe que estamos criado um objeto RecordSet que utiliza esta conexão como parâmetro para o método Open do objeto RecordSet.
Listagem 8.5 – Utilizando a conexão criada no evento OnStart – usa_appcon.asp.
13 Pedidos.Open "Select * from Orders Order By OrderID", Application("conn"), 3, 3
Na Figura 8.12 vemos o resultado quando a página usa_appcon.asp é carregada no Internet Explorer.
Figura 8.12 Página que utiliza uma conexão criada no arquivo globla.asa.
No evento Application_OnStart não podemos utilizar os seguintes objetos:
Se tentarmos utilizar um destes objetos no evento Application_OnStart, obteremos a mensagem de erro indicada na Figura 8.13.
Figura 8.13 Erro devido a utilização de Response no evento Application_OnStart.
Evento Application_OnEnd
Embora possamos criar variáveis e objetos no evento Application_OnEnd isto não teria utilidade prática. Normalmente utilizamos o evento OnEnd para funções administrativas, tais como gravar informações em um log de auditoria ou parar um determinado serviço para manutenção.
Sintaxe para o evento Application_OnEnd:
A seguir temos um exemplo de definição de código para o evento OnEnd. Neste exemplo estamos retirando o objeto conn da memória.
Set Application("conn") = Nothing
Uma situação especial em que o evento Application_OnEnd ocorre é quando o arquivo global.asa precisa ser novamente interpretado e carregada na memória. Isto acontece quando o arquivo global.asa é alterado e as alterações são salvas.
Coleções do objeto Application.
Na Tabela 8.2 temos a descrição das coleções do objeto Application.
Contents Contém todos os itens que foram adicionados ao objeto Application, com exceção dos que foram declarados com a tag <OBJECT>. Todas as variáveis e objetos criados com Set, fazem parte desta coleção. Podemos usar a coleção Contents para obter a lista de itens aos quais tenha sido atribuído escopo do aplicativo ou para especificar um item específico para ser o destino de uma operação. É possível também remover os itens da coleção com os métodos Remove e RemoveAll. No próximo tópico falaremos sobre os métodos do objeto Application.
StaticObjects A coleção StaticObjects contém todos os objetos criados com as tags <OBJECT> dentro do escopo do objeto Application. Podemos usar esta coleção para determinar o valor de uma propriedade específica de um objeto ou fazer iteração através da coleção e recuperar todas as propriedades de todos os objetos estáticos.
Tabela 8.2 As coleções do objeto Application.
Agora passaremos a estudar a sintaxe e alguns exemplos de utilização das coleções do objeto Application.
Application.Contents(Chave)
Por exemplo, vamos supor que as seguintes variáveis tenham sido criadas no arquivo global.asa, no evento Application_OnStart:
Application("Var1") = "José da Silva"
Application("Var2") = "Maria do Socorro"
Application("HoraDia") = Hour(Time( ))
Response.Write "Variáveis de nível de aplicação.<HR>"
Response.Write "Var1: " & Application.Contents("Var1") & "<BR>"
Response.Write "Var2: " & Application.Contents("Var2") & "<BR>"
Response.Write "Hora do início da aplicação: " & Application.Contents("HoraDia") & "<BR>"
O comando Application.Contents("Var1"), retorna o valor da variável de aplicação Var1, O comando Application.Contents("Var2"), retorna o valor da variável de aplicação Var2 e assim por diante.
For Each elemento in Application.Contents
Considere a Listagem 8.6, onde fazemos uso do operador For Each...Next para exibir o nome de todos os itens da coleção Contents do objeto Application.
Listagem 8.6 – Acessando os elementos da coleção Contents – contents.asp.
10 For Each elemento in Application.Contents
Ao carregarmos esta página no Internet Explorer, obtemos o resultado indicado na Figura 8.14.
Figura 8.14 Usando For Each...Next para exibir o nome dos elementos da coleção Contents.
Neste caso a página contents.asp faz parte da aplicação que utiliza o arquivo global.asa da Listagem 8.4. Observe que inclusive o elemento conn, o qual é um objeto do tipo Connection, faz parte da coleção Contents.
Poderíamos modificar a Listagem 8.6, para que além de exibir o nome de cada elemento, a mesma exibisse o valor de cada um dos elementos. Esta alteração está indicada na Listagem 8.7.
Listagem 8.7 – Exibindo o nome e o conteúdo dos elementos da coleção Contents.
18 <TD><% =Application.Contents(elemento)%></TD>
Ao carregarmos esta nova versão da página, no Internet Explorer, obtemos o resultado indicado na Figura 8.15.
Figura 8.15 Usando For Each...Next para exibir o nome e o conteúdo dos elementos da coleção Contents.
Application.StaticObjects(Chave)
For Each elemento in Application.StaticObjects
Na Tabela 8.3 temos a descrição dos métodos do objeto Application.
Contents.Remove O método Application.Contents.Remove exclui um item de uma coleção. O método Contents.Remove considera uma sequência de caracteres ou um inteiro como um parâmetro de entrada. Se o parâmetro de entrada for uma seqüência de caracteres, o método pesquisará a coleção Contents para localizar um item com esse mesmo nome e o removerá. Se o parâmetro de entrada for um inteiro, o método contará o número de itens equivalente a partir do início da coleção e removerá o item correspondente.
Contents.RemoveAll O método Application.Contentes.RemoveAll remove todos os itens que foram adicionados à coleção Application.Contents
Lock O método Lock impede que outros clientes modifiquem as variáveis armazenadas no objeto Application, garantindo que apenas um cliente de cada vez possa alterar ou acessar as variáveis do objeto Application. Se o método Unlock não for chamado explicitamente, o servidor desbloqueará o objeto Application bloqueado quando o arquivo .asp for concluído ou atingir seu tempo limite - TimeOut.
Unlock O método Unlock permite que outros clientes modifiquem as variáveis armazenadas no objeto Application após ele ter sido bloqueado usando o método Lock. Se você não chamar explicitamente esse método, o servidor Web desbloqueará o objeto Application quando o arquivo .asp for concluído ou atingir seu tempo limite - TimeOut.
Tabela 8.3 Os métodos do objeto Application.
Application.Contents.Remove(Nome_da_Variável)
No exemplo a seguir são adicionadas três variáveis em nível de aplicação. Depois utilizamos o método Contents.Remove para remover uma das variáveis.
Application("Nome") = Request.Form("nome")
Application("Idade") = Request.Form("idade")
Application("ValorDolar") = 1.72
Application.Contents.Remove(Idade)
No exemplo a seguir são adicionadas três variáveis em nível de aplicação. Depois utilizamos o método Contents.RemoveAll para remover todas as variáveis, inclusive variáveis que tenham sido adicionadas em outras páginas ASP da aplicação, ou através do arquivo global.asa.
A sintaxe para o método Lock é a seguinte:
No exemplo a seguir, o método Lock impede que mais de um cliente acesse a variável NumVisitantes ao mesmo tempo. Se o aplicativo não tivesse sido bloqueado, dois clientes poderiam tentar incrementar a variável NumVisitantes simultaneamente.
Application("NumVisitantes") = Application("NumVisitantes") + 1
Application("DataUltimaVisita") = Now()
Response.Write "Esta aplicação já foi visitada: "
= Application("NumVisitantes")
Response.Write " vezes!"
A sintaxe para o método UnLock é a seguinte:
No exemplo a seguir, o método Unlock libera o objeto bloqueado para que o próximo cliente possa incrementar NumVisitantes.
Application("NumVisitantes ") = Application("NumVisitantes ") + 1
Application("DataUltimaVisita ") = Now()
O método Lock do aplicativo é cumulativo, significando que se o mesmo script chamar Lock várias vezes, ele também deverá chamar Unlock o mesmo número de vezes para liberar totalmente o aplicativo. Se isso não ocorrer, o bloqueio do aplicativo será mantido até que o script termine de executar.
Com isso encerramos o estudo do objeto Application. Conforme podemos ver as possibilidades são muitas. Podemos criar variáveis que estarão acessíveis para todos os usuários da aplicação (semelhante ao conceito de variável global nas aplicações tradicionais), podemos criar objetos, como por exemplo um objeto Connection, de tal forma que qualquer página ASP da aplicação possa utilizar o objeto Connection, sem que para isso o mesmo tenha que ser criado em cada página.