Dekorátory nejsou nic jiného, než běžné JSP stránky [4] obsahující uživatelské značky rámce SiteMesh. Běžnou praxí bývá použití více dekorátorů použitých v jedné aplikaci, kde společné části těchto dekorátorů jsem zachyceny v pomocných souborech a includovány do dekorátorů pomocí běžné syntaxe jazyka JSP.
<%@ page session="true" contentType="text/html;
charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="page"
uri="http://www.opensymphony.com/sitemesh/page" %>
<%@ taglib prefix="decorator"
uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@ taglib prefix="c"
uri="http://java.sun.com/jstl/core" %>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" >
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" />
<decorator:usePage id="myPage" />
<title><decorator:title />
<c:if test="${not empty myPage.title}">|</c:if>
Sportoviny | sportovní výsledky snadno a rychle
</title>
<link rel="stylesheet" type="text/css" media="screen"
href="<c:url value='/css/style.css' />" />
<meta name="author"
content="<decorator:getProperty property="meta.autor"
default="MoroSystems" />">
<decorator:head />
</head>
<body id="<decorator:getProperty property="body.id" />">
<div id="content">
<decorator:body />
<%@ include file="/WEB-INF/decorators/include/footer.jsp" %>
Na příkladu vidíme ukázku dekorátoru
public.jsp tak, jak jej můžeme najít v naší
aplikaci. Na této ukázce si ukážeme a popíšeme jednotlivé uživatelské
značky našeho rámce.
Nejdříve musíme v daném dekorátoru definovat použití uživatelských značek. Definujeme obecné dekorátory (s předponou uživatelských značek „decorator“), stránkové dekorátory (s předponou uživatelských značek „page“). Pro úplnost dodejme, že uživatelské značky začínající prefixem „c“ jsou základní značky knihovny JSTL [3].
Jak už jsme si naznačili dříve, uživatelské značky mají přístup k objektu implementující rozhraní Page, tedy parsovanému obsahu cílové stránky, odkud čerpají data. Zde je seznam globálních uživatelských značek rámce SiteMesh.
Uživatelská značka, která přistupuje k obsahu elementu
<head> požadované stránky.
Uživatelská značka pro přístup k obsahu elementu
<body> cílové stránky.
Uživatelská značka pro přístup k obsahu elementu
<title>. Pokud není
<title> cílové stránky nastaven, můžeme
atributem default určit implicitní hodnotu
této značky.
Uživatelská značka pro přístup k vlastnostem požadované
stránky. Tímto způsobem lze získat hodnoty všech atributů
uvedených v elementech <head>,
<title>, <body>
a hodnoty všech <meta> elementů.
Atribut property je klíčem k těmto
vlastnostem. Pokud budeme chtít např. přistoupit tímto způsobem k
atributu author
<meta> elementu, musíme použít zápis
<decorator:getProperty property="meta.author"
/>.
V případě, že cílová stránka obsahuje element
<meta name="author" content="Tomáš Páral"
/> bude výslednou hodnotou řetězec "Tomáš Páral". V
případě, že se zmíněný element v cílové stránce nevyskytuje, bude
vrácen prázdný řetězec, případně implicitní hodnota atributu
default za předpokladu, že tento parametr
je nastaven. V našem případě tedy hodnota "MoroSystems".
Vloží naplněný objekt implementující rozhraní Page do dekorátoru. Tento objekt bude od té chvíle plně k dispozici běžným konstrukcím jazyka JSP.
V našem případě vložíme naplněný objekt implementující třídu
Page do dekorátoru pod jménem
myPage. Potom jej využíváme k testování
prázdnosti elementu <titlle> požadované
stránky.
Druhou skupinou značek jsou stránkové uživatelské značky, které slouží pro dekoraci vnitřního i vnějšího obsahu stránek.
Uživatelská značka pro dekorování vnitřního obsahu stránky
uzavřeného v těle této značky nebo pro dekorování externích
stránek odkazovaných atributem
page.
Parametr name určuje jméno
dekorátoru aplikovaného na tento obsah.
Parametr page určuje externí
stránku, jejíž obsah bude dekorován.
Parametr title překryje obsah
elementu <title> požadované stránky,
který bude vrácen metodoui
Page.getTitle() nebo uživatelskou
značkou <decorator:title/>.
Uživatelská značka pro překrytí hodnot parametrů
požadované stránky přístupných v dekorátoru pomocí metody
Page.getProperty() či uživatelské
značky <decorator:getProperty/>. Platné
použití této značky je pouze uvnitř značky
<page:applyDecorator>.
Stránkové uživatelské značky nemají takové uplatnění jako globální uživatelské značky a ani v naší aplikaci jsme je nepoužili. Pokud bychom však chtěli integrovat více aplikací do jednoho grafického návrhu, poté bychom se bez nich neobešli.