SiteMesh2-示例工程

了解SiteMesh的最佳方法是使用它。假设SiteMesh设置在您的Web应用程序中,本教程将展示如何掌握SiteMesh最强大的方面,如下所示装饰页面:

效果发生在第2步,其中Menu.jsp页面呈现为html。在html页面发送到客户端浏览器之前,该页面由单个文件basic-theme.jsp进行装饰。

在此示例中,添加了一个Menu.jsp,添加了一个Footer.jsp,而没有任何额外的代码被添加到Menu.jsp。

示例操作步骤:

0、整体项目结构:

1、POM引入依赖:

        <!-- https://mvnrepository.com/artifact/opensymphony/sitemesh -->
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>sitemesh</artifactId>
            <version>2.4.2</version>
        </dependency>

在WEB-INF中新建lib文件夹,并引入SiteMesh标签

2、配置web.xml,增加filter:

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

注意:根据需要进行匹配,这里只匹配jsp页面。

配置标签url:

    <taglib>
        <taglib-uri>http://www.opensymphony.com/sitemesh/decorator</taglib-uri>
        <taglib-location>/WEB-INF/lib/sitemesh-decorator.tld</taglib-location>
    </taglib>

    <taglib>
        <taglib-uri>http://www.opensymphony.com/sitemesh/page</taglib-uri>
        <taglib-location>/WEB-INF/lib/sitemesh-page.tld</taglib-location>
    </taglib>

3、新建decorators文件夹,并新建basic-theme.jsp文件用于做为模板页

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
    <h1>Header</h1>
    <p><b>Navigation</b></p>
    <hr />
    <decorator:body />
    <hr />
    <h1><b>Footer</b></h1>
</body>
</html>

4、新建data文件夹,并新建menu.jsp和hours.jsp

menu.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>
    <title>Menu</title>
</head>
<body>
    <h1>Beverages</h1>
    <p>Cappucino $3.25</p>
    <p>Latte $3.35</p>
    <p>Espresso $2.00</p>
    <p>Mocha $3.50</p>
</body>
</html>

hours.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>
    <title>Hours</title>
</head>
<body>
    <h1>Weekdays</h1>
    <p>5:00pm - 10:00pm</p>
    <p>Weekends</p>
    <p>5:00pm - 10:00pm</p>
</body>
</html>

5、在WEB-INF文件夹下新建decorators.xml文件,用于页面拦截和排除规则

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/decorators">
    <decorator name="basic-theme" page="basic-theme.jsp">
        <pattern>/data/*</pattern>
    </decorator>
</decorators>

说明:上面的规则拦截data文件夹下的jsp页面,并把内容替换为decorators/basic-theme.jsp模板页的内容。

6、在WEB-INF文件夹下新建sitemesh.xml文件,添加如下规则:

<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
    <excludes file="${decorators-file}"/>

    <page-parsers>
        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers>
    <decorator-mappers>
        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
            <param name="property.1" value="meta.decorator" />
            <param name="property.2" value="decorator" />
        </mapper>
        <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper"/>
        <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
            <param name="decorator" value="printable" />
            <param name="parameter.name" value="printable" />
            <param name="parameter.value" value="true" />
        </mapper>
        <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper"/>
        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}" />
        </mapper>
    </decorator-mappers>
</sitemesh>

说明:这个文件类似Spring的Bean注入,把来接规则配置好然后通过此文件进行注入和实例化。

7、运行并访问menu.jsp文件,效果如下:

可以看出,内容集成了模板页basic-theme.jsp的内容,其中body部分就是menu.jsp的。

测试工程:https://github.com/easonjim/5_java_example/tree/master/sitemesh/test1

参考:

http://wiki.sitemesh.org/wiki/display/sitemesh/Start+Using+SiteMesh+in+10+Minutes

https://github.com/sitemesh/sitemesh2/blob/master/README.txt

时间: 2024-12-07 13:19:13

SiteMesh2-示例工程的相关文章

构建施耐德楼控系统数据库后台服务器示例工程二(数据库查询编写)

构建施耐德楼控系统数据库后台服务器示例工程-(工程创建)记录了一个Spring.Hibernate.Rest的工程如何创建,这篇将简单介绍在这个框架下如何利用注释编程. 1.Spring注释 Spring为我们提供了@Service.@Autowired这些标注来让工程中的Bean自动创建. 在我们的框架中,我们需要为每一个需要被其他类调用到的类名前添加@Service标签,在需要被自动创建的成员类上添加@Autowired,这样程序在运行时Spring会为我们自动装配相关的类实例. 2.Res

Android客户端与PHP服务端通信(四)---极光推送示例工程分析

概述 上一节,描述了注册极光推送并使用其例子的方法,这一节准备研究一下示例工程的框架,为移植它做准备. 分析例程源码 首先分析一下例程的源码结构,建议对照着JPUSH的官方文档(http://docs.jpush.io/)分析,我就是这样做的. 注册应用后,下载的示例工程结构如下, ExampleApplication.java:该类为应用程序定制了一个Application类,因为调用JPush的SDK时,需要调用JPush提供的init()函数API,而按照官方文档的说明"init 只需要在

activiti学习2:示例工程activiti-explorer.war的使用

目录 activiti学习2:示例工程activiti-explorer.war的使用 一.搭建开发环境 二.运行示例工程 三.示例工程功能演示 1. 创建流程图 2. 部署流程图 3. 启动流程 4. 完成任务 5. 用户管理 四.数据持久化 五.总结 activiti学习2:示例工程activiti-explorer.war的使用 工作流主要解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档.信息或者任务. activiti官方提供了一个示例工程ac

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

构建施耐德楼控系统数据库后台服务器示例工程—(工程创建)

工作中需要在施耐德楼控系统上添加后台管理功能和手机控制功能,单位采购的施耐德的产品仅仅是用于控制现场设备的楼控模块及上位机编程与HMI,我们需要在此基础上,自主开发手机端控制功能,那么就需要通过建立后台工程用于往施耐德的硬件上发信号或者修改其数据库. 本文即是建立在此想法的基础上,记录一下如何采用Spring.Hibernate.Rest这个框架构建一个可以快速开发的后台管理框架. 1.使用eclipse新建一个普通JAVA工程 2.右键工程名,选择属性,点击"Project Facets&qu

构建施耐德楼控系统数据库后台服务器示例工程三(Web端展示)

最近看到Extjs的示例中有仿操作系统桌面的代码,并且展示效果很美观,结合楼控这个系统的Web端展示需求,目前前端采用Extjs.楼控相关的操作会设计成桌面中的不同应用. Extjs初次入手看起来很复杂,但是由于其自带的示例代码很丰富,通常在了解一些基本概念后,参照着示例代码一步一步去做,我认为是最好的学习方式了. 目前我参照着Extjs中仿照桌面的示例代码,做出了如下的画面: 从图中我们可以看出,我目前在仿照着这个示例代码中的GridPanel.TabPanel.Window这些基本的组件,做

构建施耐德楼控系统数据库后台服务器示例工程四(SQLServer查询语句)

由于目前做的是一个数据库操作的一个简易类,涉及到如下查询语句,在此记录一下. 1.查询表名 select object_id,name name from sys.tables 2.查询列信息 SELECT (case when a.colorder = 1 then d.name else null end) 表名, a.colorder 字段序号, a.name 字段名, (case when COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 th

spring整合axis2(最小配置化)的示例

http://blog.csdn.net/xinhaoluan/article/details/3605234 环境配置: spring-framework-3.2.7 axis2-1.6.2 tomcat-7.0.64 实现步骤: 1.eclipse新建Dynamic Web Project,本例工程名为:ws-sample 2.将spring-framework和axis2的lib加入工程中 3.编写测试服务: IHello.java(interface) package com.lichm

[IE编程] 多页面基于IE内核浏览器的代码示例

有不少人发信问这个问题,我把答案贴在这里: 建议参考 WTL (Windows Template Library) 的代码示例工程TabBrowser  (在WTL目录/Samples/TabBrowser 下面).该工程演示了如何用WTL + IE WebBrowser接口开发一个多Tab的IE内核浏览器, 并演示如何用ATL的IDispEventSimpleImpl监听DWebBrowserEvents2 事件, 代码简洁易懂,很有参考价值. WTL 是微软的开源项目,可以去 http://

ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深入的了解,每个工程里应该写什么样的代码,代码如何组织以及ABP是如何在工程中发挥作用的. 源文档地址:https://www.codeproject.com/Articles/791740/Using-AngularJs-ASP-NET-MVC-Web-API-and-EntityFram 源码可以