날짜: 1996-07-03 | 글쓴이: 도아 | 7273 번 | 프린트 | 메일로보내기

제 3강 - 동적문서 생성하기


CGI.pm의 대부분의 함수들은 진행중에 문서를 생성한다. 일반적으로 HTTP 헤더를 먼저 만들며 이어 HTML과 같은 문서를 생성하게 된다. CGI.pm은 HTML과 같은 text/html 형식뿐만아니라 여러가지 다양한 형태의 HTTP 헤더를 생성하는 함수를 제공한다. GIF 이미지를 만들기위해서는 GD.pm 모듈 을 보기 바란다.

이들 함수 각각은 HTML이나 HTTP의 일부를 출력할 수 있으며 따라서 브로우저 창에 출력되고 문자열에 덧붙여지고 파일로 저장될 수 있다. 표준 HTTP 헤더 생성하기

임의의 CGI 스크립트에서 첫번째로 출력해야 하는 것은 HTTP 헤더이다. 이 것은 문서의 유형이 무엇인지와 다른 추가적인 정보(언어, 만료기간, 문서의 캐쉬여부등)를 브로우저에게 제공한다. 이 헤더는 또한 서버 밀기(Server Push)와 같은 특수한 목적으로 사용될 수 있다.

print $query->header;	
# Content-Type: text/html과 빈줄을 출력

또는

print $query->header('image/gif');
# Content-Type: image/gif과 빈줄을 출력

또는

print $query->header('text/html','204 No response');
# Status: 204 No response, Content-Type: text/html과 
# 빈줄을 출력

또는

print $query->header(-type=>'image/gif',# MIME 형식 출력
	-nph=>1,			# 상태행 출력
	-status=>'402 Payment required',# Status 헤더 출력
	-expires=>'+3d',		# 만료일 출력
	-cookie=>$cookie,		# 쿠키 출력
	-Cost=>'.00');		# Cost 헤더 출력

header()
는 Content-type: 헤더를 리턴한다. 원하는 경우 자신의 MIME 형식을 제공할 수 있으며, 그렇지 않은 경우 기본값은 text/html이다. 다른 추가적인 두번째 매개변수는 상태코드와 이 상태코드에대한 해석이다. 예를들어 브로우저가 할일이 전혀 없다는 것을 통지하기위해 204, "No response"를 지정할 수 있다.

마지막 예는 매개변수의 이름을 이용해서 CGI 메소드에 인자를 전달하는 기명 인자 전달 형식을 보이고 있다. 인식된 매개변수는 -type, -status, -expires-cookie이다. 모든 매개변수는 대쉬(-)를 제거한 상태에서 헤더필드에 삽입된다. 이 것으로 원하는 임의의 HTTP 헤더를 지정할 수 있다. 매개변수 이름 중간의 밑줄은 대쉬(-)로 변환된다.

print $query->header(-Content_length=>3002);

대부분의 브로우저는 CGI 출력을 캐쉬하지 않는다. 따라서 브로우저가 해당 페이지를 읽어들일때 마다 스크립트가 새롭게 호출된다. 이러한 특징은 -expires 매개변수를 이용해서 변경할 수 있다. 이 매개변수로 절대 또는 상대 만료 주기를 지정할 때 몇몇 브로우저와 프록시 서버는 지정된 만료일까지 CGI의 출력을 캐쉬한다. 다음 표는 -expires 필드에서 사용할 수 있는 값이다.

형식 의미
+30s 지금부터 30초
+10m 지금부터 10분
+1h 지금부터 1시간
-1d 어제
now 즉시
+3M 석달 내
+10y 10년내
Thursday, 25-Apr-1999 00:40:33 GMT 지정된 시간/날자에

-cookie 매개변수는 상태정보 유지를 위해 이어지는 모든 트랜잭션동안 쿠키를 제공하도록 브로우저에 통지하는 헤더를 만든다. 넷스케잎의 쿠기는 만료일과 같은 속성을 포함하는 특수한 형식을 가지고 있다. 세션 쿠키를 생성/복원하기위해

<A HREF="perl-cgipm6.htm#NETSCAPE_COOKIES">cookie()</A>
메소드를 사용한다.

-nph 매개변수는 참으로 설정되면 NPH(Non-Parse-Header) 스크립트로 동작하는데 필요한 올바른 헤더를 생성한다. 이 것은 모든 스크립트를 NPH일걸로 생각하는 IIS와 같은 서버와 함께 사용할 때에는 중요하다. 방향전환 헤더 생성하기

print $query->redirect('http://qaos.com/');

때때로 문서 자체를 만들지 않고 간단히 다른 문서(URL)로 방향전환하기를 원하는 경우가 있다. 이런 경우는 아마 시간이나 사용자 확인에 따라 URL을 선택해야하는 경우일 것이다.

redirect()
함수는 다른 URL을 브로우저에 전달한다. 만약 이와 같은 방향전환을 사용한다면 다른 어떠한 헤더로 출력하지 않아야 한다. 2.0 버전에서 처럼 비공식적인 Location: 헤더와 공식적인 URI: 헤더 둘다 지원한다. 이 것으로 대부분의 서버와 브로우저를 지원할 수 있다.

한가지 주의할 것은 자기 사이트의 다른 문서로 방향전환 할 때 상대 링크는 바르게 동작하지 않을 수 있다는 것이다. 이 것은 몇몇 서버들이 사용하는 최적화 과정때문이다. 이 것에대한 해결책은 방향전환하려는 문서의 완전한 URL(http:를 포함한)을 사용하는 것이다.

또한 기명 인자를 사용할 수도 있다.

print $query->redirect(-uri=>'http://qaos.com/',
	-nph=>1);

-nph 매개변수는 참으로 설정되면 NPH(Non-Parse-Header) 스크립트로 동작하는데 필요한 올바른 헤더를 생성한다. 이 것은 모든 스크립트를 NPH일걸로 생각하는 IIS와 같은 서버와 함께 사용할 때에는 중요하다. HTML 문서 헤더 생성하기

print $query->start_html(-title=>'도아의 CGI 강좌',
	-author=>'webmaster@mailx2.com',
	-base=>'true',
	-target=>'_blank',
	-meta=>{'keywords'=>'Forever with CGI',
		'copyright'=>'저작권 도아'},
	-style=>{'src'=>'/style1.css'},
	-BGCOLOR=>'blue');

HTTP 헤더를 생성한 후 대부분의 CGI 스크립트는 HTML 문서를 생성하기 시작한다.

start_html()
는 HTML 문서의 헤더부분 외에 페이지의 외관과 특징을 제어하는 많은 추가적인 정보를 생성한다.

이 메소드는 HTML 헤더부분과 <BODY>(시작 태그)를 리턴한다. 모든 매개변수는 조건부이다. 기명 매개변수 형식에서 인식할 수 있는 매개변수는 -title, -author, -base, -xbase과 -target이다. 넷스케잎의 확장속성인 BGCOLOR 속성과 같은 임의의 추가젹인 매개변수가 <BODY> 태그에 추가될 수 있다. 추가젹인 매개변수는 대쉬(-)로 시작해야 한다.

-xbase 인자로 다음 예에서 처럼 현재 URL과는 다른 URL에대한 HREF를 제공할 수 있다.

-xbase=>"http://syscon.soongsil.ac.kr/~artech/"

모든 상대적인 링크는 이 링크에대한 상대 URL로 해석된다.

-target 인자로 페이지의 모든 링크와 폼에대한 기본 타겟 프레임을 지정할 수 있다. 이 것을 어떻게 다루는 가에대한 자세한 설명은 프레임에대한 넷스케잎 문서 를 보기바란다.

-target=>"answer_window"

또한 -meta 인자로 HTML 헤더부에 임의의 메타정보를 추가할 수 있다. 이 인자는 메타 정보의 이름/값 쌍을 포함하는 연관 배열를 참조한다. 이 것은 다음과 같은 일련의 <META> 태그로 삽입된다.

<META NAME="keywords" CONTENT="CGI 강좌">
<META NAME="description" CONTENT="저작권 도아">

HTTP-EQUIV 형식의 <META> 태그는 지원되지 않는다. 이 것은 HTTP 헤더를 header()로 직접 지정할 수 있기 때문이다. 예를들어 Refresh: 헤더를 전송하려면

<A HREF="CREATING_A_STANDARD_HTTP_HEADER_">header()</A>
메소드를 이용하면 된다.

print $q->header(-Refresh=>'10; URL=http://qaos.com/');

-style는 코드내에 종속 서식 파일을 병합하는데 사용된다. 보다 자세한 정보는 종속 서식 파일에대한 절을 보기 바란다.

-head 매개변수로 <HEAD> 부분에 다른 임의의 HTML 태그를 둘 수 있다. 예를들어 드물게 사용되는 <LINK> 태그를 헤드 부분에 두기위해 다음과 같은 방법을 사용하면 된다.

print $q->start_html(-head=>Link({-rel=>'next',
	-href=>'http://qaos.com/css/'}));

다중 HTML 요소를 <HEAD>부로 병합하기 위해 배열 참조를 사용할 수 있다.

print $q->start_html(-head=>[ 
	Link({-rel=>'next',
		-href=>'http://qaos.com/css/'}),
	Link({-rel=>'previous',
		-href=>'http://qaos.com/cgi/'})
	]);

자바스크립트: -script, -noScript, -onLoad, -onMouseOver, -onMouseOut-onUnload 매개변수는 자바스크립트를 정의/호출을 하는 사용되는 태그나 이벤트를 페이지에 추가하는데 사용된다. -script는 자바스크립트 함수를 정의하는 블럭을 포함한다. 이 블럭은 HTML 헤더부의 <SCRIPT>블럭 내에 있어야한다. 페이지가 완전히 읽혀지기 전에 사용자가 중지 버튼을 누를지라도 모든 자바스크립트가 정삭적으로 동작하도록 이 블럭을 가급적 HTML 헤더부에 두어야 한다. CGI.pm은 이러한 방법으로 스크립트를 형식화 한다.

-onLoad-onUnload는 각각 브로우저에의해 페이지가 열려질 때와 닫혀질때 수행될 자바스크립트 코드를 지정하는데 사용된다. 보통 이들 매개변수는 -script 필드내에 정의된 함수를 호출하는데 사용된다.

$query = new CGI;
print $query->header;
$JSCRIPT=<<END;
// 질문
function riddle_me_this() {
	var r = prompt("아침에는 네 발로 기고, " +
		"점심에는 두발로 걷고, " +
		"저력에는 세발로 기는 것은?");
	response(r);
}

// 답을 구한다.
function response(answer) {
	if (answer == "사람")
		alert("짜식, 바보는 아니군!");
	else
		alert("이구! 맹순아 다시해.");
	}
END

print $query->start_html(-title=>'스핑크스의 수수께기',
		-script=>$JSCRIPT);

-noScript를 사용해서 자바스크립트를 인식하지 못하는 브로우저(또는 자바스크립트 기능을 사용하지 않는 브로우저)에 출력될 몇몇 HTML 문장을 지정할 수 있다.

넷스케잎 3.0은 LANGUAGE와 SRC를 포함한 몇몇기지 속성을 <SCRIPT> 태그에 추가했다. 이들 중 SRC는 자바스크립트를 각 페이지에 포함시키는 것이 아니라 임의의 파일이나 CGI 스크립내에 자바스크립트를 참조하려는 사람들에게 관심이 가는 속성이다. 이 속성을 사용하기위해 하나 또는 그 이상의 -language, -src, -code를 HASH 참조를 사용해서 -script 매개변수에 포함시킬 수 있다.

print $q->start_html(-title=>'스핑크스의 수수께기',
		-script=>{-language=>'JAVASCRIPT',
		-src=>'/myjs/sphinx.js'}
	);

print $q->(-title=>'깜찍이쇼',
		-script=>{-language=>'PERLSCRIPT'},
		-code=>'print "안녕, 깜찍아!\n;"'
	);

마지막 특징으로 여러가지 <SCRIPT> 섹션이 헤더로 병합할 수 있다. 스크립트 섹션의 목록을 인자로 전달하면 된다. 이 것으로 서로 다른 버전의 자바 스크립트에대해 다른 소스파일을 지정할 수 있다.

print $q-&gt;start_html(-title=&gt;'스핑크스의 수수수께끼',
	-script=&gt;[
		{ -language =&gt; 'JavaScript1.0',
			-src      =&gt; '/javascript/utilities10.js'
		},
		{ -language =&gt; 'JavaScript1.1',
			-src      =&gt; '/javascript/utilities11.js'
		},
		{ -language =&gt; 'JavaScript1.2',
			-src      =&gt; '/javascript/utilities12.js'
		},
		{ -language =&gt; 'JavaScript28.2',
			-src      =&gt; '/javascript/utilities219.js'
		}
	]);
     </pre>

이 것이 다소 힘들어 보인다면 직접적인 CGI 스크립팅을 고수하기 바란다.

자바스크립트에대한 보다 자세한 정보는 필자의

<A HREF="http://qaos.com/learn/javascript/">자바스크립트 가이드(http://qaos.com/learn/javascript/)</A>

을 보기 바란다. HTML 문서 끝내기

print $query->end_html

이 것은 </BODY></HTML>를 출력함으로서 HTML 문서를 닫는다.

자기 참조 URL 생성하기

$myself = $query->self_url;
print "<A HREF=$myself>혼자 얘기하네.</A>";

self_url()
은 현재 스크립트를 호출한 URL을 모든 상태정보와 더불어 리턴한다. 이 것은 폼의 현재 내용을 건들이지 않고 내부 앵커를 사용해서 문서내에서 이동하고자 할때 아주 유용하다.

$myself = $query->self_url;
print "<A HREF=$myself#table1>표 1</A>";
print "<A HREF=$myself#table2>표 2</A>";
print "<A HREF=$myself#yourself>혼자해</A>";

리턴되는 형식을 제어하려면 url() 메소드를 사용한다.

또한

query_string()
로 특수문자가 제거되지 않은 질의 문자열을 복원할 수도 있다.

$the_string = $query->query_string;
스크립트의 URL 얻기

$full_url      = $query->url();
$full_url      = $query->url(-full=>1);  # 다른 형식의 사용방법
$relative_url  = $query->url(-relative=>1);
$absolute_url  = $query->url(-absolute=>1);
$url_with_path = $query->url(-path_info=>1);
$url_with_path_and_query = $query->url(-path_info=>1,-query=>1);

url()은 다양한 형식으로 스크립트의 URL을 리턴한다. 인자 없이 호출하면 호스트 이름과 포트 번호를 포함한 완전한 형식의 URL을 리턴한다. 예를들어 스크립트의 URL이 다음과 같다면

<A HREF="http://qaos.com/cgi/exam/example1.cgi">http://qaos.com/cgi/exam/example1.cgi</A>

다음과 같은 기명 인자로 이 형식을 변경할 수 있다.

-absolute
참이면 절대 URL을 리턴한다. 예:

/cgi/exam/example1.cgi

-relative
상대 URL을 리턴한다. 이 것은 다른 매개변수로 스크립트를 다시 호출하려는 경우 유용하다. 예:

example1.cgi

-full
인자없이 호출되면 완전한 URL을 리턴한다.

-path (-path_info)
추가적인 경로정보를 URL에 추가한다. 이 것은 -full, -absolute-relative 결합될 수 있다. -path_info는 동의어이다.

-query (-query_string)
질의 문자열을 URL에 추가한다. 이 것은 -full, -absolute-relative 결합될 수 있다. -query_string은 동의어이다.


다음글: 제 4강 - 표준 HTML 태그 만들기 (8191)1996-07-04
이전글: 제 2강 - CGI.pm의 사용방법 (7178)1996-07-02

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.