2009년 6월 4일 목요일

2007년 11월 6일 화요일

세션 배열

Session Object (IIS)

출처
MSDN - Session Object (IIS)

세션 객체를 이용하여 개별적인 사용자 세션을 관리하기 위해 필요한 정보를 저장할 수 있다. 사용자가 어플리케이션의 페이지 사이를 이동할 때마다 정보를 버리지 않고 변수들에 저장한다. 대신에 이 변수들은 사용자 세션 내내 유지된다.

웹서버는 세션을 가지지 않은 사용자에 의해 어플리케이션내에서 웹페이지가 호출되면 자동으로 세션 객체를 생성한다. 서버는 세션이 만료되거나 끊어지면 세션 객체를 제거한다.

세션 객체의 일반적인 용도는 사용자 정보를 저장하는데 목적이 있다. 예를 들어 사용자가 숨겨진 정보를 나타내기위해 세션 객체를 사용하여 그 정보를 저장할 수 있다. 세션 객체에 대한 더많은 정보는 the Acive Server Page & Web Application Guide 섹션의 Managing Sessions를 보라.



노트
세션 상태는 오직 쿠키를 지원하는 브라우저에서만 유지된다.



메소드
Session.Abandon
세션 객체 및 관련 리소스를 제거한다.

Session.Contents.Remove
Contents 컬렉션으로부터 아이템을 삭제한다.

Session.Contents.RemoveAll
Contents 컬렉션의 모든 아이템을 삭제한다.



속성
Session.CodePage
전체 세션에서 사용되는 고유한 객체들의 데이터를 위한 코드 페이지를 설정한다. 코드 페이지는 상이한 언어들을 위한 문자의 인코딩 방법을 서버에게 알려준다.

Session.Contents 컬렉션
스크립트 명령을 통해 세션에 추가한 아이템이 들어있다.

Session.LCID
전체 세션에서 사용되는 데이터의 LCID 값을 설정한다. LCID는 특정 지역 시간대에 맞는 날짜와 시간, 통화의 표시 방법을 알려준다.

Session.SessionID
현재 사용자의 세션 인식값을 내놓는다.

Session.StaticObject 컬렉션
Global.asa 파일에서 오브젝트 태그에 의해 session에 한정된 객체를 가지고 있다.

Session.Timeout
현재 어플리케이션의 세션 상태 유지의 분 단위의 만료값.





이벤트


Session_OnEnd 이벤트
세션이 제거되거나 만료될 때 발생난다.

Session_OnStart 이벤트
서버에 새로운 세션이 생성될 때 발생한다.





설명


세션 객체에 값들을 저장할 수 있다. 세션 객체에 저장된 정보는 세션과 주어진 세션 범위을 통해 사용 가능하다. 다음 스크립트를 통해 두가지 형식의 변수에 값을 저장하는 예를 보인다:

<%
Session("username") = "Janine"
Session("age") = 24
%>

만일 세션 객체에 객체를 저장하려고 한다면 VBScript에서는 Set 예약어을 사용하여 다음과 같이 코딩한다:

<% Set Session("Obj1") = Server.CreateObject("MyComponent.class1") %>

이렇게 저장된 MyComponent.class1 객체의 메소드와 속성을 웹 페이지에서 다음과 같이 사용한다:

<% Session("Obj1").MyMethod %>

혹은 다음처럼 객체의 로컬 복사본을 얻어내어 사용하기도 한다:

<%
Set MyLocalObj1 = Session("Obj1")
MyLocalObj1.MyObjMethod
%>

다른 방법으로 Global.asa 파일에 오브젝트 태그를 사용하여 session 한정자와 함께 객체를 생성한다.

그렇지만 Session 객체에 내장 객체를 저장할 수는 없다. 다음 예는 에러를 내놓는다.

<%
Set Session("var1") = Session
Set Session("var2") = Request
Set Session("var3") = Response
Set Session("var4") = Server
Set Session("var5") = Application
%>

Session 객체에 객체를 저장하기 전에 세션 객체는 쓰레딩 모델을 사용한다는 것을 염두해 두어야한다. 세션 객체는 잠금 없는 단일 쓰레드로 처리되기 때문에 객체가 서로 덮어쓸 수 있다.
세션 객체안에 배열을 저장하려고 한다면 저장된 배열 요소들을 직접 변경하는 시도를 피해야 한다. 예를 들어 다음과 같은 스크립트의 작성은 안된다:

<% Session("StoredArray")(3) = "new value" %>

Session 객체는 컬렉션처럼 구현되어 있기 때문에 위의 스크립트는 동작하지 않는다. 배열 요소인 StoredArray(3)은 새로운 값을 받지 못한다. 대신에, 그 값은 컬렉션의 색인값으로 사용되고 그 위치에는 의미없는 정보가 저장된다.

만약 세션 객체에 배열을 저장하기를 원한다면 배열 요소의 값을 구하거나 변경하기 전에 배열을 복사본을 사용하기를 강력하게 추천한다.

다음 예는 처리가 끝나 배열을 세션 객체에 저장했다가 불러내어 값을 변경한 후 다시 저장하는 예이다.

--- File1.asp ---
<%
'Creating and initializing the array
Dim MyArray()
Redim MyArray(5)
MyArray(0) = "hello"
MyArray(1) = "some other string"

'Storing the array in the Session object.
Session("StoredArray") = MyArray

Response.Redirect("file2.asp")
%>

--- File2.asp ---

'Retrieving the array from the Session Object
'and modifying its second element.
LocalArray = Session("StoredArray")
LocalArray(1) = " there"

'Printing out the string "hello there."
Response.Write(LocalArray(0)&LocalArray(1))

'Re-storing the array in the Session object.
'This overwrites the values in StoredArray with the new values.
Session("StoredArray") = LocalArray

2007년 10월 31일 수요일

웹메일

윈2003서버에서 ASP프로그램으로 메일을 발송할때, 기존의 ASP 소스는 문제가 없으나 CDONTS를 사용한 메일 발송이 안됩니다. 이유인즉 cdonts는 NT4.0에서 사용되던 것인데 그것이 Windows 2000에서는 하위 호환을 위하여 지원이 되었지만 Windows 2003에서는 없어졌기 때문이다.



따라서 가급적이면 CDONTS보다는 CDOSYS를 사용하기를 바란다. (cdosys.dll)



소스를 수정하여 CDONTS가 아닌 CDO를 사용한다.
Server.CreateObject("CDONTS.NewMail")를 Server.CreateObject("CDO.Message")로 변경해서 사용한다. (cdosys.dll 사용.)



CDO의 사용 예제 1


Set objMail = Server.CreateObject("CDO.MESSAGE")
objMail.From="aaa@mail.com"
objMail.To = request("email")
objMail.Subject= "subject"
objMail.HTMLBody= "body"
objMail.Send
objMail.close
Set objMail = Nothing





CDO의 사용 예제 2



Dim iMsg
Dim iConf
Dim Flds
Dim strHTML
Const cdoSendUsingPort = 2
set iMsg = CreateObject("CDO.Message")
set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
Flds.Update
Set iMsg.Configuration = iConf
iMsg.To = "altip@msn.com" 'ToDo: 유효한 이멜 주소를 넣는다.
iMsg.From = "altip@msn.com" 'ToDo: 유효한 이멜 주소를 넣는다.
iMsg.Subject = "이것은 테스트 CDOSYS 메시지입니다(Port 25를 통해 발송)"
iMsg.HTMLBody = strHTML '메일내용을 넣는다.
iMsg.BodyPart.Charset="ks_c_5601-1987" ' 한글 문자설정
iMsg.HTMLBodyPart.Charset="ks_c_5601-1987" ' 한글 문자설정
iMsg.AddAttachment "첨부파일"
iMsg.Send
End With
Set iMsg = Nothing
Set iConf = Nothing
Set Flds = Nothing





CDO의 사용 예제 3



set objMessage = createobject("cdo.message")
set objConfig = createobject("cdo.configuration")


' Setting the SMTP Server
Set Flds = objConfig.Fields

Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost"
Flds.update

Set objMessage.Configuration = objConfig
objMessage.To = "you@yourdomain.com" '보내는 사람 이메일 주소
objMessage.From = "someone@somewhere.com" '받는 사람 이메일 주소
objMessage.Subject = "This is a sample email sent using CDO" '제목
objMessage.TextBody = "Congratulation" & VbCrLf & "If you receive this is, your mail component works"
' 메일 내용이 HTML 형식이면 objMessage.TextBody 대신에 objMessage.HTMLBody를 사용
objMessage.fields.update
objMessage.Send

Response.write "발송 완료!!!!"

set objMessage = nothing
set objConfig = nothing

간단하죠?

참고로 로컬 서버에서 사용하실 때 유동 아이피 쓰시는 분들은 아이피 세팅시에
자동 DNS 아이피 받기로 하지 마시고 꼭 특정한 DNS 서버 아이피를 따로 설정해서 사용하세요.
안그럼 메일들이 발송 안되고 큐폴더로 떨어진답니다.



----------------------------------------------------------------------------------------------------




참고 : 기존 소스를 사용하고 싶다면 아래 방법을 사용한다.


1. Windows 2000에서 winntsystem32inetsrv에 있는 cdonts.dll 을

Windows 2003의 폴더로 복사한다.
2. 명령 창을 띄우고 regsvr32 cdonts.dll 라고 쳐서 등록해준다.
3. 확인 창에서 OK를 눌러준다

2007년 10월 26일 금요일

scriptX

function Print() {
factory.printing.header = "영수증 원본"; // Header에 들어갈 문장
factory.printing.footer = "감사합니다."; // Footer에 들어갈 문장
factory.printing.portrait = false // true 면 가로인쇄, false 면 세로 인쇄
factory.printing.leftMargin = 1.0 // 왼쪽 여백 사이즈
factory.printing.topMargin = 1.0 // 위 여백 사이즈
factory.printing.rightMargin = 1.0 // 오른쪽 여백 사이즈
factory.printing.bottomMargin = 1.0 // 아래 여백 사이즈
factory.printing.SetMarginMeasure(2); // 테두리 여백 사이즈 단위를 인치로 설정합니다.
factory.printing.printer = "HP DeskJet 870C"; // 프린트 할 프린터 이름
factory.printing.paperSize = "A4"; // 용지 사이즈
factory.printing.paperSource = "Manual feed"; // 종이 Feed 방식
factory.printing.collate = true; // 순서대로 출력하기
factory.printing.copies = 2; // 인쇄할 매수
factory.printing.SetPageRange(false, 1, 3); // True로 설정하고 1, 3이면 1페이지에서 3페이지까지 출력
factory.printing.Print(true) // 출력하기
}


이제 버튼 하나 만들어서 Print() 만 호출하면 위에 설정된 구성들로 프린트가 될것입니다.

만일 폼값을 받아 위의 설정값들을 변경하려면
frm = document.forms[0]; 처럼 폼 다큐먼트를 설정해 준 후
document.factory.printing.copies = frm.CopiesValue.value; 처럼 그 값을 받아오면 됩니다.