关闭

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

标签: freemarkersitemesh装饰页面标签库
3078人阅读 评论(0) 收藏 举报
分类:

不少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 ;

1
0
查看评论

sitemesh3.0 自定义标签

对于sitemesh3,官方只给出了 三个标签,但是对于一些特殊的需求是远远不能满足的,好了,不废话了,进入正题: 本文章是基于java类来配置的,先建好sitemesh的配置类SiteMeshFilter ,如下: public class SiteMeshFilter extends Con...
  • u010425898
  • u010425898
  • 2015-12-22 10:54
  • 2068

spring mvc + freemarker + sitemesh 案例

pom 文件 org.freemarker freemarker 2.3.20 org.springframework spring-core 4....
  • liuao107329
  • liuao107329
  • 2017-06-26 15:40
  • 410

Sitemesh与Freemarker

SiteMesh简介     sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种hea...
  • micwing
  • micwing
  • 2015-12-03 17:06
  • 1142

【sitemesh】Jsp的装饰器组件sitemesh

姑且不论这东西到底有没有用,毕竟Jsp页面编程完全可以利用JSP的include命令,像传统网页编程一样,先写好几个页眉页脚header.html、footer.html、banner.html之类,再于每个页面利用引入这几个页面。这样一来好维护,二来代码清晰不麻烦,三来去到asp.net、vbsc...
  • yongh701
  • yongh701
  • 2015-05-16 10:34
  • 1672

FreeMarker和siteMesh简析

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通...
  • luo_yifan
  • luo_yifan
  • 2014-04-17 09:21
  • 1080

sitemesh实现页面Js及Css简单化(java)

你的html或jsp还在每个页面都加载同样的js/css吗?或者是每个页面都在import其他页面? 现在说的就是简化这些操作,不要让你的代码冗余这么多重复的东西,让sitemesh来帮助你吧。看下面: 我有一些公共的js和css,写个application.jsp,全部放在里面。看下图,注意后...
  • safasfafa
  • safasfafa
  • 2016-06-17 16:56
  • 932

使用SiteMesh分割、装饰jsp页面

1. 在WEB-INF下添加decorators.xml文件: xml version="1.0" encoding="UTF-8"?>   decorators defaultdir="/WEB-INF/decor...
  • torrytang
  • torrytang
  • 2015-12-31 14:43
  • 956

FreeMarker和Sitemesh结合

 FreeMarker和Velocity都是一种类JSP的模板语言,FreeMarker相对于Jsp繁琐的Tag定义,他的Macro机制相对于Tag更加的容易和简单,并且提供了诸多的内置函数;FreeMarker更加确保强制用户保持MVC的好的风格;   在s...
  • turkeyzhou
  • turkeyzhou
  • 2009-10-30 23:38
  • 5496

使用SiteMesh(2.4.2) ,被装饰页面导入的外部js文件无法调用的问题

写在前面的废话: 自从大学毕业后,10年间几乎没写过什么代码,最新的技术也没研究过,更不要说前端开发这种软件工程师一般不怎么关注的部分。 近期心血来潮,准备自己写个管理系统,前端后端全部一个人搞。结果刚刚动手,一大堆问题如潮水般涌来,很多小bug往往要花一天的时间才能调试出来。 这篇文章算是分享一下...
  • Jackin_Zhang
  • Jackin_Zhang
  • 2018-01-03 01:33
  • 58

SiteMesh页面装饰器的使用步骤

1、往j2
  • kpchen_0508
  • kpchen_0508
  • 2014-11-19 14:40
  • 4455
    微信订阅号
    关注小雷,更聪慧,人生从此不中雷。
    友情链接
    个人资料
    • 访问:2649550次
    • 积分:41032
    • 等级:
    • 排名:第103名
    • 原创:1072篇
    • 转载:35篇
    • 译文:0篇
    • 评论:3533条
    关于FansUnion

    微信:FansUnion

    姓名:雷文

    昵称:小雷FansUnion

    籍贯:湖北-襄阳-枣阳

    大学:武汉科技大学-软件工程08级-WUST

    博客专栏
    最新评论