連載
» 2007年03月29日 08時00分 公開

作って学ぶ、今どきのWebサービス:最終回 Webアプリケーション開発にチャレンジ【後編】 (1/3)

PerlによるWebプログラミングの基礎から応用まで解説してきた本連載の締めくくりとして、今回は、これまで学んだことを踏まえた上で、実際にWWW::OpenSearchを使ってアプリケーションを組み立てていきましょう。

[はてな 伊藤直也,ITmedia]

WWW::OpenSearchを使った検索Webアプリケーション

 前回は、「Webアプリケーションを作るための仕組み」は、フレームワークとしてCGI::Applicationが用意されていることを解説し、その使い方も紹介しました。前回までの内容を踏まえて、目的のWebアプリケーションは次のような仕様にしました。

  • 検索語句を指定して検索
  • 検索エンジンを一覧から選んで検索できる

 まずは、リスト1のようにCGI本体を記述します。これをapp.cgiとしましょう。app.cgiではCGI::Application::Dispatchを使うので、リスト中の1の部分のようにして自作クラスを置くライブラリディレクトリを指定しておきます。


#!/usr/local/bin/perl
use strict;
use lib qw (/path/to/lib);             ←1
use CGI::Application::Dispatch;

CGI::Application::Dispatch->dispatch(     PREFIX => 'UU',     DEFAULT => 'Index', );
リスト1 CGI本体(app.cgi)

 そして、指定したライブラリディレクトリに、CGI::Applicationを継承したクラスを作っていきます。たとえばUU::Foobarクラスなら、/path/to/lib/UU/Foobar.pmになります。

 トップページのapp.cgi/indexに対応するUU::Indexから作っていきましょう*(リスト2)。まず3行目ですが、CGI::Application::Dispatchを使った場合でも、ロジックを書くクラスがCGI::Applicationのサブクラスなのは一緒です。「use base」で継承します。


 1 package UU::Index;
 2 use strict;
 3 use base qw (CGI::Application);
 4 use CGI::Application::Plugin::TT;
 5
 6 sub cgiapp_init {
 7     my $self = shift;
 8     $self->tt_config(
 9         TEMPLATE_OPTIONS => {
10             INCLUDE_PATH => "/path/to/template",
11         },
12     );
13 }
14
15 sub cgiapp_prerun {
16     my $self = shift;
17     $self->header_props( -charset => 'utf-8' );
18 }
19
20 sub setup {
21     my $self = shift;
22     $self->start_mode('index');
23     $self->run_modes(
24         index => 'do_index',
25     );
26 }
27
28 sub do_index {
29     my $self = shift;
30     my $q = $self->query;
31     $self->tt_process('index.tt', { query => $q });
32 }
33
34 1;

リスト2 app.cgi/indexに対応するUU::Index(便宜上行番号を示しています)

 4行目ではCGI::Application::Plugin::TTモジュールをuseで読み込んでいます。CGI::ApplicationからTTを使うには、TTのインスタンス生成から出力作成までを自分で行うという手もありますが、プラグインを使うことで、もっと簡単に扱うことができます。プラグインはuseするだけでOK、必要なメソッドがインポートされます。

 6行目から13行目にかけて、TTにオプションを渡す処理を追加しています(INCLUDE_PATHでテンプレートのディレクトリを一括指定しています)。CGI::Applicationでは、アプリケーションの起動時にcgiapp_initというメソッドが呼ばれることになっています。アプリケーションの初期化処理などを書きたい場合は、このcgiapp_initをオーバーライドしてそこにロジックを追加していきます。

 15行目から18行目のcgiapp_prerunはページへのリクエストごとに呼ばれるロジックです。ここでは出力の文字コードをUTF-8に指定するため、header_propsでヘッダーに出力のcharsetを追加しています。

 CGI::Applicationインスタンスのtt_processを呼ぶと、TTを使った出力が可能です。28行目から32行目のように、INCLUDE_PATHオプションでテンプレートのディレクトリを/path/to/templateに設定し、tt_processでファイル名をindex.ttと指定すると、このクラスに対応したテンプレートとして/path/to/template/index.ttが使用できるようになります。今回はリスト3のようなテンプレートを記述してみました。


<html>
<head><title>Open Search</title></head>
<body>
<h1>Open Search</h1>

<form action="./app.cgi/search" method="get">   <input type="text" name="word">   <select name="osxml">     <option value="http://search.hatena.ne.jp/osxml">Hatena</option>     <option value="http://bulkfeeds.net/opensearch.xml">Bulkfeeds</option>   </select>   <input type="submit" value="search"> </form>
</body> </html>
リスト3 テンプレートindex.tt

 ただし、リスト3ではマクロを使っていません。マクロを使わないのならテンプレートエンジンなど使わず、単なるHTMLでもいいのですが、将来的にたとえばtitleを外出しの設定ファイルから拾ってきたいといった拡張もありそうなので、TTで出力しておきます。

 これで最小限のプログラムは出そろいました。app.cgiを、CGIが実行できる環境に置き、クラスやテンプレートをプログラムの中で指定したとおりの場所に配置して実行(app.cgiにアクセス)します。すると図1が表示されます。

図1 図1 トップページを出力

 まだ検索フォームから検索語を打っても動きません。そこで、検索フォームのアクション先であるapp.cgi/searchに相当するクラスとテンプレートを用意しましょう。トップページがapp.cgi/indexでIndex.pmだったのと同じく、app.cgi/searchなのでクラス名はUU::Searchになります。

このページで出てきた専門用語

トップページのapp.cgi/indexに対応するUU::Indexから作っていきましょう

なおapp.cgiではDEFAULTに「Index」を指定しているので、app.cgiに直接アクセスするとUU::Indexにディスパッチされapp.cgi/indexと同様の画面が表示される。


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ