how to create a simple web application with web::app template::toolkit and class::dbi
Post on 19-Jan-2016
26 Views
Preview:
DESCRIPTION
TRANSCRIPT
How to create a simple Web application with Web::App
Template::Toolkit and Class::DBI
Leonard MillerJune 17, 2008
Who is this talk for?
Who is this talk for?
• Need to write web applications
Who is this talk for?
• Need to write web applications
• Don’t want/cannot have a heavy framework
Who is this talk for?
• Need to write web applications
• Don’t want/cannot have a heavy framework
• Experienced Programmers.
Who is this talk for?
• Need to write web applications
• Don’t want/cannot have a heavy framework
• Experienced Programmers.
• Know about CPAN, how to learn from CPAN’s documentation.
Who is this talk for?
• Need to write web applications• Don’t want/cannot have a heavy
framework• Experienced Programmers.• Know about CPAN, how to learn from
CPAN’s documentation.• Newer programmers that could use a
new/better way to organize their code.
Why these three Modules?
• Separate out the code to MVC Pieces
• Each can be used/tested alone
• The modules themselves are easy to use and understand
Why not Catalyst?
• mod_perl/fastcgi: You don’t always have the access on the machine to get Catalyst to work.
• CGI::Application is a ‘lite’ framework, and as such is much smaller.
• Not as big and scary.• Trivial to install in a local ~/lib dir
What is MVC
• MVC stands for Model-View-Controller
What is MVC
• MVC breaks the work into three parts
What is MVC
• MVC breaks the work into three parts1. Model - Short for database model.
Class::DBI does all the database work: inserts/queries.
What is MVC
• MVC breaks the work into three parts1. Model - Short for database model.
Class::DBI does all the database work: inserts/queries.
2. View - Template::Toolkit does all the view/html work.
What is MVC
• MVC breaks the work into three parts1. Model - Short for database model.
Class::DBI does all the database work: inserts/queries.
2. View - Template::Toolkit does all the view/html work.
3. Controller - CGI::Application holds all the logic to glue the Model and the View together.
What is MVC
• Who has seen code like this:use DBI;my $sql = "select * from users";my $dbh = DBI->connect( $ds, $un, $pw );my $sth = $dbh->prepare($sql);$sth->execute();print "Content-type: text/html\r\n\r\n";while (my $h = $sth->fetchrow_hashref()){ print ”Name is:".$h->{'first_name'}."<br>\n";}
What is MVC
• Who has seen code like this:my $q = new CGI;
if ($q-> param('first_name' eq ''){ print input_form();}else{ my $sql = "insert into users ..."; my $sth = $dbh->prepare($sql); $sth->execute(); print submission_form();}
What is MVC
• Any questions regarding what MVC is?
CGI::Application• A sample program• Helloworld.cgi <- config info• HelloWorldCgiApp.pm <- controller• Html files: <- View
– header.html– body.html– footer.html
• MyDatabase.pm <- Model
CGI::Applicationhelloworld.cgi:
use HelloWorldCgiApp;
my $helloworld = HelloWorldCgiApp->new();
$helloworld->run();
CGI::Applicationhelloworld.cgi (with config info):
use HelloWorldCgiApp;my $helloworld = HelloWorldCgiApp->new ( PARAMS => { tt_config => { INCLUDE_PATH => ".", PRE_PROCESS => 'header.html', POST_PROCESS => 'footer.html', }, hw_string => "hi there big earth!", }, );$helloworld->run();
CGI::ApplicationHelloWorldCgiApp (continued):
package HelloWorldCgiApp;
use base 'CGI::Application';
use Template;
sub setup {
my $self = shift;
$self->run_modes( 'mode1' => 'start’,
'mode2' => 'sec_page'
);
$self->start_mode('mode1');
}
CGI::ApplicationHelloWorldCgiApp (continued):
package HelloWorldCgiApp;
use base 'CGI::Application';
use Template;
sub setup {
my $self = shift;
$self->run_modes( 'mode1' => 'start’,
'mode2' => 'sec_page'
);
$self->start_mode('mode1');
}
$q -> param (‘rm’);
CGI::ApplicationHelloWorldCgiApp (continued):
sub start {
my $self = shift;
my $tt_config = $self->param(‘tt_config’)
my $tt = Template->new( $tt_config );
$tt->process('body.html',
{
hwstr => 'hi big planet!!!',
},
\$html);
return $html;
}
CGI::ApplicationHelloWorldCgiApp (continued):
sub cgiapp_prerun
{
my ($self, $runmode) = @_;
my $q = $self->query;
}
Class::DBI• The mysql table:
CREATE TABLE users (
user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name varchar(75) NOT NULL,
last_name varchar(75) NOT NULL,
country_code CHAR(2) NULL
);
Class::DBIMyDatabase.pm:
package MyDatabase;
use base 'Class::DBI';
MyDatabase->connection('dbi:mysql:db',‘user’,’pw');
MyDatabase -> table('users');
MyDatabase -> columns( All => qw/user_id
first_name last_name country_code / );
MyDatabase -> columns( Primary => user_id );
Class::DBI• Using the Class::DBI ModuleHelloWorldCgiApp.pm:
use MyDatabase;
my @users = MyDatabase -> retrieve_all;
$tt->process('body.html',
{
users => [ @users ],
},
\$html);
Class::DBI
• Using the Module
use MyDatabase;my @users = MyDatabase -> retrieve_all;my $user = MyDatabase -> retrieve( 1 );$tt->process('body.html', { users => [ @users ], user => $user, }, \$html);
Class::DBI
• Using the Module – inserts:
use MyDatabase;
my $user = MyDatabase -> insert(
{
first_name => ‘Randall’,
last_name => ‘Schwartz’,
country_code => ‘US’,
}
);
Template::Toolkit
• Why use Template::Toolkit?– Common ‘look and feel’ templates.
• Easy to change for those people who are better at design than we are.
– What type of data is It good for?• arrays• hashes• scalars
Template::Toolkit
• Any html file is a TT file!
• Simplest usage for a scalar:<html>
<body>
[% var_name %]
</body>
</html>
Template::Toolkit
• Usage for an Array where users is an array:
<body>
[% FOREACH item IN users %]
[% item %]<br />
[% END %]
</body>
Template::Toolkit
• Usage for an Array where users is a hash:
<body>
[%item.user_id%] [%item.first_name%] [%item.last_name%] [%item.country_code%] <br />
</body>
Template::Toolkit
• Usage for an Array where users is an array of hashes (like an array of rows from a database):
<body>
[% FOREACH item IN users %]
[%item.user_id%] [%item.first_name%]
[%item.last_name%] [%item.country_code%]<br />
[% END %]
</body>
Template::Toolkit
• Usage for an Array where users is an array of hashes (like an array of rows from a database):
<body>
<form>
<input type=“hidden” name=“rm” value=“page_2”
[% FOREACH item IN users %]
...
[% END %]
<input type=“submit”>
</form>
</body>
Questions?
Thank you
Leonard MillerJune 17, 2008
top related