用Sitemesh装饰器控制页面布局 2

最重要的是写出装饰器本身 ( 也就是那些要复用页面,和结构页面 )
其实,重要的工作就是制作装饰器页面本身 ( 也就是包含结构和规则的页面 ) ,然后把他们描述到 decorators.xml 中。
让我们来先看一看最简单的用法:其实最常用也最简单的用法就是我们的 hello 例子,面对如此众多的技术,我想只要达到功能点到为止即可,没必要去研究太深 ( 除非您有更深的需求 )
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="sitemesh-decorator" prefix="decorator" %>
 
<html>
     <head>
       <title><decorator:title default=" 装饰器页面..." /></title>
       <decorator:head />
     </head>
     <body>
       sitemesh 的例子<hr>
       <decorator:body />
       <hr>[email protected]
     </body>
</html>
我们在装饰器页面只用了 2 个标签:
<decorator:title default=" 装饰器页面 ..." />  :把请求的原始页面的 title 内容插入到 <title></title> 中间。 <decorator:body /> 把请求的原始页面的 body 内的全部内容插入到相应位置。然后我们在 decorator.xml 中加入以下描述即可:
<decorator name="main" page="main.jsp">
       <pattern>*</pattern>
</decorator>
这样,请求的所有页面都会被重新处理,并按照 main.jsp 的格式重新展现在你面前。
 
让我们看看更多的用法。 ( 抄袭 sitemesh 文档 )
以下列着全部标签:
Decorator Tags
Page Tags
被用于建立装饰器页面 .
被用于从原始内容页面访问装饰器 .
<decorator:head />
<decorator:body />
<decorator:title />
<decorator:getProperty />
<decorator:usePage />
<page:applyDecorator />
<page:param
 
<decorator:head />
插入原始页面 ( 被包装页面 ) head 标签中的内容 ( 不包括 head 标签本身 )
<decorator:body />
插入原始页面 ( 被包装页面 ) body 标签中的内容。
<decorator:title [ default="..." ] />
插入原始页面 ( 被包装页面 ) title 标签中的内容,还可以添加一个缺省值。
例:
/_decorator/main.jsp (装饰器页面) : <title><decorator:title default=" 却省 title-hello"     /> - 附加标题 </title>
/aaa.jsp ( 原始页面 ) <title>aaa 页面 </title>
访问 /aaa.jsp 的结果: <title>aaa 页面 - 附加标题 </title>
<decorator:getProperty property="..." [ default="..." ] [ writeEntireProperty="..." ]/>
在标签处插入原始页面 ( 被包装页面 ) 的原有的标签的属性 中的内容,还可以添加一个缺省值。
sitemesh 文档中的例子很好理解:
The decorator:
<body bgcolor="white"<decorator:getProperty property="body. writeEntireProperty="true" />>
The undecorated page: <body onload="document.someform.somefield.focus();">
The decorated page: <body bgcolor="white" onload="document.someform.somefield.focus();">
注意, writeEntireProperty="true" 会在插入内容前加入一个空格。
<decorator:usePage id="..." />
jsp 页面中的 <jsp:useBean> 标签一样,可以使用被包装为一个 Page 对象的页面。 ( 懒的用 )
例:可用 <decorator:usePage id="page" /> <%= page.getTitle()%> 达到<decorator:title/>的访问结果。
 
<page:applyDecorator name="..." [ page="..." title="..." ] >
<page:param name="..."> ... </page:param>

<page:param name="..."> ... </page:param>

</page:applyDecorator>
应用包装器到指定的页面上,一般用于被包装页面中主动应用包装器。这个标签有点不好理解,我们来看一个例子:
包装器页面 /_decorators/panel.jsp <p><decorator:title /></p>     ... <p><decorator:body /></p>
    
并且在 decorators.xml 中有 <decorator name="panel" page="panel.jsp"/>

一个公共页面,即将被 panel 包装: /_public/date.jsp:  
     ... <%=new java.util.Date()%>     ...<decorator:getProperty property="myEmail" />

被包装页面 /page.jsp
     <title>page
的应用 </title>
     .....  
     <page:applyDecorator name="panel" page="/_public/date.jsp" >
       <page:param name="myEmail"> [email protected] </page:param>
     </page:applyDecorator>
最后会是什末结果呢?除了 /page.jsp 会被默认的包装页面包装上 header,footer 外, page.jsp 页面中还内嵌了 date.jsp 页面,并且此 date.jsp 页面还会被 panel.jsp
包装为一个 title body 的有 2 段的页面,第 1 段是 date.jsp title ,第 2 段是 date.jsp body 内容。
另外, page:applyDecorator 中包含的 page:param 标签所声明的属性值还可以在包装页面中用 decorator:getProperty 标签访问到。
可打印的界面装饰
前面说过有 1 种可打印的装饰器,可以允许你当用 http://localhost/aaa/a.html?printable=true 方式访问时,应用其他的装饰器 ( 自己指定 ) ,给出原始页面以供打印 (
免得把 header,footer 等的花哨的图片也搭上 )
让我们来看一看怎样实现他:
1. 首先在 WEB-INFO/sitemesh.xml 中设置:
     <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>
这样就可以通过 ?printable=true 来使用名为 printable 的装饰器,而不是用原来的装饰器。
2. WEB-INFO/decorators.xml 中定义相应的 printable 装饰器
     <decorator name="printable" page="printable.jsp"/>
3. 最后编写 printable 装饰器 /decorators/printable.jsp
<%@ taglib uri="sitemesh-decorator" prefix="decorator" %>
<html>
<head>
     <title><decorator:title /></title>
     <decorator:head />
</head>
<body>

     <h1><decorator:title /></h1>
     <p align="right"><i>(printable version)</i></p>

     <decorator:body />

</body>
</html>
这样就可以让一个原始页面通过 ?printable=true 开关来切换不同的装饰器页面。
 
 
中文问题
由于 sitemesh 内部所使用的缺省字符集为 iso-8859-1 ,直接使用会产生乱码,我们可以通过以下方法纠正
之:
  • 方法1:可以在您所用的application server的配置文件中找一找,有没有设置encodingcharset的项目,然后设成gbkgb2312即可
  • 方法2:这也是我们一直使用的方法。
    1.
    在每一个jsp页里设置: <%@ page contentType="text/html; charset=gbk"%> 来告诉server你所要求的字符集。
    2.
    在每个jsp页的head中定义:<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=gbk"> 来告诉浏览器你所用的字符集。
 
总结:使用 sitemesh 最通常的途径:
1. 配置好环境,
2. WEB-INFO/decroators.xml 中描述你将建立的包装器。
3. 开发在 decroators.xml 中描述的包装器,最好存放在 /_decorators 目录下
4.ok ,可以看看辛勤的成果了 :)

你可能感兴趣的:(职场,sitemesh,页面布局,休闲, )