Dynamic (database-driven) web pages

Ensembl uses a complex structure of templating modules in order to create its pages.
The diagram below shows the process for constructing a dynamic page.
The code is loosely written using an MVC (Model/View/Controller) style, as shown by the colours of the boxes.
Using a human region in detail page as an example, the diagram can be explained as follows:

Handler - Apache::SpeciesHandler
The initial E::W::Handler hands off to the SpeciesHandler for dynamic pages. The URL is analyzed to choose the appropriate Controller.
Controller - Controller::Page
The Page controller is used to generate the page. After it has been loaded, additional components will be requested via AJAX. These will use E::W::Controller::Component. See here for a more detailed explanation of how the Controller module is chosen.
A holder for all the database connections, CGI parameters, session data, etc. required by any dynamic page
Creates a Factory for each CGI parameter which is linked to an Object, and stores the Objects generated
Factories - Factory::Location
Parses the CGI parameters to generate an Object with the required data. In this case, only a Factory::Location is generated. If the URL also contained, for example, a "g" parameter (e.g. g=ENSG00000139618), a Factory::Gene would be created too.
Objects - Object::Location
A wrapper for a Bio::EnsEMBL::Slice, containing functions required by the web code.
Configuration - Configuration::Location
Builds a tree of available pages for the current Location, from which the left-hand navigation menu is built. Also defines the set of components that belong to each page
Elements - Document::Element::[Tabs, Logo etc]
A series of more-or-less static modules which output HTML for various sections of the page template: logo, search box, footer, etc, as well as the left-hand navigation menu and top tabs
Panels - Document::Panel
A container for a set of Elements and/or Components
Components (dynamic content modules)
One or more modules attached to a Panel, each of which outputs a chunk of HTML and/or images
Page - Document::Page
Takes HTML output from Elements, Panels and Components, puts them into the whole page template, and renders the page

Next: Creating a simple custom page