在上篇笔记学习了sitemesh的基本用法,这里还有另一种用法


在sitemesh.jar有一个默认的sitemesh-default文件 ,这个文件是可以指定的
可以指定的文件名的sitemesh.xml文件,放在/WEB-INF目录下。如果没用,则默认读取sitemesh.jar文件中的sitemesh-default.xml文件。这个文件在jar:com.opensymphony.module.sitemesh.factory包中。
在这个文件中可以指定使用那些mapper对象来装饰页面,也可以扩展自己的Mapper类。 sitemesh自带的mapper类放在com.opensymphony.module.sitemesh.mapper包中,可以供大家选择使用。

sitemesh-default.xml的内容

  1. <sitemesh>
  2. <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
  3. <excludes file="${decorators-file}"/>
  4. <page-parsers>
  5. <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
  6. </page-parsers>
  7. <decorator-mappers>
  8. <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
  9. <param name="property.1" value="meta.decorator" />
  10. <param name="property.2" value="decorator" />
  11. </mapper>
  12. <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper"/>
  13. <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
  14. <param name="decorator" value="printable" />
  15. <param name="parameter.name" value="printable" />
  16. <param name="parameter.value" value="true" />
  17. </mapper>
  18. <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper"/>
  19. <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
  20. <param name="config" value="${decorators-file}" />
  21. </mapper>
  22. </decorator-mappers>
  23. </sitemesh>

这里是今天学习备注的重点 ,com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper 这个类的使用。
 
在sitemesh-default.xml中,可以看到已经声明了这个类,并且可以通过查阅API来获得其使用方法。
在这个文件中可以看到配置了这个类的两个属性

  1. <param name="property.1" value="meta.decorator" />
  2. <param name="property.2" value="decorator" />

通过查阅API可以找到,只要html文件中包含

  1. <meta name="decorator" content="decoratorname">
  2. <meta name="meta.decorator" content="decoratorname">

 就可以应用相应的装饰器,而不必在decorator.xml中使用<pattern>来规定哪些页面使用哪些装饰器。

decorators.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <decorators defaultdir="/WEB-INF/views">
  3. <!-- 默认装饰页面, 在需要装饰的页面增加<meta name="decorator" content="default"/> -->
  4. <decorator name="blank" page="layouts/blank.jsp" />
  5. <decorator name="default" page="layouts/default.jsp" />
  6. <!-- CMS基础主题装饰页面 -->
  7. <decorator name="cms_default_basic" page="modules/cms/front/themes/basic/layouts/default.jsp" />
  8. <decorator name="cms_default_weixin" page="modules/cms/front/themes/weixin/layouts/default.jsp" />
  9. </decorators>


装饰页面为blank

某一个需要被装饰的页面不用<pattern>来拦截

xxx.jsp 被装饰的页面
  1. <%@ page contentType="text/html;charset=UTF-8" %>
  2. <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
  3. <html>
  4. <head>
  5. <title>${fns:getConfig('productName')}</title>
  6. <meta name="decorator" content="blank"/><c:set var="tabmode" value="${empty cookie.tabmode.value ? '0' : cookie.tabmode.value}"/>
  7. <c:if test="${tabmode eq '1'}"><link rel="Stylesheet" href="${ctxStatic}/jerichotab/css/jquery.jerichotab.css" />
  8. <script type="text/javascript" src="${ctxStatic}/jerichotab/js/jquery.jerichotab.js"></script></c:if>
  9. <style type="text/css">
  10. #main {padding:0;margin:0;} #main .container-fluid{padding:0 4px 0 6px;}
  11. #header {margin:0 0 8px;position:static;} #header li {font-size:14px;_font-size:12px;}
  12. #header .brand {font-family:Helvetica, Georgia, Arial, sans-serif, 黑体;font-size:26px;padding-left:33px;}
  13. #footer {margin:8px 0 0 0;padding:3px 0 0 0;font-size:11px;text-align:center;border-top:2px solid #0663A2;}
  14. #footer, #footer a {color:#999;} #left{overflow-x:hidden;overflow-y:auto;} #left .collapse{position:static;}
  15. #userControl>li>a{/*color:#fff;*/text-shadow:none;} #userControl>li>a:hover, #user #userControl>li.open>a{background:transparent;}
  16. </style>


看到只要头部引用了 <meta name="decorator" content="blank"/> 这个meta,就会自动去decorators.xml 找 decorator name为meta指定的进行装饰操作 ,这个方法跟用<pattern>用起来都很方便,只是使用meta控制的粒度更细


一点联想:
 
   在com.opensymphony.module.sitemesh.mapper包中我看到了一个叫CookieDecoratorMapper的类,话说可以在用户的cookie中指定装饰器的名字。
 
这样我们可以通过扩展来实现基于用于的个人喜好设定,用户可以自己选择需要应用的装饰器(有点类似QQ空间选择个性主页模板),把装饰器的的名称存放起来,当浏览页面的时候自动去读取这个值以实现主页风格的动态切换。只是有个这个想法,没有实践




sitemesh 学习之 meta 引入的更多相关文章

  1. sitemesh学习笔记(2)

    之前我也是通过网上一些资料来学习sitemesh的,后来发现那些资料都比较老了,现在最近的已经是sitemesh3了而我之前看的是sitemesh2.3,今天重新去看了一些sitemesh3的资料,发 ...

  2. sitemesh学习笔记(1)

    最近在学习web开发的时候,发现很多的页面都存在同样的导航栏,登陆栏,js,jQuery等等相同的元素.这样就感觉开发变得好臃肿啊,并且,有时候改一个元素,就要把所有包含这个元素的页面全部重新码一遍, ...

  3. sitemesh学习笔记(3)

    前两篇博客浅谈了一下sitemesh3.0和2.4的区别和简单用法,今天我做了一个结合sturts2的sitemesh构架,由于strusts2只能用sitemesh2.x的版本,与3.0目前还不能兼 ...

  4. SiteMesh学习入门

    http://www.java3z.com/cwbwebhome/article/article2/2962.html?id=1668 demo下载 简介:     sitemesh应用Decorat ...

  5. SiteMesh学习笔记

    SiteMesh是一个轻量级的web应用框架,实现了Decorator模式.它的目标是将多个页面都将引用的jsp页面通过配置加载到相应的jsp文件中. 在我们的项目中,每个jsp都需要添加两个top和 ...

  6. html学习笔记 - meta link

    <!DOCTYPE html> <html lang="en"> <head> <!-- 编码格式 --> <meta cha ...

  7. Django基础学习五_引入静态文件

    今天继续学习Django,今天主要掌握两个小点 一.如果为Django项目中引入静态文件 1.先要在project目录下创建static的目录,然后将jquery文件拷贝这个目录下就可以了 2.在pr ...

  8. 【元学习】Meta Learning 介绍

    目录 元学习(Meta-learning) 元学习被用在了哪些地方? Few-Shot Learning(小样本学习) 最近的元学习方法如何工作 Model-Agnostic Meta-Learnin ...

  9. webpack学习笔记——项目引入zepto及tap事件失效的解决

    先要npm下来zepto:npm install zepto 然后npm下来exports-loader和script-loader 配置如下: JavaScript // webpack.confi ...

随机推荐

  1. julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题

    这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度.Ruby 的灵活.Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程 ...

  2. 关于Django迁移出现问题

    关于Django迁移出现问题 源码: #coding:utf- from django.db import models # Create your models here. class BookIn ...

  3. scrapy 抓取数据被禁止的解决方法

    在用抓取头条新闻的数据时出现以下问题:禁止抓取,结果数据没有出来 后来经过查询得知需要把settings.py里面 修改为ROBOTSTXT_OBEY = False就可以了, 默认True

  4. [Python爬虫] 之十五:Selenium +phantomjs根据微信公众号抓取微信文章

    借助搜索微信搜索引擎进行抓取 抓取过程 1.首先在搜狗的微信搜索页面测试一下,这样能够让我们的思路更加清晰 在搜索引擎上使用微信公众号英文名进行“搜公众号”操作(因为公众号英文名是公众号唯一的,而中文 ...

  5. QSignalMapper类的使用

    Qt中当定义了非常多的button,而他们的信号都同样时(比方都是点击信号),没有必要给他们每一个都设置信号和槽的链接.QSignalMapper给我们攻克了这个难题. 今天完毕这个相似的功能时,不知 ...

  6. 云计算之路-试用Azure:Azure内置的负载均衡是四层的

    当初迁移至阿里云遇到的第一个问题是在程序中通过Request.UserHostAddress得到的是负载均衡(SLB)的内网IP,而不是用户的真实IP.真实IP存储在服务器变量HTTP_X_Forwa ...

  7. RTP 时间戳的处理

    RTP 时间戳的处理   在RTP传输音频数据时,一般选定逻辑时间戳速率与采样速率相同, 但是在传输视频数据时,必须使时间戳速率大于每帧的一个滴答(这样才能使图像回放更为平滑--<用TCP/IP ...

  8. 易语言调用csharp写的COM组件的程序在Win2008上奔溃的解决办法

    易语言调用csharp写的COM组件,除了要注册csharp写的dll之外(由于是.net代码,需要用.net自带的注册工具RegAsm.exe注册,具体注册方法为: C:\WINDOWS\Micro ...

  9. Angular 监听路由变化事件

    摘要: $stateChangeStart- 当模板开始解析之前触发 $rootScope.$on('$stateChangeStart', function(event, toState, toPa ...

  10. vue vuex 大型项目demo示例

    1.vuex 动态模块配置 import Vue from 'vue' import Vuex from 'vuex' import store from '@/store'; // 使用Vuex插件 ...