sitemesh装饰模式的强大就不用说了,但使用过程中遇到的最郁闷的莫过于排除装饰action的困扰了,例如使用某个ajax请求要求返回不装饰的数据,但sitemesh却死活给你装饰了,以前用了个小技巧绕过了sitemesh的装饰--在返回的头部声明为xml类型:ServletActionContext.getResponse().setContentType("text/xml;charset=utf-8");
看了文档知道sitemesh默认装饰所有text/html的页面的,要装饰其他类型的页面还得自己配置。
但是总觉得这样很麻烦,况且有些页面是对外公开的api页面,只需要显示内容给其他iframe嵌入,这个时候如何排除呢?
在excludes里面排除的却总是不起作用!
经过查阅文档和不断的实践终于发现无法排除的原因了,原来排除的是相对于url目录层次的,而非文件所在的目录!
<!-- 在excludes元素下指定的页面将不会由SiteMesh来装饰 -->
<excludes>
<pattern>/index.jsp</pattern>
<pattern>/scripts/*.*</pattern>
<pattern>/htmleditor/*.*</pattern>
<pattern>/chart/*.*</pattern>//排除chart目录下的所有action请求
<pattern>/flash/*.*</pattern>
<pattern>/other/*.*</pattern>
<pattern>/remote_requst.action*</pattern>//排除根目录下的remote_requst.action包括带参数的请求,如果action后面不带*则只能排除不带参数的请求
</excludes><decorator name="global" page="global.ftl">
<pattern>*.action</pattern>
</decorator>
<decoratorname="editor"page="blog.ftl"webapp="/editor/">
<pattern>/editor/*.action</pattern>
</decorator>
<decoratorname="browser"page="blog.ftl"webapp="/browser/">
<pattern>/browser/*.action</pattern>
</decorator>
<decoratorname="admin"page="admin.ftl"webapp="/admin/">
<pattern>/admin/*.action</pattern>
</decorator>