Parameters RenderStrategy.ONE_PASS_RENDER是否是一种合理的方法,可以消除Wicket应用程序中的页面版本参数,如?1?

Parameters RenderStrategy.ONE_PASS_RENDER是否是一种合理的方法,可以消除Wicket应用程序中的页面版本参数,如?1?,parameters,wicket,stateful,Parameters,Wicket,Stateful,我们已经使用Wicket 1.3.7几年了,目前正在将我们的项目升级到Wicket 6.x 我做了很多关于每个URL附加的页面版本参数(例如?1)的研究,以及如何去除它们。(不幸的是,在官方文档中找不到关于这一点的详细信息。)在这样做的同时,我阅读了很多声明(来自Wicket开发者和用户 需要跟踪页面版本,否则就不可能是有状态的 及 你需要使你的页面无状态以摆脱它 还建议使用AbstractComponentMapper的自定义实现,覆盖encodePageComponentInfo,而不附加参

我们已经使用Wicket 1.3.7几年了,目前正在将我们的项目升级到Wicket 6.x

我做了很多关于每个URL附加的页面版本参数(例如
?1
)的研究,以及如何去除它们。(不幸的是,在官方文档中找不到关于这一点的详细信息。)在这样做的同时,我阅读了很多声明(来自Wicket开发者和用户

需要跟踪页面版本,否则就不可能是有状态的

你需要使你的页面无状态以摆脱它

还建议使用
AbstractComponentMapper
的自定义实现,覆盖
encodePageComponentInfo
,而不附加参数。这有一个明显的缺点,就是破坏已装入页面的状态性。(参见示例)

昨天我偶然发现了

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

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

问:还有什么我还没有意识到的缺点吗?有什么意外吗

这似乎是一个完美的解决方案,我只是想知道为什么会有这么多关于如何去除这些参数的讨论,即使是wicket开发者,这是而不是建议的


提前感谢。

我们经历了类似的升级过程,升级后我的第一反应是“哇,这是一些讨厌的URL…”

最初,我们还切换到一次渲染以获得更好的URL。但在深入研究之后,“?id”似乎不仅仅解决了双sumbit问题

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

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

这在“列出结果”页面(显示带有Ajax分页和过滤的“项目”列表/表格的页面)中尤其明显。在这种具有一次性呈现的页面上,即使您多次单击“下一页”,您也经常会丢失搜索条件或返回到结果的开头

我们最终使用了“标准”的呈现机制(不是一次性重新渲染)。URL看起来不太好,但我们觉得利大于弊(href看起来不错,它只是浏览器的URL栏)

另一个问题是我们网站的“爬行能力”。为了不让302s或“url?id”影响谷歌索引,我们在Wicket application init方法中添加了以下代码,以强制谷歌机器人进行一次渲染:

    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();
                    }
                }
            };
        }
    });

感谢分享您的经验。您所描述的内容与我们在Wicket 1.3中的习惯非常相似。就个人而言,我喜欢在点击F5时获得一个新构建的页面:)如果我需要保留Ajax状态,我宁愿以RESTful方式将其编码到URL中。顺便说一句:从SEO的角度来看,除了额外的参数(我可能可以使用a很好地处理这个参数)之外,更让我困扰的是,每个页面请求都会立即响应302重定向,并附加参数。好吧,如果你想让你的页面正确地爬网、索引和排名,那么每个请求都有302个重定向,对于任何URL来说都是一件非常糟糕的事情。啊,是的,谷歌爬网器!我们必须添加一点代码来强制进行一次渲染。我相应地更新了我的答案。谢谢,很高兴知道可以在应用程序中从一次渲染切换到另一次渲染:)不过,我认为我们会坚持下去。