姑且不论这东西到底有没有用,毕竟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好不好用见仁见智,反正我觉得不好用,但是我会用。