SiteMesh 入门示例

SiteMesh 在 Jave Web 项目中用来统一页面风格,减少重复代码。
用Maven 的话,在 pom 中加入对应依赖:

<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>

然后在项目中加入必须的配置,首先是 web.xml

<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

然后在 WEB-INF 下新建 decorators.xml

<?xml version=”1.0″ encoding=”UTF-8″ ?>
<decorators defaultDir=”/WEB-INF/decorators”>
<excludes>
<pattern>/static/*</pattern>
</excludes>

<decorator name=”default” page=”default.jsp”>
<pattern>/*</pattern>
</decorator>
</decorators>

excludes 是用来排除不需要执行 SiteMesh 装饰器的 URL,比如 图片 和 样式。

decorator 是定义装饰器,以及分别在哪些 URL 下执行,上面的配置定义了一个名为 default 的装饰器,装饰器的父模板为 /WEB-INF/decorators 下的 default.jsp 页面,由于配置的 pattern 是 /* ,该装饰器对所有路径都有效。

如何实现子模板填充到父模板呢?SiteMesh 提供了一套标签,使用也很简单。比如<sitemesh:body/>,在父模板中加入该标签后,自模板中 body 标签下的所有内容在渲染时就会全部填充至该标签处。记住,是填充,并不是替换掉父模板的body内容。

其他标签:

<decorator:head/>:填充子模板中<head>标签中的内容,没有属性。

<decorator:body/>:填充子模板中<body>标签中的内容,除title标签外。

<decorator:title [default=""]/>:填充子模板的title标签中的内容,default属性:默认title。

<decorator:getProperty property=”" [default=""][writeEntireProperty=""]/>:
填充子模板的property属性指定的值同名的属性。
property:指定哪个属性
default:默认值
writeEntireProperty:是否将(空格 属性名=“属性值”)整个插入,允许时的值是true或yes或1
例子:
装饰器页面: <body bgcolor=”#ffffff”<decorator:getProperty property=”body.onload” writeEntireProperty=”true” />>
自模板:<body onload=”document.someform.somefield.focus();”>
装饰后效果:<body bgcolor=”White” onload=”document.someform.somefield.focus();”>

<decorator:userPage id=”"/>

<page:applayDecorator name=”" [page="" title=""]></page:applayDecorator>
应用一个装饰器到指定的内容,这个内容可能是被内联的一个页面,或是page属性指定的任何一个页面
name:被包含页面要应用的那个装饰器的名字
page:被包含的页面
title:覆盖被包含页面的title标签的内容

<page:param name=”"/>
解析一个属性到装饰器,这个属性会覆盖原有页面中的的属性,该标签只能用于<page:applyDecorator>标签内部
name:指定哪个属性的值要被重写

SiteMesh 很容易上手,配置方便,而且确实能够提升开发效率,非常推荐!

——

因为只有失去,空下的双手,才能拾起新的幸福。