第6回 Webアプリケーション開発にチャレンジ【前編】:作って学ぶ、今どきのWebサービス(3/3 ページ)
本連載ではこれまで、PerlによるWebプログラミングの基礎から応用まで解説してきました。今回は、これまで学んだことを踏まえた上で、Webサービスを使ったWebアプリケーション開発にチャレンジします。
Webアプリケーション開発にはフレームワークを使おう
出力の整え方は分かったので、ここからWebアプリケーションを作りますが、今回は見通しを良くするため、mod_perlなどは使わず、CGIプログラムとしてアプリケーションを作っていきます。
Webアプリケーションというと大層な感じがしますが、すでにWWW::OpenSearchで検索、結果を受け取るという中核の処理、それから検索結果を整形して表示するという出力部分は分かっています。残る作業は、入力を受け取ってそれに応じてアプリケーションを動かす部分の作成くらいです。
この部分、つまり入力を受け取ってうんぬんというスクリプトを、実装するとどんな具合でしょうか。よくあるのはリスト5のようなパターンです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このスクリプトでは、アプリケーションのトップページ、検索結果ページ、設定ページの出力処理をすべて1つのファイルにまとめています。それぞれの動作は、URLに与えられたmodeなどのクエリパラメータの変数によって切り替え、サブルーチンを呼び出すことで実装するというものです。うーん、ちっとも「いまどき」な感じがしませんね。この方法だと、アプリケーションを拡張するとどんどんスクリプトの行数が増えていって、後からメンテナンスするのが大変になってしまいます。
そうならないためには、どうすれば良いでしょうか? こういった問題を追究すると、例えば各ページごとにモジュールやクラスを切り分けて……といった方向へ発展していくわけですが、その仕組みそのものを一から作るのは「車輪の再開発」にほかなりません。「Webアプリケーションを作るための仕組み」は、フレームワーク*としてすでにあるものを使ってしまうのが良いでしょう。これもやっぱりCPANです。
CGI::ApplicationでWebアプリケーションを作る
CGI::Applicationを使うと、先の例のような一枚っぺらでメンテナンス性の低い構成ではなく、ページ(機能)ごとにクラスを分けつつ、かつmodeでの条件分岐のような泥臭い処理を書かずにWebアプリケーションを作れるようになります。
CGI::Applicationでは、CGIスクリプトそのものには処理を書きません。CGIスクリプトからはクラスを呼び出して実行するだけです。例えば次のようになるでしょう。
#!/usr/local/bin/perl
use WebApp; # CGI::Application のサブクラス
my $webapp = WebApp->new;
$webapp->run;
具体的な処理が入っているWebAppクラスの実装はリスト6のようになります。CGI::Applicationを継承して、setupメソッドをオーバーライドしオブジェクト指向インタフェースでどのモードがどのメソッドを呼ぶか、というふうに記述していきます。if文で分岐処理を書くよりもずいぶんすっきりしますね。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
CGI::Applicationは$self->mode_paramで指定した名前のURLのクエリパラメータをモードとして扱い、その値によってメソッドのディスパッチ*先を決定します。またstart_modeで指定した値がデフォルトのモードになります。つまり、前述の書き方だと、・cgiapp.cgi?__mode=search → do_searchが呼ばれる
- cgiapp.cgi?__mode=config → do_configが呼ばれる
- cgiapp.cgi→デフォルト→do_searchが呼ばれる
といった具合になります。また、各メソッドの戻り値がそのモードのページの出力です。例えば、
sub do_search {
return "hoge";
}
のようにすると、「cgiapp.cgi?__mode=search」にアクセスしたときの画面には、「hoge」と1行表示されます。
CGI::Applicationでは、ページの切り替えはmodeパラメータで行うか、別のクラスを作って分けるといった具合に設計していくことができます。ある特定の機能に関連したページは1つのクラスの中にまとめて適宜modeで切り替え、異なる機能のページはクラスを分けるといった感じでページ設計をしていくと良いでしょう。
- CGI::Application::Dispatchで呼び出すクラスのディスパッチ
CGI::Applicationを単体で使うのもいいですが、ページごとにクラスを用意するような設計を行う場合はCGI::Application::Dispatchを使うと便利です。例えば、リスト7がcgiapp.cgiというCGIプログラムだとすると、「cgiapp.cgi/<モジュール名>/<モード>」というURLで該当ページにアクセスできるようになります。具体的には、
- cgiapp.cgi → UU::Indexのデフォルトのモード
- cgiapp.cgi/search → UU::Searchのデフォルトのモード
- cgiapp.cgi/search/config → UU::Searchのモードconfig
- cgiapp.cgi/edit/enter → UU::Editのモードenter
といった具合でディスパッチされます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
それではフレームワークの解説はここまでにして、次回は実際にWWW::OpenSearchを使ってアプリケーションを組み立てていきましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
フレームワーク
Perlの代表的なWebアプリケーションフレームワークとして、次のものが挙げられる。
- CGI::Application
- Mason
- Sledge
- Catalyst
この中でも特に、最近はCatalystが非常に注目されているが、これは、「Ruby on Rails」というRubyで利用するフレームワークが流行している影響もある(CatalystはRailsを参考に作られている)。Catalystは便利だが、利用方法を覚えるまでに若干敷居が高く今回は解説しなかった。興味のある方はぜひ挑戦してほしい。
ディスパッチ
処理を振り分けること。会社の受付が来客の応対と対応部署への誘導を専門に行うのと同様、プログラムにおいても、入力データを受け付けて該当処理を呼び出すプログラム構造を持つことがある。こういった処理をディスパッチと呼ぶ。
本記事は、オープンソースマガジン2005年9月号「作って学ぶ、今どきのWebサービス 第3回」を再構成したものです。
関連記事
- developersLife〜開発者という生き方
- 連載第1回:何はなくともCPANを知ろう
最近のWebかいわいでは、Webアプリケーション同士が連携してどんどん面白いサービスが生まれています。しかし、Web上のサービスは手元にソフトウェアも何も残らないので、どうしても雲をつかむような分かりにくさがあります。そこで本連載では、Webサービスを実際に利用/作成しながら、そういった「今どき」のテクノロジーを学んでみたいと思います。 - 連載第2回:RSSフィードの料理はLWPとXML::RSSにおまかせ
今回から、いよいよPerlプログラミングの世界に入っていきましょう。手始めに、PerlにおけるWebプログラミングの要ともいえるLWPを用いた、HTTPコンテンツをPerlでHackする手法を解説します。 - 連載第3回:XML::SimpleであらゆるXML文書を料理する
RSSにおけるXML::RSSのように、専用のモジュールがある場合にはそれを使えばよいのですが、そうでない場合は汎用のXMLパーサーモジュールを使ってパースすることになります。今回は、XML::Simpleを使ってあらゆるXML文書を料理できるようにしてみます。 - 連載第4回:Webサービスって実はこんなに簡単
前回まで3回に渡って、PerlにおけるWebプログラミングの基礎を解説しました。今回は一歩進めて、より実用的なアプリケーションを作るため、その足がかりとなるであろうXML Webサービスの使い方について解説していきたいと思います。 - 連載第5回:Amazon Webサービスを料理してみる
Webサービスを使いこなすといっても、Web検索の機能をアプリケーションに統合するだけでは、いまいち面白みがありません。今回は、Amazon.comが提供するAmazon Webサービスを料理してみましょう。
関連リンク
Copyright © ITmedia, Inc. All Rights Reserved.