其实我不善于写作,有些东西仅仅是写下来.还可以提醒自己.
人生"入"梦,各位一定要保重身体.
注意: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