原文地址:https://blog.csdn.net/jzh440/article/details/7770013

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中配置如下信息:

<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>/*</url-pattern>
  </filter-mapping>
    在WEB-INF目录下新建一个decorators.xml文件(/decorator是你的包装jsp根路径在这里main.jsp和panel.jsp都是包装jsp,a.jsp,b,jsp是被包装jsp)

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

<?xml version="1.0" encoding="utf-8" ?>
 <decorators defaultdir="/decorator">
    <decorator name="main" page="main.jsp">
      <pattern>/page/a.jsp</pattern>
      <pattern>/page/b.jsp</pattern>
 </decorator>
 <decorator name="panel" page="panel.jsp"></decorator>
 </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上。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>
        <decorator:title default="默认包装器。。。"/>
    </title>
    <decorator:head/>
  </head>
  <body>
  <hr width="100" color="red"/>
      <decorator:body/>
  <hr width="100" color="blue"/>
  </body>
</html>

main.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title><decorator:title default="装饰器页面..." /></title>
    <decorator:head />
  </head>
  <body bgcolor="gray"<decorator:getProperty property="body.onload" writeEntireProperty="true" />>
 
  <page:applyDecorator page="/common/top.jsp" name="panel"/>
  <div align="center">
    <p><font color="red">this is style's header</font></p>
    <decorator:body/>
    <p><font color="red">this is style's footer</font></p>
    </div>
   <page:applyDecorator page="/common/bottom.jsp" name="panel"/>
  </body>
</html>
a.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'a.jsp' starting page</title>
   </head>
  <body onload="document.someform.a.focus();">
<form name="someform">
 <font color="red">this is my JSP page. </font><br>
 <input type="text" id="a"/>
</form>
 </body>
</html>
文件都写好之后我们就访问了

[转]decorator(HTML装饰器)的更多相关文章

  1. python3 第二十二章 - 函数式编程之Decorator(装饰器)

    前面我们说了,在python中,一切皆对象.函数也是一个对象,而且函数对象可以被赋值给变量,通过变量也能调用该函数.如: def sayHello(name): print(name + ' hell ...

  2. Decorator模式 装饰器模式

    Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加 ...

  3. 简单理解 ES7 Decorator(装饰器)

    如何使用ES7 Decorator给你的游戏人物开挂? // 预告: 本文有点小难度,对js不太熟的人可能比较懵逼 // 本文的目的是让你们知其然 // ======================= ...

  4. Decorator - 利用装饰器武装前端代码

    历史 以前做后端时,接触过一点Spring,也是第一次了解DI.IOC等概念,面向切面编程,对于面向对象编程还不怎么熟练的情况下,整个人慌的一批,它的日志记录.数据库配置等都非常方便,不回侵入到业务代 ...

  5. python 装饰器(decorator)

    装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...

  6. Python装饰器(decorator)

    了解装饰器,要先了解闭包. 1,闭包(closure) 闭包是Python所支持的一种特性,它让在非global scope定义的函数可以引用其外围空间中的变量,这些外围空间中被引用的变量叫做这个函数 ...

  7. ES6装饰器Decorator基本用法

    1. 基本形式 @decorator class A {} // 等同于 class A {} A = decorator(A); 装饰器在javascript中仅仅可以修饰类和属性,不能修饰函数.装 ...

  8. python 语法之 装饰器decorator

    装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...

  9. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  10. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

随机推荐

  1. 366. Fibonacci

    描述 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2 ...

  2. X-factor Chains [POJ3421] [素数]

    Description    给定一个正整数X, 一个长度为m的X-因子链是由m+1个整数组成的.其中    1 = X0, X1, X2, …, Xm = X 满足Xi < Xi+1 且 Xi ...

  3. 编程菜鸟的日记-初学尝试编程-编写函数实现strcmp功能

    #include <iostream>using namespace std;int mystrcmp(const char *str1,const char *str2){ assert ...

  4. jQuery如何追加tr到table中任意位置--向Table中指定位置添加tr或td(jQuery)

    jQuery 添加新内容有以下四个方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() ...

  5. Pycharm安装pygame游戏库遇到的问题

    正常情况下: 点file-settings-project-project interprter 点右上角的+号,搜索pygame 点击下方 install Package即可 成功 第二种,如果提示 ...

  6. python部分面试- 测试维度

    2. 软件测试的维度 1. 正确性:功能 正确 2. 健壮性: 意外的输入,不会崩溃 3. 性能: 大压力, 依然能工作 4. 可靠性: 长时间,不会崩溃 5. 易用性: 目标客户,都易用 6. 安全 ...

  7. python之函数深入探测

    第一:命名空间与作用域 命名空间: 局部命名空间: def foo(): x=1 def func(): pass 全局命名空间: import time class ClassName:pass d ...

  8. IO流(2)—知识结构

    结构: 注:此IO包下主要介绍: 节点流:(字节流)FileInputStream.FileOutputStream.(字符流)Filereader.FileWriter 处理流(缓冲流):(字节流) ...

  9. django之ajax补充

    之前的ajax使用都是依据jquery来使用的,本篇会先分析ajax的原生的js代码实现,还有jsonp的介绍和最终使用. 本篇导航: js实现的ajax 同源策略与Jsonp 一.js实现的ajax ...

  10. Kubernetes Ingress 学习

    Kubernetes 中暴露服务的方式有三种 Loadbalancer 这种方式往往需要云供应商支持,或者本地F5等设备支持 NodePort 这种方式调用方通过NodeIP:NodePort 的方式 ...