| Red Hat Web Application Framework 6.1: WAF Developer Guide | ||
|---|---|---|
| Prev | Chapter 12. Presentation (Bebop) Tutorial | Next |
Once you have a shared-layout Page subclass, such as SockPuppetPage above, you will likely have single pages that vary the boilerplate content slightly. For example, you might have a single page which uses the same header, footer, and sidebar as all other pages on your site, but which adds an extra boilerplate component above the header, such as a banner ad.
You can accomplish this with further sub-classing. You can define a subclass of SockPuppetPage, BannerAdSockPuppetPage, which has all of the same pre-filled components but adds a second header, a BannerAd component:
package com.arsdigita.bebop.demo;
import com.arsdigita.bebop.*;
import com.arsdigita.xml.*;
import com.arsdigita.dispatcher.RequestContext;
import com.arsdigita.dispatcher.DispatcherHelper;
// fictitious banner ad management system
import com.arsdigita.personalization.BannerAdManager;
public class BannerAdSockPuppetPage extends SockPuppetPage {
private Component m_banner_ad;
public BannerAdSockPuppetPage() {
this("");
}
public BannerAdSockPuppetPage(String s) {
// calling super() adds default header, footer, and sidebar
super("SockPuppet.com: " + s);
m_banner_ad = new BannerAd();
}
public void generateXML(PageState ps, Document doc) {
Element page = generateXML(doc);
Element layout = new Element("socksite:layout", SOCKSITE_XML_NS);
page.addContent(layout);
// generate XML for header, footer, sidebar, and main panel
super.addContents(layout, ps);
// just add the new banner ad here
Element bannerAd = new Element("socksite:bannerAd",
SOCKSITE_XML_NS);
layout.addContent(bannerAd);
m_banner_ad.generateXML(ps, bannerAd);
}
/**
* Header component. Demonstrates dynamic content.
*/
private class BannerAd extends SimpleComponent {
public void generateXML(PageState ps, Element parent) {
Element elt = new Element("socksite:bannerAd",
SOCKSITE_XML_NS);
elt.setText(BannerAdManager.getInstance().getBanner());
parent.addContent(elt);
}
}
} |
You must also amend the XSLT stylesheet:
<!-- match the layout element and put the
header, footer, etc., in their appropriate places. -->
<xsl:template match="socksite:layout"
xmlns:socksite="http://www.sockpuppet.com/xmlns">
<xsl:apply-templates select="socksite:top"/>
<xsl:apply-templates select="socksite:bannerAd"/>
<table>
<tr>
<td width="25%"><xsl:apply-templates
select="socksite:side"/></td>
<td><xsl:apply-templates select="socksite:main"/></td>
</tr>
</table>
<xsl:apply-templates select="bebop:bottom"/>
</xsl:template> |
![]() | Note |
|---|---|
The above stylesheet will work whether or not the input DOM actually contains a banner ad; the <xsl:apply-templates select="socksite:bannerAd"/> code will simply be ignored if no such element exists in the DOM. |