ASP 강의 3: 애플리케이션 개체와 세션 개체
저자:Eve Cole
업데이트 시간:2009-05-30 19:58:17
이전 강의에서는 Request 객체의 Form 데이터 수집, QueryString 데이터 수집, ServerVariables 데이터 수집에 대해 배웠습니다. 다음에 소개할 Application 객체는 상대적으로 추상적이고, 처음 이해했을 때 사물을 구별하지 못할 수도 있으므로, 다음 연구를 계속하기 전에 먼저 긴장을 푸는 것이 좋습니다. 기억하세요: 그것을 찾을 수 없다면, Application 객체가 무엇인지 너무 많이 생각하지 마세요. 오래된 속담처럼 먼저 사용하는 법을 배우십시오.
1. 애플리케이션 객체를 이해합니다. 정신을 차리려면 카운터 루틴을 살펴보겠습니다(이해하려면 실행해야 합니다).
먼저 wuf16.htm 파일을 편집합니다.
<html>
<본문>
페이지 클릭수 기록의 예: <a href="wuf17.asp">wuf17.asp</a>
</body>
</html>
wuf17.asp의 코드는 다음과 같습니다.
<% @LANGUAGE = VBScript %>
<% 'wuf17.asp - 특정 페이지에 대한 방문 횟수를 기록합니다(카운터 원칙).
옵션 명시적
Dim CountWeb
CountWeb = Request.ServerVariables("SCRIPT_NAME")
'이렇게 하면 혼동을 피하기 위해 각 페이지에 고유한 변수가 있습니다.
%>
<HTML><BODY>
<%
Response.Write CountWeb & "<Br><Br>" & vbcrlf
Application.Lock '설명을 읽어주세요.
Application(CountWeb) = Application(CountWeb) + 1 'Accumulator, 클릭수에 1을 더함
응용 프로그램.잠금 해제
Response.Write "웹 서버가 종료되고 다시 시작되기 전에 이 페이지에서 발생한 총 클릭 수는 다음과 같습니다. " & Application(CountWeb)
%>
</BODY></HTML>
이 프로그램을 실행할 때 대부분의 사람들에게는 웹 서버와 클라이언트라는 하나의 컴퓨터만 있습니다. 그렇다면 이런 상황을 상상할 수밖에 없습니다. 두 개의 홈페이지 파일이 멀리 떨어진 웹 서버에 있고, 수많은 국내외 사용자가 브라우저를 통해 해당 파일에 액세스하고 있습니다. 각 사용자가 클릭하면 Application(CountWeb)의 값이 1씩 증가하며, wuf17.asp 파일이 저장된 서버가 종료되지 않는 한 Application(CountWeb)은 계속해서 누적됩니다. 그러나 서버가 종료되었다가 다시 시작되면 Application(CountWeb)이 다시 0부터 계산되기 시작합니다(혼란스럽습니다. 페이지 방문 횟수가 왜 항상 한 자리인지 설명했습니다). 항상 0부터 시작하는 이런 카운팅 상황을 피하기 위해서는 서버가 종료되기 전에 Application(CountWeb)의 값을 저장했다가 다음에 필요할 때 꺼내서 순차적으로 누적할 수 있도록 해야 합니다. 그러기 위해서는 N번 후에 Decompose를 들어주세요.
다음 질문은 Application.Lock 및 UnLock이 무엇을 의미합니까? 우리는 단지 많은 수의 사용자가 페이지를 방문하고 각 사용자의 클릭으로 인해 Application(CountWeb)이 1씩 증가한다고 가정했습니다. 생각해보면 이것이 엉망이 되지 않을까요? 생각하지 마세요. 당신이 틀림없이 (홈페이지를 후원하는 사람은 당신뿐입니다) 선착순 규칙이 있어야합니다. 사용자가 페이지를 방문하여 Application(CountWeb)의 값을 수정해야 하는 경우 다른 사용자가 수정하지 못하도록 Lock 메소드를 사용하여 수정이 완료된 후 잠금을 해제합니다.
위의 예에서 Application 개체가 모든 사용자에게 공유 정보(Application(CountWeb))를 제공하고 모든 사용자를 대상으로 한다는 것을 보셨나요(각 사용자의 액세스로 인해 카운터가 1씩 증가함). Application 개체에는 Application_OnStart 이벤트와 Application_OnEnd 이벤트라는 두 가지 이벤트도 있습니다(혼동하지 마십시오. 이는 개체 지향 프로그래밍 언어의 시작 개념일 뿐입니다). 이를 사용할 때의 구문은 다음과 같습니다.
<SCRIPT LANGUAGE=VBScript RUNAT=서버>
하위 애플리케이션_OnEnd
'웹 서버가 닫히면 Application_OnEnd 이벤트가 활성화됩니다.
'즉, 프로그램은 여기에 배치된 코드를 실행합니다.
'따라서 서버가 종료되기 전에 여기서 wuf17.asp의 Application(CountWeb) 값을 변경할 수 있습니다.
'텍스트 파일 등으로 저장하세요.
서브 끝
하위 애플리케이션_OnStart
'첫 번째 사용자가 ASP 웹 페이지를 탐색하면 Application_OnStart 이벤트가 활성화되지만 나중에 다른 사용자가 탐색할 때는 이 이벤트가 발생하지 않습니다.
'즉, 프로그램은 여기에 배치된 코드를 실행합니다.
'그래서 텍스트 파일에 저장된 Application(CountWeb)의 값을 여기서 읽을 수 있습니다.
서브 끝
</SCRIPT>
다음은 이벤트를 사용하는 방법을 보여주는 예입니다. 이 프로그램의 기능은 사이트의 모든 페이지에 대한 총 클릭 수를 계산하는 것입니다.
wuf18.asp 파일의 코드(사이트의 다른 페이지 파일은 이 파일과 유사합니다):
<% @LANGUAGE = VBScript %>
<% 옵션 명시적
'사이트의 모든 페이지 파일에는 다음 문장이 포함되어야 합니다. <!--#include file="wuf19.asp"-->%>
<!--#include 파일="wuf19.asp"-->
<HTML><BODY>
서버가 종료되고 다시 시작되기 전 사이트의 모든 페이지에 대한 총 조회수: <%= Application("CountAll") %>
</BODY></HTML>
wuf19.asp 파일의 코드:
<% ' wuf19.asp
응용프로그램.잠금
Application("CountAll") = 응용프로그램("CountAll") + 1
응용 프로그램.잠금 해제
%>
wuf18.asp 및 wuf19.asp 파일은 동일한 디렉터리에 배치됩니다. global.asa 파일의 코드:
참고: 이벤트 핸들러는 "global.asa"라는 텍스트 파일로 저장해야 하며 가상 경로의 루트 디렉터리(일반적으로 index.htm 또는 default.htm 파일과 동일한 디렉터리에 있어야 합니다. 예: 내 컴퓨터를 예로 들어 보겠습니다. 절대 경로 측면에서 global.asa는 c:InetPubhome에 배치되고 wuf18.asp 및 wuf19.asp는 c:InetPubhomeasp에 배치됩니다. 경로만 global.asa 파일이 존재하도록 허용됩니다.
<SCRIPT LANGUAGE=VBScript RUNAT=서버>
'global.asa - wuf18.asp 다운로드 패키지의 파일 이름은 18global.asa이며, 사용 시 이름을 바꿔야 합니다.
하위 애플리케이션_OnStart
'첫 번째 사용자가 웹 페이지를 탐색할 때 카운터의 초기 값을 0으로 설정합니다.
'나중에 다른 사용자가 탐색할 때 다음 코드는 더 이상 실행되지 않습니다.
응용프로그램.잠금
애플리케이션("CountAll") = 0
응용 프로그램.잠금 해제
서브 끝
</SCRIPT>
실행 결과를 보려면 wuf18.asp를 찾아보세요. Application 객체의 사용법만 익히는 것은 어렵지 않은 것 같습니다.
2. 세션 개체를 이해합니다. 이전 Application 개체를 예시로 사용하면 Session 개체가 훨씬 쉽습니다. 이는 단일 사용자와 관련된 정보를 기록하는 데만 사용된다는 점을 제외하면 Application 개체와 유사합니다. 단일 사용자를 대상으로 하므로 Session 개체를 사용하여 단일 사용자에 대한 정보를 저장할 수 있습니다.
Application 개체와 마찬가지로 Session 개체에도 Session_OnStart 이벤트와 Session_OnEnd 이벤트라는 두 가지 이벤트가 있습니다. 사용법 구문은 Application 객체와 유사합니다.
Session 개체를 사용하기 전에 브라우저의 쿠키 기능이 활성화되어 있는지 확인해야 합니다(기본 설정은 괜찮음).
다음은 예입니다. global.asa 파일에 대한 요구 사항은 위와 동일하므로 위 예의 global.asa는 이 예에서 global.asa로 덮어쓰여집니다.
<SCRIPT LANGUAGE=VBScript RUNAT=서버>
' global.asa - wuf20.asp 다운로드 패키지의 파일 이름은 20global.asa입니다.
SubSession_OnStart
Session("In") = Now 'Function Now는 현재 시간을 가져옵니다.
서브 끝
SubSession_OnEnd
세션("아웃") = 현재
응용프로그램.잠금
애플리케이션("아웃") = 세션("아웃")
애플리케이션("포함") = 세션("포함")
응용 프로그램("Out").잠금 해제
서브 끝
</SCRIPT>
파일 wuf20.asp:
<%@ 언어=VBScript %>
<HTML>
<본문>
<% 'wuf20.asp
Response.Write "기본 시간 초과 설정:" & Session.Timeout & "분<Br>"
세션.시간 초과 = 1
Response.Write "이 사이트에 들어간 시간:" & Session("In") & "<Br>"
응답.쓰기 "1분 후에 이 페이지를 새로 고치십시오" 및 "<Br><Br>"
if Not IsEmpty(Application("Out")) 다음
Response.Write "이 사이트에 마지막으로 들어간 시간:" & Application("In") & "<Br>"
Response.Write "마지막으로 이 사이트를 떠난 시간:" & Application("Out") & "<Br>"
응답.쓰기 "탐색 시간(분):" &_
Datediff("n",Application("In"),Application("Out")) & "<Br><Br>"
종료 조건
if IsEmpty(Session("Out")) 다음
Response.Write "새로 고침 전과 새로 고침 후의 Session(""Out"") 값이 비어 있습니다." & "<Br>"
종료 조건
%>
</BODY>
</HTML>
사용자가 웹 페이지를 처음 열 때 Session_OnStart 이벤트가 발생합니다. 그러나 이 시점에서는 Session_OnEnd 이벤트가 발생하지 않으므로 Application("Out")이 발생합니다. 값이 비어 있고 프로그램에 탐색 시간이 표시되지 않습니다.
우리는 Application 개체의 수명이 웹 페이지를 탐색하는 첫 번째 사용자부터 서버가 종료될 때까지라는 것을 알고 있습니다. Session 개체의 수명은 사용자가 처음으로 웹 페이지를 탐색할 때(세션 시작)부터 세션이 끝날 때까지입니다. 그럼 세션은 언제 끝나나요? 특히 이 예에서 Session.Timeout = 1은 세션 시간 초과를 1분으로 설정합니다. 즉, 1분 동안 웹 서버에 요청이 제공되지 않으면 세션 시간이 초과되어 세션이 종료되고 Session_OnEnd 이벤트가 발생합니다. 프로그램은 Session_OnEnd의 코드를 실행합니다. 여기서는 진입 및 종료 시간을 각각 Application("In") 및 Application("Out")에 입력합니다. 세션이 종료된 후에는 Session 개체가 더 이상 존재하지 않기 때문입니다. 코드 끝에서 이를 확인했습니다.
이 루틴에서 우리는 다음을 볼 수 있습니다:
1. 애플리케이션 개체와 세션 개체의 수명은 서로 다릅니다.
2. Session 개체는 단일 사용자를 위한 것이며 해당 값은 클라이언트에 저장됩니다. 다른 사용자가 탐색해도 단일 사용자 Session 개체에는 영향이 없습니다. 단일 사용자는 자신의 Session 개체(예: Session("In"))의 값만 읽고 쓸 수 있습니다.
3. Response.Write: (""Out"")에서 큰따옴표 표현을 확인하세요.
4. 특별 알림: 이 프로그램은 실용성이 없으며 디버깅 전용입니다(단 한 명의 사용자만 탐색하는 데 적합합니다). 왜 그런지 생각해 보세요. 답은 이 글의 마지막 부분에 있습니다.
팁: Application 개체의 특성에 주의하세요.
3. 전형적인 예: 웹 페이지에 온라인 인원 수를 표시하는 방법 다음 예에서는 온라인 인원 수를 저장하는 데 애플리케이션("Online")이 사용되고, 애플리케이션("CountAll")은 다음과 같이 사용됩니다. 총 방문자 수를 저장합니다.
원리: 신규 사용자가 웹 페이지를 탐색하면 Session_OnStart 이벤트가 발생하고 온라인 사용자 수가 1명 증가하고 방문 사용자 수도 1명 증가합니다. 사용자가 나가면 세션 시간이 초과된 후 Session_OnEnd 이벤트가 발생하고 온라인 인원이 1명 감소합니다.
Global.asa 코드는 다음과 같습니다.
<SCRIPT LANGUAGE=VBScript RUNAT=서버>
'Global.asa-wuf21.asp
하위 애플리케이션_OnStart
응용프로그램.잠금
'여기에서 Application("CountAll")의 초기 값을 읽습니다.
응용 프로그램.잠금 해제
서브 끝
SubSession_OnStart
응용프로그램.잠금
애플리케이션("온라인") = 애플리케이션("온라인") + 1
Application("CountAll") = 응용프로그램("CountAll") + 1
응용 프로그램.잠금 해제
서브 끝
SubSession_OnEnd
응용프로그램.잠금
Application("온라인") = Application("온라인") - 1
응용 프로그램.잠금 해제
서브 끝
하위 애플리케이션_OnEnd
응용프로그램.잠금
'Application("CountAll")은 여기 파일에 저장되어야 합니다.
응용 프로그램.잠금 해제
서브 끝
</SCRIPT>
Wuf21.asp 코드는 다음과 같습니다.
<%@ 언어=VBScript %>
<HTML>
<본문>
<%Session.Timeout = 5%>
<P>온라인 접속자 수: <%= Application("Online")%></P>
<P>총 방문자 수: <%= Application("CountAll")%></P>
</BODY>
</HTML>
이 루틴은 wuf17.asp와 비교되며 후자는 클릭 수를 계산하고 전자는 방문자 수를 계산합니다.
답변: Application 개체는 모든 사용자에게 적용되므로 다중 사용자의 경우 다른 사용자의 탐색도 Application("In") 및 Application("Out")의 값을 변경하게 됩니다.