• sitemesh学习笔记(2)


    之前我也是通过网上一些资料来学习sitemesh的,后来发现那些资料都比较老了,现在最近的已经是sitemesh3了而我之前看的是sitemesh2.3,今天重新去看了一些sitemesh3的资料,发现和2.3还是有点区别的。先不讲怎么使用把,先附上一图给小伙伴们。

    这张图是不是很清晰地表现了sitemesh的工作流程啊,我觉得是很清晰了,结合我昨天讲的一看就懂了。

    简单地再阐述下工作原理:

    SiteMesh是基于Servlet的filter的,即过滤流。它是通过截取reponse,并进行装饰后再交付给客户。

    其中涉及到两个名词: 装饰页面(decorator page)和 “被装饰页面(Content page)" , 即 SiteMesh通过对Content Page的装饰,最终得到页面布局和外观一直的页面,

    并返回给客户

    sitemesh3.0运行环境需要:servlet2.5, JDK1.5 以上。

    下面就开始做一个简单的demo吧,首先先去下个sitemesh-3.0-alpha-2.jar包 给个地址:https://github.com/sitemesh/sitemesh3/downloads

    下个完整版的,然后在sitemesh-3.0-alpha-2sitemesh-3.0-alpha-2dist有这个jar包,看清楚了是dist下面的sitemesh-3.0-alpha-2.jar,不是src下面的那个jar包,名字很象的,刚开始我就弄错了。

    打开myeclipse,新建一个工程sitemesh1,把sitemesh-3.0-alpha-2.jar拖到lib下面,在WEB-INF下面新建一个web.xml,用来配置一个filter,

    <filter>  
    
    <filter-name>sitemesh</filter-name>  
    
    <filter-class>
    
    org.sitemesh.config.ConfigurableSiteMeshFilter
    
    </filter-class> 
    
    </filter>  
    
      
    
    <filter-mapping>  
    
    <filter-name>sitemesh</filter-name>  
    
    <url-pattern>/*</url-pattern>  
    
    </filter-mapping>

    这个配置和2.3相比就是类包名不一样,其他都是差不多的。配好了过滤装置,接下来配置装饰页面:WEB-INF下面建一个sitemesh3.xml

    这里的配置就有讲究了。容我细细道来

    <sitemesh>
     <!-- 根目录下的所有页面让 decorator.html装饰-->
     <mapping path="/*" decorator="/decorator/decorator.jsp" />
    </sitemesh>

    如果我们有一张页面不需要被装饰,那么可以这样定义:

    <mapping path="/javadoc/page.html" exclue="true"/>

    也就是说在javadoc文件夹下面的page.html文件不会被装饰

    如果想要整个文件夹下的页面都不被装饰可以用*代替:

    <mapping path="/javadoc/*" exclue="true"/>

     如果我们想要javadoc文件夹下的文件被多个装饰页面装饰,可以这样配置:

    <mapping>
    
          <path>/javadoc/*</path>
        
          <decorator>/decorators/article.html</decorator>
    
          <decorator>/decorators/two-page-layout.html</decorator>
    
          <decorator>/decorators/common.html</decorator>
    
    </mapping> 

    这里javadoc下的所有页面被三个装饰页面装饰。我的demo做了第一个配置,所以我在WebRoot下面建立了decorator文件夹,在文件夹下面建立了一个decorator.jsp作为装饰页面:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title><sitemesh:write property="title"/></title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
      <h1>开头</h1>
      	<sitemesh:write property="body"/>
      <h1>结尾</h1>
      </body>
    </html>
    

      

    获取了被装饰页面的body放在开头和结尾中间。

    myeclipse下自动帮你建立了一个index.jsp. 里面body内容默认是This is my JSP page,我们稍微修改一下:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>Hello,sitemesh3</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
      	好久不见
      </body>
    </html>
    

      

    所以我们的小demo就做好了,打开浏览器

     

    轻轻松松合并title和body,神器啊

  • 相关阅读:
    [Go] 解决空接口 interface{} cannot use (type []string) as type []interface {}
    [Linux] 脚本中的set -e有什么作用
    [Go] 解决go test 时 testing: warning: no tests to run
    [Go] go for range循环map是无序的 变成有序
    [Linux] ubuntu 32位 i686 安装docker
    [Git] git checkout 恢复未add的修改文件
    [MySQL] in 子查询出现DEPENDENT SUBQUERY问题
    [MySQL] group by 聚合函数的原理和聚合限制原因SELECT list is not in GROUP BY clause and contains nonaggregated column
    [MySQL]mysql的ANY_VALUE()函数 解决 ONLY_FULL_GROUP_BY 模式
    [Go] GODEBUG=inittrace=1 查看所有执行的init函数
  • 原文地址:https://www.cnblogs.com/think-in-java/p/3875177.html
Copyright © 2020-2023  润新知