【sitemesh】Jsp的装饰器组件sitemesh

姑且不论这东西到底有没有用,毕竟Jsp页面编程完全可以利用JSP的include命令,像传统网页编程一样,先写好几个页眉页脚header.html、footer.html、banner.html之类,再于每个页面利用<jsp:include page="xxx.html" />引入这几个页面。这样一来好维护,二来代码清晰不麻烦,三来去到asp.net、vbscript、php等服务器编程页面我们一样这样搞。要不是html没有include命令,甚至来不至于用到服务器后端语言的include命令。然而,作为一个很常见的jsp装饰器插件sitemesh,你用不用是一回事,你懂不懂事一回事,在团队开发中,如果要求用sitemesh,你即使使用jsp的include命令,也要懂得如何要求某些页面不要装饰器。下面,举一个例子,还完整说明这个插件。

一、sitemesh的下载与配置

首先,这个东西其实到现在还是在更新的,但是其旧有的2.x版本已经在2009年成为了永久稳定版sitemesh-2.4.2.jar不再更新。这更好,免得隔三差五就推新版本改代码。然而,现在3.x也像spring那样傲娇起来,其jar要利用Maven去下载,而且sitemesh3.x还不算太稳定,各大jsp工程还是使用sitemesh2.x。

直接上sitemesh的官网http://wiki.sitemesh.org/wiki/display/sitemesh/Download,如下图下载,此网页有可能有时打开比较卡。

下载之后直接得到一个可以用的sitemesh-2.4.2.jar,在Eclipse for Javaee中新建一个名为sitemeshTest的Dynamic web Project。直接把sitemesh-2.4.2.jar放到sitemeshTest的WEB-INF里面。在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"
	version="3.0">
	<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-app>

由于sitemesh在官网上没有提供其标签库,要求我们在JSP工程中,通过引用其网址的方式,使用它的标签库。我们不能这样做。不是不想引用你的网址,主要你的网址在国外,我要保证自己的web工程的打开网速。就像从不能引入Google托管的jquery一样。毕竟这些东西总有一天会崩掉,不安全。因此,我们必须再于WEB-INF新建一个sitemesh-decorator.tld,写入如下的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>

	<tlibversion>1.0</tlibversion>
	<jspversion>1.1</jspversion>
	<shortname>SiteMesh Decorator Tags</shortname>
	<uri>sitemesh-decorator</uri>

	<tag>
		<name>head</name>
		<tagclass>com.opensymphony.module.sitemesh.taglib.decorator.HeadTag</tagclass>
		<bodycontent>JSP</bodycontent>
	</tag>

	<tag>
		<name>body</name>
		<tagclass>com.opensymphony.module.sitemesh.taglib.decorator.BodyTag</tagclass>
		<bodycontent>JSP</bodycontent>
	</tag>

	<tag>
		<name>title</name>
		<tagclass>com.opensymphony.module.sitemesh.taglib.decorator.TitleTag</tagclass>
		<bodycontent>JSP</bodycontent>
		<attribute>
			<name>default</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

	<tag>
		<name>getProperty</name>
		<tagclass>com.opensymphony.module.sitemesh.taglib.decorator.PropertyTag</tagclass>
		<bodycontent>JSP</bodycontent>
		<attribute>
			<name>property</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>default</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>writeEntireProperty</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

	<tag>
		<name>usePage</name>
		<tagclass>com.opensymphony.module.sitemesh.taglib.decorator.UsePageTag</tagclass>
		<teiclass>com.opensymphony.module.sitemesh.taglib.decorator.UsePageTEI</teiclass>
		<bodycontent>JSP</bodycontent>
		<attribute>
			<name>id</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>

	<tag>
		<name>useHtmlPage</name>
		<tagclass>com.opensymphony.module.sitemesh.taglib.decorator.UsePageTag</tagclass>
		<teiclass>com.opensymphony.module.sitemesh.taglib.decorator.UseHTMLPageTEI</teiclass>
		<bodycontent>JSP</bodycontent>
		<attribute>
			<name>id</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>

</taglib>

这样,sitemesh的配置就完毕了。

二、sitemesh的使用

1、于WEB-INF目录新开一个decorators.xml,这个文件用来配置装饰器在JSP的使用,说明哪些使用装饰器,哪些网页不使用。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<decorators defaultdir="/decorators">
	<!-- 此处用来定义不需要装饰器的页面 -->
	<excludes>
		<!-- 根目录下的index.jsp不会被装饰器修饰 -->
		<!--
		接下去,如有需要,自行在此标签下加pattern,还可以使用*还说明问题
		如<pattern>/a/*<pattern>就是指WebContent下的a文件夹的所有网页不使用装饰器
		如<pattern>/a/*.jsp<pattern>就是指WebContent下的a文件夹的所有jsp页面不使用装饰器
		如<pattern>/a/b*<pattern>就是指WebContent下的a文件夹的所有b开头的页面不使用装饰器
		 -->
		<pattern>/index.jsp</pattern>
	</excludes>

	<!-- 用来定义要使用装饰器要过滤的页面 -->
	<decorator name="main" page="decoratorsTest.jsp">
		<pattern>/*</pattern>
	</decorator>
</decorators>

值得注意的是,如果此工程同时使用struts开发,decorators.xml指明的东西,应为struts.xml中此页面对应的action,与此action对应的返回页,而不是此页面的真实的路径。

2、然后我们要在WebContent,Web工程的根目录下,新建一个decorators文件夹,因为decorators.xml的开头就指明,所有装饰器的页面藏在根目录下的decorators。然后再decorators下面新建一个decoratorsTest.jsp。其代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%--此乃装饰器页面,注意在开头声明要使用sitemesh的标签库--%>
<%@ taglib uri="sitemesh-decorator" prefix="decorator"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%--要求此处是以源页面的title标签来填充--%>
<title><decorator:title /></title>
</head>
<body>
	<h1>页头,这才是装饰器要加到其它页面的内容</h1>
	<%--要求此处是以源页面的body标签来填充--%>
	<decorator:body />
	<h1>页脚,除了decorators.xml中指定的exclude内容,此装饰器无处不在!</h1>
</body>
</html>

此时,此页面的将会出现在除了decorators.xml中exclude指定的页面,因此在decorator.xml中,声明使用装饰器的页面是改站点的所有页面。

3、最后,我们再于根目录WebContent下建两个测试页面,

一个是在decorators.xml已经说好不使用装饰器页面index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
	<a href="forDecorator.jsp">去被装饰页!!</a>
</body>
</html>

一个是使用装饰器的页面forDecorator.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>被装饰器修饰的页面</title>
</head>
<body>
<p>我是源页面的内容!!其余都是装饰器加给我的!此页面本来无h1标签代码!</p>
</body>
</html>

三、运行效果

最后搞好之后,整个Web工程的目录结构如下,没有在src建任何一个.java文件,因为装饰器sitemesh是view层的内容。

注意到index.jsp与forDecorator.jsp都是仅仅有一个文字的页面,但是运行起来,由于使用装饰器与否,把工程挂到Tomcat中运行,得到的却是两种不同的结果:

在浏览器中,分别查看index.jsp与forDecorator.jsp的源代码,可以注意到index.jsp就是我们在Eclipse中写的东西。

而forDecorator.jsp的源代码则由于装饰器的作用而变成了:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>被装饰器修饰的页面</title>
</head>
<body>
<h1>页头,这才是装饰器要加到其它页面的内容</h1>

<p>我是源页面的内容!!其余都是装饰器加给我的!此页面本来无h1标签代码!</p>

<h1>页脚,除了decorators.xml中指定的exclude内容,此装饰器无处不在!</h1>
</body>
</html>

这个jsp装饰器组件sitemesh好不好用见仁见智,反正我觉得不好用,但是我会用。

时间: 2024-10-26 06:00:32

【sitemesh】Jsp的装饰器组件sitemesh的相关文章

使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)

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

关于Springmvc中include与Sitemesh装饰器的基本使用

关于Springmvc中include与Sitemesh装饰器的使用 !!!转载请注明出处=>http://www.cnblogs.com/funnyzpc/p/7283443.html 静态包含:example:<%@include file="xxx.jsp"%> 文件的包含是发生在 jsp向servlet转换时期 ,相当于将jsp编译成html静态文件,由于对包含的文件不再编译(直接拷贝到父页面),则只产生一个class文件. 动态包含:example<j

SiteMesh装饰器使用总结

SiteMesh是一个Java WEB项目的网页布局和修饰框架. 可以将网页的内容和页面结构分离,达到页面结构共享的目的. 页面装饰效果耦合在目标页面中,无需使用include指令显示包含装饰效果,目标页面和装饰页面完全分离. 整个web应用可以使用相同的装饰页面,风格统一,整体效果更好. SiteMesh通过Filter拦截请求和响应,给原始页面加入装饰,再把装饰后的结果返回给客户端. 根据页面URL查找合适的装饰模板页 提取被访问页的内容,放置到装饰模板中的适当位置. 用法 1.加入site

说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制email,sms,rtx,qq等,但不能同时采用多种机制完成消息的发送,这在一些情况下是没有问题的,但有时,我们也需要同时为客户提供多种消息的推送,这在目前还是挺现时的,如在用户下单后,同时为它发email 和短信进行通过,并对每个订单的过程进行跟踪并通知

认证登录装饰器与form组件的使用

def auth(func): '''制作登录认证的装饰器''' def inner(request,*args,**kwargs): user_info=request.session.get(settings.SJF) if not user_info: return redirect('/login/') return func(request,*args,**kwargs) return inner ''' form组件的使用 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交

高阶组件装饰器

高阶组件装饰器  注意利用函数式组件进行化简! import React from 'react'; //1 组件原型 class Reg extends React.Component{ render(){ return <_Reg service={service} />; } } //2 匿名组件 const Reg = class extends React.Component{ render(){ return <_Reg service={service} />; }

【react】---react中使用装饰器(高阶组件的升级用法)

一.creact-react-app中使用装饰器 运行 npm run eject 可以让由create-react-app创建的项目的配置项暴露出来 此时,项目中多了一个config文件,并且各个配置文件已经暴露出来了.(运行npm run eject之前,保证本地没有待提交到git的文件) 安装babel插件npm install --save-dev @babel/plugin-proposal-decorators 修改package.json文件的babel配置项 "babel&quo

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

Java装饰器模式

意图:动态的将责任附加到对象上什么时候使用:1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责2.处理那些可以撤销的职责3.当不能采用生成子类的方式进行扩充时结构图: package com.test.patten.decorator; public interface Person { void doCoding(); } package com.test.patten.decorator; public class Employee implements Person { @