ASP를 사용하여 가상 커뮤니티, 온라인 쇼핑 및 기타 프로그램을 작성할 때 Application 및 Session 개체가 결정적인 역할을 하며 유연하고 합리적으로 사용할 수 있습니다.
이 개체는 프로그램 품질을 향상시키는 열쇠입니다. 이 분야에 대한 나의 경험을 바탕으로 ASP에 내장된 두 개체에 대해 자세히 소개하겠습니다.
1. Application 객체의 멤버 개요
응용 프로그램 개체 멤버에는 응용 프로그램 개체 컬렉션, 메서드 및 이벤트가 포함됩니다.
⒈응용 프로그램 개체 모음
콘텐츠 컬렉션: <OBJECT> 요소를 사용하여 정의되지 않은 Applicaiton 개체에 저장된 모든 변수의 컬렉션입니다.
StaticObjects: <OBJECT> 요소를 사용하여 정의된 Application 개체에 저장된 모든 변수의 모음입니다.
예: default.asp에 다음 할당이 있습니다.
애플리케이션(a)=a
애플리케이션(b)=128
애플리케이션(c)=false
그 다음에는 콘텐츠 컬렉션이 있습니다.
application.contents(1)=a '는 application.contents(a)=a로 쓸 수도 있습니다.
application.contents(2)=128 'application.contents(b)=128로 쓸 수도 있습니다.
application.contents(3)=false '는 application.contents(c)=false로도 쓸 수 있습니다.
여기서 저자는 호출 시 application.contents(a)와 같은 메소드를 사용할 것을 권장합니다. 일련번호로 표시하면 더 직관적이기 때문입니다.
할당 순서를 고려하십시오.
⒉응용 객체의 방법
Contents.Remove(변수 이름): Application.Contents 컬렉션에서 지정된 변수를 삭제합니다.
Contents.RemoveAll(): Application.Contents 컬렉션의 모든 변수를 삭제합니다.
Lock(): 현재 ASP 페이지만 콘텐츠에 액세스할 수 있도록 Application 개체를 잠급니다.
Unlock(): 애플리케이션 객체 잠금 해제
예: default.asp에서:
애플리케이션(a)=a
애플리케이션(b)=128
애플리케이션(c)=false
response.write application.contents(1)&<br>
response.write application.contents(2)&<br>
response.write application.contents(3)&<br>
response.write b 제거 후:
application.contents.remove(b)
response.write application.contents(1)&<br>
response.write application.contents(2)&<br>
실행 결과:
에이
128
거짓
b를 제거한 후:
에이
거짓
컬렉션의 모든 변수를 삭제하려면 application.contents.removeall을 사용하면 됩니다. Lock 및 Unlock 메소드는 실제로 자주 사용됩니다.
독자도 잘 알고 있으니 여기서는 부담이 되지 않을 것이다.
⒊어플리케이션 객체 이벤트
OnStart: 서버에 처음 접속한 사용자가 처음으로 페이지에 접속할 때 발생
OnEnd: 마지막 사용자의 세션이 종료되고 해당 세션의 OnEnd 이벤트에 대한 코드가 모두 실행되었거나 마지막 사용자가 접속한 경우에 발생합니다.
서버는 아무도 서버에 액세스하지 않는 일정 시간(보통 20분) 후에 발생합니다.
응용 프로그램 개체의 OnStart 및 OnEnd 이벤트에서 수행할 작업을 정의하려면 Global.asa 파일에 코드를 작성해야 합니다(아래 예).
그리고 파일을 사이트의 루트 디렉터리(보통 Inetpubwwwroot)에 넣습니다.
2. Session 개체의 구성원 개요
Session 개체의 멤버에는 Application 개체보다 하나 이상의 특성(컬렉션, 속성, 메서드 및 이벤트)이 있습니다.
⒈Session 객체 수집
내용: <OBJECT> 요소를 사용하여 정의되지 않은 특정 세션 개체에 저장된 모든 변수의 모음입니다.
StaticObject: <OBJECT> 요소를 사용하여 정의되고 Session 개체에 저장되는 모든 변수의 컬렉션입니다.
예: default.asp에 다음 할당이 있습니다.
세션(a)=a
세션(b)=128
세션(c)=false
그 다음에는 콘텐츠 컬렉션이 있습니다.
session.contents(1)=a '는 session.contents(a)=a로도 쓸 수 있습니다.
session.contents(2)=128 ' session.contents(b)=128 로도 쓸 수 있습니다
session.contents(3)=false '는 session.contents(c)=false로도 쓸 수 있습니다.
⒉Session 객체의 속성
코드페이지: 읽기/쓰기 가능. 정수 유형. 브라우저에 페이지 콘텐츠를 표시하는 데 사용되는 코드 페이지를 정의합니다. 코드 페이지는 다양한 언어에서 사용하는 숫자 값의 문자 집합입니다.
다른 코드 페이지. 예를 들어, ANSI 코드 페이지는 1252, 일본어 코드 페이지는 932, 중국어 간체 코드 페이지는 936입니다.
LCID: 읽기/쓰기 가능. 정수 유형. 브라우저로 전송되는 페이지 로케일 식별자를 정의합니다. LCID는 지역을 고유하게 식별하는 국제 표준 약어입니다.
2057은 현재 지역의 통화 기호를 £로 정의합니다.
세션ID: 읽기 전용입니다. 롱타입. 이 세션의 세션 식별자를 반환합니다. 세션이 생성될 때마다 서버에서 자동으로 식별자를 할당합니다. 그것을 기반으로 할 수 있습니다
값은 두 사용자 중 서버에 먼저 액세스하는 사용자를 결정합니다.
시간 초과: 읽기/쓰기 가능. 정수 유형. 세션에 대한 시간 초과 제한을 분 단위로 정의합니다. 이 시간 내에 사용자가 새로 고치거나 요청하지 않는 경우
웹 페이지에서 사용자가 생성한 세션은 자동으로 종료됩니다. 기본값은 20입니다.
위의 속성은 실제 애플리케이션에서는 거의 사용되지 않으며 기본적으로 수정할 필요가 없습니다.
⒊Session 객체의 메소드
Contents.Remove(변수 이름): Session.contents 컬렉션에서 지정된 변수를 제거합니다.
Contents.Removeall(): Session.contents 컬렉션의 모든 변수를 제거합니다.
Abandon(): 현재 사용자 세션을 종료하고 현재 세션 개체를 삭제합니다.
Session 객체의 Contents.Remove(변수명), Contents.Removeall() 메소드는 기본적으로 Application 객체와 동일합니다.
이해를 돕기 위해 위의 예를 참조하여 Application을 Session으로 변경할 수 있습니다. 여기서 설명하고 싶은 것은 Contents.Removeall() 과 Abandon() 입니다.
차이점은 이 두 가지 방법을 실행하면 현재
사용자 세션의 모든 세션 변수. 차이점은 Contents.Removeall()이 현재 세션을 종료하지 않고 단순히 세션 변수의 값을 해제한다는 것입니다.
Session 변수를 해제하는 것 외에도 Abandon()은 세션을 종료하고 Session_OnEnd 이벤트를 트리거합니다. 둘 사이의 차이점에 주의하시기 바랍니다.
⒋Session 객체의 이벤트
OnStart: ASP 사용자 세션이 생성될 때 트리거됩니다. 이 이벤트는 사용자가 이 서버에서 페이지를 요청하면 생성됩니다.
OnEnd: ASP 사용자 세션이 종료될 때 트리거됩니다. 이 이벤트는 Abandon() 메서드 또는 시간 초과가 사용될 때도 트리거됩니다.
이 두 이벤트는 Application의 OnStart 및 OnEnd 이벤트와 동일하며 Global.asa 파일에 배치되어야 합니다.
이 네 가지 이벤트의 사용법을 집중적으로 연구해 봅시다.
3. 글로벌.asa
ASP의 응용 프로그램 및 세션 개체는 다른 ASP 내장 개체에는 없는 기능, 즉 이벤트를 구현합니다. 방문자가 서버에 접속할 때마다
OnStart 이벤트(첫 번째 방문자는 애플리케이션과 세션의 OnStart 이벤트를 동시에 트리거하지만 애플리케이션이 세션보다 우선함), 각 방문자
각 세션이 종료되면 OnEnd 이벤트가 트리거됩니다. (마지막 게스트 세션이 종료되면 Application과 Session 모두의 OnEnd 이벤트가 트리거되지만,
세션이 신청보다 우선합니다).
OnStart 및 OnEnd 두 이벤트는 일반적으로 가상 커뮤니티에서 온라인 사용자 수를 계산하고 사용자의 온라인 및 오프라인 상태를 수정하는 데 사용됩니다. 이 두 가지를 구체적으로 정의하려면
파일을 저장하려면 Global.asa 파일에 코드를 작성하고 해당 파일을 사이트의 루트 디렉터리(기본값은 Inetpubwwwroot)에 두어야 합니다. 게다가,
애플리케이션 및 세션 개체는 다른 ASP 내장 개체(응답, 요청,
서버, 세션...)을 사용할 수 없습니다. 다음은 이 두 가지 이벤트를 활용하는 방법을 설명하기 위해 가상 커뮤니티에서 온라인에 있는 사람 수를 계산하는 예입니다.
파일 설명:
global.asa는 d:Inetpubwwwroot 디렉터리에 있습니다.
default.asp는 가상 커뮤니티 로그인 페이지인 d:Inetpubwwwroot 디렉터리에 있습니다.
login.asp는 d:Inetpubwwwroot 디렉터리에 있으며 사용자가 입력한 사용자 이름과 암호를 검색하는 데 사용됩니다.
index.asp는 가상 커뮤니티 홈페이지인 d:Inetpubwwwroot 디렉터리에 있습니다.
bbs.mdb는 d:Inetpubwwwroot 디렉터리에 위치하며 사용자 정보를 저장하는 데이터베이스입니다.
데이터베이스(액세스) 구조:
===bbs 테이블===
id 사용자 ID, 긴 정수
이름 사용자 이름, 텍스트 유형
코드 비밀번호, 텍스트 유형
온라인 온라인 상태, 예/아니요
===글로벌.asa===
<스크립트 LANGUAGE=VBScript RUNAT=서버>
하위 애플리케이션_OnStart
신청(온라인)=0
서브 끝
하위 애플리케이션_OnEnd
차 서브
SubSession_OnStart
서브 끝
SubSession_OnEnd
if session.contents(pass) then '로그인한 사용자의 Session_OnEnd인지 확인합니다.
애플리케이션.잠금
애플리케이션(온라인)=애플리케이션(온라인)-1
응용 프로그램.잠금 해제
종료하면
서브 끝
</스크립트>
==============
===login.asp===
...'비밀번호 확인, 데이터베이스에 접속하여 사용자가 입력한 사용자 이름과 비밀번호가 올바른지 확인합니다.
비밀번호 확인이 통과되면
세션(이름)=rs(이름)
세션(id)=rs(id)
세션(통과)=true
또 다른
RS.닫기
연결 닫기
response.write 비밀번호가 잘못되었습니다!
응답.끝
종료하면
애플리케이션.잠금
애플리케이션(온라인)=애플리케이션(온라인)+1
conn.Execute (update bbs set online=1 where id=&session(id))'사용자 상태를 온라인으로 설정
응용 프로그램.잠금 해제
RS.닫기
연결 닫기
response.redirect index.asp '데이터 초기화 후 커뮤니티 홈페이지로 이동
===========
이 예에서는 애플리케이션(온라인) 변수를 사용하여 커뮤니티에 로그인한 온라인 사용자 수를 기록합니다. 사용자가 서버에 액세스하면 사용자가 로그인했는지 여부는 중요하지 않기 때문입니다.
로그인 시 OnStart 이벤트가 발생하므로 OnStart 이벤트에서 Applicaiton(online)을 1개 늘릴 수 없습니다. 로그인한 사용자의 세션인지 여부에 관계없이
OnEnd 이벤트는 종료 시 생성됩니다(방문자가 서버를 방문했지만 커뮤니티에 로그인하지 않은 경우 세션 종료 후에도 OnEnd 이벤트가 생성됨).
Session_OnEnd 이벤트에 if 문을 사용하여 로그인한 사용자에 대한 OnEnd 이벤트인지 여부를 확인하면 온라인에 있는 사람 수가 한 명씩 줄어듭니다.
이는 온라인에 있는 사람 수를 계산하는 간단한 예일 뿐입니다. 이 경우 온라인에 있는 사람 수를 계산하는 것만으로는 충분하지 않습니다.
데이터베이스에는 사용자의 온라인 상태를 기록하는 데 사용되는 온라인 필드가 있습니다. 사용자가 로그인하면 login.asp에서 online이 1로 설정되지만 사용자가 오프라인일 때는 나타나지 않습니다.
온라인은 0으로 설정되어 있습니다. 이를 개선하려면 Session_OnEnd 이벤트를 수정하고 이 이벤트에서 온라인을 0으로 설정해야 합니다.
===loal. sas===
<스크립트 LANGUAGE=VBScript RUNAT=서버>
하위 애플리케이션_OnStart
신청(온라인)=0
애플리케이션(conn)=Server.CreateObject(ADODB.Connection) 설정
application(db)=Server.MapPath( bs.mdb) '여기에서는 아래에 설명된 대로 절대 경로 bs.mdb를 사용하는 것이 가장 좋습니다.
서브 끝
하위 애플리케이션_OnEnd
응용프로그램(conn)=아무것도 설정하지 않음
서브 끝
SubSession_OnStart
서브 끝
SubSession_OnEnd
if session.contents(pass) then '로그인한 사용자의 Session_OnEnd인지 확인합니다.
application(con).open =driver={Microsoft Access Driver(*.mdb)};dbq=&application(db)
애플리케이션.잠금
애플리케이션(온라인)=애플리케이션(온라인)-1
application(con).Execute(온라인으로 설정된 친구 업데이트=0, 여기서 id=&session.contents(id))
응용 프로그램.잠금 해제
애플리케이션(콘).닫기
종료하면
서브 끝
</스크립트>
==============
이 시점에서 완전한 코드가 완성되었습니다. Application과 Session의 OnEnd 이벤트에서는 Server 객체를 사용할 수 없기 때문에 데이터베이스의
서버의 연결 및 데이터베이스(d:inetpubwwwroot bs.mdb)의 물리적 주소는 응용 프로그램 변수에 저장되며
Application_OnStart 이벤트에서 전처리됩니다. 마찬가지로 Session_OnEnd 이벤트에서도 session.contents 대신 session(pass)를 사용할 수 없습니다.
(통과) (자세한 설명은 아래 참조).
4. 이 기사의 예에서 주목할 만한 두 가지 사항
OnEnd 이벤트의 ⒈session.contents
이제 막 global.asa에 접속하기 시작한 친구들은 위의 Session_OnEnd 이벤트를 자주 언급합니다.
session.contents(pass)인 경우 다음과 같이 작성됩니다.
세션(통과)이면,
이 경우 시스템에서는 오류 메시지가 표시되지 않지만 그 이후의 콘텐츠는 절대 실행되지 않습니다. 이는 OnEnd 이벤트에서 Session 개체를 사용할 수 없기 때문입니다.
그러나 세션 변수는 세션 개체 컬렉션을 사용하여 호출할 수 있습니다. IIS에서는 오류 메시지가 표시되지 않았기 때문에 작성자는 이에 대해 많은 시간을 낭비한 적이 있습니다.
사이. 모두가 이것으로부터 배울 수 있기를 바랍니다!
⒉Application_OnStart 이벤트에서 데이터베이스의 물리적 주소를 얻기 위해 Server.MapPath를 사용할 때 절대 주소를 사용해야 이 문제를 설명할 수 있습니다.
실험을 해보겠습니다. 위의 Application_OnStart 이벤트를 변경해 보세요.
application(db)=Server.MapPath( bs.mdb)는 다음과 같이 변경됩니다.
애플리케이션(db)=Server.MapPath(bbs.mdb)
그런 다음 d:inetpubwwwroot 디렉터리에 테스트 하위 디렉터리를 만들고 테스트 디렉터리에 temp.asp를 작성합니다.
====test.asp====
<%response.write 애플리케이션(db)%>
================
그런 다음 temp.asp를 복사하여 루트 디렉터리(d:inetpubwwwroot)에 배치합니다. 메모장으로 global.asa를 연 다음 두 개의 브라우저(브라우저 A)를 엽니다.
주소 http://localhost/temp.asp를 입력하고 Enter를 누르면 브라우저에 다음이 출력됩니다.
d:inetpubwwwroot bs.mdb
그런 다음 메모장 창에서 파일 메뉴를 클릭하고 저장을 선택한 다음(global.asa의 수정 시간을 변경하여 IIS가 모든 서비스를 다시 시작하도록 함)를 클릭합니다.
브라우저 B에 주소 http://localhost/test/temp.asp를 입력하고 Enter를 누르십시오. 브라우저의 출력은 다음과 같습니다.
d:inetpubwwwrootestbs.mdb
global.asa 파일은 사이트 루트 디렉터리에 위치하지만, server.mappath에 상대 주소를 사용하면 Application_OnStart가 실행됩니다.
이벤트 사용자가 처음 방문한 페이지가 루트 디렉터리에 속하지 않는 경우 데이터베이스의 물리적 주소를 얻는 것은 예상한 결과가 아닐 것이므로 각별히 주의하시기 바랍니다.