Title information goes here

** MENU **

들머리
1 ASP란 무엇인가
 1.1 Active Server Pages
1.1.1 개요
1.1.2 간단한 ASP 만들기
1.1.3 HTML FORM 만들기
1.1.4 ASP Response Page만들기
 1.2 ASP 란 무엇인가?
1.3 Hypertext의 역사
1.3.1 연결된 정적인 페이지
1.3.2 동적인 HTML
1.3.3 Active Server Pages
1.4 Asp 파일 만들기
1.4.1 Asp.파일이란
1.4.2 스크립트란
1.5 ASP 구문
1.5.1 딜리미터(Delimiter)
1.5.2 간단한 표현
1.5.3 명령어로 이루어진 표현
1.5.4 HTML에 포함시키기
1.5.5 스크립트 태그

2. 클라이언트에서 정보가져오기
 2.1 Request
2.2 HTML 폼에서 정보를 가져오기
2.3 QueryString
2.4 Form
2.5 ServerVariable
2.6 Asp File 자신에게 정보 전달하기
2.7 Cookies 사용하기

3. 클라이언트에 정보 보내기
 3.1 클라이언트에 정보 보내기
3 .2 ActiveX Component
3.3 ASP 프로그램 개발하기

4. 실전연습
 4.1 방문자 카운터 만들기
4.2 강의실 입장시각 표시

5. 데이터베이스 다루기
 5.1 데이터베이스 예제(SQL)
5.2 SQL Where #1
5.3 SQL Where #2
5.4 SQL 과 Form의 연결 #1
5.5 SQL 과 Form의 연결 #2
5.6 SQL 과 Form의 연결 #3
5.7 SQL AND/OR
5.8 SQL Count

6. ADO 기법
 6.1 maxrecords 용법
6.2 테이블 페이지로 나누기
6.3 Database Count Records
6.4 ADO 커서 형태
6.5 새 레코드 입력하기 폼
6.6 SQL이용한 새레코드 추가
6.7 ADO 이용한 새레코드 추가

7. 사이버 연수시스템
 7.1 연수등록
7.2 연수생 인증확인
7.3 연수생 추가정보 입력
7.4 연수생 추가등록 마무리

8. 추가 상세 설명
 8.1 파일업로드 이해하기
8.2 초보자 데이터베이스 연결이해


Main Frame in Roadmap

들머리

이 강좌는 ASP(Active Server Page)를 처음 배우는 사람으로서 기초를 다지고자 하는 사람을 위해서 만들기 시작한 강좌이다.

나 역시 ASP에 관한 한 초보이지만 이렇게 강좌를 열게되면 초보를 탈피할 수 있다는 기대에서 이 강좌를 열기로 마음먹었다.

가르치는 것이 곧 철저히 배우는 것이라 생각한다.

직역을 하지 않고 나름대로 소화하여 뺄 것은 빼고 또 보충설명이 필요한 것은 첨가하여 작성하였다.

본 강좌의 원서가 되는 것은 마이크로 소프트사에서 제공하는 Personal Web Server와 함께 제공하는 Road Map이다.

개인적으로 마이크로 소프트사에서 여러 가지 중요한 자료들을 공개하는 태도에 대하여 많은 호감을 가지고 있다.

또 앞으로 NT서버가 서버시장의 주류를 이루리라는 예상이 들고 NT서버을 올라갈 웹어플리케이션이 주로 ASP로 작성되리라는 확신을 가지게 되었다.

이 강좌는 처음부터 완성된 상태에서 올리지 않는다. 시간나는대로 보충하고 보완해 나갈 작정이다.

1999년 1월 1일

이 용 훈


Main Frame in Roadmap

1.1 Active Server Pages

1.1.1 개요

HTML로 웹페이지를 제작하는데 좀 익숙해지면 웹페이지가 뭔가 정적인 느낌이 들고 좀더 다른 사람과 다른 웹페이지를 만들고 싶은 욕망이 생긴다. 이런 욕망을 충족시켜주는 방법에는 여러 가지가 있다 자바를 배워서 자바로 구성하는 방법, 자바 스크립트를 배워서 해결하는 방법, PERL을 배워서 해결하는 방법, 비주얼 베이직 스크립트를 배우는 방법 등 프로그래머의 취향에 따라 다르다.

이러한 방법 중에 하나가 될 수 있는 것이 ASP를 배우는 것이다. 자바스크립트나 비주얼베이직 스크립트가 웹 브라우저에서 실행되는 반면 ASP는 서버에서 실행되는 점이 다른 스크립트 언어와 다른 점이다. 따라서 클라이언트에서는 그 소스를 볼 수 없는 것이 특징이다. ASP는 클라언트가 요구하면 서버에서 실행하여 그 결과를 HTML파일로 만들어 클라언트에게 제공하기 때문에 그 소스를 볼 수 없는 것이다.

ASP가 서버에서 실행되어 그 결과만 웹 브라우저에 제공하기 때문에 웹 브라우저가 익스플로러가 된든지 넷스케이프가 되든지 상관하지 않는다.

ASP는 비쥬얼베이직스크립트를 그대로 이식시켜서 실행시킬 수 있기 때문에 이미 비쥬얼베이직으로 작성된 프로그램을 그대로 이용할 수 있는 장점을 가지고 있다.

ASP는 VBScript 와 JScript 명령을 그대로 실행할 수 있다.

ASP는 엑세스에서 만들어 놓은 데이베이스를 그대로 이용하여 쓸 수 있어서 많은 편리한 점이 있다. 따라서 디베이스, 폭스베이스, 폭스프로 등에서 만들어 놓은 모든 데이터를 그대로 채용해 쓸 수 있다.

ASP는 퍼스널웹서버( PWS )만 설치하면 네트워크가 연결되지 않은 개인용 컴퓨터에서도 충분히 실습할 수 있는 환경을 갖출 수 있어서 학습자에게는 비싼 서버를 구입하지 않아도 되는 좋은 점이 있다.

윈도우 95/98 환경의 PC라면 PWS를 설치하고, 웹 사이트 hinfo.co.kr에 가면 ASP를 다운 받아서 설치할 수 있다.

1.1.2 간단한 ASP 만들기

무엇을 배울 때 가장 좋은 방법은 직접 작성해보는 것이다. 워드프로세서로 HTML페이지를 작성하고 거기에 ASP를 작성해보자. 가장 간단한 방법은 HTML파일을 그대로 확장자를 ASP로 바꾸면 그대로 ASP 페이지가 되는 것이다. 그것을 간단히 웹 브라우저로 열기만 하면 ASP 페이지는 완성된 것이다.

다음 문서를 메모장으로 완성해보자.이것을 Hello.htm파일로 저장하고 웹 브라우저로 불러보자 .

<HTML>
<BODY>
<FONT SIZE=7>
Hello World!<BR>
</FONT>
</BODY>
</HTML>

이것의 출력결과 Hello World!를 화면에 한번 출력하는 것이다. 그러나 Hello World!를 여러번 다른 크기로 출력하고 싶다면 문제는 간단하지가 않다.

다음과 같이 코딩을 하고 Hello.asp로 저장하고 웹 브라우저에서 불러보자

<HTML>
<BODY>
<% For i = 3 To 7 %>
<FONT SIZE=<% = i %>>
Hello World!<BR>
<% Next %>
</BODY>
</HTML>

여기서 새로 들어간 줄은 다음과 같다.
<% For i = 3 To 7 %>

<FONT SIZE=<% = i %>>

<% Next %>

ASP 스크립트 명령어는 <% 와 %> 사이에 들어간다. 여기서 이 것을 딜리미터라고 부른다.

1.1.3 HTML Form 만들기

보통 인터넷이나 인트라넷 서버 프로그램은 서버에서 제시한 양식에 클라이언트가 내용을 완성하여 제출하면 그것을 처리하여 그 결과를 알려 주는 것이 보통이다. 이것을 여기서 간단하게 연습해보자.

다음은 보기가 되는 폼이다.

다음을 작성하여 Order.htm으로 저장하여 웹 브라우저에서 실행하여보자 .

<HTML>
<HEAD><TITLE>Order</TITLE></HEAD>

<BODY>
<H2>Sample Order Form</H2>
<P>
Please provide the following information, then click Submit:

<FORM METHOD="POST" ACTION="response.asp">
<P>
First Name: <INPUT NAME="fname" SIZE="48">
<P>
Last Name: <INPUT NAME="lname" SIZE="48">
<P>
Title: <INPUT NAME="title" TYPE=RADIO VALUE="mr">Mr.
<INPUT NAME="title" TYPE=RADIO VALUE="ms">Ms.

<P><INPUT TYPE=SUBMIT><INPUT TYPE=RESET>
</FORM>

</BODY>

</HTML>

1.1.4 ASP Response Page만들기

. 다음은 앞에서 만든 폼에 클라언트가 웹 브라우저에서 이름과 성을 입력하고 해당란에 체크를 하고 양식을 제출하면 이것을 받아서 처리하는 ASP 파일을 만들어보자. 다음과 같이 코딩하여

Response.asp 파일로 저장하고 앞의 폼 Order.htm을 실행 시켜 폼을 완성하고 쿼리전송을 눌러보자.

<HTML>
<HEAD>
<TITLE> Response.asp</TITLE>
</HEAD>
<BODY>
<%Title = Request.Form("title")
LastName = Request.Form("lname")
If Title = "mr" Then%>
Mr.<%= LastName %>
<%Else If Title = "ms" Then%>
Ms.<%= LastName %>
<%Else %>
<%= Request.Form("fname") & " " & LastName %>
<% End If %>
<% End If %>
</BODY>
</HTML>

앞 Order.htm에서 다음 3개의 인수를 전달받는다.
fname
lname
title

Response.asp에서는 위세가지 변수를 전달받아서 처리하게 된다.

title이 Mr이냐 Ms냐를 구분하여 메시지를 보내고 title이 없으면 성과 이름을 그대로 출력하는 간단한 폼이 된다.

이로서 간단하게 ASP 페이지를 맛보았다.


Main Frame in Roadmap

1.2 Active Server Page 란 무엇인가?

앞 장에서는 ASP 페이지를 간단하게 다루어봄으로서 ASP를 간단하게 맛보았다. 이 장에서는 구체적으로 ASP의 개념을 알아보자 ASP 는 활동적이며, 클라이언트와 서버간의 상호의사전달이 가능하고, 수준높은 웹 어플리케이션을 개발하고 실행하는 환경을 제공한다. ASP는 서버에서 실행되고 그 결과만 클라이언트에게 제공하는 것이다.

클라이언트가 ASP페이지를 요구하면 서버는 요구하는 ASP페이지를 실행하여 그 결과를 HTML문서로 클라이언트의 웹 브라우저에 반환한다. ASP는 오히려 클라이언트의 웹 브라우저가 무엇인가를 판단하여 그 웹 브라우저의 입맛에 맞는 HTML 문서를 제공할 수도 있다.

ASP는 다음 웹서버에서 실행가능하다.

  • Microsoft Internet Information Server version 3.0 on Windows NT Server
  • Microsoft Peer Web Services Version 3.0 on Windows NT Workstation
  • Microsoft Personal Web Server on Windows 95


Main Frame in Roadmap

1.3. Hypertext의 역사

Active Server Pages (ASP)는 웹에서 대단한 발전을 이룩한 기술이다. 여기서는 정적인 웹페이지에서 동적인 ASP로의 발전과정을 설명하려고 한다. "정적"이다라는 말은 스크립트가 포함되지 않은 단순한 HTML을 의미하기도 하고 단순한 웹페이지를 의미하기도 한다.

1.3.1. 연결된 정적인 페이지

웹의 시조는 정적인 페이지를 단순히 연결시켜놓은 형태이다. 아직도 많은 웹사이트들이 이러한 정적인 상태에서 서로 연결된 형태로 남아있다.

서버에서 웹 브라우저에 보내는 내용을 변경하려고 하면 어떤 에디터를 써서 웹페이지(HTML 문서)를 변경시켜야 한다. 웹 브라우저가 서버에 웹페이지를 요구할 때 쓰는 프로토콜이 Hypertext Transport Protocol (HTTP)이다.

1.3.2 동적인 HTML

Common Gateway Interface (CGI)와 같은 게이트웨이 인터페이스와 Internet Server Application Programming Interface (ISAPI) 들은 동적인 웹페이지를 제공한다. 이러한 인터페이스들은 정적인 페이지보다는 특정한 실행파일을 실행시켜서 웹 브라우저의 요구에 적극적으로 대처한다. 그러나 이러한 CGI들은 만들기가 쉽지 않고 또 쉽게 변경하기가 힘들다는 단점을 가지고 있다.

특히 게이트웨이 프로그램의 불리한 점은 HTML 문서와 함께 섞어서 쓸 수 없으며 HTML 문서와는 전혀 다른 방법으로 설계하여야 한다는 점이다.

1.3.3 Active Server Pages

ASP는 HTML 파일 속에 실행가능한 스크립트를 집어넣을 수 있다. HTML 파일을 만드과정이나 스크립트를 개발하는 과정이나 같은 과정 속에서 이룰 수 있다.

ASP는 다음과 같은 장점을 가지고 있다.

  • ASP는 HTML과 완전히 섞어서 개발할 수 있다.
  • 어떤 컴파일 과정도 필요없으면 어떤 다른 연결작업도 필요없다.
  • ActiveX 서버 컴퍼넌트를 사용함으로서 완벽한 객체지향 프로그래밍 방식을 따르고 있다.

따라서 이것은 웹 개발자에게는 상호 대화가 가능한 웹어플리케이션을 개발까능하게 하고 있다. ASP를 사용하여 웹기반 인터라넷 어플리케이션 뿐 아니라 인터넷 어플리케이션 개발이 손쉽게 이룰 수 있다. 이것만 가지고도 여행사에서는 인터넷을 통하여 손님이 비행기 스케쥴을 작성하는 것을 도와줄 수도 있고 좌석예약도 가능하다.

ASP 프로그램 은 개발하기가 쉽고 VBScript와 JScript를 그대로 쓸 수 있다. 특히 ActiveX server components를 이용하면 아주 수준높고 세련된 프로그램을 만들 수 있다.


Main Frame in Roadmap

1.4. Asp 파일 만들기

1.4.1 Asp.파일이란

Active Server Pages (ASP)는 파일확장자가 asp를 가진다. 한편으로는 텍스트 파일이라고 할 수 있으며 그 텍스트 파일 속에는 다음 내용들이 포함되어 있다.

  • 텍스트
  • HTML 테그
  • 스크립트 명령어

ASP 파일은 만드는 것은 쉽다. HTML화일의 이름만 바꾸면 된다. 확장자인 htm 나 html을 asp로 바꾸기만 하면 된다. 그러나 웹 브라우저로 asp 파일을 실행시키기 위해서는 웹 디렉토리에 저장해야 하며 그 디렉토리가 실행가능한 디렉토리로 웹서버관리 프로그램으로 지정되어야 한다. 이것에 관해서는 상세히 알려고 하면 웹서버 운영방법을 공부해야 한다.

그러나 ASP를 정말 맛보려고 하면 단순히 html파일을 asp파일로 바꾸는 것이 아니고 html파일 속에 스크립트를 포함시켜야 한다.

1.4.2 스크립트란

스크립트는 스크립트 명령어들로 구성되어 있다. 예를 들면 스크립트는 다음 일을 할 수 있다.

  • 변수에 어떤 값을 할당한다.
  • 웹서버에게 어떤 값을 보내도록 명령한다.
  • 명령어들을 묶어서 하나의 프로세스를 만든다. 프로세서란 컴퓨터가 한 건의 일을 처리하는 단위를 말한다.

스크립트를 실행한다는 것은 스크립팅 엔진에 명령어를 보내는 것이다. 스크립팅 엔진은 이 명령어를 해석하여 컴퓨터에 그 명령어를 전달해준다.

스크립트는 정해진 규칙을 가진 언어로 쓰여지며, 어떤 특정한 스크립트로 적은 것은 서버가 그 스크립트를 해석할 수 있는 스크립팅 엔진을 실행시켜야 한다.

ASP는 VBScript와 JScript 스크립팅 언어를 지원한다. 만약 특정한 스크립트 언어를 명시하지 않으면 asp는 디폴트로 VBScript로 인식한다.


Main Frame in Roadmap

1.5 ASP 구문

ASP는 스크립트 언어라기 보다는 HTML페이지에서 스크립트 언어를 실행시켜주는 환경을 제공한다고 보아야 한다. ASP를 성공적으로 사용하려고 하면 문법을 정확하게 알아야 하며 그것이 작동되는 규칙을 파악해야 한다.

1.5.1 딜리미터(Delimiter)

HTML에서 딜리미터는 (<)와 (>)이다.

비슷하게 ASP에서는 (<%)와 (%>)이다.

예를 들면 <% sport = "climbing" %>이라는 말은 sport라는 변수에 climbing이라는 값을 할당하는 것이다.

나중에 변수 sport를 출력하려고 하면 간단히

<%= sport %>

라고 적으면 된다.

1.5.2 간단한 표현

다음과 같은 문장이 있다고 하자.

This page was last refreshed at <%= Now %>.

자료의 최근 변경된 시각을 웹 브라우저 상에 표현하려고 하면 Now라는 변수에 서버의 변경시간을 저장하고 위와 같이 적으면 된다.

1.5.3 명령어로 이루어진 표현

<%
If Time >=#12:00:00 AM# And Time < #12:00:00 PM# Then
greeting = "Good Morning!"
Else
greeting = "Hello!"
End If
%>

위 문장은 웹페이지에 접근한 시간이 오전이면 "Good Morning!" 아니면 그냥 "Hello!"라고 말하는 명령어들로 구성된 ASP 문장이다.

그러나 이 문장은 클라이언트의 웹 브라우저에 아무것도 전달하지 않는다. 다음 문장을 넣어야 웹 브라우저에 표현된다..

<FONT COLOR="GREEN">
<%= greeting %>
</FONT>

1.5.4 HTML에 포함시키기

위의 절차들을 HTML문장 속에 포함시키면 다음과 같은 문장이 된다.

<HTML>
<BODY>
<FONT COLOR="GREEN">
<% If Time > = #12:00:00 AM# And Time < #12:00:00 PM# Then %>
Good Morning!
<% Else %>
Hello!
<% End If %>
</FONT>
</BODY>
</HTML>

1.5.5 스크립트 태그

디폴트스크립트(VBScript)를 HTML에 포함시켜고자 하면 <SCRIPT> 와 </SCRIPT> 사이에 스크립트를 넣으면 된다. 디폴트 스크립트가 아닌 경우는 <SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT>라고 스크립트 언어를 표시해주면 된다.

스크립트를 적는 방법은 다음과 같이 하면 된다.

<HTML>
<BODY>
<% Call MyFunction %>
</BODY>
</HTML>

<SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT>
function MyFunction ()
{
Response.Write("MyFunction Called")
}
</SCRIPT>


Main Frame in Roadmap

2.1 Request

종종 클라이언트가 사용하는 웹 브라우저가 넷스케이프인가 익스플로러인가를 서버에서 확인해야하는 일이 생긴다. 클라이언트가 폼에 내용을 넣고 전송하면 ASP는 Request 를 이용하여 간단하게 이러한 정보를 알아낼 수 있다.

  • 서버변수에 포함된 표준 정보
  • POST 명령에 따라 오는 파라메터 정보
  • GET 명령에 따라 오는 쿼리 파라메트 정보
  • 브라우저에서 오는 COOKIE 정보
  • 사용자의 권한

Request 객체는 5가지 관련 Collection을 가진다.

  • QueryString
  • Form
  • Cookies
  • ServerVariables
  • ClientCertificate

Request 의 사용규칙은 다음과 같다.:

  • Request.CollectionName(변수)

CollectionName으로는 QueryString, Form, Cookies, ServerVariables, ClientCertificate이 해당된다.

  • Request(variablename)

CollectionName 없이 위와 같이 적을 때는 QueryString, Form, Cookies, ServerVariables, ClientCertificate 순서로 해당변수를 찾는다. 따라서 처음 만나는 값을 돌려준다.


Main Frame in Roadmap

2.2 HTML 폼에서 정보를 가져오기

HTML 폼은 클라언트의 정보를 가져오는데 흔히 사용하고 있다. 폼에는 text boxes, option buttons, check boxes 등이 있다. 사용자가 폼에 정보를 넣고 쿼리버튼을 누르면 사용자의 정보가 서버로 전달된다.


Main Frame in Roadmap

2.3 QueryString

다음과 같은 문장이 있다고 하자

    <A HREF="myasp.asp?name=Charles+Parker&age=30">

QueryString은 name변수와 age변수의 값을 전달한다.

myasp.asp 에서는 그 값을 전달받아 다음과 같이 이용할 수 있다.

    Welcome, <%= Request.QueryString("name") %>.
    Your age is <%= Request.QueryString("age") %>.

위와 같은 문장에서 다음과 같은 결과가 나온다.

    Welcome, Charles Parker. Your age is 30.

QueryString은 같은 이름의 변수에 여러개의 값을 할당할 수도 있다.

    name=Andrew&name=Aaron&name=Eric

위 문장의 의미는 다음 표와 같다. 각각 인덱스 숫자를 가진다.

,
Reference | Value
Request.QueryString("name")(1) | Andrew
Request.QueryString("name")(2) | Aaron
Request.QueryString("name")(3) | Eric

이 경우 Request.QueryString("name")는 count 속성을 가지는데 count는 3이 된다.


Main Frame in Roadmap

2.4 Form

Form collection은 사용자가 폼에 적어넣은 정보를 포함하고 있다. 다음 구문을 살펴보자.

    <HTML>
    </BODY>
    <form action="/scripts/submit.asp" method="post">
    <p>Your first name: <input name="firstname" size=48>
    <p>What is your favorite ice cream flavor: <select
    name="flavor">
    <option>Vanilla <option>Strawberry <option>Chocolate
    <option>Rocky Road
    </select>
    <p><input type=submit>
    </form>
    </BODY>
    </HTML>

이름으로 James를 입력하고 Rocky Road옵션을 선택했다면 다음과 같이 사용자가 입력했다면 다음과 같이 값이 전달된다.:

    firstname=James&flavor=Rocky+Road

다음 구문이 그 결과를 처리하여 보여 준다.

    <HTML>
    </BODY>
    Welcome, <%= Request.Form("firstname") %>.
    Your favorite flavor is <%= Request.Form("flavor") %>
    </BODY>
    </HTML>

Form도 QueryString와 마찬가지로 같은 변수이름에 여러개의 값을 가질 수 있다.


Main Frame in Roadmap

2.5 ServerVariable

ServerVariable 은 사용자의 웹환경 변수와 함께 HTTP 정보를 알아내는데 사용한다.

다음 구문이 있다고 하자

    TCP/IP port <%= Request("SERVER_PORT") %>

이것은 서버의 포트번호를 알 수 있다.

다음 문장은 HTTP가 인식할 수 있는 언어의 종류를 알아내어 그에 따라 다르게 웹페이지를 제공하는 문장이다..

    <% language = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
    If language = "en" Then %>
    <!--#INCLUDE FILE="myapp/Englishpage.asp"-->
    <% Else %>
    <!--#INCLUDE FILE="myapp/Otherlang.asp"-->
    <% End If %>


Main Frame in Roadmap

2.6 Asp File 자신에게 정보 전달하기

폼으로 사용자의 정보를 받아 그 정보가 올바른 정보인지 아니면 틀린 정보인지를 판단하여 틀린 정보일 경우는 다시 입력하라는 메시지를 보내야 할 일이 생긴다. 이 때 이용할 수 있는 방법이 이 방법이다.

예를 들어서 이메일 주소를 넣어야 하는데 엉뚱한 정보를 넣었을 때 이것을 체크하여 다시 넣도록 하는 과정을 적으면 다음과 같은 문장이 된다. 실행보려면 여기를 누른다.

    <HTML>
    <BODY>

    <!-- This is GetEmail.asp -->

    <%
    If IsEmpty(Request("Email")) Then
    Msg = "Please enter your email address."
    ElseIf InStr(Request("Email"), "@") = 0 Then
    Msg = "Please enter an email address" & _
    " in the form username@location."
    Else
    Msg = "This script could process the " & _
    "valid Email address now."
    End If
    %>

    <FORM METHOD="POST" ACTION="GetEmail.asp">
    <PRE>
    Email: <INPUT TYPE="TEXT" NAME="Email" SIZE=30
    VALUE="<%= Request("Email") %>">
    <%= Msg %> <P>
    <INPUT TYPE="SUBMIT" VALUE="Submit">
    </PRE>
    </FORM>
    </BODY>
    </HTML>


Main Frame in Roadmap

2.7 Cookies 사용하기

Cookie는 클라언트가 웹서버에게, 웹서버가 클라이언트에 보내는 정보이다.

    <%= Request.Cookies("animal") %>

Cookie도 인덱스를 가진 정보를 다음 방식으로 가질 수 있다.

    Request.Cookies("name)("key").

예를 들면

    animal=elephant&elephant=African

다음 구문의 결과는 African 값을 돌려준다.

    <%= Request.Cookies("animal")("elephant") %>


Main Frame in Roadmap

3.1 클라언트에 정보 보내기

ASP는 Response 오브젝트를 통하여 클라언트에 정보를 보낸다.

  • Response.Write는 브라우저에 직접정보를 보낸다.
  • Response.Redirect 는 브라우저에 또 다른 URL로 가도록 한다.
  • Response.ContentType는 브라우저가 보내는 텍스트의 종류를 제어한다.
  • Response.Cookies는 쿠키의 값을 보낸다.

유저에게 텍스트를 보낼 때 사용하는 메쏘드가 Write 메쏘드이다.

다음 보기는 사용자에게 인사말을 출력하는 예이다.

    <%
    If user_has_been_here_before Then
    Response.Write "<H3 ALIGN=CENTER>Welcome Back to the Overview Page</H3>"
    Else
    Response.Write "<H3 ALIGN=CENTER>Welcome to the Overview Page</H3>"
    End If
    %>

다음은 위의 보기문장과 같은 결과를 나타낸다.

    <H3 ALIGN=CENTER>
    <% If user_has_been_here_before Then %>
    Welcome Back to the Overview Page.
    <% Else %>
    Welcome to the Overview Page.
    <% End If %>
    </H3>

사용자에게 다른 URL로 가도록 해주는 메쏘드가 Redirect 메쏘드이다.

    Response.Redirect URL

예를 들면 사용자가 홈페이지를 경유하지 않고 직접 어떤 페이지로 왔을 경우 홈페이지로 가도록 하는 예를 밑에서 보여주고 있다.

    <%
    If Not Session("Been_to_Home_Page") Then
    Response.Redirect "homepage.asp"
    End If
    %>

HTTP 문장 형식을 결정해주는 메쏘드가 ContentType 메쏘드이다.

일반적인 문장형식은 다음과 같다.

    Response.ContentType = ContentType

예를 들면 다음과 같이 쓸 수 있다.

    <% Response.ContentType = "text/plain" %>

쿠키는 클라이언트 브라우저가 웹서버에게 또는 웹서버가 클라이언트 브라우저에게 정보를 보낼 때 사용한다.

예를 들면 다음과 같이 쓸 수 있다.

    <% Response.Cookies("animal")="elephant" %>

    <% Response.Cookies("animal")("elephant")="African" %>


Main Frame in Roadmap

3.2 ActiveX 서버 콤포넌트 사용하기

여기서는 ActiveX 서버 콤포넌트 사용법을 익힌다. ActiveX 서버 콤포넌트는 일종의 소프트웨어 부속품이다. 예를 들면 데이터베이스에 접근하기 위해서는 여러분이 만든 웹프로그램만 가지고는 부족하다. 그러나 여러분의 웹프로그램과 데이터베이스와 연결시켜주는 부속 소프트웨어가 필요하다. 이것이 ActiveX 서버 콤포넌트이다. 이러한 콤포넌트는 여러분이 직접 제작할 수도 있지만 이미 만들어진 것을 구입하여 사용할 수 있다.

콤포넌트는 주로 ASP 파일에서 가동시킨다.

ASP에서 기본적으로 제공하고 있는 ActiveX 콤포넌트는 5개가 있다.

  • Database Access component
  • Ad Rotator component
  • Browser Capabilities component
  • File Access component
  • Content Linking component

콤포넌트를 한번 가동시키면 그 콤포넌트에 해당되는 속성과 메쏘드를 모두 사용할 수 있다.

다음은 브라우저의 타입을 알아보는 콤포넌트를 bc라는 변수에 할당하는 것이다.

    <% Set bc = Server.CreateObject("MSWC.BrowserType") %>

아래와 같이 <OBJECT> 태그를 사용하여 콤포넌트를 가동시킬 수도 있다.

    <OBJECT RUNAT=Server ID=MyAd PROGID="MSWC.AdRotator"></OBJECT>

데이터베이스에서 테이터 가져오기

    Database Access 콤포넌트를 사용하여 웹프로그램에서 데이터를 엑세스할 수 있다.

    데이터베이스 콤포넌트에 대해서는 나중에 집중적으로 다루게 된다.

광고 싣기

    Ad Rotator 콤포넌트를 사용하여 광고를 실을 수 있다.

    다음은 그 보기이다.

    <% Set Ad = Server.CreateObject("MSWC.Adrotator") %>
    <%= Ad.GetAdvertisement("/ads/adrot.txt") %>

    다음 HTML문장이 따라온다.

    <A
        HREF="http://www.msn.com/scripts/adredir.asp?url=http://www.company.com/">
<IMG SRC="http://msnnt3web/ads/homepage/chlogo_lg.gif"
ALT="Check out the new Technology Center"
WIDTH=440 HEIGHT=60
        BORDER=1></A>

브라우저 능력 검정하기

    브라우저가 다양하기 때문에 웹페이지를 제공하기 위해서는 접속해오는 브라우저의 능력을 서버에서 알아볼 필요가 있다. 이 때 Browser Capability 콤포넌트를 사용한다.

파일을 읽고 쓰기

    파일을 읽고 쓰기 위해서는 File Access 콤포넌트를 사용한다.


Main Frame in Roadmap

3.3 ASP 프로그램 개발하기

    ASP는 간단한 홈페이지를 형성할 수 있다.

    ASP 프로그램을 개발할 때 어떤 상태(state)를 관리할 수 있다. 이러한 상태는 두가지 형태가 있는데 Session과 Application이다.

    Application은 asp프로그램을 이용하는 모든 사용자에게 공통으로 가지는 상태이며

    Session은 어떤 특정한 용자가 가지는 상태이다.

    예를 들면 어떤 유저가 가지는 비밀번호와 아이디는 Session정보로 관리하고 특정한 시간에 어느 홈페이지에 접속하고 있는 접속자 수는 Application정보로 관리하게 된다.

Global.asa 파일

    ASP 프로그램은 Global.asa파일을 하나 가질 수 있다(asa: Active Server Application).

    이 파일은 해당 웹어플리케이션의 루트 디렉토리에 저장해야 한다. 이 파일은 다음과 같은 경우에 읽혀진다.

    • 웹서버가 처음 그 웹어플리케이션을 읽을 때
    • 어는 한 사용자가 처음 session을 요구할 때

    Global.asa에는 다음과 같은 것이 포함된다.

    • Application-start events, session-start events, or both.
    • Application-end events, session-end events, or both.
    • Object tags.

Application-Start and Session-Start Events

    이것은 웹어플리케이션에서 공통적으로 적용되는 내용을 미리 실행시켜두고자 할 때 필요하다.

      <SCRIPT LANGUAGE=VBScript RUNAT=Server>
      Sub Application_OnStart
      ' This is where you would insert script for an application-start event.
      End Sub
      </SCRIPT>

    예를 들면 Ad Rotator 콤포넌트를 실행시킬 때 다음과 같이 한다.

      <SCRIPT LANGUAGE=VBScript RUNAT=Server>
      Sub Session_OnStart
      Set Session("MyAd")=Server.CreateObject("MSWC.Adrotator")
      End Sub
      </SCRIPT>

Application-End and Session-End Events

    웹어플리케이션이나 세션이 끝날 때 공통적으로 해야할 작업이 있으면 여기에 기술한다.

      <SCRIPT LANGUAGE=VBScript RUNAT=Server>
      Sub Session_OnEnd
      ' This is where you would insert script for a session-end event.
      End Sub
      </SCRIPT>

      <SCRIPT LANGUAGE=VBScript RUNAT=Server>
      Sub Application_OnEnd
      'This is where you insert script for an application ending event.
      End Sub
      </SCRIPT>

세션 끝내기

    사용자가 웹페이지에 연결하고 20분(기본) 동안 아무일도 하지 않으면 세션을 자동적으로 끝이나고 연결이 끝어진다.

    그렇지 않고 20분전에 세션을 끝내려면 다음 명령으로 끝낼 수 있다.

      <% Session.Abandon %>

    만약 20분보다 너 많은 시간을 주고 싶으면 다음과 같이 연장할 수 있다.

      <% Session.Timeout = 30 %>

    주의 할 것은 기본을 20분보다 적게 줄 수는 없다.

어플리케이션 끝내기

    웹서버가 셧다운될 때 어플리케이션이 끝난다.

세션관리하기

    세션의 범위에서 세션 변수를 사용할 수 있다. 여기서 범위라고 하는 것은 세션 변수가 적용되는 범위를 말한다.

    세션은 다음 세가지 경우에 시작한다.

    • 새로운 사용자가 처음 어플리케이션을 시작하고 Session_OnStart가 포함된 어플리케이션의 Global.asa를 시작할 때
    • 한 사용자가 세션 오브젝트에 값을 저장할 때
    • 한 사용자가 어플리케이션에서 한 asp파일을 요구하고 그 어플리케이션의 Global.asa파일이 세션범위를 가지는 오브젝트를 시작하는 <OBJECT>테그를 사용할 때

SessionID 와 Cookies

    한 사용자가 처음 ASP 파일을 실행하면 SessionID를 생산하여 그 것을 쿠키로 바꾸어 사용자의 브라우저에 보낸다. SessionID는 아주 복잡한 알고리즘에 의해 서버에 접속해오는 사용자를 구별하기 위하여 생산한다. 이것은 사용자의 브라우저에 쿠키로 전달되지만 사용자의 하드 디스크에는 저장되지는 않는다.

    웹브라우저가 대부분 쿠키를 지원하지만 그렇지 않은 것도 있다.

세션 오브젝트에 변수 저장하기

      <%
Session("Initiated") = Now
Session("Fidelity") = "Low"
Set Session("myObj") =
          Server.CreateObject("someObj")
%>

사용자 정보 기억하기

    사용자의 정보를 세션에 다음과 같이 저장할 수 있다.

      <%If Session("Fidelity") = "Low" Then %>
      This is the text version of the page.
      <% Else %>
      This is the multimedia version of the page.
      <% End If %>

어플리케이션 관리하기

    ASP로 만들어진 프로그램에서 모든 클라이언트가 조회할 수 있는 속성을 어플리케이션 오브젝트에 저장한다.

클라이언트에게 메시지 전달하기

    웹서버에 접속하는 모든 웹 브라우저에게 전달사항을 전달할 때 Application 오브젝트를 사용한다. 다음은 Application_OnStart 프로시저 사용법을 나타내고 있다.

    이것은 Global.asa에 저장된 내용이다.

      <SCRIPT LANGUAGE=VBScript RUNAT=Server>
      Sub Application_OnStart
      Application("Message") = "This is the default message."
      End Sub
      </SCRIPT>

    위와 같이 Application이 저장되어 있으면 다음과 같이 call할 수 있다.

      <HTML>
      <BODY>
      This is the message: <p>
      <%= Application("Message") %>
      </BODY>
      </HTML>

    다음 보기는 메시지를 새로 변경시키는 프로그램이다.

      <HTML>
      <BODY>
      <form method="post" action="C.asp">
      Enter a new value for the application-wide message:<BR>
      <input type="text" name="newmsg" size=60><p>
      <input type="submit" value="Submit">
      </form>
      </BODY>
      </HTML>

    다음은 새 메시지를 받아 새 메시지를 보도록 하는 프로그램이다.

      <%
      If Not IsEmpty(Request.Form("newmsg")) Then
      Application.Lock
      Application("Message") = Request.Form("newmsg")
      Application.Unlock
      End If
      Response.Redirect("A.asp")
      %>


Main Frame in Roadmap

4.1 방문자 카운터 만들기

다음은 본 강좌의 왼쪽 프레임에서 방문자 수 카운터를 그대로 옮겨놓은 것이다.

같은 디렉토리에 visitors.txt 파일에 방문자 숫자가 텍스트 파일로 기록되어 있다. 이 텍스파일의 기록을 읽어와서 숫자를 증가시키고 다시 기록하는 과정을 적어 놓았다.

    <BODY bgcolor="white" text="black" link="blue" vlink="purple" alink="red">

    <%

    VisitorCountFilename = Server.MapPath ("/cyberinternet/webasp") + "/visitors.txt"
    Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
    Set Out= FileObject.OpenTextFile (VisitorCountFilename, 1, FALSE)

    Application("visitors") = Out.ReadLine
    ' 한줄의 방문자 수를 텍스트파일에서 읽는다

    Application.lock
    Application("visitors")= application("visitors") + 1
    Application.unlock

    Set Out= FileObject.CreateTextFile (VisitorCountFilename, True)

    Out.WriteLine(application("visitors"))
    Out.close
    '파일을 기록하고 닫는다.

    %>

    <TABLE border="0" cellpadding="0" cellspacing="0" width="600" nowrap>
    <TR>
    <TD valign="top" bgcolor="#3366CC"><P><FONT size="2"><IMG src="Contents.GIF" width="98" height="30" border="0"></FONT></TD>
    </TR></TABLE>
    <TABLE border="0" nowrap>
    <TR>
    <TD><P>&nbsp;</TD>
    <TD width="316" nowrap><P><FONT color="#333300">&nbsp;&nbsp;&nbsp;Visitors:

    <% =application("visitors") %>

    '증가된 방문자 수를 화면에 표시한다.

    <BR>
    &nbsp;&nbsp; Since 1999.1.1</FONT></P>

    물론 위에서 현재 디렉토리 속성이 읽고 쓸 수 있도록 설정되어 있어야 visitors.txt 파일을 읽고 쓸 수 있다. 그렇지 않으면 에러가 된다.


Main Frame in Roadmap

4.2 강의실 입장 시각 표시

다음은 강의실 입장 시각을 화면에 표시해 주는 문장이다.

    <%
    currentdate=now()

    response.write "강의실 입장 시각은" & "<br>"
    response.write currentdate & "<P>"

    %>

간단한 것이지만 이것을 이용하면 다양한 시각표현 방법을 쓸 수 있고, 오늘 날짜로부터 2000년까지 남은 일 수도 표현할 수 있다.


Main Frame in Roadmap

5. 데이터베이스 다루기

5.1 데이터베이스 예제(SQL)

5장의 내용은 다음 사이트에서 가져온 내용이다.http://www.activeserverpages.com/learn/SQLexamples.asp

다음은 5장에서 다룰 예제의 기본이 되는 테이블을 정의해 놓은 것이다.

  • Authors table

Au_ID

Author

Year_Born

  • Titles table

Title

Year_Published

ISBN

PubID

Description

Notes

Subject

Comments

  • Title_Author table

ISBN

Au_ID

  • Publisher table

PubID

Name

Company_Name

Address

City

State

Zip

Telephone

Fax

Comments


Main Frame in Roadmap

5.2 SQL Where #1

    SQL에서 데이터를 찾는 방법에는 여러 가지가 있다. 그러나 기본을 잘 익혀놓으면 원하는 데이터에 접근하기가 쉽다.

    텍스트 필드는 홑 따옴표를 쳐야 한다.

    예를 들면 publishers 테이블에서 state가 MD인 레코드를 뽑아내려고 하면 다음과 같이 한다.

    "select * from publishers where state='MD'"

    숫자 필드는 다음과 같이 한다.

    "select * from publishers where PubID=10"

    A로 시작하지만 정확하게 철자를 모를 경우는 다음과 같이 한다.

    "select * from publishers where Name like 'A%%'"

다음은 SQL문에서 쓰는 연산자들이다.

<> 같지 않다

> 보다 크다

< 보다 작다

>= 크거나 같다

<= 작거나 같다

연산자는 다음과 같이 이용할 수 있다.

    "select * from publishers where PubID>10"


Main Frame in Roadmap

5.3 SQL where #2

    다음은 출판사 이름이 A로 시작하는 레코드를 찾는 예제이다.

    <HEAD><TITLE>SQLwhere1.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select * from publishers where name like     'A%%'")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    다음은 출판년도가 1994년과 그 이후 출판된 책을 골라내는 예제이다. 물론 연도는 숫자 필드로 이루어져 있다.

    <HEAD><TITLE>SQLwhere2.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select * from titles where Year_Published >= 1994")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    다음은 팩스번호 앞자리가 "212"로 시작하는 출판사를 고르는 예제이다.

    <HEAD><TITLE>SQLwhere3.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select * from publishers where fax like     '212%%'")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    다음은 출판사가 뉴욕에 있지 않은 출판사를 고르는 예제이다.

    <HEAD><TITLE>sqlwhere4.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select * from publishers where state<>     'NY'")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    위 예제에서 사용한 subdbtable.inc 파일은 다음과 같다.

    <%
    sub query2table(inputquery)
       set conntemp=server.createobject("adodb.connection")
       conntemp.open "DSN=Student;uid=student;pwd=magic"
       set rstemp=conntemp.execute(inputquery)
       howmanyfields=rstemp.fields.count -1%>
       <table border=1><tr>
           <% 'Put Headings On The Table of Field Names
       for i=0 to howmanyfields %>
                 <td><b>    <%=rstemp(i).name%></B></TD>
           <% next %>
       </tr>
           <% ' Now lets grab all the records
       do while not rstemp.eof %>
          <tr>
              <% for i = 0 to howmanyfields
             thisvalue=rstemp(i)
             If isnull(thisvalue) then
                thisvalue="&nbsp;"
             end if%>
                 <td valign=top>    <%=thisvalue%></td>
              <% next %>
          </tr>
              <%rstemp.movenext
       loop%>
       </table>
           <%
       rstemp.close
       set rstemp=nothing
       conntemp.close
       set conntemp=nothing
    end sub%>


Main Frame in Roadmap

5.4 SQL 과 Form의 연결 #1

    여기서는 Form과의 연결을 공부해보자.

    아래 페이지는 폼에서 찾고자 하는 주의 명칭을 받아 sqlwhereForm1respond.asp를 실행시키는 예제이다.

      <HEAD><TITLE>sqlwhereform1.asp</TITLE></HEAD>
      <HTML><body bgcolor="#FFFFFF">
      <Form action = "sqlwhereForm1respond.asp" method=GET>
      Choose A State:<p>
      State: <Input NAME="st" MaxLength="2" size="3"><P>
      <Input type="submit" value="Get Data">&nbsp;<Input type="reset" value="Clear State"></form>
      </BODY></HTML>

    다음은 폼에서 데이터를 넘겨받아 처리하는 페이지이다.

      <HEAD><TITLE>sqlwhereform1respond.asp</TITLE></HEAD>
      <HTML><body bgcolor="#FFFFFF">
      <%
      mystate=request.querystring("st")
      SQLtemp="select * from publishers where state='"
      SQLtemp=SQLtemp & mystate & "'"
      call query2table(SQLtemp)
      %>
      <!--#include virtual="/learn/test/subdbtable.inc"-->
      </BODY></HTML>

    위의 페이지에 포함된 subdbtable.inc의 내용이다.

      <%
      sub query2table(inputquery)
      set conntemp=server.createobject("adodb.connection")
      conntemp.open "DSN=Student;uid=student;pwd=magic"
      set rstemp=conntemp.execute(inputquery)
      howmanyfields=rstemp.fields.count -1%>
      <table border=1><tr>
      <% 'Put Headings On The Table of Field Names
      for i=0 to howmanyfields %>
      <td><b><%=rstemp(i).name%></B></TD>
      <% next %>
      </tr>
      <% ' Now lets grab all the records
      do while not rstemp.eof %>
      <tr>
      <% for i = 0 to howmanyfields
      thisvalue=rstemp(i)
      If isnull(thisvalue) then
      thisvalue="&nbsp;"
      end if%>
      <td valign=top><%=thisvalue%></td>
      <% next %>
      </tr>

      <%rstemp.movenext
      loop%>
      </table>
      <%
      rstemp.close
      set rstemp=nothing
      conntemp.close
      set conntemp=nothing
      end sub%>


Main Frame in Roadmap

5.5 SQL 과 Form의 연결 #2

    like문을 쓴 Form 예제를 다루어 보자.

    다음은 form을 가진 페이지이다.

      <HEAD><TITLE>SQLwhereform2.asp</TITLE></HEAD>
      <HTML><body bgcolor="#FFFFFF">
      <Form action = "SQLwhereForm2respond.asp" method=GET>
      Choose A City:<p>
      City: <Input NAME="cy" MaxLength="20" size="23"><P>
      <input TYPE="checkbox" NAME="ExactSearch" CHECKED>Exact Search<P>
      * note if Exact Search is -> NOT CHECKED <-<br>You can use %% as a wildcard<p>
      <Input type="submit" value="Get Data">&nbsp;<Input type="reset" value="Clear City"></form>
      </BODY></HTML>

    폼에서 데이터를 받아서 처리하는 페이지이다. 위에서 정확한 데이터를 원하는가 그렇지 않으면 유사한 데이터를 원하는가를 폼에서 사용자들이 선택하도록하여 처리한 예제이다.

      <HEAD><TITLE>sqlwhereform2respond.asp</TITLE></HEAD>
      <HTML><body bgcolor="#FFFFFF">
      <%
      mycity=request.querystring("cy")
      myexactsearch=request.querystring("exactsearch")
      SQLtemp="select * from publishers where city"
      If myexactsearch="on" then
      SQLtemp=SQLtemp & " ='"
      Else
      SQLtemp=SQLtemp & " LIKE '"
      End If
      SQLtemp=SQLtemp & mycity & "'"
      'response.write SQLtemp
      call query2table(SQLtemp)
      %>
      <!--#include virtual="/learn/test/subdbtable.inc"-->
      </BODY></HTML>

    다음은 위의 예제에서 subdbtable.inc 포함된 파일이다.

      <%
      sub query2table(inputquery)
      set conntemp=server.createobject("adodb.connection")
      conntemp.open "DSN=Student;uid=student;pwd=magic"
      set rstemp=conntemp.execute(inputquery)
      howmanyfields=rstemp.fields.count -1%>
      <table border=1><tr>
      <% 'Put Headings On The Table of Field Names
      for i=0 to howmanyfields %>
      <td><b><%=rstemp(i).name%></B></TD>
      <% next %>
      </tr>
      <% ' Now lets grab all the records
      do while not rstemp.eof %>
      <tr>
      <% for i = 0 to howmanyfields
      thisvalue=rstemp(i)
      If isnull(thisvalue) then
      thisvalue="&nbsp;"
      end if%>
      <td valign=top><%=thisvalue%></td>
      <% next %>
      </tr>

      <%rstemp.movenext
      loop%>
      </table>
      <%
      rstemp.close
      set rstemp=nothing
      conntemp.close
      set conntemp=nothing
      end sub%>


Main Frame in Roadmap

5.6 SQL 과 Form의 연결 #3

    다음은 사용자가 도시 이름을 엉터리로 선택하지 않도록 도시 이름 리스트를 보여주는 예제이다.

    <HEAD><TITLE>SQLwhereform3.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <Form action = "SQLwhereForm3respond.asp" method=GET>
    Choose A City:<p>
    City:
    <%
    call query2list("select distinct city from publishers", _
    "cy","DSN=student;uid=student;pwd=magic")
    %>
    <P>
    <Input type="submit" value="Get Data">&nbsp;<Input type="reset" value="Clear City"></form>
    </BODY></HTML>
    <!--#include virtual="/learn/test/subdblist.inc"-->

    <HEAD><TITLE>sqlwhereform3respond.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    mycity=request.querystring("cy")
    myexactsearch=request.querystring("exactsearch")
    SQLtemp="select * from publishers where city"
    If myexactsearch="on" then
    SQLtemp=SQLtemp & " ='"
    Else
    SQLtemp=SQLtemp & " LIKE '"
    End If
    SQLtemp=SQLtemp & mycity & "'"
    'response.write SQLtemp
    call query2table(SQLtemp)
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    파일 /learn/test/subdbtable.inc 의 내용은 다음과 같다.

    <%
    sub query2table(inputquery)
    set conntemp=server.createobject("adodb.connection")
    conntemp.open "DSN=Student;uid=student;pwd=magic"
    set rstemp=conntemp.execute(inputquery)
    howmanyfields=rstemp.fields.count -1%>
    <table border=1><tr>
    <% 'Put Headings On The Table of Field Names
    for i=0 to howmanyfields %>
    <td><b><%=rstemp(i).name%></B></TD>
    <% next %>
    </tr>
    <% ' Now lets grab all the records
    do while not rstemp.eof %>
    <tr>
    <% for i = 0 to howmanyfields
    thisvalue=rstemp(i)
    If isnull(thisvalue) then
    thisvalue="&nbsp;"
    end if%>
    <td valign=top><%=thisvalue%></td>
    <% next %>
    </tr>

    <%rstemp.movenext
    loop%>
    </table>
    <%
    rstemp.close
    set rstemp=nothing
    conntemp.close
    set conntemp=nothing
    end sub%>

    The file /learn/test/subdblist.inc looks like this:

    <%sub query2list(myquery,myname,myDSN)
    set conntemp=server.createobject("adodb.connection")
    conntemp.open myDSN
    set rstemp=conntemp.execute(myquery)
    %>
    <Select name="<%=myname%>">
    <%
    do while not rstemp.eof %>
    <option> <%=RStemp(0)%> </option>
    <%rstemp.movenext
    loop%>
    </select>
    <%rstemp.close
    set rstemp=nothing
    conntemp.close
    set conntemp=nothing
    end sub%>


Main Frame in Roadmap

5.7 SQL AND/OR

    다음은 AND의 구문이다.
    "select * from publishers where state='MD' and city='Rockville'
    "select * from authors where Year_Born>1960 and Year_Born<1970'

    다음은 OR의 구문이다.
    "select * from publishers where state='MD' OR state='NY'

    <HEAD><TITLE>SQLcities.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <Form action = "SQLcitiesrespond.asp" method="POST">
    Choose City (or Cities):<p>
    <%
    call query2listm("select distinct city from publishers", _
    "cy","DSN=student;uid=student;pwd=magic")
    %>
    <P>
    <Input type="submit" value="Get Data">&nbsp;<Input type="reset" value="Clear City"></form>
    </BODY></HTML>
    <!--#include virtual="/learn/test/lib_dblist.asp"-->

    결과를 보여주는 페이지이다.

    <HEAD><TITLE>sqlcitiesrespond.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    citycount=request.form("cy").count
    If citycount=0 then%>
    <B>You never choose a city!</b><br>
    <a href="sqlcities.asp">Choose City</a>
    <%
    response.end
    end if
    firstcity=request.form("cy")(1)
    SQLtemp="select * from publishers "
    SQLtemp = SQLtemp & " where city='" & firstcity & "'"
    for counter=2 to citycount
    whichcity=request.form("cy")(counter)
    SQLtemp = SQLtemp & " or city='" & whichcity & "' "
    next
    response.write SQLtemp
    call query2table(SQLtemp,"DSN=student;uid=student;pwd=magic")
    %>
    <!--#include virtual="/learn/test/lib_dbtable.asp"-->
    </BODY></HTML>

    파일 /learn/test/lib_dbtable.asp 는 다음과 같다.

    <%
    sub query2table(inputquery, inputDSN)
    dim conntemp, rstemp
    set conntemp=server.createobject("adodb.connection")
    conntemp.open inputDSN
    set rstemp=conntemp.execute(inputquery)
    howmanyfields=rstemp.fields.count -1%>
    <table border=1><tr>
    <% 'Put Headings On The Table of Field Names
    for i=0 to howmanyfields %>
    <td><b><%=rstemp(i).name%></B></TD>
    <% next %>
    </tr>
    <% ' Now lets grab all the records
    do while not rstemp.eof %>
    <tr>
    <% for i = 0 to howmanyfields
    thisvalue=rstemp(i)
    If isnull(thisvalue) then
    thisvalue="&nbsp;"
    end if%>
    <td valign=top><%=thisvalue%></td>
    <% next %>

    </tr>
    <%rstemp.movenext
    loop%>
    </table>
    <%
    rstemp.close
    set rstemp=nothing
    conntemp.close
    set conntemp=nothing
    end sub%>

    파일 /learn/test/lib_dblist.asp

    <%sub query2listm(myquery,myname,myDSN)
    dim conntemp, rstemp
    set conntemp=server.createobject("adodb.connection")
    conntemp.open myDSN
    set rstemp=conntemp.execute(myquery)
    %>
    <Select multiple name="<%=myname%>">
    <option>-All Cities-</option>
    <%
    do while not rstemp.eof
    thisfield=trim(RStemp(0))
    if isnull(thisfield) or thisfield="" then
    ' ignore
    else
    response.write "<option>" & thisfield & "</option>"
    end if
    rstemp.movenext
    loop
    %>
    </select>
    <%rstemp.close
    set rstemp=nothing
    conntemp.close
    set conntemp=nothing
    end sub%>


Main Frame in Roadmap

5.8 SQL Count

    다음은 COUNT의 구문 규칙이다.

    레코드 개수를 단순하게 세고자 할 때는 다음과 같이 하면 된다.

    "select count(*) from publishers where state='NY'

    If you count a specific field you must groupby that field or it won't work:

    어떤 특정 필드에서 도시 이름이 다른 경우 구룹을 정하여 세고자 할 때는 다음과 같이 한다.

    "select count(city),city from publishers group by city"

    AS 연산자를 이용하여 도시의 개수를 세어서 특정한 변수에 저장할 수 있다.

    "select count(city) as howmany,city from publishers group by city"

    <HEAD><TITLE>SQLcount1.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select count(*) from publishers where state='NY'")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    <HEAD><TITLE>SQLcount2.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select count(city),city from publishers group by city")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    <HEAD><TITLE>SQLcount3.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select count(city) as howmany,city from publishers group by city")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    <HEAD><TITLE>SQLcount4.asp</TITLE></HEAD>
    <HTML><body bgcolor="#FFFFFF">
    <%
    call query2table("select count(*),city,state from publishers group by city,state")
    %>
    <!--#include virtual="/learn/test/subdbtable.inc"-->
    </BODY></HTML>

    위의 /learn/test/subdbtable.inc 내용은 다음과 같이 한다.

    <%
    sub query2table(inputquery)
    set conntemp=server.createobject("adodb.connection")
    conntemp.open "DSN=Student;uid=student;pwd=magic"
    set rstemp=conntemp.execute(inputquery)
    howmanyfields=rstemp.fields.count -1%>
    <table border=1><tr>
    <% 'Put Headings On The Table of Field Names
    for i=0 to howmanyfields %>
    <td><b><%=rstemp(i).name%></B></TD>
    <% next %>
    </tr>
    <% ' Now lets grab all the records
    do while not rstemp.eof %>
    <tr>
    <% for i = 0 to howmanyfields
    thisvalue=rstemp(i)
    If isnull(thisvalue) then
    thisvalue="&nbsp;"
    end if%>
    <td valign=top><%=thisvalue%></td>
    <% next %>
    </tr>

    <%rstemp.movenext
    loop%>
    </table>
    <%
    rstemp.close
    set rstemp=nothing
    conntemp.close
    set conntemp=nothing
    end sub%>


Main Frame in Roadmap

6. ADO 기법

6.1 maxrecords의 용법

maxrecords는 테이블에서 레코드 집합을 가져올 때
한번에 나타내고자하는 레코드의 갯수를 지정할 때 사용한다.

    <html>
    <head>
    <TITLE>dbmaxrecs.asp</TITLE>
    </head>
    <body bgcolor="#FFFFFF">
    <!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->
    <%
    set rstemp=Server.CreateObject("adodb.Recordset")
    rstemp.maxrecords=15
    connectme="DSN=Student;uid=student;pwd=magic"
    rstemp.open "select * from titles", _
    connectme,adopenstatic
    ' table display
    howmanyfields=rstemp.fields.count -1
    %>
    <table border=1><tr>
    <%
    for i=0 to howmanyfields %>
    <td><b><%=rstemp(i).name %></B></TD>
    <% next %>
    </tr>
    <%
    do while not rstemp.eof %>
    <tr>
    <% for i = 0 to howmanyfields%>
    <td valign=top><% = rstemp.fields(i).value %>&nbsp;</td>
    <% next %>
    </tr>
    <%
    rstemp.movenext
    loop
    %>
    </table>
    </body>
    </html>


Main Frame in Roadmap

6. ADO 기법

6.2 페이지로 나눈 테이블 표시

레코드 셋을 페이지로 나누는 방법을 보여주고 있다.

AbsolutePage, .PageCount and .PageSize 의 쓰임새를 알 수 있다.

    <html><head>
    <TITLE>dbtablepaged.asp</TITLE>
    </head><body bgcolor="#FFFFFF">
    <!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->
    <%
    connectme="DSN=Student;uid=student;pwd=magic"
    sqltemp="select * from publishers"

    ' 문제 해결
    ' 만약 여기서 에러가 발생하면, 예를 들어:
    '
    ' ADODB.Recordset error 800a0cb3
    '
    ' 여기서 연산자를 지원하지 않기 때문이다. 이때는
    '
    ' 파일 dovbs.inc를 포함시켜야 하는데 이 파일이 없으면 다음 주소에서
    ' 구하면 된다.
    ' www.learnasp.com/adovbs.inc

    mypage=request.querystring("whichpage")
    If mypage="" then
    mypage=1
    end if
    mypagesize=request.querystring("pagesize")
    If mypagesize="" then
    mypagesize=10
    end if
    set rstemp=Server.CreateObject("ADODB.Recordset")
    rstemp.cursorlocation=aduseclient
    rstemp.cachesize=5
    rstemp.open sqltemp,connectme
    rstemp.movefirst
    rstemp.pagesize=mypagesize
    maxcount=cint(rstemp.pagecount)
    rstemp.absolutepage=mypage
    howmanyrecs=0
    howmanyfields=rstemp.fields.count -1
    response.write "Page " & mypage & " of " & maxcount & "<br>"
    %>
    <table border=1><tr>
    <% 'Put Headings On The Table of Field Names
    for i=0 to howmanyfields %>
    <td><b><%=rstemp(i).name %></B></TD>
    <%next%>
    </tr>

    <%do while not rstemp.eof and howmanyrecs<rstemp.pagesize%>
    <tr>
    <%for i = 0 to howmanyfields%>
    <td valign=top><%=rstemp(i)%></td>
    <%next%>
    </tr>
    <%
    rstemp.movenext
    howmanyrecs=howmanyrecs+1
    loop
    rstemp.close
    set rstemp=nothing
    %>
    </table><p>
    <%
    pad="0"
    scriptname=request.servervariables("script_name")
    for counter=1 to maxcount
    If counter>=10 then
    pad=""
    end if
    ref="<a href='" & scriptname & "?whichpage=" & counter
    ref=ref & "&pagesize=" & mypagesize & "'>" & pad & counter & "</a>"
    response.write ref & " "
    if counter mod 10 = 0 then
    response.write "<br>"
    end if
    next
    %>
    </body></html>


Main Frame in Roadmap

6. ADO 기법

6.3 Database Count Records (by Juan Llibre)

데이터베이스에서 레코드의 수를 세는 방법을 보여주고 있다.

여기서는 커서를 지원한다는 것이 특징이다.

    <head><html>
    <TITLE>dbcount.asp</TITLE>
    </head><body bgcolor="#FFFFFF">
    <!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->
    <%
    ' 여러분의 환경에 맞게 고쳐야 할 부분이다.
    connectme="DSN=Student;uid=student;pwd=magic"
    sqltemp="select * from publishers where state='NY'"

    set rstemp=Server.CreateObject("adodb.Recordset")
    ' 커서의 형태는 매우 중요하다.
    ' adopenstatic이 동작한다.
    ' adopenforwardonly는 -1을 되돌려준다.
    ' adopenkeyset가 동작한다.
    ' adopendynamic는 -1을 되돌려준다.
    rstemp.open sqltemp, connectme, adopenstatic
    howmanyrecs=rstemp.recordcount
    response.write howmanyrecs & " records in<br>" & sqltemp
    %>
    </body>
    </html>


Main Frame in Roadmap

6. ADO 기법

6.4 ADO 커서 형태 Phil Paxton제공 (phil@matchw.com)

    ADO 커서 형태는 사용가능한 속성과 메쏘드에 영향을 미친다.

    다음 표에서 표시한 것들이 사용가능한 속성과 메쏘드이다.

Property | Forward-Only | Dynamic | Keyset | Static
AbsolutePage | N/A | N/A | R/W | R/W
AbsolutePosition | N/A | N/A | R/W | R/W
ActiveConnection | R/W | R/W | R/W | R/W
BOF | R/O | R/O | R/O | R/O
Bookmark | N/A | N/A | R/W | R/W
CacheSize | R/W | R/W | R/W | R/W
CursorLocation | R/W | R/W | R/W | R/W
CursorType | R/W | R/W | R/W | R/W
EditMode | R/O | R/O | R/O | R/O
EOF | R/O | R/O | R/O | R/O
Filter | R/W | R/W | R/W | R/W
LockType | R/W | R/W | R/W | R/W
MarshalOptions | R/W | R/W | R/W | R/W
MaxRecords | R/W | R/W | R/W | R/W
PageCount | N/A | N/A | R/O | R/O
PageSize | R/W | R/W | R/W | R/W
RecordCount | N/A | N/A | R/O | R/O
Source | R/W | R/W | R/W | R/W
State | R/O | R/O | R/O | R/O
Status | R/O | R/O | R/O | R/O
Method |  |  |  |
AddNew | Yes | Yes | Yes | Yes
CancelBatch | Yes | Yes | Yes | Yes
CancelUpdate | Yes | Yes | Yes | Yes
Clone | N/A | N/A | Yes | Yes
Close | Yes | Yes | Yes | Yes
Delete | Yes | Yes | Yes | Yes
GetRows | Yes | Yes | Yes | Yes
Move | Yes | Yes | Yes | Yes
MoveFirst | Yes | Yes | Yes | Yes
MoveLast | N/A | Yes | Yes | Yes
MoveNext | Yes | Yes | Yes | Yes
MovePrevious | N/A | Yes | Yes | Yes
NextRecordset | Yes | Yes | Yes | Yes
Open | Yes | Yes | Yes | Yes
Requery | Yes | Yes | Yes | Yes
Resync | N/A | N/A | Yes | Yes
Supports | Yes | Yes | Yes | Yes
Update | Yes | Yes | Yes | Yes
UpdateBatch | Yes | Yes | Yes | Yes

범례:
R/W = Read/Write
R/O = Read-Only
N/A = Not Available or Supported
Yes = Available/Supported


Main Frame in Roadmap

6. ADO 기법

6.5 새 레코드 입력하기 폼

이 페이지는 새레코드를 추가하기 위한 폼이다.

<html><head>
<title>dbnewrec.asp</title>&
<body bgcolor="#FFFFFF">
<% ' My ASP program that allows you to append a record %>
<form name="myauthor" action="dbnewrecSQL.asp" method="GET">
<p>Author ID: <input type="TEXT" name="id"></p>
<p> Author Name: <input type="TEXT" name="name"></p>
<p> Year Born: <input type="TEXT" name="year"></p>
<p> <input type="SUBMIT"> </p>
</form>
</body>
</html>


Main Frame in Roadmap

6. ADO 기법

6.6 SQL이용한 새레코드 추가

    만약 이 프로그램이 잘 작동하지 않으면 아래주소에 접속하여 문제해결을 해보기 바란다.

    http://www.activeserverpages.com/learn/dbtroubleshoot.asp

    이 프로그램을 테스트하려고 하면 다음과 같이 접속해본다. http://www.activeserverpages.com/learn/test/dbnewrecSQL.asp?name=Joey&id=9000&year=1964

    <TITLE>dbnewrecSQL.asp</TITLE>
    <body bgcolor="#FFFFFF">
    <HTML>
    <%
    'on error resume next
    auname=request.querystring("name")
    auyear=request.querystring("year")
    auID=request.querystring("ID")
    If auid<9000 then
    auid=auid+9000
    end if
    Set Conn = Server.CreateObject("ADODB.Connection")
    conn.open "DSN=Student;uid=student;pwd=magic"
    SQLStmt = "INSERT INTO authors (AU_ID,author,year_born) "
    SQLStmt = SQLStmt & "VALUES (" & auid
    SQLStmt = SQLStmt & ",'" & auname & "'"
    SQLStmt = SQLStmt & "," & int(auyear) & ")"
    Set RS = Conn.Execute(SQLStmt)
    set rs=nothing
    If err.number>0 then
    response.write "VBScript Errors Occured:" & "<P>"
    response

    .write "Error Number=" & err.number & "<P>"
    response.write "Error Descr.=" & err.description & "<P>"
    response.write "Help Context=" & err.helpcontext & "<P>"
    response.write "Help Path=" & err.helppath & "<P>"
    response.write "Native Error=" & err.nativeerror & "<P>"
    response.write "Source=" & err.source & "<P>"
    response.write "SQLState=" & err.sqlstate & "<P>"
    else
    response.write "No VBScript Errors Occured" & "<P>"
    end if
    IF conn.errors.count> 0 then
    response.write "Database Errors Occured" & "<P>"
    for counter= 0 to conn.errors.count
    response.write "Error #" & conn.errors(counter).number & "<P>"
    response.write "Error desc. -> " & conn.errors(counter).description & "<P>"
    next
    else
    response.write "No Data

    base Errors Occured!" & "<P>"
    end if
    Conn.Close
    set conn=nothing
    %>
    </BODY>
    </HTML>


Main Frame in Roadmap

6. ADO 기법

6.7 ADO 이용한 새레코드 추가

    이 페이지는 SQL 대신 ADO를 이용하여 새 레코드를 추가할 수 있음을 보여준다.

    <html><head>
    <title>dbnewrec.asp</title>&
    <body bgcolor="#FFFFFF">
    <% ' My ASP program that allows you to append a record %>
    <form name="myauthor" action="dbnewADOrespond.asp" method="GET">
    <p>Author ID: <input type="TEXT" name="id"></p>
    <p> Author Name: <input type="TEXT" name="name"></p>
    <p> Year Born: <input type="TEXT" name="year"></p>
    <p> <input type="SUBMIT"> </p>
    </form></body></html>

    위 폼에서 자료를 입력받아 처리하는 dbnewADOrespond.asp페이지이다.

    <TITLE>dbnewADO.asp</TITLE>
    <body bgcolor="#FFFFFF">
    <HTML>
    <!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->
    <%
    'on error resume next
    auname=request.querystring("name")
    auyear=request.querystring("year")
    auID=request.querystring("ID")

    If auid<9000 then
    auid=auid+9000
    end if
    conn="DSN=Student;uid=student;pwd=magic"
    Set RS = Server.CreateObject("ADODB.Recordset")
    RS.Open "authors",Conn,adopenstatic,adlockoptimistic

    RS.AddNew
    RS("AU_ID")=auid
    RS("Author") = auname
    RS("Year_Born")= int(auyear)
    RS.Update

    RS.Close
    set rs=nothing

    If err.number>0 then
    response.write "VBScript Errors Occured:" & "<P>"
    response.write "Error Number=" & err.number & "<P>"
    response.write "Error Descr.=" & err.description & "<P>"
    response.write "Help Context=" & err.helpcontext & "<P>"
    response.write "Help Path=" & err.helppath & "<P>"
    response.write "Native Error=" & err.nativeerror & "<P>"
    response.write "Source=" & err.source & "<P>"
    response.write "SQLState=" & err.sqlstate & "<P>"
    else
    response.write "Record was added Fine!<P>"
    end if
    %>
    </BODY>
    </HTML>


Main Frame in Roadmap

7. 사이버연수원 시스템

7.1 연수생 등록 프로그램

여기 소개하는 프로그램은 필자가 운영하는 사이버 연수원에서 연수등록 프로그램으로 쓰고 있는 프로그램이다. 원문을 그대로 제공하는 것이 도움이 되리라고 생각한다. 프로그램은 AddUser2.asp로 저장되어 있다.

<%@ LANGUAGE="VBSCRIPT" %>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual InterDev 1.0">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=ks_c_5601-1987">
<TITLE>Document Title</TITLE>
<Script Language="JavaScript">
<!--
function Cancel_Click() {
alert("연수등록을 취소합니다.");
document.location.href="yunsu.htm";
return;
}

function Previous_Click()
      {
document.location.href="AddUser1.asp";
return;
}

function loadDoc()
      {
document.frmAddUser2.txtName.focus();
return;
}

function Reset_Click()
      {
document.frmAddUser2.txtUserID.value =
      "";
document.frmAddUser2.txtName.value =
      "";
document.frmAddUser2.txtPersonNo.value =
      "";
document.frmAddUser2.txtPassword1.value =
      "";
document.frmAddUser2.txtPassword2.value =
      "";
document.frmAddUser2.txtName.focus();
return;
}

function frmAddUser2_Validate(theForm) {
if (theForm.txtName.value == "") {
alert("성명(Name)를 입력하십시요.");
theForm.txtName.focus();
return (false);
}

if (theForm.txtPersonNo.value == "") {
alert("주민등록번호(Person No)를 입력하십시요.");
theForm.txtPersonNo.focus();
return (false);
}

if (theForm.txtUserID.value == "")
      {
alert("아이디(User ID)를
      입력하십시요.");
theForm.txtUserID.focus();
return
      (false);
}

if (theForm.txtUserID.value.length < 4
      || theForm.txtUserID.value.length > 8)
      {
alert("사용자ID는 4 ~ 10자
      이내로 입력하셔야
      합니다.");
theForm.txtUserID.focus();
return
      (false);
}

if (theForm.txtPassword1.value == "") {
alert("패스워드(Password)를 입력하십시요.");
theForm.txtPassword1.focus();
return (false);
}

if (theForm.txtPassword1.value.length < 6 || theForm.txtPassword1.value.length > 16) {
alert("패스워드는 6 ~ 10자 이내로 입력하셔야 합니다.");
theForm.txtPassword1.focus();
return (false);
}

if (theForm.txtPassword2.value == "") {
alert("패스워드(Password)를 입력하십시요.");
theForm.txtPassword2.focus();
return (false);
}

if (theForm.txtPassword1.value != theForm.txtPassword2.value) {
alert("패스워드(Password)가 서로 다릅니다.");
theForm.txtPassword1.value = "";
theForm.txtPassword2.value = "";
theForm.txtPassword1.focus();
return (false);
}
return (true);
}
//-->
</Script>
</HEAD>

<!-BODY bgcolor="#FFFFFF"
      onLoad="loadDoc()"-->
<BODY bgcolor="#F7F7E7" text="#333300"
      link="#2A458A" vlink="#DE1B1B" alink="#DE1B1B"
      onLoad="loadDoc()">
<DIV align="center">
<P><IMG
      src="images/Cyber.jpg" border="0"
      align=center>&nbsp;&nbsp;&nbsp;</p>

<br>
<center>
<font size=4 color="blue">연수생 기본정보 등록</font>
<table width=500><tr><td>
<hr>
<form name="frmAddUser2" method="post"
onsubmit="return frmAddUser2_Validate(this)"
action="AddUser3.asp">
<table border=0>
<tr>
<td align="right"><font size="2">
성명(Name) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=8 name="txtName" value="<%=Session("Name")%>">
<font color="green"> 홍 길 동(글자사이를 한칸만 띄우기) </font>
</font></td>
</tr><tr>
<td align="right"><font size="2">
주민등록번호(Person No) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=14 name="txtPersonNo" value="<%=Session("PersonNo")%>">
<font color="green"> XXXXXX-XXXXXXX</font>
</font></td

>
</tr><tr>
<td align="right"><font size="2">
아이디(User ID) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=12 name="txtUserID" value="<%=Session("UserID")%>">
<font color="green"> 4~10자 영어나 숫자(띄어쓰기없음) </font>
</font></td>
</tr><tr>
<td align="right"><font size="2">
패스워드(Password) :
</font></td>
<td align="left"><font size="2">
<input type="password" size=12 name="txtPassword1" value="<%=Session("Password")%>">
<font color="green"> 6-10자 영어나 숫자(띄어쓰기없음 )</font>
</font></td>
</tr><tr>
<td align="right"><font size="2">
패스워드 확인 :
</font></td>
<td align="left"><font size="2">
<input type="password" size=12 name="txtPassword2" value="<%=Session("Password")%>">
<font color="gre

en"> 패스워드를 똑같이 한번더입력 </font>
</font></td>
</tr></table>
<hr>
</td></tr></table>
<input type="hidden" name="txtValue" value="true">
<input type="button" name="cmdPrevious" value="< 이전" OnClick="var rtn=Previous_Click();">&nbsp;
<input type="submit" name="cmdNext" value="다음 >">&nbsp;
<input type="button" name="cmdReset" value="지 우 기" OnClick="Reset_Click()">&nbsp;
<input type="button" name="cmdCancel" value="취 소" OnClick="var rtn=Cancel_Click();">
</center>
</form>

</BODY>
</HTML>

다음은 직접 웹 브라우저에 나타나는 화면이다.

여기서 내용이 확실하게 입력되면 AddUser3.asp 프로그램으로 진행된다.


Main Frame in Roadmap

7. 사이버연수원 시스템

7.2 연수생 인증 확인 프로그램

다음은 연수생이 입력한 이름과 주민등록번호가 DB( MS-ACCESS, Cyber.mdb)의 tbl_Basic 테이블에 저장되어 있는 이름과 주민등록번호와 비교하여 연수생임을 확인하고 연수생이면 추가정보를 받아들이고 연수생이 아니면 등록된 연수자가 아님을 알려주고, tbl_User에 이미 등록된 연수자이면 이미 등록되어 있을을 알려주고, 연수생이 확인되면 tbl_User에 레코드를 추가하는 프로그램이다.

<%@ LANGUAGE="VBSCRIPT" %>

<%
If Request("txtValue") = "true" Then
Session("UserID")=Request("txtUserID")
Session("Name")=Request("txtName")
Session("PersonNo")=Request("txtPersonNo")
Session("Password")=Request("txtPassword1")
End If
%>

<%
Dim db
Dim rs

Set db = Server.CreateObject("ADODB.Connection")
db.Open "Cyber"

Dim strSQL

strSQL = "SELECT * FROM tbl_Basic " & _
"WHERE tbl_Basic.PersonNo = '" & Session("PersonNo") & "' " & _
"AND tbl_Basic.Name = '" & Session("Name") & "'"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, db, 1

If rs.RecordCount < 1 Then%>
<br>
<center>
<img src="images/Stop2.gif" border=0 width=87 height=87>
<br>
<p><%=Session("Name")%>님은 과정신청이 되어있지 않습니다.</p>
<p><a href="AddUser2.asp">전화면</a>으로 돌아가서 주민등록번호와 성명을 확인 하시거나</p>
<p>과정신청을 하지않은 일반 이용자인 경우는 연수등록을 <a href="Cyber.htm">취소</a> 하세요.</p>
</center>
<%
rs.Close
db.Close
set rs = nothing
set db = nothing
Response.End
End If

rs.Close
set rs = nothing

strSQL = "SELECT * FROM tbl_User " & _
"WHERE tbl_User.PersonNo = '" & Session("PersonNo") & "'"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, db, 1

If rs.RecordCount > 0 Then%>
<br>
<center>
<img src="images/Stop2.gif" border=0 width=87 height=87>
<br>
<p><%=Session("Name")%>님은 이미 연수등록을 하셨습니다.</p>
<p>연수등록을 <a href="inter.asp">취소</a> 하시고 연수를 계속하세요.</p>
</center>
<%
rs.Close
db.Close
set rs = nothing
set db = nothing
Response.End
End If

rs.Close
set rs = nothing

strSQL = "SELECT * FROM tbl_User " & _
"WHERE tbl_User.UserID = '" & Session("UserID") & "'"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, db, 1

If rs.RecordCount > 0 Then%>
<br>
<center>
<img src="images/Stop2.gif" border=0 width=87 height=87>
<br>
<p><%=Session("Name")%>님의 아이디(ID)는 이미 존재 합니다.</p>
<p><a href="AddUser2.asp">전화면</a>으로 돌아가서 아이디를 수정 하세요.</p>
</center>
<%
rs.Close
db.Close
set rs = nothing
set db = nothing
Response.End
End If

rs.Close
db.Close
set rs = nothing
set db = nothing
%>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual InterDev 1.0">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=ks_c_5601-1987">
<TITLE>Document Title</TITLE>
<Script Language="JavaScript">
<!--
function Cancel_Click() {
alert("연수등록을 취소합니다.");
document.location.href="Inter.asp";
return;
}

function Previous_Click()
      {
document.location.href="AddUser2.asp";
return;
}

function loadDoc()
      {
document.frmAddUser3.txtPosition.focus();
return;
}

function Reset_Click()
      {
document.frmAddUser3.txtPosition.value =
      "";
document.frmAddUser3.txtJik.value =
      "";
document.frmAddUser3.txtSoji.value =
      "";
document.frmAddUser3.txtHomeAddr.value =
      "";
document.frmAddUser3.txtEmail.value =
      "";
document.frmAddUser3.txtTelno.value =
      "";
document.frmAddUser3.txtBirthday.value =
      "";
document.frmAddUser3.txtPost.value =
      "";
document.frmAddUser3.txtAddress.value =
      "";
document.frmAddUser3.txtPosition.focus();
return;
}

function frmAddUser3_Validate(theForm) {
if (theForm.txtPosition.value == "") {
alert("소속(Position)을 입력하십시요.");
theForm.txtPosition.focus();
return (false);
}

if (theForm.txtJik.value == "") {
alert("직명을 입력하십시요.");
theForm.txtJik.focus();
return (false);
}

if (theForm.txtSoji.value == "") {
alert("소지자격을 입력하십시요.");
theForm.txtSoji.focus();
return (false);
}

if (theForm.txtTelno.value == "") {
alert("연락처를 입력하십시요.");
theForm.txtTelno.focus();
return (false);
}

if (theForm.txtPost.value == "") {
alert("우편번호를 입력하십시요.");
theForm.txtPost.focus();
return (false);
}

if (theForm.txtAddress.value == "") {
alert("주소를 입력하십시요.");
theForm.txtAddress.focus();
return (false);
}

return (true);
}
//-->
</Script>
</HEAD>

<!-BODY bgcolor="#FFFFFF"
      onLoad="loadDoc()"-->
<BODY bgcolor="#F7F7E7" text="#333300"
      link="#2A458A" vlink="#DE1B1B" alink="#DE1B1B"
      onLoad="loadDoc()">
<DIV align="center">
<P><IMG
      src="images/Cyber.jpg" border="0"
      align=center>&nbsp;&nbsp;&nbsp;</p>

<br>
<center>
<font size=4 color="blue">연수생 부가정보 등록</font>
<table width=500><tr><td>
<hr>
<form name="frmAddUser3" method="post"
onsubmit="return frmAddUser3_Validate(this)"
action="AddUserFinish.asp">
<font size="2">
<table border=0>
<tr>
<td align="right"><font size="2">
학교/소속(Position) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=40 name="txtPosition" value="<%=Session("Position")%>">
</font></td>
</tr><tr>
<td align="right"><font size="2">
직명 :
</font></td>
<td align="left"><font size="2">
<input type="text" size=25 name="txtJik" value="<%=Session("Jik")%>">
<font color="green"> (교사,연구사...)</font>
</font></td>
</tr><tr>

<td align="right"><font size="2">
소지자격 :
</font></td>
<td align="left"><font size="2">
<input type="text" size=25 name="txtSoji" value="<%=Session("Soji")%>">
<font color="green"> (중등1정영어...)</font>
</font></td>
</tr><tr>
<td align="right"><font size="2">
홈페이지주소(Home) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=40 name="txtHomeAddr" value="<%=Session("HomeAddr")%>">
<font color="green"> (없으면 쓰지 마세요.)</font>
</font></td>
</tr><tr>
<td align="right"><font size="2">
전자우편주소(E-Mail) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=40 name="txtEmail" value="<%=Session("Email")%>">
<font color="green"> (없으면 쓰지 마세요.)</font>
</font></td>
</tr><tr>

<td align="right"><font size="2">
연락처(집) :
</font></td>
<td align="left"><font size="2">
<input type="text" size=20 name="txtTelno" value="<%=Session("Telno")%>">
<font color="green"> (0553-543-7191)</font>
</font></td>
</tr><tr>
<td align="right"><font size="2">
성별(Sex) :
</font></td>
<td align="left"><font size="2">
<%If Session("Sex") = "1" or Session("Sex") = "" Then%>
<INPUT TYPE="RADIO" NAME="chkSex" VALUE="1" checked>남
<INPUT TYPE="RADIO" NAME="chkSex" VALUE="2">여<br>
<%Else%>
<INPUT TYPE="RADIO" NAME="chkSex" VALUE="1">남
<INPUT TYPE="RADIO" NAME="chkSex" VALUE="2" checked>여
<%End If%>
</font></td>
</tr><tr>
<td align="right"><font size="2">
우편번호(집) :
</font></td>
<td align

="left"><font size="2">
<input type="text"
      size=20 name="txtPost" value="<%=Session("Post")%>">
<font
      color="green"> (찾아서
      적어주세요.)</font>
</font></td>
</tr><tr>
<td
      align="right"><font size="2">
주소(집) :
</font></td>
<td align="left"><font
      size="2">
<input type="text" size=40 name="txtAddress"
      value="<%=Session("Address")%>">
</font></td>
</tr></table>
<hr>
</td></tr></table>
<input
      type="hidden" name="txtValue" value="true">
<input type="button"
      name="cmdPrevious" value="< 이전" OnClick="var
      rtn=Previous_Click();">&nbsp;
<input type="submit"
      name="cmdNext" value="다음 >">&nbsp;
<input type="button"
      name="cmdReset" value="지 우 기"
      OnClick="Reset_Click()">&nbsp;
<input type="button"
      name="cmdCancel" value="취  소" OnClick="var
      rtn=Cancel_Click();">
</center

>
</font>
</form>
</center>

</BODY>
</HTML>

이 프로그램 다음으로 AddUserFinish.asp로 연결된다.


Main Frame in Roadmap

7. 사이버연수원 시스템

7.3 연수생 추가정보 입력 프로그램

다음은 연수생 추가 정보를 입력하는 것을 받아들이는 프로그램이다. 입력이 완성되면 AddUserResult.asp 프로그램으로 연결된다.

<%@ LANGUAGE="VBSCRIPT" %>

<%
If Request("txtValue") = "true"
      Then
Session("Position")=Request("txtPosition")
Session("Jik")=Request("txtJik")
Session("Soji")=Request("txtSoji")
Session("HomeAddr")=Request("txtHomeAddr")
Session("Email")=Request("txtEmail")
Session("Telno")=Request("txtTelno")
Session("Sex")=Request("chkSex")
Session("Post")=Request("txtPost")
Session("Address")=Request("txtAddress")
End
      If
%>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual InterDev 1.0">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=ks_c_5601-1987">
<TITLE>Document Title</TITLE>
<Script Language="JavaScript">
<!--
function Cancel_Click() {
alert("연수등록을 취소합니다.");
document.location.href="Inter.asp";
return;
}

function Previous_Click()
      {
document.location.href="AddUser3.asp";
return;
}

function loadDoc()
      {
document.frmAddUserFinish.txtRemark.focus();
return;
}

function Reset_Click()
      {
document.frmAddUserFinish.txtRemark.value =
      "";
document.frmAddUserFinish.txtRemark.focus();
return;
}
-->
</script>
</HEAD>
<!-BODY
      bgcolor="#ffffff" onLoad="loadDoc()"-->
<BODY bgcolor="#F7F7E7"
      text="#333300" link="#2A458A" vlink="#DE1B1B" alink="#DE1B1B"
      onLoad="loadDoc()">
<DIV align="center">
<P><IMG
      src="images/Cyber.jpg" border="0"
      align=center>&nbsp;&nbsp;&nbsp;</p>

<center>
<font size=4 color="blue">연수 등록 마침</font>
<table width=500><tr><td>

<hr>
<table border=0>
<tr>
<td align="right"><font size="2">
아이디(User ID) :
</font></td>
<td align="left"><font size="2">
<%=Session("UserID")%></font></td>
</tr><tr>
<td align="right"><font size="2">
성명(Name) :
</font></td>
<td align="left"><font size="2">
<%=Session("Name")%></font></td>
</tr><tr>
<td align="right"><font size="2">
패스워드(Password) :
</font></td>
<td align="left"><font size="2">
<%=Session("Password")%></font></td>
</tr><tr>
<td align="right"><font size="2">
학교/소속 :
</font></td>
<td align="left"><font size="2">
<%=Session("Position")%></font></td>
</tr><tr>
<td align="right"><font size="2">
직명 :
</f

ont></td>
<td align="left"><font size="2">
<%=Session("Jik")%></font></td>
</tr><tr>
<td align="right"><font size="2">
소지자격 :
</font></td>
<td align="left"><font size="2">
<%=Session("Soji")%></font></td>
</tr><tr>
<td align="right"><font size="2">
홈페이지주소(Home) :
</font></td>
<td align="left"><font size="2">
<%=Session("HomeAddr")%></font></td>
</tr><tr>
<td align="right"><font size="2">
전자우편주소(E-Mail) :
</font></td>
<td align="left"><font size="2">
<%=Session("Email")%></font></td>
</tr><tr>
<td align="right"><font size="2">
연락처(Telephone) :
</font></td>
<td align="left"><font size="2">
<%=Session("Telno")%></font></td>
</tr><tr>

<td align="right"><font size="2">
성별(Sex) :
</font></td>
<td align="left"><font size="2">
<%If Session("Sex") = "1" or Session("Sex") = "" Then%>
남
<%Else%>
여
<%End If%>
</font></td>
</tr><tr>
<td align="right"><font size="2">
우편번호(Post) :
</font></td>
<td align="left"><font size="2">
<%=Session("Post")%></font></td>
</tr><tr>
<td align="right"><font size="2">
주소(Address) :
</font></td>
<td align="left"><font size="2">
<%=Session("Address")%></font></td>
</tr></table>

<form name="frmAddUserFinish" method="post"
action="AddUserResult.asp">
<font size="2">
기타사항(Remarks) : <br>
<textarea name="txtRemark" rows=4 cols=70><%=Session("Remark")%></textarea><br>
<font size=2>
기타 의견이나 하고싶은 말씀이 있으시면 기타사항란에 입력하십시요.<br><br>
<font color="red">연수생 정보 등록에 응해주셔셔 감사합니다......</font>
</font><hr>
</td></tr></table>
<input type="hidden" name="txtValue" value="true">
<input type="button" name="cmdPrevious" value=" 이전" OnClick="var rtn=Previous_Click();">&nbsp;
<input type="submit" name="cmdNext" value="마 침">&nbsp;
<input type="button" name="cmdReset" value="지 우 기" OnClick="Reset_Click()">&nbsp;
<input type="button" name="cmdCancel" value="취 소" OnClick="var rtn=Cancel_Click();">
</center>
</font>
</form>
</center>

</BODY>
</HTML>


Main Frame in Roadmap

7. 사이버연수원 시스템

7.4 연수생 등록 마무리 프로그램

다음은 AddUserResult.asp 프로그램으로 저장되어 있는 프로그램이다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ks_c_5601-1987">
<title>Document Title</title>
<meta name="generator" content="Namo WebEditor v3.0">
</head>

<body bgcolor="#F7F7E7" text="#333300" link="#2A458A" vlink="#DE1B1B" alink="#DE1B1B">

<%@ LANGUAGE="VBSCRIPT" %>

<p><!-ody--> </p>
<p align="center"><img src="images/Cyber.jpg" border="0">&nbsp;&nbsp;&nbsp;</p>
<p align="center"><%
If Request("txtValue") = "true" Then
Session("Remark")=Request("txtRemark")
End If
%>
</p>
<%If Session("UserID")="" or Session("Name")="" or _
Session("PersonNo")="" or Session("Password")="" or _
Session("Position")="" or Session("Jik")="" or _
Session("Soji")="" or Session("Telno")="" or _
Session("Sex")="" or Session("Address")="" Then%>

<p align="center"><br></p>
<p align="center"><img src="images/Stop2.gif" width="87" height="87" border="0">
<br></p>
<p align="center">입력이 잘못 되었거나 입력하지 않았습니다.</p>
<p align="center"><a href="AddUser2.asp">전화면</a>으로 돌아가서 다시 입력하세요.</p>
<%
Response.End
End If

Dim db
Dim rs, rs2

Set db = Server.CreateObject("ADODB.Connection")
db.Open "Cyber"

Dim strSQL

strSQL = "SELECT * FROM tbl_User " & _
"WHERE tbl_User.UserID = '" & Session("UserID") & "'"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, db, 1

If rs.RecordCount > 0 Then%>

<p align="center"><br></p>
<p align="center"><img src="images/Stop2.gif" width="87" height="87" border="0">
<br></p>
<%=Session("Name")%>

<p align="center">님의 아이디(ID)는 이미 존재 합니다.</p>
<p align="center"><a href="AddUser2.asp">전화면</a>으로 돌아가서 아이디를 수정
하세요.</p>
<%
Else
strSQL = "INSERT INTO tbl_User "
strSQL = strSQL & "(UserID, Name, PersonNo, Password, " & _
"Position, Jik, Soji, HomeAddr, Email, Telno, Sex, Post, Address, Remark) "
strSQL = strSQL & "VALUES('" & Session("UserID") & "', "
strSQL = strSQL & "'" & Session("Name") & "', "
strSQL = strSQL & "'" & Session("PersonNo") & "', "
strSQL = strSQL & "'" & Session("Password") & "', "
strSQL = strSQL & "'" & Session("Position") & "', "
strSQL = strSQL & "'" & Session("Jik") & "', "
strSQL = strSQL & "'" & Session("Soji") & "', "
strSQL = strSQL & "'" & Session("HomeAddr") & "', "

strSQL = strSQL & "'" & Session("Email") & "', "
strSQL = strSQL & "'" & Session("Telno") & "', "
strSQL = strSQL & "'" & Session("Sex") & "', "
strSQL = strSQL & "'" & Session("Post") & "', "
strSQL = strSQL & "'" & Session("Address") & "', "
strSQL = strSQL & "'" & Session("Remark") & "');"

Set rs2 = Server.CreateObject("ADODB.Recordset")
rs2.Open strSQL, db
set rs2 = nothing
%>

<p align="center"><br></p>
<p align="center"><img src="images/sun.gif" width="64" height="64" border="0">
<br></p>
<p align="center">연수생 정보를 입력해 주셔서 대단히 감사합니다.</p>
<%=Session("Name")%>

<p align="center">선생님의 연수등록은 성공적으로 끝났습니다.</p>
<p align="center">이제부터 연수생으로서의 자격을 가질 수 있습니다.</p>
<p align="center"><a href="inter.asp">전화면</a>으로 돌아가서 계속 하세요.</p>
<%
End If

rs.Close
set rs = nothing
db.Close
set db = nothing

%>

</body>

</html>


Main Frame in Roadmap

8.1 File Up Load 이해하기

이 자료는 http://www.15seconds.com/ 에 소개된 내용으로 이 사이트에서 제공하는 자료중에 가장 많이 읽히는 자료이다. 원본은 http://www.15seconds.com/Issue/001003.htm 에 영어로 되어 있는데 영어 원문과 한글 번역을 동시에 올려놓는다. 영어공부도 할 겸 함께 보기 바란다. 간혹 이해를 돕기 위하여 직역하지 않고 나름대로 소화하여 알기쉽게 번역하도록 노력했다. 그리고 구태어 설명할 필요가 없는 부분은 삭제해 버렸다.

Introduction

As you probably know, Microsoft has one free DLL, namely CPSHOST.DLL, with which you can upload files. It requires a folder with write permissions since it is there where the file(s) will be posted (saved) when they arrive to the Web server (IIS). Another drawback is that you are focusing only on file uploading and not on other uploading possibilities. Remember, when you upload a file, you can also upload (post) any other inputs, such as the input file, input checkbox, input password, and input image, etc. And you can check their value just as if you were posting an ordinary form.

서문

잘 알고 있듯이 마이크로 소프트에서 무료로 제공하는 파일 올리기 프로그램으로 CPSHOST.DLL이 있다. 그런데 꼭 명심해야 할 일은 파일을 올리기 할 때 해당 폴더의 속성을 쓰기허용으로 지정되어 있어야 한다. 파일을 올릴 때는 올릴 파일도 중요하지만 파일을 올릴 때 파일과 함께 다른 내용도 올린다는 사실을 알아야 한다. 말하자면 올릴 파일 이름과 체크박스의 체크 여부, 패스워드, 이미지 등이 추가로 기록되어야 한다. 이것은 평상시 폼을 올릴 때와 같다고 생각하면 된다.

So when you upload a file you are really posting a form's content to the browser by using a different encoding type (enctype) in your form. That encoding is specified as enctype="multipart/form-data" as an attribute of your form.

파일을 올릴 때는 엔코딩을 다르게 해서 브라우저에 폼의 내용을 올려주어야 한다. 따라서 폼 속성을 줄 때 enctype="multipart/form-data"라고 지정해 주어야 한다.

The specification in RFC 1867 "Form-based File Upload in HTML" describes the mechanism by which a file may be uploaded from a Web browser to the server.

The Strange and Fun Stuff

RFC 1867에 HTML상에서 폼을 통해서 파일을 업로드 할 때 신경써서 알아두어야 할 절차가 쓰여 있다. 이 절차를 통해서 파일이 웹 브라우저를 통해서 서버로 올려지기 때문이다.

Imagine you have a form just like this one ( click here for the upload.asp file):

자 폼이 다음과 같다고 생각하자. 아래 폼을 실행하면 다음 같이 된다.

<form method="post" enctype="multipart/form-data"
action="upload.asp">
<table cellpadding="5" cellspacing="0" border="0">
<tr>
        <td>Input Checkbox:</td>
        <td><input type="checkbox" checked
name="input_check"></td>
</tr>
<tr>
        <td>Input Password:</td>
        <td><input type="password" name="input_password"
value="mypassword"></td>
</tr>
<tr>
        <td>Input Text:</td>
        <td><input type="text" name="input_text"
value="mytext"></td>
</tr>
<tr>
        <td>Input Image:</td>
        <td><input type="image" src="pic.gif" width="200"
height="100" border="0"></td>
</tr>
<tr>
        <td>Input Hidden</td>
        <td>I promise it's there :)<input type="hidden"
name="input_hidden" value="myhiddenvalue"></td>
</tr>
<tr>
        <td>Input File</td>
        <td><input type="file" accept="*.gif"
name="FileItem"></td>
</tr>
<tr>
        <td>Input File</td>
        <td><input type="file"
name="fileaaa"></td>
</tr>
<tr>
        <td>Input Submit</td>
        <td><input type="submit"></td>
</tr>
</table>
</form>

After filling those 2 input files, what happens when you submit your form? Well, all of this content will become the body of your HTML message. But, the contents will be posted in such a way that you'll be able to parse all of it.

위에서 파일을 두 개 첩부하고 폼에 쿼리전송을 눌렀을 때 무슨 일이 발생할까? 여기 폼에 제출되는 모든 내용이 서버로 전송된다. 제출되는 내용 하나 하나가 알아볼 수 있도록 되어 있다.

First things first. Let's see what's been posted:

먼저 입력한 내용이 먼저 나온다. 자 어떤 내용들이 전송되는가를 보자.

-----------------------------7d01ecf406a6
Content-Disposition: form-data; name="input_check"

on
-----------------------------7d01ecf406a6
Content-Disposition: form-data; name="input_password"

mypassword
-----------------------------7d01ecf406a6
Content-Disposition: form-data; name="input_text"

mytext
-----------------------------7d01ecf406a6
Content-Disposition: form-data; name="input_hidden"

myhiddenvalue
-----------------------------7d01ecf406a6
Content-Disposition: form-data; name="FileItem";
filename="C:\Inetpub\wwwroot\Upload\file1.txt"
Content-Type: text/plain

This file has some text in it.
It also has more than one line.

-----------------------------7d01ecf406a6
Content-Disposition: form-data; name="fileaaa";
filename="C:\Inetpub\wwwroot\Upload\pic.gif"
Content-Type: image/gif

(binary content)
-----------------------------7d01ecf406a6--

Notice all the inputs have been posted to the server. You can also see this just by having your upload.asp file like this:

입력한 모든 내용이 서버로 보내지는 것을 알 수 있다. upload.asp 파일은 다음과 같다.

Response.BinaryWrite Request.BinaryRead(Request.TotalBytes)

Where you see (binary content) there should be a lot of strange characters, which I've omitted because they take a lot of space.

이진수로 된 내용이 이상하게 나타난다. 이것까지 설명하자면 설명이 길어지니까 여기서는 생략한다.

Separating Inputs

All the text in bold like -----------------------------7d01ecf406a6 is what separates each input. Note also that in the end of the post we also have the text -----------------------------7d01ecf406a6-- but it signals the end of our post, since it ends with 2 minus signs (--). Anyway, don't forget that this strange hexadecimal number is different every time you post content this way to your IIS.

입력내용 하나 하나를 구분하는 식별자는
-----------------------------7d01ecf406a6
이렇게 표시된다. 그러나 마지막 입력내용이라는 표시는 -----------------------------7d01ecf406a6--
가 된다. 그러니까 마지막에 마이너스 기호가 두 개 더 붙는다. 어떻튼 이 이상한 16진수가 여러분이 IIS에게 어떤 내용을 보낼 때마다 약간 다르게 표시된다.

Every input appears to have the same pattern:

모든 입력내용들이 같은 형태로 나타난다.

<hex value>CRLFContent-Disposition: form-data; name="<input
name>"CRLFCRLF<input value>CRLF

But this pattern is only valid for normal inputs, those that are not of type file. Inputs of type file have the following pattern:

그러나 이 형식은 파일이 아닌 자료들을 표시할 때이다. 파일 형태의 자료는 다음과 같이 나타난다.

<hex value>CRLFContent-Disposition: form-data; name="<input
name>"; filename="<file
path>"CRLFContent-Type: <mime-type>CRLFCRLF<input
value>CRLF

Using some parsing techniques, it is quite easy to get each input name and respective value. Although I've done some parsing, available to you in the article code, I cannot say they are effective at all, since I've only used them to understand the potential of file uploading.

어떤 해독 기술을 이용하면 각각의 입력 내용이나 값을 쉽게 알아볼 수 있다. 여기서 제시한 특정한 방식으로 어떤 내용을 쉽게 해독할 수 있어도 그건 모든 방법에 똑 같이 적용되는 효과적인 방법은 아니다. 여기서는 오로지 파일 올리기에 관해서만 설명하고 있을 뿐이다.

Conclusion

If you want to have file uploading available in your Web site, whether intranet or Internet (although I prefer to use only in Intranet servers), you can build it all by yourself.

결론

여러분의 웹사이트에서 파일 올리기가 가능하도록 하고 싶으면 그건 여러분 스스로 한 번 만들어 보기 바란다.

About the Author

작가 소개

Tiago Halm is from Portugal. He is a project manager and team leader in a financial institution called BPI ( http://www.bancobpi.pt ). He has also been a program/product manager at an Internet/Multimedia company called Neuronio ( http://www.neuronio.pt ), handling projects for Telecel, Compaq, and Expresso. He can be reached at thalm@hotmail.pt and at thalm@londonoffice.com .

Tiago Halm은 포르투칼 사람이다. 그는 BPI라고 하는 회계사무소의 프로젝트매니저이고 팀장이다. 그는 Telecel, Compaq, Expresso 등에서 프로젝트를 담담하던 Neuronio라는 인터넷/멀티미디어 회사에서 프로그램제품 이사로 근무하고 있다.


Main Frame in Roadmap

8.2 ASP Data Access for Beginn ers
(초보자를 위한 ASP 데이터 베이스 이해)
 By Jason Butler

이 자료는 http://www.15seconds.com/ 에 소개된 내용으로 Top10자료 중에 하나를 여기에 옮겨 놓는다. 원본은 http://www.15seconds.com/issue/001025.htm 에 영어로 되어 있는데 이해를 돕기 위해서 또 영어공부도 병행해서 할 수 있도록 영어 원문과 해설을 동시에 제공한다. 가끔은 이해를 돕기 위하여 그대로 번역하지 않고 설명을 추가하거나 원문을 생략한 경우도 있다.

Introduction

The driving force behind Active Server technologies is data access. In order to develop a truly dynamic web site developers need to allow users to access data on demand. Luckily, with Microsoft's Active Server Pages, this is exceedingly easy to do. This article for ASP beginners details how to connect to a SQL Server 7.0 database using ActiveX Data Object (ADO) and Open Database Connectivity (ODBC).

서언

ASP기술 중에 중요한 부분이 데이터를 취급하는 방법이다. 웹사이트 개발자가 정말 다이나믹한 웹사이트를 개발하기 위해서는 사용자가 필요할 때 데이터에 접근할 수 있도록 해주어야 한다. 다행스럽게 마이크로 소프트의 ASP에서 이 부분을 쉽게해결해주고 있다. 여기서는 ASP 초보자가 ADO와 ODBC를 사용하는 SQL 서버 7.0에 연결하는 것을 상세하게 설명하고자 한다.

In order to illustrate the process of connecting to a data source with ASP, we will need to do three things:

ASP로 데이터베이스에 접근하기 위해서는 다음 3가지 일을 먼저해야 한다.

  • Create a database (데이터베이스를 만든다.)
  • Create an ODBC data source name (DSN) (ODBC 데이터 원본 이름을 만든다.)
  • Create an ASP page (ASP 페이지를 만든다.)

Creating an SQL Server Database

SQL 서버 데이터베이스 만들기

First we need a database. Since this article isn't about database design, we will create a very simple SQL Server database -- one table! We'll name this database 15Seconds, and we will name our table t_articles.

먼저 우리가 사용할 데이터베이스가 필요하다. 여기서는 데이터베이스 설계에 관해서는 설명하고 싶지 않기 때문에 간단한 SQL서버 데이터베이스를 만들기로 하자. 테이블 하나만 있는 데이터베이스이다. 테이블을 이해 못하는 사람은 여기서는 좀 빠지기 바란다. 데이터베이스 이름은 15Seconds이고 테이블 이름은 t_articles로 하자.

To create the database:

데이터베이스 만들기

  1. Open SQL Server 7.0 Enterprise Manager (Start ( Programs (SQL Server 7.0 (Enterprise Manager). SQL 서버를 오픈한다.
  2. Expand the Enterprise Manager tree, selecting the SQL Server to which you would like to add the database, until you see the "Database" node. 엔터프라이즈 관리 트리를 열고 추가하고자 하는 데이터베이스에 붙일 SQL서를 선택한다.

    Figure 1

  3. Right click on the "Database" node and select "New Database. . ." "Database" 노드에 오른쪽 마우스를 크릭하고 "New Database.."를 선택한다.
  4. On the "Database Properties" dialog box, enter "15Seconds" in the "Name" field. 데이터베이스 속성 창을 열고 이름을 적는 난에 "15Seconds"라고 입력한다.

    Figure 2

  5. Click the "OK" button.

We now have a database named "15Seconds" to which we can add our table.

이제 15Seconds라는 데이터베이스가 생성되어서 그 데이터베이스에 테이블을 만들 수 있다.

To create the table, t_articles, perform the following:

t_articles라는 테이블을 만들기 위해서 다음 차례로 진행한다.

  1. In Enterprise Manager, expand the "Database" node.
  2. Right click on the "15Seconds" node.
  3. Select "New."
  4. Select "Table. . . ."
  5. On the "Choose Name" dialog, Enter "t_articles" in the "Enter a name for the table:" textbox.
  6. Click the "OK" button.
  7. On the "Add Table" dialog box, enter the following information (see Figure 3):

Figure 3

  1. Close the "New Table" dialog box.

Now we have a database and table. Let's add some sample data. We'll add one record. To add data to t_articles, perform the following:

이제 데이터베이스와 테이블이 만들어졌다. 샘플 데이터를 만들어 넣자. 레코드 한 개를 추가하자.

  1. In Enterprise Manager, expand the "15Seconds" database node.
  2. Double click on "Tables."
  3. On the right side of Enterprise Manager, right click on "t_articles."
  4. Select "Open Table."
  5. Select "Return all rows."
  6. On the "Data in Table 't_articles'" enter the following data (see Figure 4):

Figure 4

So, there is the entire database. Pretty impressive, huh? Now that we have a database and a table, we need to create an ODBC connection to our database.

Creating an ODBC Connection

이제 데이터베이스 전체가 완성되었다. 이제 완성된 데이터베이스에 ODBC연결 작업을 해야 한다.

To create an ODBC connection, perform the following tasks:

  1. Open Control Panel (Start ( Setting ( Control Panel).
  2. Double click on the "Data Sources (ODBC)" icon in the Control Panel.
  3. Select the "System DSN" tab on the "ODBC Data Source Administrator" dialog box.
  4. Click the "Add" button.
  5. On the "Create New Data Source" dialog box (see Figure 5), highlight "SQL Server" and click "Finish."

    Figure 5

  6. On the "Create a New Data Source to SQL Server" dialog box (see Figure 6):
    • Enter "15Seconds" in the "Name" field. This is not the name of the database, but the name for the DSN. I kept it the same just for simplicity, however, this is not good practice for security reasons. 그림 6에서 이름 필드에 15Seconds라고 입력하는데 이것은 데이터베이스 이름을 의미하는 것이 아니고 DSN의 이름이다. 여기서는 데이터베이스 이름하고 DSN이름을 같이 주었다. 보안상 이렇게 하는 것은 좋지 않지만 여기서는 이해를 돕고 간단히 하기 위해서 그렇게 하자.
    • In the "Description" field, enter a brief description for the DSN. I entered "15Seconds Sample DSN." 밑에 Description 필드에 적어 넣은 것은 DSN에 대한 간단한 설명을 붙인 것이다.
    • From the "Server" drop-down box, select the SQL Server to which you would like to connect. Since, my instance of SQL Server resides on the same machine where I am creating the DSN, I selected "(local)." Server라고 적힌 필드는 여러분이 연결할 SQL서버가 있는 서버를 지정하는데 여기서는 데이터베이스가 있는 서버와 ASP프로그램이 있는 컴퓨터가 같은 컴퓨터에 있기 때문에 local을 지정했다.
    • Click the "Next" button.

    Figure 6

  7. On the second "Create a New Data Source to SQL Server" (see Figure 7) dialog box:
    • Select the "With SQL Server authentication using a login ID and password entered by the user" radio button to indicate that database security with be implemented by SQL Server rather than Windows NT. 이 부분은 윈도우 NT에서 제공하는 로긴 아이디와 비밀번호를 사용하지 않고 SQL서버에서 사용하는 아이디와 비밀 번호를 사용한다는 것을 표시해주고 있다.
    • Select the "Connect to SQL Server to obtain default settings for the additional configuration options" checkbox.
    • In the Login ID textbox, enter "sa." 로긴 아이디로 "sa"라고 입력한다.
    • Leave the "Password" textbox empty. 패스워드 칸은 그냥 비워두라.
    • Click the "Next" button.

    Note: I used "sa" for login ID with a blank password for convenience. This is the default SQL Server administrator account. Again, this is not a good idea for security reasons. 패스워드는 비워두고 아이디는 "sa"로 하는 것은 sql서버 운영자 디폴터 계정이다. 이것은 보안상 좋은 일은 아니다.

    Figure 7

  8. On the third "Create a New Data Source to SQL Server" dialog box (see Figure 8): • Select the "Change the default database to" checkbox and select "15Seconds" from the accompanying select box.
    • Click the "Next" button.

    Figure 8

  9. On the fourth "Create a New Data Source to SQL Server" dialog box (see Figure 9): • Click the "Finish" button.

    Figure 9

  10. On the "ODBC Microsoft SQL Server Setup" dialog box (see Figure 10), do one of the following: • Click the "Test Data Source. . . " button to ensure that the ODBC connection has been created successfully.
    • Click the "OK" button to complete the ODBC DSN setup process.

    Figure 10

We have a database, a table, some data and an ODBC DSN. The next step is to create an ASP page to access the data.

이제 데이터베이스를 만들고 거기에 테이블을 집어넣고, 테이블에 데이터를 넣고 ODBC DSN을 완성하였다. 다음은 데이터에 접근할 ASP페이지를 만드는 일이 남았다.

Creating the ASP Page

1. Begin the ASP script with standard code (or at least my standard): ASP 스크립트 표준 코드는 아래와 같이 시작하는 것이 좋다.

<% @LANGUAGE="VBSCRIPT" %>
<%
Option Explicit
Response.Buffer = True
On Error Resume Next

2. Dimension all variables we'll be using in the scripts. I like to dimension my variables in blocks for ease of readability. 우리가 스크립트에 사용할 배열을 미리 주는 것이 좋다. 그래야 이해하기가 쉽다.

Dim oConn, oRS, oFld

3. Create the Connection and Recordset objects: 연결 오브젝트와 레코드셋 오브젝트를 만든다.

Set oConn = Server.CreateObject("ADODB.Connection")
Set oRS = Server.CreateObject("ADODB.Recordset")

4. Set the connection objects ConnectionString property. Notice in the ConnectionString, we are specifying "15Seconds" as the DSN, "sa" as the User ID (UID). This should look familiar because it is the same information we provided while creating the ODBC DSN. 연결객체의 ConnectionString 속성을 설정한다. 여기서 기억해 줄 것은 DSN으로 15Seconds로 주고 유저 아이디로 sa를 주었다. 이것은 먼저 그렇게 지정해 두었기 때문에 이상할 것이 없을 것이다.

oConn.ConnectionString = "DSN=15Seconds;UID=sa"

5. Open the Connection: 연결을 튼다. 이것은 데이테베이스를 오픈하는 것과 같다.

OConn.Open

6. Open the Recordset: 열린 데이터베이스에서 지정하는 테이블을 열어 데이터를 가져오는 절차이다.

oRS.Open "SELECT * FROM t_articles", oConn

7. Start writing the HTML to output: 가져온 데이터를 HTML형식으로 만들어 브라우저에 제공한다.

Response.Write("<HTML>" & chr(13))
Response.Write("<HEAD>" & chr(13))
Response.Write("<TITLE>ASP Database - For
Beginners</TITLE>" & chr(13))
Response.Write("</HEAD>" & chr(13))
Response.Write("<BODY>" & chr(13))

8. Now we will start an HTML table and create an HTML table row by iterating through the Recordset's Field collection to create column headers for our HTML table. HTML로 테이블을 만들는 과정이다. 여기서

Response.Write("<TABLE BORDER=1 CELLPAADING=0 CELLSPACING=0>" &
chr(13))
Response.Write("  <TR>" & chr(13))
For Each oFld in oRS.Fields
    Response.Write("    <TD>" & oFld.Name & "</TD>"
& chr(13))
Next
Response.Write("  </TR>" & chr(13))

9. Using the Record object's GetString method, we will create an HTML table row for each record in t_articles: GetString 메소드를 이용해서 각 레코드의 필드를 가져온다.

Response.Write("  <TR>" & chr(13))
Response.Write("    <TD>")
Response.Write(oRS.GetString(,,"</TD>" & chr(13) & "
<TD>","</TD>" & chr(13) & "  </TR>" & chr(13)
& "  <TR>" & chr(13) & "    <TD>","--null--"))
Response.Write("    </TD>" & chr(13))
Response.Write("  </TR>" & chr(13))

10. Close all of the object references: 참조했던 레코드 셋을 닫고, 연결된 데이터베이스를 닫는다.

oRS.Close
Set oRs = Nothing
oConn.Close
Set oConn = Nothing

11. Complete the HTML output: HTML의 마무리 코드이다.

Response.Write("</TABLE>" & chr(13))
Response.Write("</BODY>" & chr(13))
Response.Write("</HTML>" & chr(13))
%>

Conclusion

This article details how to connect to the data source using ASP. Data access with ASP, at its core, is very simple. However, there are many ways to improve and build upon the provided example. Try using OLE DB rather than ODBC, or incorporating eXtensible Markup Language (XML) into your data access processes.

결언

여기서 ASP를 이용해서 데이터베이스에 접근하는 방법을 상세하게 다루었다. ASP로 데이터에 접근하는 것은 매우 간단하다. 그러나 여기서 제공한 샘플을 이용하여 여러 가지 다른 방법을 얼마든지 구사할 수 있다. ODBC보다는 OLE DB를 이용해본다거나 XML로 데이터베이스에 접근한다든지 다양한 방법을 구사해보도록 노력해보라.

About the Author

작가소개

Jason Butler, a Virginia Tech graduate, is a technical manager for a Big 5 consulting firm. He has built numerous Microsoft-centric Web/e-commerce applications for Fortune 500 and dot-com clients. He can be reached at Jason_m_butler@hotmail.com.

Jason Butler는 버지니아 공대를 졸업하고 Big 5 컨설팅 회사의 기술이사로 근무하고 있다. 그는 Fortune 500과 닷컴 기업들을 위해 수 많은 마이크로소프트 웹 프로그램을 제작하였다.