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

原创 2014年12月28日 12:59:21

不少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的版权声明

相关文章推荐

一篇很全面的freemarker教程

copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMa...
  • fhx007
  • fhx007
  • 2012-08-24 00:24
  • 451195

SiteMesh简单引入demo

使用SiteMesh主要包括3部 1. 引入 sitemesh jar包 2. 配置web.xml(添加过滤器)、配置decorators.xml(添加装饰页面、被装饰文件目录、被...

SiteMesh的使用

最近在搭建新的后台管理系统框架的时候需要用到三栏布局,如下图所示,之前采用的   frameset  框架,据说有很多的缺陷,所以今天就试着用SiteMesh进行布局。 SiteMes...

SiteMesh

SiteMesh项目简介OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容易实现...

struts2+spring4+hiobernate4整合sitemesh导致jsp页面引入的js失效解决方案

1.查看web.xml文件里的sitemesh过滤器的配置 注意顺序的问题 ssh_user login.jsp org.springframework.web...

springMvc sitemesh freemarker 整合总结

   前言 由于个人喜欢springmvc对restful支持的完美,再加上配置简单和与spring的天然集成,故项目打算用springMvc;freemarker 尽管网上有众...

JSP中如何使用自定义的标签库

主要分为三步:1.创建标签的处理类     2.创建标签ku

struts2之整合sitemesh(定义装饰器页面)

struts2之整合sitemesh(定义装饰器页面)
  • fhd001
  • fhd001
  • 2011-04-06 17:26
  • 1166

jsp页面引入标签库的问题

Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core".  Try increasing the...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)