Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

CGI::Applicationを用いたアプリケーションの実装

Perlでのフレームワークプログラミングの基礎

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/07/23 00:00

PerlでCGIアプリケーションを作るフレームワークの1つが、CGI::Applicationです。本稿では、CGI::Applicationとデータベースを用いた基礎的なCGIアプリケーションの実装方法を解説します。

目次

はじめに

 PerlでCGIアプリケーションを作るフレームワークの1つが、CGI::Applicationです。CGI::ApplicationにはどのようなCGIアプリケーションにも必ず存在する定型処理があらかじめ用意されており、自ら記述するコードの量を減らすことができます。また、プラグインによって、足りない機能を補えます。本稿では、CGI::Applicationとデータベースを用いた基礎的なCGIアプリケーションの実装方法を解説します。

対象読者

  • Perlで何らかのCGIアプリケーションを作成したことのある方。
  • CGI、DBI、HTML::Templateモジュールを使用したことのある方。
  • フレームワークを使用したことのない方。

動作環境

 Perl 5.8以降を使ったCGIアプリケーションが正しく動作するWebサーバが必要です。また、以下の依存モジュールをCPANで導入しておいてください。

依存モジュール
DBI
DBD::SQLite
CGI::Application
CGI::Application::Plugin::DBH
CGI::Application::Plugin::Forward

 ActivePerl 5.8を利用している場合、代わりにppmコマンドで導入してください。コマンドプロンプトを開き、次のように入力します。

ppmを用いた依存モジュールのインストール
C:\Perl>ppm
PPM - Programmer's Package Manager version 3.4.
Copyright (c) 2001 ActiveState Software Inc.  All Rights Reserved.

Entering interactive shell. Using Term::ReadLine::Perl as readline library.

Type 'help' to get started.

ppm>install DBI
ppm>install DBD::SQLite
ppm>install CGI::Application
ppm>install CGI::Application::Plugin::DBH
ppm>install CGI::Application::Plugin::Forward
ppm>quit

 もしモジュールが見つからずインストールできない場合は、installの前に以下を実行し、ActiveState社以外のppmサーバを追加した後で再度インストールを試みてください。

外部ppmサーバの追加
ppm>rep add Winnipeg http://theoryx5.uwinnipeg.ca/cgi-bin/
ppmserver?urn:/PPMServer58

 本稿ではデータベースとしてSQLiteを用います。DBD::SQLiteモジュールにデータベースアクセスに必要なライブラリも含まれているため、特に別途用意するものはありません。アーカイブにはテーブル定義済みのデータベースファイル「cashbook.db3」を添付しています。

まずは動かしてみよう

 CGI::Applicationを利用したサンプルアプリケーションとして、「おこづかい帳」を用意しました。まずはこのアプリケーションを操作して、動作を見てみましょう。

パスの設定

 ダウンロードしたアーカイブを展開し、テキストエディタなどで「cashbook.cgi」を開きます。「cashbook.cgi」の1行目を「perl」(もしくは「perl.exe」)の存在するパスに変更してください。

cashbook.cgi
#!/usr/bin/perl ←ここを変更

use strict;
use Cashbook;

my $app = Cashbook->new(
    PARAMS => {
        db_dsn => 'dbi:SQLite:cashbook.db3',
        db_user => '',
        db_pass => ''
    }
);
$app->run();

 テキストエディタはWindowsに付属のメモ帳でも構いませんが、UTF-8やLF改行コードに対応したものをお勧めします。筆者はサクラエディタというフリーウェアを使っています。

補足
 WindowsのApacheでは、先頭行の変更だけではうまく動作しない場合があります。詳しくはApacheに同梱されているドキュメントのScriptInterpreterSourceディレクティブに関する説明を参照してください。また、セキュリティ上の問題はありますが、単に#!perlとだけ指定すると動く場合もあります。

ファイルの配置

 Webサーバにファイルを配置します。各ファイルのパーミッションと転送モードは次のとおりです。必要に応じて参照してください。

パーミッションと転送モード
ファイル名パーミッション転送モード
cashbook.cgi705ASCII
Cashbook.pm604ASCII
insert_input.tmpl604ASCII
update_input.tmpl604ASCII
view.tmpl604ASCII
default.css604ASCII
cashbook.db3606Binary
initdb.sql-転送不要

ブラウザでアクセス

 ブラウザに配置先のURLを入力すると、図1のような「一覧」画面が表示されます。

図1
図1

 図中の[追加]ボタンを押すと入力画面に遷移します。1つでも項目がある状態だと、[編集]や[削除]ボタンも使用可能です。適当に遊んでみてください。

CGI::Applicationの基本

 CGI::Applicationを利用するCGIアプリケーションは、CGI::Applicationを基本クラスとする派生クラスとして実装しなければなりません。本稿のサンプルではCashbookというパッケージを「Cashbook.pm」に実装しています。これを「cashbook.cgi」内でインスタンス化し、runメソッドを呼び出して実行しています。

 テキストエディタで「Cashbook.pm」を開いてください。4行目がCGI::Applicationを基本クラスにしている部分です。5~6行目はCGI:Applicationのプラグインモジュールのロードを行っており、それぞれデータベースアクセスとモードの強制遷移(後述)をサポートします。

Cashbook.pm(1~8行目)
1 package Cashbook;
2 use 5.0008;
3 use strict;
4 use base qw(CGI::Application);
5 use CGI::Application::Plugin::DBH qw(dbh_config dbh);
6 use CGI::Application::Plugin::Forward;
7 use vars qw($VERSION);
8

 一般的に、CGIアプリケーションはいくつかの「モード」から構成されます。先ほど動かしたときに気付かれたと思いますが、「一覧」「追加」「編集」「削除」のモードがあり、それぞれ機能と画面を持っています。さらに細かく見ると「追加」や「編集」のモードは「入力」と「実行」の2段階に分かれています。

 CGI::Applicationにはモードの概念があり、初期化を済ませた後、それぞれのモードに対応するサブルーチンを呼び出す仕組みになっています。モードはクエリ文字列中のパラメータ「rm」として渡します。例えば"cashbook.cgi?rm=view"の場合、"view"がモードとなります。モードを処理するサブルーチンの戻り値がブラウザに返すHTMLとなります。

 「Cashbook.pm」の34~41行目で各モードに対応するサブルーチンの名前を指定しています。32行目のerror_modeメソッドはdieなどで例外が発生した場合に強制的に遷移するモードを設定します。33行目のstart_modeメソッドはクエリ文字列中にモードを指定するパラメータが無かった場合のモードを指定します。

Cashbook.pm(26~42行目)
26 ###
27 ### モードの設定
28 ###
29 sub setup {
30     my $self = shift;
31
32     $self->error_mode('error');
33     $self->start_mode('view');
34     $self->run_modes(
35         'view'          => 'view',
36         'insert_input'  => 'insert_input',
37         'insert_finish' => 'insert_finish',
38         'update_input'  => 'update_input',
39         'update_finish' => 'update_finish',
40         'delete_finish' => 'delete_finish',
41     );
42 }

 初期化も含めた「Cashbook.pm」内の全体的なプログラムの流れをまとめると図2の通りです。

図2
図2

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • fruit(くだもの)

    Webアプリケーションからデバイスドライバまで、面白そうなものにすぐ飛びつきます。 ■サイト:『果物工房』

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5