NAME

Apache2::WebApp - Simplified web application framework

SYNOPSIS

This module should not be used directly; it is intended to be run as a mod_perl handler that can be configured as such by adding the following directives to your httpd.conf

PerlRequire /path/to/project/bin/startup.pl

<Perl>
    use Apache2::WebApp;
    $Apache2::WebApp = Apache2::WebApp->new;
</Perl>

<Location /app>
    SetHandler perl-script
    PerlHandler $Apache2::WebApp->handler
    SetEnv WEBAPP_CONF /path/to/project/conf/webapp.conf
</Location>

DESCRIPTION

The WebApp::Toolkit is a mod_perl web application framework for the Perl programming language. It defines a set of methods, processes, and conventions that help provide a consistent application environment.

The way this package works is actually pretty simple. For every HTTP request, a mod_perl handler is executed that instanciates a new WebApp controller object. This object is then passed to a dispatch() method that parses the URI request and maps the result to a public class/method while passing the %controller as the first argument.

Example:

# URI                                    # Class                          # Method
/app/project           --> maps to -->   Project
/app/project/foo       --> maps to -->   Project::Foo        --> or -->   Project->foo()
/app/project/foo/bar   --> maps to -->   Project::Foo::Bar   --> or -->   Project::Foo->bar()

If the target method does not exist, the distpatch() will execute the class _global() and _default() methods. Below is an example of what a class (.pm) would look like.

Example:

package Project::Foo;

use strict;
use warnings;

# construct as an object (optional)
sub _new {
    my $class = shift;
    return bless( {}, $class );
}

# this method is executed for every request (optional)
sub _global {
    my ( $self, $c ) = @_;

    $c->stash('baz','qux');

    return $c;
}

# if the target method doesn't exist, this will be executed
sub _default {
    my ( $self, $c ) = @_;

    $self->_print_result( $c, 'bar' );
}

# _ always denotes a private method (not URI accessible)
sub _print_result {
    my ( $self, $c, $output ) = @_;

    $c->request->content_type('text/html');

    print $output;
    exit;
}

# /app/project/foo/bar --> maps to Project::Foo->bar()
sub bar {
    my ( $self, $c ) = @_;

    $self->_print_result( $c, $c->stash('baz') );     # output 'qux'
}

1;

PREREQUISITES

Apache2::Request
AppConfig
Template::Toolkit
Getopt::Long
Params::Validate

INSTALLATION

From source:

$ tar xfz Apache2-WebApp-Toolkit-0.X.X.tar.gz
$ perl MakeFile.PL PREFIX=~/path/to/custom/dir LIB=~/path/to/custom/lib
$ make
$ make test
$ make install

Perl one liner using CPAN.pm:

$ perl -MCPAN -e 'install Apache2::WebApp'

Use of CPAN.pm in interactive mode:

$ perl -MCPAN -e shell
cpan> install Apache2::WebApp
cpan> quit

Just like the manual installation of Perl modules, the user may need root access during this process to insure write permission is allowed within the installation directory.

GETTING STARTED

HELPER SCRIPTS

Create a new project

$ webapp-project --project_title Project --apache_doc_root /var/www

  or

$ webapp-project --config /path/to/conf/webapp.conf

Export project settings to the Unix shell

$ source /path/to/project/.projrc

Create a new class

$ webapp-class --name ClassName

Add a pre-packaged Extra to an existing project

$ webapp-extra --install PackageName 

Start your application

$ webapp-kickstart

Standard output

/var/www/project/app                              <-- A
/var/www/project/app/Project
/var/www/project/app/Project/Base.pm              <-- B
/var/www/project/app/Project/Example.pm           <-- C
/var/www/project/bin
/var/www/project/bin/startup.pl                   <-- D
/var/www/project/conf
/var/www/project/conf/htpasswd                    <-- E
/var/www/project/conf/httpd.conf                  <-- F
/var/www/project/conf/webapp.conf                 <-- G
/var/www/project/htdocs                           <-- H
/var/www/project/templates/example.tt             <-- I
/var/www/project/templates/error.tt               <-- J
/var/www/project/logs                             <-- K
/var/www/project/logs/access_log
/var/www/project/logs/errror_log
/var/www/project/tmp                              <-- L
/var/www/project/tmp/cache
/var/www/project/tmp/cache/templates
/var/www/project/tmp/uploads

A) Application directory. All classes (*.pm) within this directory are precompiled into memory when Apache starts/restarts.

B) Base class that can be included from other classes. Contains _global() and _error() methods that can be inherited using:

Example:

use base qw(
    Project::Base
  );

C) Basic class.

D) This is executed when the Apache server starts. It's used to reset Perl module search paths in @INC, preload web application classes, precompile constants, etc.

Example:

#!/usr/bin/env perl

$ENV{MOD_PERL} or die "Not running under mod_perl";

use lib '/var/www/project/app';

..

# Modules added here will be URI accessible 
__DATA__ 
Project::Foo

E) Password file used for restricting access to a specified path (see httpd.conf).

The login information below is currently set-up by default.

User Name       admin
Password        password

You can change the login password using the htpasswd command-line script.

$ htpasswd /var/www/project/conf/htpasswd admin

F) Apache server Virtual Host configuration.

G) Application configuration. This file contains your project settings. Due to security reasons, this file should always remain outside the /htdocs directory path.

Example:

[project]
title              = Project                                 # must not contain spaces or special characters
author             = Your Name Here
email              = email@domain.com
version            = 0.01

[apache]
doc_root           = /var/www/project                        # path to project directory
domain             = www.domain.com                          # valid domain name
disable_uploads    = 0                                       # allow file uploads
post_max           = 5242880                                 # post max in bytes (example 5MB)
temp_dir           = /var/www/project/tmp/uploads

[template]
cache_size         = 100                                     # total files to store in cache
compile_dir        = /var/www/project/tmp/cache/templates    # path to template cache
include_path       = /var/www/project/templates              # path to template directory
stat_ttl           = 60                                      # template to HTML build time (in seconds)

H) Website sources. This includes HTML, CSS, Javascript, and images. When setting up FTP access - restrict access to this directory only.

I) Basic template.

J) Application error templates.

K) Apache log directory that contains both access and error logs. Due to security reasons, this directory should always remain outside the /htdocs directory path.

L) Temporary shared space for file processing.

CAVEATS

Since your classes get compiled at Apache start-up, the server must be restarted when any code changes take place. You can do this easily using the webapp-kickstart script provided with this package.

WARNING

In Perl, variables do not need to be declared and are by default globally scoped. The issue with mod_perl is that global variables can persist between requests. To avoid this problem, you should always have the following line in your code:

use strict;

SEE ALSO

perl(1), mod_perl(2), Apache(2), Apache2::Request, Apache2::RequestRec, Apache2::RequestUtil, Apache2::Connection, Apache2::Upload, Apache2::Const, Apache2::Log

AUTHOR

Marc S. Brooks, <mbrooks@cpan.org> - http://mbrooks.info

COPYRIGHT

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

See http://www.perl.com/perl/misc/Artistic.html

DISCLAIMER OF WARRANTY

BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.