CGI:Common Gateway Interface Webプログラミング演習 – STEP4 Perl/CGIによる 動的ページ生成(その1) CGIによるWebページ生成 – – ブラウザ a.htmlの内 容が渡る データ x.cgiの実 行を要求 HTML a.html Webページを出力するプログラム 出力内容 – プログラム ブラウザ サイトで管理しているデータを集計して表示 時刻や期間にあわせて表示を変える 利用者の要求にあわせて表示を変える CGIプログラム 入力 a.html を要求 Webサーバ上でプログラムを実行し,動的にWebページを 生成する仕組み – x.cgi x.cgiの出 力が渡る 出力の種類(Content-Type: text/html) 実際のページソース(HTML記述) 出力例 Content-Type: text/html 出力 <html> <head> <title>test page</title> </head> <body> <p>This is a test.</p> </body> </html> ページ webサーバ webサーバ 静的ページの取得 動的ページの生成 CGIプログラムの記述 どのようなプログラミング言語でも記述できる – プログラム例 #!/usr/bin/perl ここはお約束の書き方 use CGI qw(:standard); print header(-type=>"text/html; charset=UTF-8"); print <<PAGE; <html> ウェブページの内容を出力 ....省略.... </html> PAGE ページソース Perl Practical Extraction and Report Language 特徴 適切な出力がされればよい この演習ではperlを使用する 出力の種類 空行 – – – – 実用データ取得&レポート作成言語 インタプリタ型 文字列のパターンマッチングとテキスト処理 様々な機能モジュールの提供(CPAN) CGI (CGI特有の機能を提供するライブラリ) XML::DOM, XML::XPath(XML文書を処理するためのライブラリ) Encode (多国語文字コードを扱うためのライブラリ) 1 演習(プログラム作成) 演習(動作確認) index.htmlの内容をそのまま出力するCGIプログラムの作 成 – – – – 準備 % cd myblog ファイル名: index.cgi – 注) 文字コードはUTF-8にする 参考:デプロイ後に実行許可・文法チェックを行う方法(sshコマンドでサーバ にログインしてから行う.Windowsの場合はTera Termを使う) #!/usr/bin/perl use CGI qw(:standard); print header(-type=>"text/html; charset=UTF-8"); print <<PAGE; ....ここにindex.htmlを挿入する.... PAGE exit(0); Perl/CGIの注意点 – % ssh webdesign.center.wakayama-u.ac.jp (パスワードの入力) % cd public_html/myblog % chmod +x index.cgi % perl -wc index.cgi ヒアドキュメント 文字コード – 日本語を扱う場合,文字コードはUTF-8かEUC-JPが望ましい. サイト全体で扱う文字コードを統一することが混乱を防ぐ. – – print文と,print文中に書いた終了文字列のみからなる行とに挟ま れた部分が出力される 終了位置には終了文字列のみを書く WebサーバのOSに合った改行コードを webdesignはUNIX系OS 主に複数行の文字列を出力する時に使う – 改行コード – デプロイ後にブラウザで確認 http://webdesign.center.wakayama-u.ac.jp/~ユーザID/myblog/index.cgi 中身 作成後の手続き(実行許可を与える) % chmod +x index.cgi 文法チェック % perl -wc index.cgi Windows上のテキストエディタで作成した場合には改行コードの変換 が必要に(WinSCPの設定でデプロイ時に自動変換することも可能) 参考 http://tech.bayashi.net/pdmemo/chara.html – – プログラムの汎用性向上 データの保守性向上 $ → ¥$, @ → ¥@ データファイルの書式 データ(ブログの場合はエントリ内容)を管理するファイルを 用意し,プログラムがこれを読み込んで動作する メリット – 終了文字列PAGEが 出現するまで出力 要注意:ヒアドキュメントの中でドルマーク($)やアットマーク(@)を 出力する場合は,直前にバックスラッシュ(円マーク)を付ける プログラムとデータの分離 空白も入れてはいけない print <<PAGE; 出力したい内容を複数行に渡って 記述する PAGE 入力 エントリ 内容 データファイル CGI プログラム 出力 トップページ のHTML XML整形式を使用 – – タグ(<タグ名>)を使ってデータの種類を表現 タグで挟まれたデータを木構造(入れ子構造)に配置 <?xml version="1.0" encoding="UTF-8" ?> <EMPLOYEES> <EMPLOYEE> <ENAME>佐野力</ENAME> <JOB>President</JOB> <SAL>10000</SAL> </EMPLOYEE> <EMPLOYEE> <ENAME>高橋敦子</ENAME> <JOB>Director</JOB> <MGR>1</MGR> <SAL>6000</SAL> </EMPLOYEE> </EMPLOYEES> XML記述の例 2 演習 トップページCGIの改良 エントリ内容をあらわす XMLファイルを作成する – 準備 % cd mng – (mngディレクトリの中に作成) ファイル名: entries.xml 注) 文字コードはUTF-8にする <?xml version="1.0" encoding="UTF-8" ?> <entrylist> <entry id="1"> <date>2014.10.30 13:10</date> <category>カテゴリ</category> <title>タイトル</title> <body> ここに主文を書く エントリひとつ分の </body> データ </entry> <entry id="2"> ....省略.... </entry> <entry id="3"> ....省略.... </entry> ....エントリの繰り返し.... </entrylist> ヒアドキュメントの分割 print <<PAGE; <html> <head><title>Webプログラミング演習</title> .... <div class="main"> PAGE print <<PAGE; <div class="entry"> .... </div> <div class="entry"> .... </div> PAGE print <<PAGE; </div> <div class="footer"> .... </html> PAGE XMLファイルを参照してエントリを出力するようにする 手順 – ヒアドキュメントを三つに分割 – エントリ出力部分を,XMLファイルから自動生成するように改良 エントリ出力前,エントリ出力部分,エントリ出力後 演習 エントリ出力前 エントリ出力部分 エントリ出力後 演習 XMLファイルを読んでエントリ内容を出力するプログラム eval {$doc = new XML::XPath::XMLParser->parsefile('mng/entries.xml')}; XMLファイル名 if($@){ print "XML文書が不整です:$@¥n"; エラー処理 exit; } エントリ毎の繰り返し foreach $entry ($doc->findnodes('//entry')){ $date = $entry->findvalue('date'); $title = $entry->findvalue('title'); $body = $entry->findvalue('body'); print <<ENTRY; エントリの日時, <div class="entry"> タイトル,本文 <h3>$date</h3> を取り出す <h4>$title</h4> エントリひとつ分の出力 <div class="body">$body</div> (各自の出力形式に合わせて) </div> ENTRY (ソースファイル) } XMLファイルを処理するための準備 #!/usr/bin/perl use CGI qw(:standard); use XML::XPath; use encoding 'utf-8'; 挿入する ヒアドキュメントでエントリを出力している部分を,次ページ のプログラムで置き換える .... PAGE print <<PAGE; ....エントリ出力部分.... PAGE print <<PAGE; .... 次ページのプログラムで置き換える 参考Webページ Perl – XML – とほほのperl入門 http://www.tohoho-web.com/wwwperl.htm XML1.0仕様書(日本語訳) http://www.doraneko.org/xml/xml10/19980210/Overview.html XML::XPathモジュール – http://search.cpan.org/~msergeant/XML-XPath-1.13/XPath.pm 3 次回の予定 Perl/CGIを使ってエントリの登録を行う 4
© Copyright 2024 ExpyDoc