CGI::Application was developed with HTML::Template in mind, so it's natural to use them together.
I assume that you already read the HTML::Template Tutorial.
An example such as 'Hello, World!' will not show much of the real benefit using CGI::Application. This module was developed to simplify the programming of web application with many 'screens'.
Anyway, I will give an example just to show where to put the different pieces of code.
We can use the same template as in the HTML::Template tutorial, helloworld.tmpl.html:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title><TMPL_VAR NAME=THAT_FAMOUS_STRING></title>
</head>
<body>
<b><TMPL_VAR NAME=THAT_FAMOUS_STRING></b>
</body>
</html>
Then we create the module HelloWorldCgiApp.pm where we put all the code (thanks to Cory Trese for valuable comments!):
# HelloWordCgiApp.pm
package HelloWorldCgiApp;
use lib qw(/home/redanti/perl);
use base 'CGI::Application';
use HTML::Template;
use strict;
# Run at startup
sub setup {
my $self = shift;
$self->start_mode('mode1');
$self->run_modes(
'mode1' => 'helloworld_cgi_app',
);
# Use current path as template path,
# i.e. the template is in the same directory as this script
$self->tmpl_path('./');
}
# HTML::Template-style "Hello, World!"
sub helloworld_cgi_app {
# The application object
my $self = shift;
# The message
my $that_famous_string = 'Hello, world!';
# Open the html template
# NOTE 1: load_tmpl() is a CGI::Application method, not a HTML::Template method.
# NOTE 2: Setting the 'cache' flag caches the template if used with mod_perl.
my $template = $self->load_tmpl(
'helloworld.tmpl.html',
cache => 1,
);
# Fill in some parameters
$template->param(
THAT_FAMOUS_STRING => $that_famous_string,
);
# Parse the template
my $html_output = $template->output;
return $html_output;
}
1; # so the 'require' or 'use' succeeds
Finally we need a 'wrapper', helloworld.cgi-app.pl, which creates an object of our application and runs it:
#!/usr/bin/perl -wT
##
## CGI Application Hello World
##
use strict;
use lib qw(.);
use HelloWorldCgiApp;
my $helloworld = HelloWorldCgiApp->new();
$helloworld->run();
The output should look like this.
Not very exiting.
But we already know from the HTML::Template tutorial that we may change the look without changing the code.
This example only uses one 'screen', called 'run mode' in CGI::Application terms.
What if we want to extend our script to various 'screens'?
We just define more 'run modes' in our module, and we probably want a template for each 'run mode' (even if it's not mandatory).
The next example shows how to use 'run modes', and how to pass parameters between them.