﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-seasun-随笔分类-1.8 sitemesh</title><link>http://www.blogjava.net/shiwenfeng/category/42429.html</link><description>在不断模仿、思考、总结中一步一步进步！</description><language>zh-cn</language><lastBuildDate>Wed, 28 Oct 2009 09:19:45 GMT</lastBuildDate><pubDate>Wed, 28 Oct 2009 09:19:45 GMT</pubDate><ttl>60</ttl><item><title>Struts2和SiteMesh整合之web.xml</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300084.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Wed, 28 Oct 2009 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300084.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/300084.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/300084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/300084.html</trackback:ping><description><![CDATA[<p>&lt;?xml version="1.0" encoding="GBK"?&gt;<br />
&lt;!-- 配置Web应用配置文件的根元素，并指定配置文件的Schema信息 --&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee<br />
&nbsp;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"&gt;<br />
&nbsp;&lt;!-- 定义ActionContextCleanUp过滤器 --&gt;<br />
&nbsp;&lt;filter&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.ActionContextCleanUp&lt;/filter-class&gt;<br />
&nbsp;&lt;/filter&gt;<br />
&nbsp;&lt;!-- 定义SiteMesh的核心过滤器 --&gt;<br />
&nbsp;&lt;filter&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt;<br />
&nbsp;&lt;/filter&gt;<br />
&nbsp;&lt;!-- 定义Struts 2的核心过滤器 --&gt;<br />
&nbsp;&lt;filter&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;struts&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />
&nbsp;&lt;/filter&gt;</p>
<p>&nbsp;&lt;!-- 定义过滤器链 --&gt;<br />
&nbsp;&lt;!-- 排在第一位的过滤器是：ActionContextCleanUp过滤器 --&gt;<br />
&nbsp;&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;<br />
&nbsp;&lt;!-- 排在第二位的过滤器是：SiteMesh的核心过滤器 --&gt;<br />
&nbsp;&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;<br />
&nbsp;&lt;!-- 排在第三位的过滤器是：FilterDispatcher过滤器 --&gt;<br />
&nbsp;&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;struts&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<p>&nbsp;&lt;!-- 定义一个Listener，该Listener在应用启动时创建Spring容器 --&gt;<br />
&nbsp;&lt;listener&gt;<br />
&nbsp;&nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener<br />
&nbsp;&nbsp;&lt;/listener-class&gt;<br />
&nbsp;&lt;/listener&gt;<br />
&nbsp;&lt;!-- 定义一个Listener，该Listener在应用启动时加载MyFaces的Context --&gt;<br />
&nbsp;&lt;listener&gt;<br />
&nbsp;&nbsp;&lt;listener-class&gt;org.apache.myfaces.webapp.StartupServletContextListener<br />
&nbsp;&nbsp;&lt;/listener-class&gt;<br />
&nbsp;&lt;/listener&gt;<br />
&nbsp;&lt;!-- 配置JSF的FacesServlet，让其在应用启动时加载 --&gt;<br />
&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;faces&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp;&lt;/servlet&gt;<br />
&nbsp;&lt;!-- 让FacesServlet拦截所有以*.action结尾的请求 --&gt;<br />
&nbsp;&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;faces&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&nbsp;&lt;/servlet-mapping&gt;<br />
&lt;/web-app&gt;</p>
 <img src ="http://www.blogjava.net/shiwenfeng/aggbug/300084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-28 17:11 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sitemesh技术的应用</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300045.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Wed, 28 Oct 2009 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300045.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/300045.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/300045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/300045.html</trackback:ping><description><![CDATA[<div>一、基本概念</div>
<div>1、Sitemesh是一种页面装饰技术 ：</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /> <span style="color: #000000">1</span> <span style="color: #000000">&nbsp;：它通过过滤器(filter)来拦截页面访问<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #000000">2</span> <span style="color: #000000">&nbsp;：根据被访问页面的URL找到合适的装饰模板<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #000000">3</span> <span style="color: #000000">&nbsp;：<strong>提取被访问页面的内容，放到装饰模板中合适的位置</strong><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> <span style="color: #000000">4</span> <span style="color: #000000">&nbsp;：最终将<strong>装饰后的页面</strong>发送给客户端。<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span> </div>
<div>2、在sitemesh中，页面分为两种：装饰模板和普通页面。<br />
1）装饰模板，是指用于修饰其它页面的页面。<br />
2）普通页面，一般指各种应用页面。</div>
<div>二、模板修饰网页的原理<br />
<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/pagecutomize2.gif"  alt="" /><br />
<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/pagecutomize3.gif"  alt="" /><br />
<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/pagecutomize4.gif"  alt="" /><br />
<br />
通过Sitemesh的注册机制，告诉Sitemesh，当访问该路径时使用XXX模板（假定使用前面那个模板）来修饰被访问页面。 <br />
<br />
</div>
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/pagecutomize5.gif"  alt="" /> <br />
<br />
当用户在左边导航栏点击&#8220;戏说长城&#8221;（ /ShowGreatWall.do）时，右边的&#8220;戏说长城&#8221;页面将会被指定的模板修饰<br />
<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/pagecutomize6.gif"  alt="" /><br />
<br />
总结上面过程，Sitemesh修饰网页的基本原理，可以通过下面来说明：<br />
<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/pagecutomize7.gif"  alt="" /><br />
<br />
三、Sitemesh的配置与使用
<div>1）WEB-INF/web.xml中加入filter定义与sitemesh的taglib定义</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">sitemesh</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">com.opensymphony.module.sitemesh.filter.PageFilter</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">mapping</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">sitemesh</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_244_583_Open_Image" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_244_583_Closed_Image" style="display: none" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">url</span><span style="color: #000000">-</span><span style="color: #000000">pattern</span><span style="color: #000000">&gt;</span><span id="Codehighlighter1_244_583_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_244_583_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&lt;/url-pattern&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/filter-mapping&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-uri&gt;sitemesh-decorator&lt;/taglib-uri&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;/WEB-INF/sitemesh-decorator.tld&lt;/taglib-location&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/taglib&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-uri&gt;sitemesh-page&lt;/taglib-uri&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;/WEB-INF/sitemesh-page.tld&lt;/taglib-location&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/taglib&gt;&nbsp;</span></span></div>
<div>2）创建WEB-INF/decorators.xml，在该文件中配置有哪些模板，以及每个模板具体修饰哪些URL，另外也可以配置哪些URL不需要模板控制 , decorators.xml的一个例子如下：</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">excludes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/Login*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">excludes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorators&nbsp;</span><span style="color: #ff0000">defaultdir</span><span style="color: #0000ff">="/decorators"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="main"</span><span style="color: #ff0000">&nbsp;page</span><span style="color: #0000ff">=&#8220;DecoratorMainPage.jsp"&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">decorator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8220;pop"&nbsp;</span><span style="color: #ff0000">page</span><span style="color: #0000ff">=&#8220;PopPage.jsp"&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/showinfo.jsp*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/myModule/GreatWallDetailAction.do*<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">decorator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">decorators</span><span style="color: #0000ff">&gt;</span></div>
<div>3）我们看一个修饰模板的例子 </div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@page&nbsp;</span><span style="color: #ff0000">contentType</span><span style="color: #0000ff">="text/html;?charset=GBK"</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@taglib&nbsp;</span><span style="color: #ff0000">uri</span><span style="color: #0000ff">="sitemesh-decorator"</span><span style="color: #ff0000">?prefix</span><span style="color: #0000ff">="decorator"</span><span style="color: #ff0000">&nbsp;%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt; <strong><u>&lt;</u></strong></span><span style="color: #800000"><strong><u>decorator:title</u></strong></span><span style="color: #0000ff"><strong><u>/&gt;</u></strong> &lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><u><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:head</span><span style="color: #0000ff">/&gt;</span></u></strong><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;World&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">hr</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><u>&nbsp;</u></strong></span><strong><u><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:body</span><span style="color: #0000ff">/&gt;</span></u></strong><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<div>4）我们看一个被修饰的页面的例子：</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@&nbsp;page&nbsp;</span><span style="color: #ff0000">contentType</span><span style="color: #0000ff">="text/html;?charset=GBK"</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Hello&nbsp;World</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Decorated&nbsp;page&nbsp;goes&nbsp;here.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<div>5）我们看一下装饰模板中可以使用的Sitemesh标签&nbsp;</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:head&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<div>&nbsp;取出被装饰页面的head标签中的内容。 </div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:body&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<div>取出被装饰页面的body标签中的内容。 </div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:title&nbsp;</span><span style="color: #ff0000">default</span><span style="color: #0000ff">="<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/dot.gif"  alt="" />"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<div>取出被装饰页面的title标签中的内容。default为默认值</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:getProperty&nbsp;</span><span style="color: #ff0000">property</span><span style="color: #0000ff">="<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/dot.gif"  alt="" />"</span><span style="color: #ff0000">&nbsp;default</span><span style="color: #0000ff">="<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/dot.gif"  alt="" />"</span><span style="color: #ff0000">&nbsp;&nbsp;writeEntireProperty</span><span style="color: #0000ff">="<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/dot.gif"  alt="" />"</span><span style="color: #0000ff">/&gt;</span></div>
<div>取出被装饰页面相关标签的属性值。 </div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">writeEntireProperty表明，是显示属性的值还是显示&#8220;属性=值&#8221;</span></div>
<div>Html标签的属性<br />
Body标签的属性<br />
Meta标签的属性</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">注意如果其content值中包含&#8220;&gt;或</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&#8221;会报错，需转码，例如&amp;lt</span><span style="color: #ff0000">;等等</span></div>
<div>default是默认值</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:usePage&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/dot.gif"  alt="" />"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<div>&nbsp;<font color="#0000ff"><strong>将被装饰页面构造为一个对象，可以在装饰页面的JSP中直接引用</strong></font>。 </div>
<div>6）看一个在装饰模板中使用标签的例子</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">html&nbsp;</span><span style="color: #ff0000">lang</span><span style="color: #0000ff">=&#8220; <strong><u>&lt;decorator:getProperty&nbsp;</u></strong></span><span style="color: #ff0000"><strong><u>property</u></strong></span><span style="color: #0000ff"><strong><u>=&#8216;lang&#8217;/&gt;</u></strong> &#8221;&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span><strong><u><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:title&nbsp;</span><span style="color: #ff0000">default</span><span style="color: #0000ff">=&#8220;你好&#8221;&nbsp;</span></u></strong><span style="color: #0000ff"><strong><u>/&gt;</u></strong> &lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><u><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:head&nbsp;</span><span style="color: #0000ff">/&gt;</span></u></strong><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body&nbsp;</span><strong><u><span style="color: #ff0000">&lt;decorator:getProperty&nbsp;property</span><span style="color: #0000ff">=&#8220;body.onload"&nbsp;</span><span style="color: #ff0000">writeEntireProperty</span></u></strong><span style="color: #0000ff"><strong><u>=&#8220;1"/&gt;</u></strong> &gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">从meta中获取变量company的名称：<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u>&nbsp;&lt;decorator:getProperty&nbsp;property</u></span><span style="color: #0000ff"><u>=&#8220;meta.company&#8221;/&gt;<br />
</u><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">下面是被修饰页面的body中的内容：<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u>&lt;decorator:body&nbsp;</u></span><span style="color: #0000ff"><u>/&gt;</u></span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><u><span style="color: #0000ff">&lt;</span><span style="color: #800000">decorator:usePage&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8220;myPage"&nbsp;</span><span style="color: #0000ff">/&gt;</span></u><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><u><span style="color: #0000ff">&lt;</span><span style="color: #800000">%=myPage</span><span style="color: #ff0000">.getRequest().getAttribute(&#8220;username&#8221;)%</span><span style="color: #0000ff">&gt;</span></u><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<div>7）看一下相应的在被修饰页面中的代码：</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">html&nbsp;</span><span style="color: #ff0000">lang</span><span style="color: #0000ff">=&#8220;en&#8221;&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">我的sitemesh</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8220;company&#8221;&nbsp;</span><span style="color: #ff0000">content</span><span style="color: #0000ff">=&#8220;smartdot&#8221;/&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;meta&nbsp;name</span><span style="color: #0000ff">=&#8220;Author&#8221;&nbsp;</span><span style="color: #ff0000">content</span><span style="color: #0000ff">=&#8220;zhangsan&#8221;/&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;count(){return&nbsp;10;}<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body&nbsp;</span><span style="color: #ff0000">onload</span><span style="color: #0000ff">=&#8220;count()&#8221;&gt;<br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">这是一个被修饰页面</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<div>四、总结<br />
<br />
1，Sitemesh最为重要的就是做用于修饰的模板，并在decorators.xml中配置这些模板用于修饰哪些页面。因此使用Sitemesh的主要过程就是：<font color="#0000ff"><strong><u>做装饰模板</u></strong></font>，然后<u><font color="#0000ff"><strong>在decorators.xml中配置URL Pattern</strong></font><br />
<br />
</u>2，分析整个工程，看哪些页面需要抽象成模板，例如二级页面、三级页面、弹出窗口等等可能都需要做成相应的模板，一般来说，一个大型的OA系统，模板不会超过8个。<br />
<br />
如果某个特殊的需求请求路径在过滤器的范围内，但又不想使用模板怎么办？<br />
你总不能这么不讲道理吧！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家放心吧，SiteMesh早就考虑到这一点了，上面第5步说道的decorators.xml这个时候就起到作用了！<br />
下面是我的decorators.xml：</div>
<div>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee"><font color="#0000ff">&lt;?</font><font color="#800000">xml</font> <font color="#ff0000">version</font><font color="#0000ff">="1.0"</font> <font color="#ff0000">encoding</font><font color="#0000ff">="ISO-8859-1"</font><font color="#0000ff">?&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">decorators</font> <font color="#ff0000">defaultdir</font><font color="#0000ff">="/decorators"</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--<font color="#008000"> Any urls that are excluded will never be decorated by Sitemesh </font>--&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">excludes</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">pattern</font><font color="#0000ff">&gt;</font>/index.jsp*<font color="#0000ff">&lt;/</font><font color="#800000">pattern</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">pattern</font><font color="#0000ff">&gt;</font>/login/*<font color="#0000ff">&lt;/</font><font color="#800000">pattern</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">excludes</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">decorator</font> <font color="#ff0000">name</font><font color="#0000ff">="main"</font> <font color="#ff0000">page</font><font color="#0000ff">="main.jsp"</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">pattern</font><font color="#0000ff">&gt;</font>/*<font color="#0000ff">&lt;/</font><font color="#800000">pattern</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">decorator</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">decorators</font><font color="#0000ff">&gt;</font></div>
</div>
</div>
<div>&nbsp;decorators.xml有两个主要的结点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decorator结点指定了模板的位置和文件名，通过pattern来指定哪些路径引用哪个模板<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excludes结点则指定了哪些路径的请求不使用任何模板</div>
<div>如上面代码，/index.jsp和凡是以/login/开头的请求路径一律不使用模板；</div>
<div>另外还有一点要注意的是：decorators结点的defaultdir属性指定了模板文件存放的目录;</div>
<img src ="http://www.blogjava.net/shiwenfeng/aggbug/300045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-28 13:47 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/28/300045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初识SiteMesh</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/27/299925.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Tue, 27 Oct 2009 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/27/299925.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/299925.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/27/299925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/299925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/299925.html</trackback:ping><description><![CDATA[<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">一、SiteMesh项目简介 （</span></span></span></span></span><a href="http://www.opensymphony.com/sitemesh/"><span style="color: #993300"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">http://www.opensymphony.com/sitemesh/</span></span></span></span></span></span></a><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"> ）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰（layout and decoration）的框架组件，能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大 <br />
量页面构成的项目中创建一致的页面布局和外观，如一致的导航条，一致的banner，一致的版权，等等。 <br />
它不仅仅能处理动态的内容，如jsp，php，asp等产生的内容，它也能处理静态的内容，如htm的内容， <br />
使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板 <br />
的形式嵌入到别的文件中去。所有的这些，都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的，但它能与其他Web应用很好地集成。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 官方：</span></span></span></span></span><a href="http://www.opensymphony.com/sitemesh/"><span style="color: #993300"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">http://www.opensymphony.com/sitemesh/&nbsp;</span></span></span></span></span></span></a><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载地址：</span></span></span></span></span><a href="http://www.opensymphony.com/sitemesh/download.action"><span style="color: #993300"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">http://www.opensymphony.com/sitemesh/download.action </span></span></span></span></span></span></a><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">目前的最新版本是Version 2.3； </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">二、为什么要使用SiteMesh?&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;我们的团队开发J2EE应用的时候，经常会碰到一个比较头疼的问题：由于Web页面是由不同的人所开发，所以开发出来的界面通常是千奇百怪，通常让项目管理人员苦笑不得。而实际上，任何一个项目都会要求界面的统一风格和美观，既然风格统一，那就说明UI层肯定有很多可以抽出来共用的静态或动态部分；如何整合这些通用的静态或动态UI呢？Apache Tiles框架站了出来很好的解决了这一问题，再加上他与struts的完美集成，导致大小项目都把他作为UI层的首选框架，但是：Tiles确实有着它很多的不足之处,下文我会介绍,本文想说的是，除了Apache Tiles框架,其实我们还有更好的解 决方案，那就是:SiteMesh；<br />
&nbsp;&nbsp;&nbsp;&nbsp;本文介绍了一个基于Web页面的布局、装饰以及应用整合的框架Sitemesh，它能帮助你为你的应用创建一致的外观，很好的取代Apache Tiles; </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">三、SiteMesh VS Apache Tiles&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用过struts的朋友应该对Apache Tiles的不会陌生，我曾经有一篇文章介绍过struts中tiles框架的组合与继承，现在怎么看怎么觉得复杂<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从使用角度来看，Tiles似乎是Sitemesh标签&lt;page:applyDecorator&gt;的一个翻版。其实sitemesh最强的一个特性是sitemesh将decorator模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰，所以它就可以用来装璜来自php、asp、CGI等产生的页面了。你可以定义若干个装饰器，根据参数动态地选择装饰器，产生动态的外观以满足你的需求。它也有一套功能强大的属性体系，它能帮助你构建功能强大而灵活的装饰器。相比较而言，在这方面Tiles就逊色许多。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 个人觉得在团队开发里面，Apache Tiles框架会导致所有人不仅仅要了解并且清楚Apache Tiles的存在，并且要特别熟悉每一个Tiles layout模板的作用，否则就可能出现用错模板的情况；除此之外，每个人涉及到的所有WEB页面都需要去配置文件里面逐个配置，不仅麻烦出错的几率还高；而以上所有的不足都是SiteMesh所不存在的。 <br />
<br />
四、SiteMesh的基本原理&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个请求到服务器后，如果该请求需要sitemesh装饰，服务器先解释被请求的资源，然后根据配置文件 <br />
获得用于该请求的装饰器，最后用装饰器装饰被请求资源，将结果一同返回给客户端浏览器。 </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">五、如何使用SiteMesh&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里以struts2+spring2+hibernate3构架的系统为例&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;1、下载SiteMesh&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下载地址：http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、在工程中引入SiteMesh的必要jar包，和struts2-sitemesh-plugin-2.0.8.jar；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、修改你的web.xml,在里面加入sitemesh的过滤器，示例代码如下： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;!-- sitemesh配置 --&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;filter&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.module.sitemesh.filter.PageFilter <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/filter&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意过滤器的位置：应该在struts2的org.apache.struts2.dispatcher.FilterDispatcher过滤器之前org.apache.struts2.dispatcher.ActionContextCleanUp过滤器之后，否则会有问题； </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、在下载的SiteMesh包中找到sitemesh.xml，(\sitemesh-2.3\src\example-webapp\WEB-INF目录下就有)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将其拷贝到/WEB-INF目录下； </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、在sitemesh.xml文件中有一个property结点(如下)，该结点指定了decorators.xml在工程中的位置,让sitemesh.xml能找到他; 按照此路径新建decorators.xml文件，当然这个路径你可以任意改变，只要property结点的value值与其匹配就行；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、在WebRoot目录下新建decorators目录，并在该目录下新建一个模板jsp，根据具体项目风格编辑该模板，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如下示例：我的模板：main.jsp </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;%@ page language="java" pageEncoding="UTF-8"%&gt; <br />
&lt;%@taglib prefix="decorator" <br />
&nbsp;&nbsp;&nbsp;&nbsp; uri="http://www.opensymphony.com/sitemesh/decorator"%&gt; <br />
&lt;%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%&gt; <br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN" <br />
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; <br />
&lt;% <br />
&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Pragma", "no-cache"); <br />
&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Cache-Control", "no-cache"); <br />
&nbsp;&nbsp;&nbsp;&nbsp; response.setDateHeader("Expires", 0); <br />
%&gt; <br />
&lt;html&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;head&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;&lt;decorator:title default="kangxm test" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/title&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 页面Head由引用模板的子页面来替换 --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;decorator:head /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;body id="page-home"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="page-total"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="page-header"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table width="100%" border="0" cellspacing="0" cellpadding="0"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class="topFunc"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的账户 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 退出 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- end header --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp;&nbsp; Menu Tag begin --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="page-menu" style="margin-top: 8px; margin-bottom: 8px;"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里放菜单 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp;&nbsp; Menu Tag end --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="page-content" class="clearfix"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;center&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;decorator:body /&gt;&lt;!-- 这里的内容由引用模板的子页面来替换 --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/center&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- end content --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="page-footer" class="clearfix"&gt; </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里放页面底部 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- end footer --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- end page --&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt; <br />
&lt;/html&gt; </span></span></span></span></span></p>
<p><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">这就是个简单的模板，页面的头和脚都由模板里的静态HTML决定了，主页面区域用的是&lt;decorator:body /&gt;标签；也就是说凡是能进入过滤器的请求生成的页面都会默认加上模板上的头和脚，然后页面自身的内容将自动放到&lt;decorator:body /&gt;标签所在位置； <br />
&lt;decorator:title default="Welcome to test sitemesh!" /&gt;：读取被装饰页面的标题，并给出了默认标题。 <br />
&lt;decorator:head /&gt;：读取被装饰页面的&lt;head&gt;中的内容； <br />
&lt;decorator:body /&gt;：读取被装饰页面的&lt;body&gt;中的内容； </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、说到这里大家就要想了，那如果某个特殊的需求请求路径在过滤器的范围内，但又不想使用模板怎么办？ 你总不能这么不讲道理吧！大家放心吧，SiteMesh早就考虑到这一点了，上面第5步说道的decorators.xml这个时候就起到作用了！ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
下面是我的decorators.xml： <br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br />
&lt;decorators defaultdir="/decorators"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- Any urls that are excluded will never be decorated by Sitemesh --&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;excludes&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern&gt;/index.jsp*&lt;/pattern&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern&gt;/login/*&lt;/pattern&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/excludes&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;decorator name="main" page="main.jsp"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern&gt;/*&lt;/pattern&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/decorator&gt; <br />
&lt;/decorators&gt; </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">decorators.xml有两个主要的结点： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decorator结点指定了模板的位置和文件名，通过pattern来指定哪些路径引用哪个模板 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excludes结点则指定了哪些路径的请求不使用任何模板 <br />
如上面代码，/index.jsp和凡是以/login/开头的请求路径一律不使用模板； <br />
另外还有一点要注意的是：decorators结点的defaultdir属性指定了模板文件存放的目录; </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">六、实战感受&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚刚做完一个用到sitemesh的项目，跟以前用tiles框架相比，最大的感受就是简单，系统设计阶段 <br />
就把模板文件和sitemesh框架搭好了！哪些页面使用框架哪些不使用，全部都通过UI Demo很快就定义出来了； <br />
在接下来的开发中所有成员几乎感受不到sitemesh的存在，各自仅仅关心自己的模块功能实现； </span></span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">七、总结&nbsp;<br />
&nbsp;&nbsp;&nbsp; 使用sitemesh给我们带来的是不仅仅是页面结构问题，它的出现让我们有更多的时间去关注底层业务 <br />
逻辑，而不是整个页面的风格和结构。它让我们摆脱了大量用include方式复用页面尴尬局面，也避免了tiles <br />
框架在团队开发中的复杂度，它还提供了很大的灵活性以及给我们提供了整合异构Web系统页面的一种方案 </span></span></span></span></span></p>
<p><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt; color: #993300">本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/it_man/archive/2009/01/17/3817347.aspx</span></span></span></span></span></p>
<img src ="http://www.blogjava.net/shiwenfeng/aggbug/299925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-27 15:47 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/27/299925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>