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

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,大功告成...嘿嘿 
 
 
来源:http://blog.sina.com.cn/s/blog_5b142cae0100cmy2.html~type=v5_one&label=rela_prevarticle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值