http://www.tandol.pe.kr/study/?cmd=prt&lecture=asp&num=6
ASP 기본 개체
▶ Request
클라이언트로부터 무언가를 받아들일 때 사용하는 개체로 QueryString, Form, ServerVariables,Cookies등이 있다.
이미 사용한 QueryString, Form과 브라우져로부터 전송되는 Cookies는 제외하고 ServerVariables만 설명한다.
ServerVariables : 사용자의 접속환경을 알게 해주는 컬렉션이다. 주로 접속지의 IP주소나, 브라우져 종류등을 알아내기 위해 사용한다. 중요 환경 변수는 다음 표와 같다.
환경변수명 | 설명 |
CONTENT_LENGTH | 보내진 바이트수 |
CONTENT_TYPE | Request가 POST타입일때 컨텐츠 타입 보통 application/x-www-form-urlencode이다 |
GATEWAY_INTERFACE | CGI버전 |
LOCAL_ADDR | 서버의 IP 주소 |
PATH_INFO | 서버 파일 웹 경로 |
PATH_TRANSLATED | 서버 파일 실제 경로 |
QUERY_STRING | 주소줄의 ?뒤의 값 |
REMOTE_ADDR | 클라이언트 IP주소 |
REMOTE_HOST | 클라이언트 hostname(ip주소) |
REMOTE_USER | 서버에 인증받은 사용자 ID명 |
REQUEST_METHOD | 서버로 전송된 Method |
SCRIPT_NAME | 실행할 애플리케이션, 스크립트이름 |
SERVER_NAME | 서버이름 혹은 주소 |
SERVER_PORT | 서버 포트 |
SERVER_PORT_SECURE | Encrypt된 포트의 경우 1로된다. |
SERVER_PROTOCOL | 프로토콜과 버젼 |
SERVER_SOFTWARE | 웹서버 어플리케이션이름과 버젼 |
URL | 주소줄의 내용 |
HTTP_ACCEPT | 브라우져에서 받아들일수 있는 MIME타입 |
HTTP_ACCEPT_LANGUAGE | 브라우져 사용 언어 |
HTTP_HOST | tandol.pe.kr |
HTTP_USER_AGENT | 브라우져종류와 버젼등 |
HTTP_COOKIE | 쿠키값 |
모든 환경변수값을 출력하는 프로그램 [실행결과보기] |
<html> <head> <title> REQUEST 개체 </title> </head> <body> <table border=1> <tr><th>환경변수</th><th>값</th> <% for each item in request.servervariables for i=1 to request.servervariables(item).count response.write "<tr><td>" response.write item & "</td><td>" a = request.servervariables(item)(i) if a="" then a=" " response.write a & "</td></tr>" next next %> </table> </body> </html> |
환경변수 사용예 [실행결과보기] |
<html> <head> <title> 환경변수 사용예 </title> </head> <body> 당신의 웹 브라우져는 <%=request.ServerVariables("HTTP_USER_AGENT")%> 입니다.<br> 당신의 IP주소는 <%=request.ServerVariables("REMOTE_HOST")%> 입니다. </body> </html> |
▶Response
서버에서 클라이언트로 정보를 전달할때 사용하는 개체로서 지난 강의 때 이미 Write와 redirect메소드를 이용 하였다. 주로 이용하는 메소드,속성, 컬렉션을 정리하면 다음과 같다.
컬렉션 | |
Cookies | 브라우져로 전송도는 모든 쿠키값 |
속성(프로퍼티) | |
buffer | 페이지가 완성될때까지 버퍼할것인지 지정 |
charset | 문자셑 - 헤드에 덧붙여진다. |
ContentType | 컨텐츠 형식 기본값은 text/html이다. |
Expires | 브라우져에서 캐시완료 기간 |
메소드 | |
addHeader | http헤드를 추가 혹은 변경 |
clear | 버퍼된값을 삭제한다. buffer=true가 되어 있어야 한다 |
end | 스크립트수행을 중단한다. |
flush | 버퍼의 값을 즉시 전송한다. buffer설정되어 있어야 한다. |
reDirect | 다른url로 이동 |
write | 클라이언트로 전송 |
▶Application
서버의 모든 사용자가 전역변수 처럼 공유하는 개체이다. 메소드에는 lock과 unlock이 있다.
Application개체를 이용한 페이지 카운트 [실행결과보기] |
<html> <head> <title> 읽은 회수 카운트 </title> </head> <body> <% application.lock application("ReadCnt") = application("ReadCnt")+1 application.unlock %> 현재 문서를 읽은 회수는 <%=application("ReadCnt")%> </body> </html> |
▶Session
현재 서버에 접속된 사용자가 전역변수처럼 사용하는 개체이다.
Timeout속성은 세션의 유지시간으로 분단위이다. 예) session.timeout=10' 세션시간을 10분으로 설정
SessionID는 사용자마다 설정되는 ID로서 사용자정보를 따로 관리할때 사용된다.
주로 로그온상태등 접속자의 상태를 기억하는 용도로 사용 된다.
간단히 만들어본 로그온 페이지 [실행결과보기] |
sesnlogin.asp |
<html> <head> <title> Session이용 로그인 상태 표시 </title> </head> <body> <% response.expires=0 ' 웹브라우져의 캐시완료시간을 0으로 하여 항상 갱신을 한다. s = session("Login") if s="" then ' 세션이 설정되지 않음 %> <center> <h2>로그온 되어 있지 않습니다</h2> <form action="sesnlogin_ok.asp" method=post> <table> <tr><td>ID</td><td><input type=text name=id size=20></td></tr> <tr><td>비밀번호</td><td><input type=password name=pwd size=20></td></tr> </table> <input type=submit value="로그인"> <input type=button value=" 취소 " onclick="history.back()"> </form> 임시로 넣어둔 id는 kim, park, choi이고 비밀번호는 1234 <% else ' 세션이 설정 되어 있음 %> <h2><%=session("Login")%>(으)로 로그온 되었 습니다</h2> <input type=button value="로그 아웃" onclick="location.href='sesnlogout.asp'"> <% end if %> </body> </html> |
sesnlogin_ok.asp |
<% id = request.form("id") pwd = request.form("pwd") if id="kim" and pwd="1234" then session("Login")="김씨성" elseif id="park" and pwd="1234" then session("Login")="박씨성" elseif id="choi" and pwd="1234" then session("Login")="최씨성" else response.write "<script language='javascript'>" response.write "alert('잘못된 사용자이거나 비밀번호가 틀립니다');" response.write "history.back();" response.write "</script>" response.end end if response.redirect "sesnlogin.asp" %> |
sesnlogout.asp |
<% session("Login")="" response.redirect "sesnlogin.asp" %> |
▶Server
서버의 컴포넌트 개체를 이용할 때 사용하는 CreateObject, 웹 가상경로를 실제 물리적 경로로 바꾸어주는 MapPath, 스크립트의 실행 시간을 조절해주는 ScriptTimeout등이 있다.
ex)
set db = Server.CreateObject("ADODB.Connection")
dbPath = Server.MapPath("sample.mdb")
server.ScriptTimeout = 120 ' 스크립트 실행 시간을 최대 120초로 설정
FilesystemObject 컴포넌트
서버의 Text 파일을 조작할 수 있도록 한다.
Set fs = server.CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("테스트입니다.")
a.Close
CreateObject 함수는 FileSystemObject 개체(fs)를 만들고, CreateTextFile 메서드에서는 파일을 TextStream 개체(a)로 만들고, WriteLine 메서드에서는 만들어진 텍스트 파일에 텍스트 한 줄을 작성한다. 끝으로 Close 메서드에서 버퍼를 비운 다음 해당 파일을 저장하고 닫는다.
FileSystemObject 개체의 메서드는 다음과 같다.
메서드 | 기능 | 결과값 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
CopyFile 원본, 대상[, 덮어 쓰기] | 파일복사 | |||||||||
CopyFolder 원본, 대상[, 덮어 쓰기] | 폴더복사 | |||||||||
CreateFolder(폴더 이름) | 폴더 만들기 | |||||||||
CreateTextFile(파일 이름[, 덮어 쓰기]) | 파일을 만들고 TextStream개체를 생성 | TextStream 개체 | ||||||||
DeleteFile filespec[, force] | 파일삭제 force가 true이면 읽기전용 파일도 삭제된다. |
|||||||||
DeleteFolder folderspec[, force] | 폴더삭제 force가 true이면 읽기전용 폴더도 삭제된다. |
|||||||||
FileExists(filespec) | 파일 존재 여부 | true/false | ||||||||
FolderExists(folderspec) | 폴더 존재 여부 | true/false | ||||||||
GetAbsolutePathName(pathspec) | 정확한 경로명 구하기 | 문자열 | ||||||||
GetBaseName(경로) | 경로명에서 파일명만 추출 | 문자열 | ||||||||
GetExtensionName(pathspec) | 경로명에서 확장자만 추출 | 문자열 | ||||||||
GetFile(filespec) | 해당파일의 File 개체를 생성 | File 개체 | ||||||||
GetFileName(pathspec) | 해당 경로의 파일명 구하기 | 문자열 | ||||||||
GetFolder(folderspec) | 해당 경로의 Folder 개체를 생성 | Folder 개체 | ||||||||
MoveFile 원본, 대상 | 파일 이동 및 이름 변경 | |||||||||
MoveFolder 원본, 대상 | 폴더 이동 및 이름 변경 | |||||||||
OpenTextFile(파일 이름, iomode) | 파일을 열고 TextStream개체를 생성
|
TextStream 개체 |
TextStream개체의 메서드 및 속성
속성 및 메서드 | 기능 | 결과값 |
---|---|---|
AtEndOfLine | 파일 포인터가 TextStream 파일의 줄 끝 표식에 바로 접하여 있으면 참 | true/false |
AtEndOfStream | 파일 포인터가 TextStream 파일 끝에 있으면 참 | true/false |
Close | 파일 닫기 | |
Read(characters) | 지정한 문자수만큼 읽기 | 문자열 |
ReadAll | 모두 읽기 | 문자열 |
ReadLine | 한 줄 읽기 | 문자열 |
Write(문자열) | 지정한 문자열 저장 | |
WriteLine([문자열]) | 지정한 문자열 저장하고 줄바꿈 문자 기록 |
File/Folder개체는 문서읽기 -> 프로그래밍 -> VBScript 를 참조 할것
웹서버 Root의 Global.asa
웹서버의 Global.asa는 특수한 기능을 하는 파일 이다.
웹서버가 실행 할 때와 중단 할때, 사용자가 처음으로 접속할 때와 접속을 중단할 때 각각의 할 일 을 적을 수 있도록 고안 되었다.
PWS 사용자는 Global.asa변경 후 재 부팅을 해 주어야 제대로 작동 한다.
일반적인 구조는 다음과 같다.
Global.asa |
---|
<script language="VBScript" runAt="Server"> Sub Application_OnStart ' 이곳에는 웹서버가 시작할 때 실행할 스크립트를 작성한다 end sub Sub Application_OnEnd ' 이곳에는 웹서버가 중단할 때 실행할 스크립트를 작성한다 end sub Sub Session_OnStart ' 이곳에는 사용자가 처음 접속할 때 실행할 스크립트를 작성한다 end sub Sub Session_OnEnd ' 이곳에는 사용자가 접속을 종료할 때 실행할 스크립트를 작성한다 end sub </script> |
방문자수 카운트 프로그램
앞의 Application개체를 이용하여 읽은 회수를 카운트 하는 스크립트에서는 두가지의 문제가 있다.
- 웹서버가 재부팅 하고나면 카운터값이 클리어 된다는 점
- 사용자가 새로 고침 버튼을 누르면 읽은 회수가 증가한다는 점
따라서 방문자 카운트로 작동 시키기 위해서는 특정 데이터 파일에 현재 카운트 한 값을 저장 해 두어야 하고
세션이 시작 될 때에만 - 즉 사용자가 접속을 할 때 - 카운트가 되어야 한다.
Global.asa의 Session_OnStart에서 이 두가지를 모두 실행하는 스크립트를 작성 해야 하고, 결과를 보는 페이지는 따로 작성해야 한다.
Web Server Root Directory 의 Global.asa (PWS 사용자는 저장 후 재부팅 필요함) |
---|
<script language="VBScript" runAt="Server"> Sub Application_OnStart ' 이곳에는 웹서버가 시작할 때 실행할 스크립트를 작성한다 end sub Sub Application_OnEnd ' 이곳에는 웹서버가 중단할 때 실행할 스크립트를 작성한다 end sub Sub Session_OnStart ' 이곳에는 사용자가 처음 접속할 때 실행할 스크립트를 작성한다 Set fs = server.CreateObject("Scripting.FileSystemObject") DataFile = Server.MapPath("/count.txt") Application.Lock ' 여러사람이 동시접속 했을 때를 대비하여 잠금 if not fs.FileExists(DataFile) then '처음으로 실행하여 파일이 존재하지 않으면 set Stream = fs.CreateTextFile(DataFile) Stream.WriteLine("1") Application("Count") = 1 Stream.close else set Stream = fs.OpenTextFile(DataFile, 1) ' 읽기용으로 연다 Application("Count") = Stream.ReadLine ' 읽어낸다. Stream.Close set Stream = fs.OpenTextFile(DataFile, 2) ' 쓰기용으로 연다. Application("Count") = Application("Count") + 1 '증가 한다. Stream.WriteLine(Application("Count")) Stream.Close Set Stream = nothing Application.Unlock ' 잠김 해제 end if Set fs = nothing end sub Sub Session_OnEnd ' 이곳에는 사용자가 접속을 종료할 때 실행할 스크립트를 작성한다 end sub </script> |
Count.asp |
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> 방문자 수 카운터 </title> <meta http-equiv="content-type" content="text/html; charset=euc-kr"> <meta http-equiv="Cache-Control" content="no-cache"> </head> <body> <% ' 다른 페이지에 방문자 카운터를 넣고 싶은경우 이부분을 복사해서 넣는다. response.write "<table style='border:1px solid red;'><tr><td bgcolor=black>" lt = cstr(application("Count")) ln = len(lt) for i=1 to ln tt = mid(lt, i, 1) response.write "<img src=""/images/" + tt + ".gif"" border=0 width=16 height=21>" next response.write "</td></tr></table>" %> </body> </html> |
Count.asp에 필요한 이미지 파일 (Root의 /images/폴더에 복사 한다.) | |||||||||
0.gif | 1.gif | 2.gif | 3.gif | 4.gif | 5.gif | 6.gif | 7.gif | 8.gif | 9.gif |