通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题
不少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;
通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题的更多相关文章
- JSP 标准标签库(JSTL)之最常用的JSTL标签总结
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-t ...
- 【转载】AngularJS 用$sce服务来过滤HTML标签,解决无法正确显示后台传递的html标签
angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有 ...
- jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...
- Spring MVC -- JSP标准标签库(JSTL)
JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能.JSTL支持通用的.结构化的任务,比如迭 ...
- [JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...
- java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库
JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...
- JSP 标准标签库(JSTL)(JSP Standard Tag Library)
[1] JSTL简介 > JSTL是JSP的标准标签库 > JSTL为我们提供了一些常用的标签,供我们日常开发使用(if . if...else .遍历 . 日期格式化) ...
- 复习java web之jsp入门_El表达式_JSTL标签库
JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...
- Java精选笔记_JSTL(JSP标准标签库)
JSTL(JSP标准标签库) JSTL入门 JavaServer Pages Standard Tag Library:JSP标准标签库 在JSP中可以通过Java代码来获取信息,但是过多的Java代 ...
- JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)
1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...
随机推荐
- Flask项目之手机端租房网站的实战开发(十)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- WCF REST (二)
今天主要写下 POST等其他方式 发送请求 以及 流方式 文件的上传与下载 一.Post 提交数据 先来想下 POST和Get 的不同 Get 方式 我们直接通过 url 来传递参数 先来 ...
- C++组合数(combination)的实现
实现: (nm) 既需要计算组合的总数 (32)=3: 也需要分别获得每一种组合的情形,用于穷举搜索: 1, 2; 1, 3; 2, 3 1. 递归实现 // picked + toPick == m ...
- Node知识总结
一. 伪装URL-SEO 伪URL重写 把一个动态页面的地址重写为静态页面的地址,为了方便网站的SEO优化 真实地址:http://item.jd.com/detail.php?id=12261336 ...
- Javascript和jquery事件--事件对象event
1. 事件对象event 对于event,js的解释是Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.而jq的解释是事件处理(事件对象.目标元素 ...
- node的express参数获取
1.express中的不定向路由参数的获取 如: app.get('/profile/:id', function(req, res) { var id=req.params.id res.send( ...
- (转)ORA-01940: cannot drop a user that is currently connected 问题解析
删除数据库用户的时候经常会遇到这样的错误: ORA: cannot drop a user that is currently connected 原因是有程序在连接我们需要删除的用户,我们删除用户之 ...
- GO语言学习(一)Windows 平台下 Go 语言的安装和环境变量设置
1. Go 语言 SDK 安装包下载和安装 GO语言安装包下载地址:https://www.golangtc.com/download 下载 go1.9.2.windows-amd64 2. Go 语 ...
- Java Timer TimerTask Example(java Timer的例子)
Java java.util.Timer is a utility class that can be used to schedule a thread to be executed at cert ...
- ivotal-tc-Server与Tomcat区别
Pivotal-tc-Server之前叫做SpringSource tc Server,包含三个版本分别是:Spring版.标准版和开发版,但其中只有开发版是免费的.比如在STS中包含的版本就是开发板 ...