在sitemesh.jar有一個默認的
sitemesh-default文件 ,這個文件是可以指定的
可以指定的文件名的sitemesh.xml文件,放在/WEB-INF目錄下。如果沒用,則默認讀取sitemesh.jar文件中的sitemesh-default.xml文件。這個文件在jar:com.opensymphony.module.sitemesh.factory包中。

在這個文件中可以指定使用那些mapper對象來裝飾頁面,也可以擴展自己的Mapper類。 sitemesh自帶的mapper類放在com.opensymphony.module.sitemesh.mapper包中,可以供大家選擇使用。
sitemesh-default.xml的內容
<sitemesh>
<property name="decorators-file" value="/WEB-INF/decorators.xml"/>
<excludes file="${decorators-file}"/>
<page-parsers>
<parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
</page-parsers>
<decorator-mappers>
<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
<param name="property.1" value="meta.decorator" />
<param name="property.2" value="decorator" />
</mapper>
<mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper"/>
<mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
<param name="decorator" value="printable" />
<param name="parameter.name" value="printable" />
<param name="parameter.value" value="true" />
</mapper>
<mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper"/>
<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
<param name="config" value="${decorators-file}" />
</mapper>
</decorator-mappers>
</sitemesh>
這里是今天學習備注的重點 ,
com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper 這個類的使用。
在sitemesh-default.xml中,可以看到已經聲明了這個類,並且可以通過查閱API來獲得其使用方法。
在這個文件中可以看到配置了這個類的兩個屬性
<param name="property.1" value="meta.decorator" />
<param name="property.2" value="decorator" />
通過查閱API可以找到,只要html文件中包含
<meta name="decorator" content="decoratorname">
<meta name="meta.decorator" content="decoratorname">
就可以應用相應的裝飾器,而不必在decorator.xml中使用<pattern>來規定哪些頁面使用哪些裝飾器。
decorators.xml
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/views">
<!-- 默認裝飾頁面, 在需要裝飾的頁面增加<meta name="decorator" content="default"/> -->
<decorator name="blank" page="layouts/blank.jsp" />
<decorator name="default" page="layouts/default.jsp" />
<!-- CMS基礎主題裝飾頁面 -->
<decorator name="cms_default_basic" page="modules/cms/front/themes/basic/layouts/default.jsp" />
<decorator name="cms_default_weixin" page="modules/cms/front/themes/weixin/layouts/default.jsp" />
</decorators>
裝飾頁面為blank
某一個需要被裝飾的頁面不用<pattern>來攔截
xxx.jsp 被裝飾的頁面
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
<title>${fns:getConfig('productName')}</title>
<meta name="decorator" content="blank"/><c:set var="tabmode" value="${empty cookie.tabmode.value ? '0' : cookie.tabmode.value}"/>
<c:if test="${tabmode eq '1'}"><link rel="Stylesheet" href="${ctxStatic}/jerichotab/css/jquery.jerichotab.css" />
<script type="text/javascript" src="${ctxStatic}/jerichotab/js/jquery.jerichotab.js"></script></c:if>
<style type="text/css">
#main {padding:0;margin:0;} #main .container-fluid{padding:0 4px 0 6px;}
#header {margin:0 0 8px;position:static;} #header li {font-size:14px;_font-size:12px;}
#header .brand {font-family:Helvetica, Georgia, Arial, sans-serif, 黑體;font-size:26px;padding-left:33px;}
#footer {margin:8px 0 0 0;padding:3px 0 0 0;font-size:11px;text-align:center;border-top:2px solid #0663A2;}
#footer, #footer a {color:#999;} #left{overflow-x:hidden;overflow-y:auto;} #left .collapse{position:static;}
#userControl>li>a{/*color:#fff;*/text-shadow:none;} #userControl>li>a:hover, #user #userControl>li.open>a{background:transparent;}
</style>
看到只要頭部引用了 <meta name="decorator" content="blank"/> 這個meta,就會自動去
decorators.xml 找
decorator name為meta指定的進行裝飾操作 ,這個方法跟用<pattern>用起來都很方便,只是使用meta控制的粒度更細
一點聯想:
在com.opensymphony.module.sitemesh.mapper包中我看到了一個叫CookieDecoratorMapper的類,話說可以在用戶的cookie中指定裝飾器的名字。
這樣我們可以通過擴展來實現基於用於的個人喜好設定,用戶可以自己選擇需要應用的裝飾器(有點類似QQ空間選擇個性主頁模板),把裝飾器的的名稱存放起來,當瀏覽頁面的時候自動去讀取這個值以實現主頁風格的動態切換。只是有個這個想法,沒有實踐