最近在学习web开发的时候,发现很多的页面都存在同样的导航栏,登陆栏,js,jQuery等等相同的元素。这样就感觉开发变得好臃肿啊,并且,有时候改一个元素,就要把所有包含这个元素的页面全部重新码一遍,亲们,是不是觉得很麻烦啊,我也觉得很麻烦。所以快来使用sitemesh框架吧,哈哈。

下面我做了一个demo,来基本介绍一下怎么使用这个框架。

首先我用myeclipse建一个java web工程,起名叫sitemesh,然后将sitemesh-2.x.jar copy到lib下面,这样就有了一个官方提供的包了,然后我们当然是去配置一些东西了。在WEB-IFN下面新建一个decorators.xml:

<?xml version="1.0" encoding="utf-8"?>
<!-- 定一个一个默认的装饰包-->
<decorators defaultdir="/decorators"> <!-- 此处用来定义不需要过滤的页面 --> <excludes> </excludes> <!-- 用来定义装饰器要过滤的页面 列出装饰页面--> <decorator name="main" page="main.jsp"> <pattern>/*</pattern> </decorator> <!-- 指明装饰页面的根目录,和用来装饰的文件名--> </decorators>

在WEBRoot下面在建立一个文件夹decorators作为一个装饰包,然后在这个文件夹下面建立一个main.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title><decorator:title default="默认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">
-->
<decorator:head/>
</head> <body>
<h2>SiteMesh装饰header</h2> <hr /> <!-- 从被装饰页面获取body标签内容 --> <decorator:body /> <hr /> <h2>SiteMesh装饰footer</h2>
</body>
</html>

一些sitemesh的标签获得被装饰页面的元素,这里也许有些亲们要问这样一个问题了,装饰页面不是应该被送到被装饰页面然后组合吗?为什么装饰页面反而得到被装饰页面的内容呢?有这样的问题的朋友,等我讲完估计就明白了。

接下配置web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>sitemesh</display-name>
<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> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

主要就是添加中间的filter过滤器,这里叫装饰器吧,定义了一个装饰器的类包,就是官方提供了jar包啦,有了jar包,有了装饰器,当然还需要一个被装饰页面拉,

<url-pattern>/*</url-pattern> 就指定了被装饰页面的路径。其实也就是app根目录了。

光指明路径还不够啊,怎么也得定一个jsp,所以在WEBRoot下面建立一个index.jsp. myeclipse已经自动帮你建了。

然后添加如下内容:

<%@ 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>被装饰(目标)页面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>
<h4>被装饰(目标)页面body标签内内容。</h4> <h3>使用SiteMesh的好处?</h3> <ul> <li>被装饰(目标)页面和装饰页面完全分离。</li> <li>做到真正的页面复用,一个装饰页面装饰多个被装饰(目标)页面。</li> <li>更容易实现统一的网站风格。</li> <li>还有。。。</li> </ul>
</body>
</html>

然后开启你的服务器,打开你的浏览器键入:localhost:8080/sitemesh/index.jsp。看到结果了吗?结果就是两个页面合体了。

回到刚刚那个问题,为什么装饰页面要得到被装饰页面的内容?

容我讲述一遍,框架运行的步骤,当你键入上述地址的时候,服务器得到一个请求,要求访问index.jsp页面,服务器收到通知以后先去读web.xml,发现有index.jsp页面需要装饰,装饰器叫sitemesh,然后在去读decorators.xml得到装饰页面的文件路径,然后呢执行这个装饰页面,通过这个sitemesh提供的标签,得到被装饰页面的元素,这个时候的装饰页面就成了一个结合体,然后把这个结合体发送给你,浏览器得到这个结合体的代码。当然拉,这个装饰页面肯定是多线程的啊,不然不是只能用一次了。它是可以被同时反复地使用的。

  

sitemesh学习笔记(1)的更多相关文章

  1. sitemesh学习笔记(2)

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

  2. sitemesh学习笔记(3)

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

  3. SiteMesh学习笔记

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

  4. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. ES5 数组方法map

    概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 语法 array.map(callback[, thisArg]) 参数 callback 原数组中的元素经 ...

  2. phpmyadmin导入sql数据的纠结

    今天准备往phpstudy的mysql导入数据,超过2M,提示" 没有接收到要导入的数据.可能是文件名没有提交,也可能是文件大小超出 PHP 限制.参见 FAQ 1.16. " 折 ...

  3. 了解 JavaScript (5)– 翻转器(rollover)

    用 JavaScript 最常用的效果就是,当用户将鼠标移动到图片上时,会改变网页上的图像,这样页面就能对用户的操作及时作出反应,这种称为 翻转器(rollover)效果很容易实现,而且有很多应用场合 ...

  4. Apache Storm 与 Spark:对实时处理数据,如何选择【翻译】

    原文地址 实时商务智能这一构想早已算不得什么新生事物(早在2006年维基百科中就出现了关于这一概念的页面).然而尽管人们多年来一直在对此类方案进行探讨,我却发现很多企业实际上尚未就此规划出明确发展思路 ...

  5. Xcode7 使用NSURLSession发送HTTP请求的问题

    报错信息: Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...

  6. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题

    A. Anton and Danik 题目连接: http://codeforces.com/contest/734/problem/A Description Anton likes to play ...

  7. Asp.net Core 使用Redis存储Session

    前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一, ...

  8. Android Studio 快捷键 for mac

    Action Mac OS Win/Linux 打开文件 Cmd + shift + O   打开Class文件 Cmd + O   覆写方法 Ctrl + O   生成方法(重写构造.setter ...

  9. C#怎样去掉对于用Splict分隔的数组中的空值?

    string[] arrayUserId = userIds.Split(new char[] { ',' },StringSplitOptions.RemoveEmptyEntries); 可以去掉 ...

  10. 搭建mongodb集群(副本集+分片)

    搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集 ...