On a current project, my team are involved in the replacement of an old content management system (CMS) with one that can serve multiple channels and allow business users to update the website without intervention from developers. After reviewing a number of CMS products, we decided to settle on
Hippo. It's open source,
JCR-283 compliant, well designed with an intuitive UI and was better aligned with the technology stack in use.
To build a website with Hippo it is important to understand the underlying architecture and model. The Hippo
developer trails and documentation provide a good reference and is used to present the summary below.
A Hippo CMS implementation is deployed as two Java web-applications. The Hippo CMS web application (cms.war) is the authoring tool used to create and edit content. The Hippo delivery tier-based (HST) site web application (site.war) is the end-user website.
Developing a website with the delivery tier (HST) is based on the
Hierarchical MVC architectural pattern that allows a hierarchical structure of content and for content to be reused across multiple pages. The content stored in the repository and accessed using HST Content Beans represents the model. Java classes providing HST components encapsulate the controller and JSP or
Freemarker templates are responsible for the view.
The configuration that connects the model, controllers and views is also stored in the repository under the
/hst:hst node. The
/hst:hst node stores all the configuration required for the website and processing of requests such as hosts, sites, channels and URLs.
Once a request has been matched to a host, site and channel it is further matched against the sitemap that contains a number of
hst:sitemapitem nodes. We can think of the sitemapitem as representing the URL to a webpage. The sitemapitem references a HMVC root
hst:component node typically under
/hst:pages. This
hst:component node can contain child
hst:component nodes to provide the composite structure of a page. The
hst:component node references a JSP or Freemark template (through its
renderpath property) to provide the view and optionally references a Java HST component class (through its
componentclassname property) that implements the controller. If a component class is not provided, the component will use the default component class.
The diagram below will help understand how a page is typically configured in the Hippo repository.
|
Hippo CMS Page Composition |
When a request that matches the sitemap item
about.html it will be rendered as a textpage due to the
hst:componentconfigurationid configured to reference
hst:pages/textpage. The content that will be displayed in the rendered page is retrieved through the
hst:relativecontentpath property. The
hst:pages/textpage nodes models the structure of the webpage. The diagram above shows that the page reuses the
hst:pages/standard page structure through the
hst:referencecomponent property and references
hst:component/content for its
content child node.
The
standard page is composed of an
header and
main child components and a template for rendering the view. The main component is further composed of a
leftmenu and
right child components and a template for rendering the view.
The child components that require some business logic such as
header and
leftmenu, again reference components under
hst:components that specify the
componentclassname that implements the logic and a
template for the view. Similarly the content component also specifies its
componentclassname that is responsible for retrieving its document from the repository and a
template responsible for the view.
The configuration of templates is found under
hst:templates where each template has a
renderpath property that specifies the location of the JSP or Freemarker file.
This covers how the Hippo repository is typically configured to deliver modular web pages..