`

decorator(HTML装饰器)

阅读更多

1>:每当遇到一个新的技术,首先我会问自己,这个技术是做神马的?用这个技术有神马好处?相比其它方式他的优势在哪里?我该怎样实现这个技术?

      首先这个Decorator解释一下这个单词:“装饰器”,我觉得其实可以这样理解,他就像我们用到的Frame,他把每个页面都有的东东提炼了出来,也可能我们也会用各种各样的include标签,将我们的常用页面给包括进来:比如说页面的top,bottom这些每个页面几乎都有,而且都一样,如果我们在每个页面都include,可以发现我们的程序是多吗的冗余,重复。相比之下装饰器给我们提供了一个较好的选择,他在你要显示的页面根本看不出任何include信息,可以说完全解耦。

2>:decorator的原理:

     sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content,banner、bottom结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer.

3>:decorator的实现

     首先我们http://www.opensymphony.com/sitemesh/下载我们需要的jar包:sitemesh-2.4.jar

    在我们的web.xml中配置如下信息:

[html] view plain copy
 
 print?
  1. <filter>   
  2.   <filter-name>sitemesh</filter-name>   
  3.      <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>   
  4.   </filter>   
  5.   <filter-mapping>   
  6.      <filter-name>sitemesh</filter-name>   
  7.      <url-pattern>/*</url-pattern>   
  8.   </filter-mapping>  

    在WEB-INF目录下新建一个decorators.xml文件(/decorator是你的包装jsp根路径在这里main.jsp和panel.jsp都是包装jsp,a.jsp,b,jsp是被包装jsp)

  • defaultdir: 包含装饰器页面的目录
  • page : 页面文件名
  • name : 别名
  • role : 角色,用于安全
  • webapp : 可以另外指定此文件存放目录
  • Patterns : 匹配的路径,可以用*,那些被访问的页面需要被装饰。

     

    [html] view plain copy
     
     print?
    1. <?xml version="1.0" encoding="utf-8" ?>   
    2.  <decorators defaultdir="/decorator">  
    3.     <decorator name="main" page="main.jsp">  
    4.       <pattern>/page/a.jsp</pattern>   
    5.       <pattern>/page/b.jsp</pattern>  
    6.  </decorator>  
    7.  <decorator name="panel" page="panel.jsp"></decorator>  
    8.  </decorators>  

     建立我们的包装jsp在WEBROOT->decorator下面:这里有两个分别是main.jsp和panel.jsp

    panel.jsp

    <decorator:head />

    插入原始页面(被包装页面)的head标签中的内容(不包括head标签本身)。

    <decorator:body />

    插入原始页面(被包装页面)的body标签中的内容。

    <decorator:title [ default="..." ] />

    插入原始页面(被包装页面)的title标签中的内容,还可以添加一个缺省值。

    下面介绍一下<page:applyDecorator name="  " page=" ">

    其实这里是一样的name指的是我们要用的包装器名字也就是在decorator.xml中定义好的,page指的是被包装页面。

    还有就是<decorator:getProperty property="" [default=""][writeEntireProperty=""]/>

    插入原始页面的property属性指定的值同名的属性。

    property:指定那个属性将要被插入

    default:如果没有发现指定的属性,则插入此值

    writeEntireProperty:表示是否将(空格 属性名=“属性值”)整个插入,允许时的值是true或yes或1

    例如下面例子中的:当你访问a.jsp时,焦点会定在text上。

    [html] view plain copy
     
     print?
    1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>  
    7.         <decorator:title default="默认包装器。。。"/>  
    8.     </title>  
    9.     <decorator:head/>  
    10.   </head>  
    11.   <body>  
    12.   <hr width="100" color="red"/>  
    13.     <decorator:body/>  
    14.   <hr width="100" color="blue"/>  
    15.   </body>  
    16. </html>  

     

    main.jsp

    [html] view plain copy
     
     print?
    1.    
    2. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    3. <%@ taglib uri="<a href="http://www.opensymphony.com/sitemesh/page">http://www.opensymphony.com/sitemesh/page</a>prefix="page"%>  
    4. <%@ taglib uri="<a href="http://www.opensymphony.com/sitemesh/decorator">http://www.opensymphony.com/sitemesh/decorator</a>prefix="decorator" %>  
    5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    6. <html>  
    7. <head>   
    8.     <title><decorator:title default="装饰器页面..." /></title>   
    9.     <decorator:head />   
    10.   </head>   
    11.   <body bgcolor="gray"<decorator:getProperty property="body.onload" writeEntireProperty="true" />>  
    12.    
    13.   <page:applyDecorator page="/common/top.jsp" name="panel"/>  
    14.   <div align="center">  
    15.     <p><font color="red">this is style's header</font></p>   
    16.     <decorator:body/>  
    17.     <p><font color="red">this is style's footer</font></p>   
    18.     </div>  
    19.    <page:applyDecorator page="/common/bottom.jsp" name="panel"/>  
    20.   </body>   
    21. </html>  
    [html] view plain copy
     
     print?
    1. a.jsp  


     

    [html] view plain copy
     
     print?
    1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
    2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    3. <html>  
    4.   <head>  
    5.     <title>My JSP 'a.jsp' starting page</title>  
    6.    </head>  
    7.   <body onload="document.someform.a.focus();">  
    8. <form name="someform">  
    9.  <font color="red">this is my JSP page. </font><br>  
    10.  <input type="text" id="a"/>  
    11. </form>  
    12.  </body>  
    13. </html>  

    文件都写好之后我们就访问了:效果如下:

    如果感觉不够详尽请看这里:http://hi.baidu.com/%C9%AE_%CC%C6/blog/item/b5731091b4591493a977a488.html

分享到:
评论

相关推荐

    storybook-decorator-react-to-html:用于HTML装饰器的Storybook,用于将React组件转换为静态HTML字符串

    安装 npm install @degjs/storybook-decorator-react-to-html用法作为.storybook/preview.js的全局装饰器(推荐): import { addDecorator } from '@storybook/html' ;import reactToHtml from '@degjs/storybook-...

    storybook-decorator-script-runner:用于HTML装饰器的Storybook,用于在故事上运行JavaScript

    装饰器的一旦呈现故事,便执行JavaScript模块。 当JavaScript功能依赖于故事中可用的完全渲染的DOM时,这很有用。 安装 npm install @degjs/storybook-decorator-script-runner 用法 作为.storybook/preview.js的...

    10-基于装饰器的日志写入器(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    es7-decorator-types:使用ES7 Decorators进行运行时类型检查的实验

    ES7装饰器+类型提示 这是我正在使用ES7的Decorator功能在javascript中实现基本参数键入的实验。 要尝试,请按照以下说明进行操作: 克隆此存储库 运行npm install gulp watch 在Chrome中打开index.html并检查...

    03-查询语句建造器(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    05-容易被忽略的迭代器(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    11-回顾和总结(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    04-通过策略选择驱动(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    06-让观察者监听事件(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    01-制造工具的工厂模式(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    02-控制反转和服务容器(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    08-责任链和管道的协作(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    09-通过容器实现的外观模式(2).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    00-初探 Laravel 和其中的设计模式(3).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    12-附录 1 设计模式的七大原则(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    07-使用代理快速接入第三方库(1).html

    装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...

    draft-demo:draft.js开发的编辑器demos,包含自定义样式、自定义组件、entity、decorator等功能的示例

    我可以使用装饰器吗? 与API后端集成 节点 Ruby on Rails 在开发中代理API请求 配置代理后出现“无效的主机头”错误 手动配置代理 配置WebSocket代理 在开发中使用HTTPS 在服务器上生成动态&lt;meta&gt;标记 预...

    reactive-html:实验React式框架

    它使用一个中央事件总线和一个装饰器,为任何对象添加可链接的方法。 要安装使用 bower: bower install reactive-event-bus reactor bower install reactive-event-bus并需要 dist/main.min.js。 这是一个演示基本...

    C#23种设计模式

    8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式...

    Decorator:为整个校园的Web开发人员提供一种简便的方法来构建具有UC San Diego品牌并包含视觉识别标准的页面

    装饰器v4 为整个校园的Web开发人员提供一种简便的方法来构建具有UC San Diego品牌并包含视觉识别标准的页面。

Global site tag (gtag.js) - Google Analytics