ssh整合SiteMesh

 Sitemesh是一个页面装饰框架,可以让整个网站的所有网页都组织为一种统一的风格。一般网页都是由header、content、footer组成,再加上菜单条或者导航条。使用sitemesh,你可以将每个页面都相同的元素都制作为模板,然后每个具体页面只编写最基本的代码,然后通过sitemesh来将其它内容“装饰”到页面上,生成最终的页面展现给用户。这样做的好处就是,页面的编写者甚至都不知道整个网站使用的哪个模板,只需要关注自己页面的实现即可,最后都是统一的风格;而如何要给网站换一个模板,那也是简单之极的事情。
    类似sitemesh的库还有apache tiles。tiles将重复内容都分割成一个个的小片断,这些小片断就可以重复使用,在页面中直接引入这些片断就可以了。不过比较了一下,tiles没有像sitemesh这样统一的管理,需要由页面编写时就要说明使用哪些内容。如果网站有可能整体性的修改风格,个人感觉sitemesh要傻瓜一些。
    sitemesh主页是:http://www.opensymphony.com/sitemesh/,不过很奇怪这个网站上的内容都无法下载。在网上找了一下,在GitHub(https://github.com/sitemesh)上可以下载到源码,包括最新的3.0。如果只需要jar文件,可以通过maven来下载。目前我在SSH整合框架使用的是2.4.2,整合的步骤如下。

将sitemesh-2.4.2.jar文件复制到lib目录下,然后对工程进行配置:

1. 编辑web.xml,主要是以下内容:
    <filter>
        <filter-name>struts-prepare</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
    </filter>

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>

    <filter>
        <filter-name>struts-execute</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts-prepare</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>struts-execute</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener</listener-class>
    </listener>

    这三个filter插入的顺序都无所谓,但是filter-mapping的顺序必须是struts-prepare、sitemesh、struts-execute的顺序,否则有问题。

2. 如果需要支持freemarker和velocity,则必须在web.xml中配置以下内容   
    <servlet>
        <servlet-name>sitemesh-freemarker</servlet-name>
        <servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class>
        <init-param>
            <param-name>default_encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>sitemesh-freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>JspSupportServlet</servlet-name>
        <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

3. 在WEB-INF目录下建立sitemesh.xml文件,内容如下:
<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
    <excludes file="${decorators-file}"/> 
    <page-parsers>
        <parser default="true" 
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
        <parser content-type="text/html" 
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
        <parser content-type="text/html;charset=utf-8"
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
    </page-parsers>

    <decorator-mappers>
        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}"/> 
        </mapper>
    </decorator-mappers>
</sitemesh>

4. 在WEB-INF目录下建立decorators.xml文件,内容如下:
<decorators defaultdir="/decorators">
    <excludes>
        <pattern>**ajax=true</pattern>
        <pattern>/dojo/*</pattern>
        <pattern>/struts/*</pattern>
    </excludes>
    <decorator name="default" page="default.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators>

这个配置指明了使用default.jsp来作为装饰的模板

5. 在WEB的根目录下建立decorators目录,在此目录下建立default.jsp文件。这个就是具体的模板文件,类似如下的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title><decorator:title default="这里是标题" /></title>
    <decorator:head />
  </head>
  <body>
    <div class="container">
      <div class="header"></div>
      <div class="content">
         <decorator:body />
      </div>
      <div class="footer"></div>
    </div>
  </body>
</html>

这里使用到的几个标签:<decorator:title /><decorator:head /><decorator:body />,分别会使用被装饰页面的title、head、body的内容替换掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值