通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题
2014-12-28 12:59
441 查看
不少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 ;
以前,主要是用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 ;
相关文章推荐
- 通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题
- 通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题
- jsp include标签引入html文件中文乱码问题解决
- 解决jsp用get方式通过a标签传值时的乱码问题
- struts中自定义标签引入到jsp中报错问题,不能引入问题
- jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题
- jsp include标签引入html文件中文乱码问题解决
- 解决idea引入jsp标签库报500的问题
- 【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!
- jsp页面定义的struts2 set标签问题 怎么解决?
- jsp 页面链接(注解:指a标签的超链接)乱码问题及其解决办法
- 解决在resin中通过SSI包含JSP页面时(静态页面中)乱码的问题
- JS通过get、post向jsp传递中文出现乱码的问题的解决
- (Struts2解决篇) Jsp页面整合datetimepicke标签解决办法
- Xcode 5 中引入 C++ 模板代码无法编译通过的问题解决
- 通过JSP自定义标签创建丰富多彩的超链接(Creating Richer Hyperlinks with JSP Custom Tags)
- JSP使用base标签和时间控件时IE6下不能打开站点,已终止操作问题解决
- web.xml文件中的jsp-config标签详解 --可用于解决jsp、html乱码问题
- jsp超链接 用 struts2 标签传多个参数 以及解决最后一个字乱码问题
- jsp 页面链接(注解:指a标签的超链接)乱码问题及其解决办法