CGI::Application::Dispatchを使おうと思って、CGI::Application::Dispatchまとめ : おまえのログ [norainu.net] を参考にしてもさっぱり分からん。分からん1:エラーでよる。分からん2:ディレクトリ構成が分からん。
と言うわけで現在のCGI::Application::Dispatch(2.12)で実際に動くコードができたので、書き留めておく。
/var/www/html/cgiappd/dispatch.cgi
#!/usr/bin/perl
use strict;
use warnings;
use lib qw(./lib);
use CGI::Application::Dispatch;
CGI::Application::Dispatch->dispatch(
prefix => 'MyApp',
default => 'Index',
);
古い解説だと、prefix, default あたりが大文字で書いてあるんですけれども、それじゃあ動かない。書き直そう。
/var/www/html/cgiappd/lib/MyApp.pm
package MyApp;
use strict;
use warnings;
use base 'CGI::Application';
use CGI::Application::Plugin::Forward;
use CGI::Application::Plugin::BrowserDetect;
sub cgiapp_init {
my $self = shift;
$self->tmpl_path('./template/');
}
# CGI実行前フック
sub cgiapp_prerun {
my $self = shift;
$self->header_add( -type => 'text/html; charset=UTF-8');
}
# CGI出力前フック
sub cgiapp_postrun {
# WinIE6の時にXML宣言を外す
my $self = shift;
my $output_ref = shift;
my $b = $self->browser;
if ( ({$self->header_props()}->{'-type'} eq 'text/html') &&
( ( $b->windows ) && ( $b->ie ) && ( $b->major < 7 ) ) ) {
$$output_ref =~s/<\?xml .+\?>\n?//so;
}
}
1;
/var/www/html/cgiappd/lib/MyApp/Index.pm
package MyApp::Index;
use strict;
use warnings;
use base 'MyApp';
sub setup {
my $self = shift;
$self->start_mode('index');
$self->run_modes(
'index' => \&do_index,
);
}
sub do_index{
my $self = shift;
return << "END_OF_HTML";
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>
hello
</h1>
<p>
hello!
</p>
</body>
</html>
END_OF_HTML
}
1;
/var/www/html/cgiappd/lib/MyApp/Set.pm
package MyApp::Set;
use strict;
use warnings;
use base 'MyApp';
sub setup {
my $self = shift;
$self->start_mode('index');
$self->run_modes(
'index' => \&do_index,
);
}
sub do_index{
my $self = shift;
return << "END_OF_HTML";
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>
Set
</h1>
<p>
Set!
</p>
</body>
</html>
END_OF_HTML
}
1;
Index.pm内のルーチンを実行:
http://labo.dtpwiki.jp/cgiappd/dispatch.cgi
http://labo.dtpwiki.jp/cgiappd/dispatch.cgi/index
http://labo.dtpwiki.jp/cgiappd/dispatch.cgi/Index
Set.pm内のルーチンを実行:
http://labo.dtpwiki.jp/cgiappd/dispatch.cgi/set
http://labo.dtpwiki.jp/cgiappd/dispatch.cgi/Set
CGI::Applicationでやり始めたのが2年くらい前なんだけれども、その時点でCGI::Application::Dispatchが動かなくて、そこだけ飛ばしていろいろ作り始めたんだけれども、やっとCGI::Application::Dispatchが動かせるようになったよ!