제대로 작동하려면 서버의 가상 응용 프로그램에 배치해야 하며, 제공된 global.asa 파일은 응용 프로그램의 루트 디렉터리에 배치되어야 합니다. 가장 간단한 방법은 global.asa 파일을 기본 웹 사이트의 루트 디렉터리(기본적으로 C:/InetPub/WWWRoot)에 넣는 것입니다.
나중에 복원할 수 있도록 기존 global.asa 파일의 이름을 바꾸는 것이 좋습니다.
1. 응용 프로그램 컬렉션의 내용 표시
ASPCounter 개체는 StaticObjects 컬렉션(<OBJECT> 요소를 통해 정의됨)의 멤버이지만 나머지(Server.CreateObject에 의해 인스턴스화됨)는 Contents 컬렉션의 멤버입니다.
앞에서 본 global.asa 예제 웹 페이지를 사용하여 이러한 컬렉션에 입력된 값을 볼 수 있습니다.
<!-- 다음을 사용하여 ASPCounter 구성 요소의 인스턴스를 선언합니다.
애플리케이션 수준 범위 //-->
<객체 ID=”ASP카운터” RUNAT=”서버” SCOPE=”응용 프로그램”
PROGID=”MSWC.카운터”>
</OBJECT>
...
...
<스크립트 언어=”VBScript” RUNAT=”서버”>
하위 Application_onStart()
'애플리케이션 수준 범위로 ADO 연결 인스턴스 생성
Application("ADOConnection") = Server.CreateObject("ADODB.Connection") 설정
Dim varArray(3) 'Variant 배열을 생성하고 채웁니다.
varArray(0) = "이것은"
varArray(1) = "변형 배열"
varArray(2) = "에 저장됨"
varArray(3) = "응용 프로그램 개체"
Application("Variant_Array") = varArray 'thd 응용프로그램에 저장
Application(“Start_Time”) = CStr(Now) '날짜/시간을 문자열로 저장
Application(“Visit_Count”) = 0 '카운터 변수를 0으로 설정
서브 끝
...
...
</SCRIPT>
(1) Contents 컬렉션을 순회하는 코드는
For Each...Next 구조를 사용할 수 있습니다. 컬렉션의 각 항목은 간단한 Variant 유형 변수, Variant 배열 또는 개체에 대한 참조일 수 있습니다. 각 유형의 값은 다르게 처리되어야 하기 때문에 유형을 결정하려면 각 값을 확인해야 합니다.
VBScript의 VarType 함수를 사용하여 이 작업을 수행할 수 있습니다. 대신 IsObject 및 IsArray 함수를 사용하십시오.
Application.Contents의 각 objItem에 대해
IsObject(Application.Contents(objItem)) 그렇다면
Response.Write "개체 참조: '" & objItem & "'
"
ElseIf IsArray(Application.Contents(objItem)) Then
Response.Write "배열: '" & objItem & "' 내용은 다음과 같습니다.
"
VarArray = 애플리케이션.컨텐츠(objItem)
'참고: 다음은 1차원 배열에서만 작동합니다.
intLoop = 0인 경우 UBound(varArray)로
Response.Write “ Index(“ & intLoop & “) = “ & _
VarArray(intLoop) & “
"
다음
또 다른
Response.Write "변수: '" & objItem & "' = " _
& 애플리케이션.컨텐츠(objItem) & “
"
종료 조건
다음으로
프로그램이 Application 개체에서 이 배열을 검색하는 방법을 확인하세요. 이를 로컬(Variant) 변수에 할당하고 다음 문을 사용합니다.
varArray = Application.Contents(objItem)
UBound 함수를 사용하여 배열의 크기(요소 수)를 알아냅니다. 이 값은 종료 조건으로 사용할 수 있습니다. 순회용:
For intLoop = 0 UBound(varArray)
이 예는 1차원 배열이며 그러한 배열의 내용만 표시합니다. 다차원 배열을 처리하기 위해 필요에 따라 코드를 편집합니다. 예:
For intLoop = 0 To UBound(varArray)
IntNumberOfDimensions = UBound(varArray, 1)
intDimension = 0의 경우 intNumberOfDimensions로
Response.Write “ Index(“ & intLoop & “) = “ _
& varArray(intLoop, intDimension)
다음
응답.쓰기 ""
다음
(2) StaticObjects 컬렉션을 탐색하기 위한 코드
StaticObjects 컬렉션에는 global.asa의 <OBJECT> 요소를 사용하여 선언된 모든 개체 참조가 포함되어 있습니다. 각 항목은 개체 변수이므로 더 간단한 코드로 배열을 반복할 수 있습니다. 원래 ID 속성에 정의된 대로 개체의 이름을 출력합니다.
For Each objItem in Application.StaticObjects
IsObject(Application.StaticObjects(objItem)) 그렇다면
Response.Write "<OBJECT> 요소: ID='" & objItem & "'
"
종료 조건
다음
2. 컬렉션 작업
1) Contents
컬렉션에 값을 추가합니다. Contents 컬렉션에 값을 추가하는 방법은 global.asa 웹 페이지의 스크립트 코드에서 사용되는 것과 동일합니다. 제안된 이름 및 값(필요에 따라 편집 가능)을 사용하여 새 Variant 값을 Application 개체에 추가하고, 단추를 클릭하고, 페이지를 다시 로드하고, Application.Contents 컬렉션에 값을 추가하고, 목록에 표시할 수 있습니다. .
샘플 웹 페이지의 양식에 모든 버튼과 기타 HTML 컨트롤을 배치하려면
새 콘텐츠 항목에 대한 코드를 추가하세요
.ACTION은 현재 웹페이지의 경로를 설정하고 양식이 제출되면 이를 다시 로드합니다. METHOD 특성은 "POST"이므로 컨트롤의 값이 Request.Form 컬렉션에 나타납니다. 이 두 기술은 이전 장에서 사용되었습니다:
<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
이 양식의 버튼은 일반 HTML INPUT 컨트롤이며 동일한 제목을 갖습니다. (공백 3개) 이름이 다릅니다. 예를 들어 첫 번째 버튼을 생성하는 코드(Application 개체에 값 추가)는 다음과 같습니다.
<INPUT TYPE="SUBMIT" NAME="cmdAdd" VALUE="">
웹 페이지를 다시 로드할 때 Request.Form 컬렉션을 확인하세요. , 어떤 SUBMIT 버튼을 클릭했는지 확인하고 그에 따라 처리하십시오. Application 개체에 값을 추가하는 버튼인 경우(HTML <INPUT> 요소에서 버튼 이름이 cmdAdd임) 다음 프로그램 세그먼트를 사용합니다.
If Len(Request.Form("cmdAdd")) Then
strVarName = Request.Form("txtVarName")
strVarValue = Request.Form("txtVarValue")
응용프로그램.잠금
애플리케이션("strVarName") = strVarValue
응용 프로그램.잠금 해제
End If
응용 프로그램이 Application.Lock 및 Application.Unlock 메서드를 사용하여 두 사용자가 동시에 액세스하여 이러한 값을 혼동하지 않도록 하는 방법에 유의하세요. 특정 값만 설정하는 경우에는 일반적으로 불가능합니다. 그러나 항상 Lock 및 Unlock 메서드를 사용하는 것이 현명합니다.
2) Contents 컬렉션에서 값을 삭제합니다
(앞에서 했던 것처럼). Contents 컬렉션을 순회하여 ASP 웹페이지를 실행할 때 이 목록을 만듭니다. 그러나 우리는 각 항목의 이름만 수집하여 <SELECT> 목록 요소 내의 <OPTION> 요소에 넣습니다.
…
<이름 선택=”lst제거” 크기=”1”>
<%
Application.Contents의 각 objItem에 대해
Response.Write “<OPTION>” & objItem & “</OPTION>”
다음
&>
</선택>
…
ASP 코드가 실행된 후 브라우저에 표시되는 결과는 다음과 같습니다.
<SELECT NAME="lstRemove" SIZE="1">
<OPTION>ADO연결</OPTION>
<OPTION>변형_배열</OPTION>
<OPTION>시작_시간</OPTION>
<OPTION>방문횟수</OPTION>
<OPTION>My_New_Value</OPTION>
</SELECT>
(1) 단일 값 삭제
단일 값을 삭제하기 위해 버튼을 클릭하면 양식이 다시 동일한 웹 페이지에 제출되지만 이번에는 cmdRemoveThis에 대한 SUBMIT 버튼이 설정되고 Remove Application.Contents 컬렉션의 메서드가 호출됩니다.
If Len(Request.Form("cmdRemoveThis")) Then
strToRemove = Request.Form("lstRemove")
Response.Write "strToRemove = " & strToRemove
응용프로그램.잠금
애플리케이션.컨텐츠.제거(strToRemove)
응용 프로그램.잠금 해제
End If
이는 Application 개체가 아니라 Contents 컬렉션의 메서드입니다. 구문은 Application.Remove가 아니라 Application.Contents.Remove입니다.
Contents 컬렉션에서 Start_Time 값을 제거한 결과입니다.
(2) 모든 값을 삭제합니다.
세 개의 SUBMIT 유형 버튼 중 마지막버튼
을 클릭하면 웹 페이지의 코드는 클릭한 버튼이 cmdRemoveAll임을 감지하고 Application.Contents 컬렉션의 RemoveAll 메서드를 실행합니다.
Request.Form("cmdRemoveAll")) 그런 다음
응용프로그램.잠금
응용 프로그램.컨텐츠.모두 제거
응용 프로그램.잠금 해제
End If는
이것이 Application이 아닌 Contents 컬렉션의 메소드임을 다시 한번 상기시켜줍니다. 구문은 Application.RemoveAll이 아니라 Application.Contents.RemoveAll입니다.