文档章节

通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题

FansUnion
 FansUnion
发布于 2015/05/03 01:29
字数 843
阅读 14
收藏 1

不少web项目,都用到了SiteMesh。SiteMesh可以和JSP、Freemarker等模版进行整合,有一定的好处,当然也有其不好的地方。我个人觉得,如果没有必要,不要在项目中引入太多的工具和技术,工具多了,项目开发的速度提高不起来。

 以前,主要是用JSP作为视图层,最近主要是用Freemarker,然后配置Freemarker和SiteMesh整合。

项目中,最初的做法如下所示。

<html>
   <head>
  ${head}

</head>

<body>

<div id="pg-container">

<#include "common/header.ftl" />

${body}

<#include "common/footer.ftl" />

</div>

</body>

</html> 
把页面的head部分,放到装饰模版的head部分,把页面的body部分,放到装饰模版的body里的某个位置。从而实现,简化引入通用JS、通用CSS、导航条、页脚等共用界面和样式。

后来,项目遇到一个问题,关于JS加载的问题。footer里引入了通用的JS,在页面最后加载。而页面的js,需要引入footer中的js,但实际上却在footer之前就被加载了,导致了JS引用错误的问题。

现在,想在footer之前,自己的页面body后面引入js,但是仍然要解决先后引入js的问题。

 ---------------------------------------------------
我探索到的方法:
普通展示页面,定义conten元素,不会在界面中直接展示出来,而是被放到装饰模版的footer之后,放置的位置取决于“<@decorator.getProperty property="page.footer"/>”的位置,很灵活。
 

<body>

<content tag="footer">

<script src="${static}/js/common.js" type="text/javascript"></script>

</content> 

</body>
 

<body>

<div id="pg-container">

<#include "common/header.ftl" />

${body}

<#include "common/footer.ftl" />

</div>

<@decorator.getProperty property="page.footer"/>

</body> 

其中遇到的一点技术问题,就是Freemarker与SiteMesh整合。

首先要说明,SiteMesh是“伪开源” 的,Maven中央仓库没有发现源码,郁闷。

SiteMesh与Freemarker整合,SiteMesh自带了个插件,com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet。
但是,在比较了代码的结构(通过class看结构,因为没有源码)和 JSP标签库提供的用法比较之后,发现,Freemarker插件功能不全,就提供了几个属性title,content等。

所以,我们通过在Freemarker引入SiteMesh的JSP标签库,实现自定义的。
Freemarker中引入标签库的语法:

<#assign decorator=JspTaglibs["http://www.opensymphony.com/sitemesh/decorator"] />

<#assign page=JspTaglibs["http://www.opensymphony.com/sitemesh/page"] />

注意哦,和JSP中的引入方式不一样,类似。

调用方式也不一样, <@decorator.getProperty property="page.footer"/>。

下面是JSP标签库的引入和调用方式:

<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>  

<%@ taglib uri=" http://www.opensymphony.com/sitemesh/page " prefix="page" %>   

 <decorator:getProperty property="page.content1"/>  

补充2点:
1.我是参考了好几篇文章,才找到的解决办法。每篇文章都帮助我解决了一个或几个问题。
2.web.xml中配置taglib。

在Eclipse中会在taglib那一行有一个错误标志,但是运行的 时候没有问题……

原因:

所使用版本的问题,如果使用2.3版本就可以直接在<web-app>里面写

 <taglib>  

   <taglib-uri>sitemesh-page</taglib-uri>  

   <taglib-location>/WEB-INF/lib/sitemesh-page.tld</taglib-location>  

 </taglib>  

 <taglib>  

   <taglib-uri>sitemesh-decorator</taglib-uri>  

   <taglib-location>/WEB-INF/lib/sitemesh-decorator.tld</taglib-location>  

 </taglib>  

 

 

如果是用的是2.4版本,就不能直接这么写了,应该:

<jsp-config>

 <taglib>  

   <taglib-uri>sitemesh-page</taglib-uri>  

   <taglib-location>/WEB-INF/lib/sitemesh-page.tld</taglib-location>  

 </taglib>  

 <taglib>  

   <taglib-uri>sitemesh-decorator</taglib-uri>  

   <taglib-location>/WEB-INF/lib/sitemesh-decorator.tld</taglib-location>  

 </taglib>  

 </jsp-config>

 


参考资料: http://blog.csdn.net/drift_away/article/details/8088758
http://www.cnblogs.com/mailingfeng/archive/2011/12/21/2296105.html
http://www.blogjava.net/usherlight/archive/2009/04/28/267879.html
http://www.iteye.com/problems/23502 ;

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
beetl与sitemesh组合的时候sitemesh的拦截对beetl无作用

@闲.大赋 你好,想跟你请教个问题: 使用 sitemesh进行布局的时候,web.xml中使用你文档中的servlet,Freemarker是用com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServ...

rubysoft
2013/11/13
823
6
使用SiteMesh简化网页布局

在公司项目使用了 Appfuse ,其带有 SiteMesh 对于网页布局简化让我感觉很好用,本文旨在对对 Sitemesh 的基本原理和在项目中使用 Sitemesh 的实现流程、使用技巧的介绍。 1. 基本原理 Site...

红薯
2008/12/01
3.9K
2
Struts2 整合Sitemesh中,怎么在jsp中拿到actionerror中的值?

Struts2 整合Sitemesh中,怎么在jsp中拿到actionerror中的值呢?表单的值能注入到action中,但在jsp页面中拿不到actionerror的值。是web.xml的配置问题,还是....? 下面是web.xml文件的配置...

空云万里晴
2012/04/06
1K
2
SiteMesh Java web页面布局框架

什么是SiteMesh? SiteMesh是一个轻量级灵活的Java web应用框架,它应用了四人帮(Gang of Four)的装饰模式允许内容和表现有一个清晰的分离 SiteMesh is a lightweight and flexible Java ...

天行健J
2012/12/07
0
0
页面修饰框架SiteMesh的简单使用

SiteMesh 简介; SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的。 Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的...

长平狐
2012/09/03
348
0

没有更多内容

加载失败,请刷新页面

加载更多

Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

铁骨铮铮
8分钟前
0
0
龙芯版办公软件下载

金山wps office   rpm包:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm   deb包:http://packages.deepin.com/loongson/pool/......

gugudu
13分钟前
0
0
BI报表分析和数据可视化,推荐这三个开源工具!

开源篇 一、Superset 1、技术架构:Python + Flask + React + Redux + SQLAlchemy 2、使用人群: (1)开发/分析人员做好看板,业务人员浏览看板数据 (2)业务人员可自行编辑图表,查看满足...

飓风2000
20分钟前
0
0
CountDownLatch

CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程...

少年已不再年少
29分钟前
0
0
centos7 新手阿里云服务器安装mongodb

简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 MongoDB特点 模式自由 :可以把不同结构的文档存...

醉雨
39分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部