asp 클래스(class) 사용하기

ASP 클래스의 시작

CLASS SampleClass 
......................................................
END CLASS

일단 시작은 저렇게 시작하고 마친다. 보통의 SUB 나 FUNCTION이랑 비슷하다.
그리고 클래스의 시작과 마침에 자동으로 실행되는 함수를 넣어야 하는데 아래와 같다

Private Sub Class_Initialize()
... 클래스 생성될때 자동으로 실행
END SUB


Private Sub Class_Terminate()
... 클래스 닫힐때 자동으로 실행 
END SUB

위는 보통 디비는 항상 열고 닫기 때문에 두 함수에 DB를 열고 닫는것을 넣어두면 편하다.
물론,, 디비접속과 아무관련이 없는 클래스의 경우 넣을 필요는 없다.
여튼 여기까지를 한번에 묶으면 ..

CLASS SampleClass
	private thisDbCon
	Private Sub Class_Initialize()
		'디비접속 
		Set thisDbCon=Server.CreateObject("ADODB.Connection")
		StrDBConnect = "Provider=ORAOLEDB.ORACLE;Password=***;User ID=****;Data Source=****;Persist Security Info=True;"
		thisDbCon.Open StrDBConnect</p>
	END SUB
	Private Sub Class_Terminate()
		'디비 끊기
		thisDbCon.Close
		thisDbCon=Noting
		END SUB
END CLASS

이게 기본 세트라고 할수 있다. 이 이후에는 클래스에 함수들을 하나씩 추가시키면 된다. 그러면 알흠다운 클래스가 만들어지게 되겠다.

그러면 만들어 놓은 클래스를 다른 페이지에서 불러서 사용하는 방법을 보겠다.

먼저 저 클래스를 CLASS.TEST.ASP 라는 이름으로 저장한다. 이름에 CALSS가 들어가는건 특별한 이유가 있는게 아니고 그냥 다른 파일들과 구분하기 위한것이니 이름은 원하는데로 해도 상관없다

먼저 페이지 상단에 위와같이 클래스를 인클루드 시킨다.

그런 다음 위와 같이 클래스를 생성한다.

클래스의 좋은 점은 함수와 달리 클래스를 생성하면 같은 함수들이 독립적으로 작동된다는것이다.

일단 생성된 클래스의 함수를 실행해 보겠다.

CLASS TEST
	Private Sub Class_Initialize()
	END SUB

	Private Sub Class_Terminate()
	END SUB 

	'A+B 함수
	PUBLIC FUNCTION GETSUM(A,B)
		GETSUM=A+B
	END FUNCTION 
END CLASS
SET T=NEWTEST
RESPONSE.WRITE T.GETSUM(10,20)

위의 간단한 합계 함수이다. 화면에는 30이 뿌려질테고..

저걸 좀더 바꿔보면..

CLASS TEST
	Private Sub Class_Initialize()
	END SUB
	Private Sub Class_Terminate()
	END SUB 

	PUBLIC FUNCTION GETSUM(NUMARR)
	DIM I,RESULT
	FOR I=0 TO UBOUND(NUMARR)
	RESULT=RESULT+NUMARR(I)
	NEXT
	GETSUM=RESULT
	END FUNCTION 
END CLASS
SET T=NEWTEST
DIM NUMBERS(4)
NUMBERS(0)=10
NUMBERS(1)=20
NUMBERS(2)=100
NUMBERS(3)=200
RESPONSE.WRITE T.GETSUM(NUMBERS)

머 이렇게 배열변수를 바로 넘겨서 사용할수도 있다.

PUBLIC & PRIVATE

PUBLIC 과 PRIVATE 는 다 알다시피 광역이냐 지역이냐 이다. 클래스 안에 쓰이는 변수들이나 함수앞에 PUBLIC 을 붙이면 클래스 밖에서도 사용가능하다. 위의 함수 GETSUM 도 앞에 PUBLIC 이 붙어 있기 때문에 클래스 밖에서 실행이 가능한것이다.

반대로 PRIVATE가 붙으면 클래스 내부에서만 실행된다. 외부에서 불러낼려치면 호출 오류가 뜰것이다.

이건 변수들도 마찬가지다.

추가 팁(?) 딕셔너리 주고 받기 PHP 에서는 배열 자체가 딕셔너리같은거라 주고 받기 편했는데.. ASP에서 이 방법을 찾는데 꽤나 고생했다. 혹시나 같은 고생하는 분이 있을까 해서 적어 본다

이걸 클래스와 연결해서 보면..

CLASS DICTEST</p>
	PUBLIC FUNCTION GETDIC()
	Set D=CreateObject("Scripting.Dictionary")
			D.add "BANANA", "100"
			D.ADD "DDALGI","200"
			D.ADD "SO","300"</p>
	SET GETDIC = D
	END FUNCTION 
END CLASS
Set DICTEST=NEW DICTEST
	SET DATA=DICTEST.GETDIC
	RESPONSE.WRITE DATA("BANANA")

ASP 에서 클라스 예제

<%
Class AspTemplate

	Private Temp
	Private ArrTemp
	Private Var
	Private SubVar
	Public Root
	Private fs

	'***************************************************
	' 클래스를 시작되면 개체를 생성하는 이벤트 핸들러 
	'***************************************************
	Private Sub Class_Initialize
		Dim key
		Set Temp = server.CreateObject("Scripting.Dictionary")
		Set ArrTemp = server.CreateObject("Scripting.Dictionary")
		Set Var = server.CreateObject("Scripting.Dictionary")
		Set SubVar = server.CreateObject("Scripting.Dictionary")
		Set fs = Server.CreateObject("Scripting.FileSystemObject")
		Root = Server.MapPath(".") & "\"
		For each key in request.form
			Var.Item(key) = request.Form(key)
		Next
		For each key in request.QueryString
			Var.Item(key) = request.QueryString(key)
		Next
	End Sub


	'***************************************************
	' 파일을 불러들여 템플릿을 정의하는 함수
	'***************************************************
	Public Function define(variable, filename)
		if InStr(filename, ".") > 0 or InStr(filename, "\") > 0 then
			fdefine variable, filename
		else 
			ddefine variable, filename
		end if
	End Function


	'***************************************************
	' 파일을 불러들여 템플릿을 정의하는 함수
	'***************************************************
	Public Function fdefine(variable, filename)
		Dim fo
		Dim buffer
	
		if not fs.FileExists(Root & filename) then
			'Temp.Item(variable) =  Root & filename & " 파일이 존재하지 않습니다."
			Temp.Item(variable) =  filename & " 파일이 존재하지 않습니다."
		else
			Set fo = fs.OpenTextFile(Root & filename,1)
			Temp.Item(variable) = include_file(fo.ReadAll)
			fo.close : Set fo = nothing
		end if

	End Function


	'***************************************************
	' 다이나믹 역영을 정의하는 함수
	'***************************************************
	Public Function ddefine(variable, parent)
		Dim buffer, tmp
		buffer = Temp.Item(parent)
		tmp = Split(buffer, "<!-- DYNAMIC AREA '" & variable & "' -->")
		if Ubound(tmp) = 2 then
			Temp.Item(variable) = tmp(1)
			Temp.Item(parent) = tmp(0) & "{{" & variable & "}}" & tmp(2)
			if SubVar.Item(parent) <> "" then
				SubVar.Item(parent) = SubVar.Item(parent) & ":::" & variable
			else
				SubVar.Item(parent) = variable
			end if
		end if
	End Function

	Public Function include_file(buffer)
		Dim pos, endpos, filename, tag
		Dim fs, fo, tmp, flag
		flag = true
		Do While flag = true
			pos = InStr(buffer, "<!-- INCLUDE FILE '")
			if pos <> 0 then 
				pos = pos + 19 
				endpos = InStr(pos, buffer, "' -->")
				filename = Mid(buffer, pos, endpos - pos)
				tag = "<!-- INCLUDE FILE '" & filename & "' -->"
				Set fs = Server.CreateObject("Scripting.FileSystemObject")
				if not fs.FileExists(Root & filename) then
					'buffer =  Replace(buffer, tag, Root & filename & " 파일이 존재하지 않습니다.")
					buffer =  Replace(buffer, tag, filename & " 파일이 존재하지 않습니다.")
				else
					Set fo = fs.OpenTextFile(Root & filename,1)
					buffer = Replace(buffer, tag, fo.ReadAll)
					fo.close : Set fo = nothing
				end if
				set fs = nothing
			else
				flag = false 
			end if
		Loop
		include_file = buffer
	End Function


	'***************************************************
	' 해당변수에 값을 저장하는 함수
	'***************************************************
	Public Function assign(key, value)
		if value = "" or IsNull(value) then 
			Var.Item(key) = ""
		else
			Var.Item(key) = value 
		end if
	End Function


	'***************************************************
	' 해당변수에 값을 저장하는 함수
	'***************************************************
	Public Function parse(variable)
		Dim buffer, count
		Dim tmp, tmp1, tmp2, str, arr, svar, i

		if IsArray(ArrTemp.Item(variable)) then
			tmp = ArrTemp.Item(variable)
			count = Ubound(tmp)
			str = tmp(0)
			For i = 1 to count step 2
				str = str & Var.Item(tmp(i)) & tmp(i+1)
			Next
		else 
			buffer = Temp.Item(variable)
			tmp1 = Split(buffer, "{{")
			count = Ubound(tmp1)
			if count > 0 then
				str = tmp1(0)
				arr = tmp1(0)
				For i = 1 To count
					tmp2 = Split(tmp1(i), "}}")
					if Ubound(tmp2) = 1 then
						str = str & Var.Item(tmp2(0)) & tmp2(1)
						arr = arr & ":::" & tmp2(0) & ":::" & tmp2(1)
					else
						str = str & tmp1(i)
						arr = arr & "::::::" & tmp1(i)
					end if
				Next
				ArrTemp.Item(variable) = split(arr, ":::")
			else
				str = buffer
			end if
		end if
		Var.Item(variable) = Var.Item(variable) & str
		

		if SubVar.Item(variable) <> "" then
			svar = Split(SubVar.Item(variable), ":::")
			Var.Item(svar(0)) = ""
			count = Ubound(svar)
			For i = 1 to count
				Var.Item(svar(i)) = ""
			Next
		end if

	End Function


	'***************************************************
	' 코멘트를 함수
	'***************************************************
	Public Function comment(variable, parent)
		Dim buffer
		buffer = Temp.Item(parent)
		buffer = replace(buffer,"<!-- " & variable & " START -->","<!--")
		Temp.Item(parent) = replace(buffer,"<!-- " & variable & " END -->","-->")
	End Function


	'***************************************************
	' 템플릿을 출력하는 함수
	'***************************************************
	Public Function print(variable)
		Dim buffer, pos, endpos, filename, tag
		Dim fs, tmp, flag
		buffer = Var.Item(variable)
		flag = true
		Do While flag = true
			pos = InStr(buffer, "<!-- EXECUTE FILE '")
			if pos <> 0 then 
				pos = pos + 19 
				endpos = InStr(pos, buffer, "' -->")
				filename = Mid(buffer, pos, endpos - pos)
				tag = "<!-- EXECUTE FILE '" & filename & "' -->"
				Set fs = Server.CreateObject("Scripting.FileSystemObject")
				if not fs.FileExists(Root & filename) then
					'buffer =  Replace(buffer, tag, Root & filename & " 파일이 존재하지 않습니다.")
					buffer =  Replace(buffer, tag, filename & " 파일이 존재하지 않습니다.")
				else
					tmp = Split(buffer, tag)
					response.write tmp(0)
					Server.Execute(filename)
					buffer = tmp(1)
				end if
				set fs = nothing
			else
				flag = false 
			end if
		Loop
		response.write buffer
	End Function


	'***************************************************
	' 템플릿을 얻는 함수
	'***************************************************
	Public Function fetch(variable)
		fetch = Var.Item(variable)
	End Function


	'***************************************************
	' 클래스를 소멸하면서 개체를 소멸하는 이벤트 핸들러 
	'***************************************************
	Private Sub Class_Terminate 
		Set Temp = Nothing  
		Set ArrTemp = Nothing 
		Set Var = Nothing 
		Set SubVar = Nothing
		Set fs = Nothing
	End Sub 


End Class



Set tpl = new ASPTemplate

	tpl.define "Design-File", skinPath &"/html/Modify.html"
	tpl.define "NL_Wec", "Design-File"
	tpl.define "NL_Wec1", "Design-File"
	tpl.define "NL_Not_Wec", "Design-File"
	tpl.define "NL_Not_Wec1", "Design-File"
	tpl.define "NL_Not_TxtAttachFile", "Design-File"
	tpl.define "NL_GlobalLev", "Design-File"
	tpl.define "NL_UseHtml", "Design-File"
	tpl.define "NL_UseHtml_Wec", "Design-File"
	tpl.define "NL_ReturnMail", "Design-File"
	tpl.define "NL_UsePrivate", "Design-File"
	tpl.define "NL_TxtAttachFile_Dext", "Design-File"
	tpl.define "NL_TxtAttachFile_Tabs", "Design-File"
	tpl.define "NL_BbsMent", "Design-File"	
	tpl.define "NL_FileAttach", "Design-File"	
	tpl.define "NL_UseLink", "Design-File"

'기본사용변수
	no_value1 = "<!--" : 	no_value2 = "-->"

	tpl.assign "skinPath", skinPath
	tpl.assign "id", id
	tpl.assign "board", board
%>
평점을 남겨주세요
평점 : 2.5
총 투표수 : 1