ビギナー 向 けの 真 珠 みがき2 お 手 軽 CGIとHTMLテンプレート Kansai.pm 2 周 年 記 念 イベント 舟 木 隆 康 2002/5/11 本 日 の 真 珠 みがき CGIとは 何 か CGI.pmの 使 い 方 HTML::Templateの 使 い 方 構 造 体 とLoop 処 理 etc...
インターネットを 見 る? もう 少 し 正 確 に 言 うと インターネット 上 のWWWサービスを 利 用 し てWebページをブラウズする WebページはWWWサーバにより 提 供 され る webページのブラウズ クライアント 1 webページを 要 求 WWWサーバ 3 htmlファイルの 送 信 2 要 求 されたページ にあたるhtmlファイル を 探 し 出 す
CGIって? クライアント 1 入 力 情 報 を 送 信 WWWサーバ 3 生 成 されたhtmlの 送 信 2 受 けたデータを 元 に プログラムが 起 動 htmlを 生 成 する CGIとは 何 か? 簡 単 に 説 明 すると 入 力 された 情 報 を 元 に WWWサーバがプログラムを 実 行 htmlの 結 果 を 出 力 する 仕 組 みの 事 情 報 を 入 力 しなくてもプログラムを 実 行 さ せてhtmlを 出 力 させることもできる
CGIには 何 が 必 要 か WWWサーバ CGIプログラム 言 語 は 動 くなら 何 でもOK ただ Perlが 広 く 使 われているようだ という 訳 でPerlでやってみよう! WWWサーバの 送 信 内 容 Header Content-Type: text/html Content-Length: xxx etc... HTML Contents <HTML> <HEAD><TITLE>xxx</TITLE></HEAD> <BODY> <H1>sample</H1> </BODY>
CGI.pmを 呼 び 出 す CGI.pmモジュールはVer5.004 以 降 のPerlに 標 準 装 備 されている とても 奥 が 深 いモジュー ル 呼 び 出 し 方 use CGI qw(:standard); 最 近 のVersionのCGI.pmがあればついでに use CGI::Carp qw(fatalstobrowser); CGI::Carpはエラーページを 自 動 で 生 成 してくれる エ ラー 発 生 時 に 便 利 オブジェクト 指 向? CGI.pmは 標 準 的 な 構 文 とオブジェクト 指 向 構 文 がある オブジェクト 指 向 構 文 の 方 が 動 作 が 若 干 早 い 今 回 のサンプルはオブジェクト 指 向 構 文
ヘッダ 部 分 を 出 力 use CGI qw(:standard); use CGI::Carp qw(fatalstobrowser); my $q = new CGI; print $q->header( text/html ); print << EOF ; <html><head><title>test</title></head> <body>just Testing</body> </html> EOF 実 行 結 果 ヘッダ 出 力 結 果 Content-Type: text/html <html> <head><title>test</title></head> <body>just Testing</body> </html> ( 見 た 目 の 都 合 のため 改 行 しています )
メディアタイプ リダイレクト 便 利 なヘッダ print $q->header( text/plain ); print $q->header(); など 空 だとtext/htmlになる print $q->redirect( http://hoge/hoge.html ) 対 応 しているブラウザであれば 自 動 でリダイレクトしてく れて webページでリダイレクトするより 早 い 利 用 する 際 は 他 のヘッダと 併 用 しないこと Html 出 力 をさせるには use CGI qw(:standard); my $q = new CGI; print $q->start_html( Hello World!! ), $q->p( Welcome to CGI.pm ), $q->end_html; (CGI::Carpは 省 略 しました)
実 行 結 果 Html 出 力 結 果 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML> <HEAD><TITLE>Hello World!!</TITLE></HEAD> <BODY> <P>Welcome to CGI.pm</P> </BODY> </HTML> CGI.pmの 代 表 的 なタグ 集 <html> $q->start_html; </html> $q->end_html; <hr>タグ $q->hr; <p>タグ $q->p( xxx ); <a href>タグ $q->a({-href => xxx }, download ); <table>タグ $q->table( 省 略 ); <form>タグ $q->start_form( 省 略 ); $q->end_form <input type = text > $q->textfield( 省 略 ) <input type = submit > $q->submit( 省 略 ) <input type = hidden > $q->hidden( 省 略 ) etc
CGI.pmで 入 力 画 面 を 作 る start_form 時 に 値 の 送 信 先 を 指 定 する use CGI qw(:standard); my $q = new CGI; print $q->header(); print $q->start_html(); print $q->start_form(-method => post, -action => 値 の 送 信 先 アドレス ); print $q->textfield(-name => user_id ); print $q->reset (); print $q->submit (-name => submit, -value => OK ); print $q->end_form(); print $q->end_html(); 出 力 結 果 CGI.pmで 値 の 取 得 $hoge = $q->param( パラメータ 名 ); この 方 法 でGetやPostされた 全 ての 情 報 が 取 得 できる text hiddenフィールド radio-box checkbox button クリッカブルマップなど ちなみにcookieは 別 リクエストヘッダで 返 っ て 来 るので
CGI.pmで 動 的 ページ 生 成 use CGI qw(:standard); my $q = new CGI; my $hoge = $q->param( user_id ); print $q->header(); print $q->start_html(); print $q->p( Your user ID is $hoge! ); print $q->end_html(); HTML::Templateとは htmlでデザインされたファイルをベースに 情 報 を 埋 め 込 んでhtml 出 力 させる デザインとプログラムが 分 離 できるので 便 利 htmlファイルにコメントとして 埋 め 込 む コマンド 一 覧 <!-- TMPL_VAR NAME= 変 数 名 --> <!-- TMPL_LOOP NAME= 変 数 名 --> <!-- TMPL_IF NAME= 変 数 名 --> <!-- TMPL_UNLESS NAME= 変 数 名 --> <!-- TMPL_ELSE -->
Templateファイル <html><title>グラフサンプル</title> <body bgcolor="#ccccff"> <h3>テンプレートでグラフを 作 ってみる</h3> <hr width="400" align="left" size="1"> <!-- TMPL_IF NAME="graph_name" --> <b> <!-- TMPL_VAR NAME="graph_name" --> </b> <!-- /TMPL_IF --> <table width="400" border="0"> <tr bgcolor="#ffffff"> <td> <table width="350" border="1" align="center" bordercolor="#ffffff"> <!-- TMPL_LOOP NAME="graph_data"--> <tr> <td><!-- TMPL_VAR NAME="place" --></td> <td width="300"> <table border="0" bgcolor="#0000ff" width="<!-- TMPL_VAR NAME="ratio" -->%"> <tr>... 長 いので 添 付 資 料 を 参 照 構 造 体 HTML::TemplateのLoop 処 理 で 必 須 Tableの 一 行 を 表 現 するとき 使 ったりする @table =( { place => Osaka, ratio => 32 }, { place => Kobe, ratio => 54 }, { place => Kyoto, ratio => 22 }, etc );
HTML::Template 利 用 サンプル # # graph.pl # # Creates graph using HTML::Template # [ FUNAKI Takayasu 2002/05/10 ] # --- Last Update 2002/05/10 --- use strict; use HTML::Template; use FindBin qw($bin); my $tmpl_file = $Bin. "/graph.tmpl"; my $tmpl = new HTML::Template ( filename => $tmpl_file ); my $graph_name = "Sample Graph"; my @data = qw( Osaka:32 Kobe:54 Kyoto:22... 添 付 資 料 を 参 照 結 果
余 談 Perlの 出 力 は 一 時 的 にバッファにためられる データを 即 出 力 させたいなら $ = 1; CGI.pmをuseしているスクリプトをコマンドライ ンで 実 行 させるとパラメータの 入 力 を 求 められ る この 場 合 EOFを 送 ってやること Unix 系 :Ctrl-D, Win 系 :Ctrl-Z 余 談 CGI::Carpはユーザにエラーが 見 えるのでマ ズイ 専 用 エラーサブルーチンを 作 成 したほう が 良 いかも CGIプログラミング の 5.5.3 エラーサブルーチ ン 参 照 一 つのCGIプログラム 内 で 入 力 画 面 の 生 成 と データ 受 け 取 りをさせる 場 合 は 画 面 ごとに $q->delete_all 等 しなければフィールド 内 容 を 引 きずるケースがあるような 無 いような
参 考 資 料 CGIプログラミング 第 2 版 Scott Guelich, Shishir Gundavaram, Gunther Birznieks 著 田 辺 茂 也 監 訳 大 川 佳 織 訳 オライリー ジャパン CGIモジュール Lincoln D. Stein 著 川 合 孝 典 訳 http://member.nifty.ne.jp/hippo2000 HTML::Templateモジュール Sam Tregar 著 川 合 孝 典 訳 http://member.nifty.ne.jp/hippo2000 みがきあげ れたのか? ご 静 聴 ありがとうございました