sitemesh的使用

来源:互联网 发布:jquery js下载文件 编辑:程序博客网 时间:2024/04/29 06:29

sitemesh的使用:
 Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。

1,要想使用sitemesh必须在web应用中导入sitemesh.jar文件
2,在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>*.action</url-pattern>
 </filter-mapping>
 
 
SiteMesh 并没有限制你只能修饰JSP页面。你可以自由的选择想要修饰的对象,比如Velocity或者Freemarker。Velocity和 Freemarker是一种可被用于生成web页面的模板语言。这些语言比JSP更加的简单易用,但在可编程性方面不如JSP灵活。
SiteMesh通过两个servlet支持这两种模板语言,这两个servlet也被定义在SiteMesh.jar文件里。我们可以像这样在web.xml里声明这两个servlet

<servlet>
 <servlet-name>sitemesh-velocity</servlet-name>
 <servlet-class>
  com.opensymphony.module.sitemesh.velocity.VelocityDecoratorServlet
 </servlet-class>
</servlet>
<!--Declare servlet for handling freemarker requests -->
<servlet>
 <servlet-name>sitemesh-freemarker</servlet-name>
 <servlet-class>
 com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet
 </servlet-class>
 <init-param>
  <param-name>TemplatePath</param-name>
  <param-value>/</param-value>
 </init-param>
 <init-param>
  <param-name>default_encoding</param-name>
  <param-value>GBK</param-value>
 </init-param>
</servlet>
<!-- Velocity servlet should serve all requests with .vm extension-->
<servlet-mapping>
 <servlet-name>sitemesh-velocity</servlet-name>
 <url-pattern>*.vm</url-pattern>
</servlet-mapping>
<!-- FreeMarker servlet should serve all requests with .dec extension-->
<servlet-mapping>
 <servlet-name>sitemesh-freemarker</servlet-name>
 <url-pattern>*.dec</url-pattern>
</servlet-mapping>


当 然,我们还需要在lib文件夹里引入freemarker.jar、velocity-dep.jar和velocity-tools- view.jar。这些jar文件已经包含在SiteMesh的发布包里了。

事例文件:

login.dec
----------------------------------------
<#include "/decorators/includes/header.ftl">
    ${body}
<#include "/decorators/includes/footer.ftl">
-----------------------------------------

main.dec
----------------------------------------------
<#include "/decorators/includes/header.ftl">
<#include "/decorators/includes/banner.ftl">
<script>
function checkMenu() {
 if($("leftcol").style.display=="none") {
  $("leftcol").show();
 }else{
  $("leftcol").hide();
 }
}

</script>
<table border="0" cellspacing="0" cellpadding="4" width="100%" >
<tr valign="top">
 <td width="18%">
  <div>
   <#include "/decorators/includes/menu.ftl">
  </div>
 </td>
 <td width="2">
  <a href="javascript:checkMenu();"><img src="${base}/images/bg_03.gif" style="cursor: hand"></a>
 </td>
 <td><body>
  <iframe width="100%" height="100%" src="${base}/opera/operaLine.action" frameBorder="0" scrolling=auto ></iframe>
  </body>
 </td>
</tr>
</table>
<#include "/decorators/includes/footer.ftl">
----------------------------------------------

opera.dec
------------------------------------------
<#include "/decorators/includes/header.ftl">
    ${body}
</body>
</html>
-------------------------------------------


在WEB-INFO目录下加入decorators.xml
<decorators defaultdir="/decorators">
 <decorator name="main" page="main.dec">
        <pattern>*</pattern>
    </decorator>
    <decorator name="login" page="login.dec">
     <pattern>/login/*</pattern>
     <pattern>/regist/*</pattern>
    </decorator>
    <decorator name="opera" page="opera.dec">
     <pattern>/opera/*</pattern>
    </decorator>
</decorators>

main.dec会拦截所有页面,除了login.dec所修饰的/login/*、/regist/*和opera.dec所修饰的/opera/*的目录下的页面。

SiteMesh 有一个概念,叫做修饰器映射,实现这个概念的接口是DecoratorMapper(有init()和getDecorator()方法)。映射器在 sitemesh.xml里声明。在sitemesh.xml文件里,每一个映射器都是它上一个映射器的父映射。当SiteMesh需要一个修饰器来修饰 页面的时候,会在sitemesh.xml里查找映射器,生成找到的第一个映射器的实例并调用getDecorator()方法,在这个方法里尝试查找针 对那个页面的修饰器。如果找到了就返回;否则,调用父映射器的getDecorator()方法,反复进行这个过程,直到找到正确的修饰器。
在WEB-INFO下面创建sitemesh.xml文件
<sitemesh>

 <page-parsers>
  <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
 </page-parsers>

    <decorator-mappers>
        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="/WEB-INF/decorators.xml" />
        </mapper>
    </decorator-mappers>
   
</sitemesh>

如此配置完成后,sitemesh就可以修饰页面了。

原创粉丝点击