FreeMarker SiteMesh Struts2 整合后如何在JSP页面中使用FreeMarker标签和Struts2标签

关于如何整合FreeMarker SiteMesh Struts2 请参考其他文章, 本文是建立在你知道如何去整合FreeMarker SiteMesh Struts2 并且如何在FreeMarker模版中使用Struts2标签,本文的重点在于如何在JSP中使用FreeMarker标签, 及其在Jsp中使用Struts2标签问题的解决。

先给出配置文件, 关于为什么这么配,本文不再详述.

代码清单 1 :Web.xml

 

 

本文的重点是如何在JSP中使用FreeMarker标签,有人可能会问:为什么不直接在FreeMarker模版文件中使用JSP标签呢? 这是个很好的问题, 因为大部分人在使用FreeMarker多半是会用FreeMarker文件格式(.ftl). 但是,试想想如果我们只是想在现有的系统中集成FreeMarker, 如果我们要把所有JSP文件改成FTL文件, 那么是需要很多时间的,在这种情况下,最好的办法就是在JSP中直接使用FreeMarker标签(一般情况下,我们很有可能在JSP中使用FreeMarker的宏)。那么如何在JSP中使用FreeMarker呢,很简单,我们必须使用JSP的<%@ taglib ...  />命令,把FreeMarker的标签库文件(fmtag.tld)导入,本文把 fmtag.tld 放到WEB-INF目录下,下面是 fmtag.tld 的源码:

代码清单 2 : fmtag.tld

 

 下一步,我们新建一个JSP文件叫hello.jsp, 代码清单如下 : hello.jsp

代码清单 3 : hello.jsp

 

本文使用的是 tomcat6,  打开浏览器, 进入页面 http://localhost:8080/test/hello.jsp . 得到结果如下:

    Hello World 1. winter, 2. spring, 3. summer, 4. autumn

 

大家已经看到我们可以正确的显示FreeMarker的结果了,大家注意了FreeMarker的部分必须放在标签<fm:template>与</fm:template>之间,否则JSP不会解析FreeMarker的内容,会把源码输出在页面之中。

 

 

截止目前我们可以在JSP中正确的显示FreeMarker的内容了, 但是如果我们使用的是Struts2,我们还必须得显示Struts2标签的内容。 新建一个JSP文件 hello2.jsp, 以下是代码清单:

 代码清单 4 :hello2.jsp

 

 启动服务器, 进入页面http://localhost:8080/test/hello2.jsp 。

 Wow, 发生了以个异常 :

代码清单 5 : exceptions

 

异常发生在 at org.apache.struts2.sitemesh.FreeMarkerPageFilter.getLocale(FreeMarkerPageFilter.java:176), FreeMarkerPageFilter是SiteMesh的Strust2 plugin 里边,找到这个文件,用Jad 反编译了一下, 得到下边的代码:

代码清单 6 : FreeMarkerPageFilter.java

 

我们知道问题是出现方法getLocale(...)中的,观察这个方法, 我们发现这个方法没有对invocation 做空判断,应该为:

   if (invocation != null && invocation.getAction() instanceof LocaleProvider){ ... }

 

现在知道问题之所在了, 如何去解决呢,去改FreeMarkerPageFilter源码,然后重新编译打包, 然后再替换原有官方提供的jar包吗? 显然这样做是不妥了, 幸亏Java提供了多态的功能,我们可以自己写一个类来继承FreeMarkerPageFilter, 叫MyFreeMarkerPageFilter, 然后重新实现getLocale()方法, 再把MyFreeMarkerPageFilter配到xml文件里就行了。

让我们先看看MyFreeMarkerPageFilter 和 新的web.xml.

 

代码清单 7 : MyFreeMarkerPageFilter.java

 

 代码清单 8 :新 web.xml

 

重新启动服务器, 进入页面: http://localhost:8080/test/hello2.jsp 

 

 

 大家可以看到,现在我们可以再JSP页面中使用Struts2给我们提供的标签了。

 

 注意: <fm:template></fm:template>之间的代码如果有Struts2标签的话,是不能够正常显示Struts2标签的,简单的说就是在JSP页面中不能混用FreeMarker标签和Struts2标签, 我目前还没有解决这个问题,如果哪位知道怎么去做,请不吝赐教。

 

 

好的,我们大概已经解决了我们要讨论的所有问题,本人刚开始学习FreeMarker可能会有许多疏忽之处,如果本文的例子不能正确显示,请大家转告我。谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值