RenderStrategy.ONE_PASS_RENDER是一个合理的方法来摆脱页面版本参数,如Wicket应用程序中的?1?

时间:2013-01-29 15:00:39

标签: parameters wicket stateful

我们几年来一直在使用Wicket 1.3.7,目前正在将我们的项目升级到wicket 6.x

我做了很多关于页面版本参数(例如?1)附加到每个URL的研究,以及如何摆脱它们。 (遗憾的是,在官方文档中找不到详细信息。)在这样做的同时,我阅读了很多语句(来自Wicket开发人员用户

  

需要跟踪页面版本,否则无法成为有状态

  

你需要让你的页面无状态才能摆脱它

还建议使用AbstractComponentMapper的自定义实现,覆盖encodePageComponentInfo不附加参数。这有明显的缺点,即打破已安装页面的状态。 (例如,参见this SO answer

昨天我偶然发现RenderStrategy.ONE_PASS_RENDER

我试了一下,在做了一些测试后,我得到的印象是这是“恢复旧的wicket方式”的设置:页面版本参数消失了,但我的页面是有状态的。

好的,也有一个缺点。如果必须自己处理双重提交问题,但我可以忍受。

问题:我还没有(还)知道其他任何缺点吗?有什么惊喜可以预料?

这似乎是一个完美的解决方案,我只是想知道为什么有这么多讨论如何摆脱这些参数,即使是wicket开发人员,这是建议....

提前致谢。

1 个答案:

答案 0 :(得分:5)

我们经历了类似的升级路径,升级后我的第一反应是“哇,这些是一些令人讨厌的网址......”。

最初,我们还切换到一次通过渲染以获得更好的URL。但是在仔细研究之后,似乎“?id”不仅仅解决了双重求和问题。

使用Ajax组件的页面可能非常有状态:当用户与页面交互时,您添加组件,删除其他组件等。使用URL参数中的页面ID,您将以与您离开时相同的状态返回页面如果您刷新页面(F5)或导航到另一页面,则按后退按钮。

如果切换到一次传递渲染,则会丢失该功能,因为浏览器无法识别页面存储中的哪个页面是目标,并且通常最终会出现另一个页面对象实例。

这在“列表结果”页面中显示特别明显(页面显示带有Ajax分页和过滤的“项目”列表/表)。在具有一次渲染渲染的此类页面上,即使您单击“下一页”几次,您也经常会丢失搜索条件或被带回结果的开头。

我们最终使用了“标准”渲染机制(不是一次通过渲染)。网址看起来不太好,但我们认为优点超过缺点(并且href确实看起来不错,它只是浏览器网址栏)。

另一个问题是我们网站的“可抓取性”。为了不让302s或“url?id”影响Google索引,我们在Wicket应用程序初始化方法中添加了以下代码,以强制对Google Bot进行一次渲染:

    setPageRendererProvider(new IPageRendererProvider() {
        @Override
        public PageRenderer get(RenderPageRequestHandler handler) {
            return new WebPageRenderer(handler) {
                @Override
                protected boolean isOnePassRender() {
                    // To avoid 302s with Google Bot and have good SEO.
                    String userAgent = ((HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest()).getHeader("User-Agent");
                    if (StringUtils.contains(userAgent, "Googlebot")) {
                        return true;
                    } else {
                        return super.isOnePassRender();
                    }
                }
            };
        }
    });