WebWork2.2新特性(八)使用FreeMarker的FTL做装饰页面

其实我不善于写作,有些东西仅仅是写下来.还可以提醒自己.

人生"入"梦,各位一定要保重身体.

 

注意:FreeMarkerPageFilter是2.2beta发布后才加到CVS上的,所以从CVS获取新的代码才能看到这个filter,同目录下还有一个VelocityPageFilter.

FreeMarkerPageFilter以及VelocityPageFilter都是Sitemesh页面装饰器中PageFilter的扩展,有了它,可以直接使用FreeMarker的ftl作为装饰页面,可以不在使用SiteMesh带的FreemarkerDecoratorServlet了,而且还可以享受Action中的ValueStack了.

不过我不推荐在装饰页面中使用ValueStack中的值,因为装饰页面对应的Action是不确定的,而且也可能修饰的是一个普通页面,不是一个Action.

我们要有一个Action及其结果页面,或者一个简单的页面,这些不在赘述,自己看自己的了.

首先我们有一个装饰页面,示例如下(main.ftl):

 <html>
 <head>
     <title>JScud Develop:${page.title}</title>
     ${page.head}
 </head>
 <body>
 ${page.body}
 <br><br>
 From: ${base} by <@ww.text name="copyright"/>
 </body>
 </html> 


我们可以看到,其中的标记都有page前缀,而不是直接使用body,title等,原因是这个FreeMarkerPageFilter只把page放到了FreeMarker的model中,如果你还是想遵循原来的习惯,那么自己继承一下FreeMarkerPageFilter即可,非常简单,然后把body,title,head放到model中即可.不过我觉得现在也挺好,省得变量太短和别的混淆.

SiteMesh的decorators.xml示例如下:

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <decorators defaultdir="/decorators">
     <decorator name="main" page="main.ftl">
         <pattern>/*</pattern>
     </decorator>
 </decorators> 


我们还需要在web.xml中配置过滤器,在这个地方,我走了弯路,因为没有文档,结果没有注意到 ActionContextCleanUp 这个Filter,自己还自作聪明修改了一下FreeMarkerPageFilter,后来才发现ActionContextCleanUp这个Filter的作用,这都是没有仔细看源码(JavaDoc)的后果啊.

在不使用SiteMesh的时候,为了使用WebWork,我们只需要在web.xml配置FilterDispatcher一个过滤器即可,阅读一下FilterDispatcher的JavaDoc和源码,我们可以看到它调用了:

 finally
 {
            ActionContextCleanUp.cleanUp(req);
 } 

而且JavaDoc中也提到看ActionContextCleanUp的文档,那我们就去看吧(我没看所以...)

在ActionContextCleanUp中,有这样的代码:

 req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE); 

如果FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清楚,保证了一系列的Filter访问正确的ActionContext.

文档中提到,如果用到SiteMesh的Filter或者其他类似Filter,那么设置顺序是:

  •  ActionContextCleanUp filter
  •  SiteMesh filter
  •  FilterDispatcher

 所以最后我们的web.xml应该类似这样:

    <filter>
        <filter-name>ActionContextCleanUp</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class>
    </filter>

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.webwork.sitemesh.FreeMarkerPageFilter</filter-class>
    </filter>

    <filter>
        <filter-name>webwork</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ActionContextCleanUp</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>webwork</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 


 
发布程序,运行结果正常.在Action改变Locale,装饰页面也获取了正确的Locale,OK,大功告成...嘿嘿

BTW:如果你使用jsp做装饰页面,使用SiteMesh自己的PageFilter即可,不过也要配置ActionContextCleanUp哦. :)


BTW 2:
 其实,我还想写一篇AJAX的,不过总是懒得写那...
 文件上传的拦截器有些Bug,而且处理流程必须结合实际才行,所以也不想写了...


除经特别注明外,本文章版权归JScud Develop团队或其原作者所有.
转载请注明作者和来源.  scud(飞云小侠)  欢迎访问 JScud Develop


posted on 2005-09-07 16:06 Scud(飞云小侠) 阅读(1400) 评论(0)  编辑  收藏 所属分类: WEB


只有注册用户登录后才能发表评论。


网站导航:
 
<2005年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

公告

文章发布许可
创造共用协议:署名,非商业,保持一致

我的邮件
cnscud # gmail


常用链接

留言簿(15)

随笔分类(113)

随笔档案(103)

相册

友情链接

技术网站

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜