struts2之整合sitemesh(使用sitemesh插件)
----------
为了在struts2中使用sitemesh的页面装饰,必须安装sitemesh插件。安装sitemesh插件非常简单,将struts2下的struts2-sitemesh-plugin-xxx.jar文件复制到web应用的根路径下,即可完成sitemesh插件的安装,当然也要sitemesh-xxx.jar(前面我们用maven例子解释过)。
正如前面看到的,为了整合sitemesh框架,必须在web.xml文件中配置sitemesh的核心过滤器,让该核心过滤器来过滤所有的用户请求。但我们知道,struts2的所有值是保存在Stack Context或者ValueStack中的,默认情况是,某个过滤器一旦访问了该Stack Context或ValueStack后,里面对应的值将会被清除掉,如果先使用struts2的FilterDispatcher来过滤用户请求,则sitemesh的过滤器将无法取得Stack Context或者ValueStack中的数据。
为了解决这个问题,Struts2提供了ActionContextCleanUp类。在Struts2的架构中,标准的过滤器链一般以ActionContextCleanUp开始,后面跟着其他需要的过滤器,最后,由FilterDispatcher来处理请求,FilterDispatcher通常是将请求传递给ActionMapper。
ActionContextCleanUp的一个重要作用是整合siteMesh页面装饰器,它通知FilterDispatcher在正确的时间清除ActionContext中的请求数据。注意:如果需要在SiteMesh的修饰器页面中访问ActionContext,ActionContextCleanUp过滤器必须放在过滤器的起点。
ActionContextCleanUp过滤器用来与FilterDispatcher协同工作来整合SiteMesh,通常,我们会把ActionContextCleanUp过滤排在第一位,似乎将FilterDispatcher排在第二位是较好的解决方案。但问题是:ActionContextCleanUp过滤器只能保证在FilterDispatcher之前先不清除Stack Context和ValueStack中的值。如果将SiteMesh过滤器排在FilterDispatcher之后,这会导致SiteMesh过滤器无法访问到Stack Context和ValueStack中的值。
因此,为了让SiteMesh过滤器和FilterDispatcher都可访问到Stack Context和ValueStack中的值,且FilterDispatcher可以在合适时机清除Stack Context和ValueStack中的值,应该使用如下的过滤器顺序:
1.ActionContextCleanUp过滤器
2.SiteMesh核心过滤器
3.FilterDispatcher过滤器
为此,在web.xml配置文件中使用如下3个过滤器,且过滤器的排列顺序也不能改变。如例: