最近在学习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. 让input支持 ctrl v上传粘贴图片? 让input支持QQ截图或剪切板中的图像数据(Java实现保存)

    原理:监听粘贴 → 获取粘贴内容 → 将内容上传 → 抓取后返回替换至input 我们在生产中用到的界面: 测试地址 http://sms.reyo.cn 用户名:aa 密码:123456 以下是PH ...

  2. ElasticSearch + Kibana

    关键词: 数据可视化 数据分析 数据爬虫 信息检索(搜索引擎) ElasticSearch是基于Lucene的分布式搜索引擎,提供多种插件及配套工具. 其中Kibana可以“关联”ES中的数据集,进行 ...

  3. 使用LotusScript操作Lotus Notes RTF域

    Lotus Notes RTF域的功能也非常强大,除了支持普通的文本以外,还支持图片.表格.嵌入对象.Http 链接.Notes 链接.附件等等众多的类型.本文将介绍如何使用这些类来灵活操作富文本域. ...

  4. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  5. 启动Eclipse 弹出“Failed to load the JNI shared library”错误的解决方法

    原因1:eclipse的版本与jre或者jdk版本不一致 对策:要么两者都安装64位的,要么都安两个是32位一个是64位. 原因2:给定目录下jvm.dll不存在 对策:(1)重新安装jre或者jdk ...

  6. nginx location 的配置

    一.基本语法:location [=|~|~*|^~] /uri/ { … } 二.分类: 1.基本location:以“ = ”或“ ^~ ”为前缀或者没有任何前缀的 /uri/ 2.正则locat ...

  7. parallels无法启动之大乌龙-流水账版

    欢迎访问我的blog:blog.thinkinside.me     早上到公司,像往日一样,开电脑倒茶喝水. 回到座位打开parallels desktop,发现不对,打开PD非常的慢.显示正在初始 ...

  8. mac上parallel与virtualbox无法共存

    Mac reboots when you attempt to launch Parallels Desktop 8 and Virtual Box simultaneously Article ID ...

  9. ./adb: cannot execute binary file:

    问题描述: 在32位ubuntu(12.04)上下载了最新的android SDK,使用SDK manager 下载ADB之后发现,无法运行ADB命令,排除权限问题,在网上搜到答案: http://a ...

  10. 开启MSDTC

    DOS方式以运行中输入cmd 然后输入下面命令: 停止MSDTC: net stop msdtc 开启MSDTC: net start msdtc 卸载MSDTC: msdtc -uninstall ...