我们已经使用 Wicket 1.3.7 几年了,目前正在将我们的项目升级到 wicket 6.x
我对页面版本参数做了很多研究(例如?1
) 附加到每个 URL,以及如何删除它们。 (不幸的是,在官方文档中找不到这方面的详细信息。)在这样做的同时,我阅读了很多声明(来自 Wicket 开发人员)and用户喜欢
需要跟踪页面版本,否则不可能有状态
and
您需要使页面无状态才能摆脱它
还建议使用自定义实现AbstractComponentMapper
, 压倒一切encodePageComponentInfo
不附加参数。其明显的缺点是破坏了已安装页面的状态。 (看这个答案 https://stackoverflow.com/a/8667136/1006823例如)
昨天我偶然发现RenderStrategy.ONE_PASS_RENDER http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/settings/IRequestCycleSettings.RenderStrategy.html#ONE_PASS_RENDER.
我尝试了一下,经过一些测试后,我得到的印象是这是“恢复旧的检票方式”的设置:页面版本参数消失了,但我的页面是有状态的。
好吧,也有一个缺点。如果必须自己处理双重提交问题,但我可以忍受。
问题:还有其他我不知道的缺点吗?有什么值得期待的惊喜吗?
这似乎是一个完美的解决方案,我只是想知道为什么有这么多关于如何摆脱这些参数的讨论,即使是 wicket 开发人员,这是在哪里not建议....
提前致谢。
我们经历了类似的升级路径,升级后我的第一反应是“哇,这些都是一些令人讨厌的 URL...”。
最初,我们还切换到一次性渲染以获得更好的 URL。但经过深入研究后,发现“?id”不仅仅解决了双位数问题。
带有 Ajax 组件的页面可能是有大量状态的:当用户与页面交互时,您可以添加组件、删除其他组件等。通过 URL 参数中的页面 ID,您可以将页面恢复到与离开时相同的状态,如果您刷新页面 (F5) 或导航到另一个页面,然后按后退按钮。
如果切换到一次渲染,您将失去该功能,因为浏览器无法识别页面存储中的哪个页面是目标页面,并且通常最终会得到页面对象的另一个实例。
这在“列表结果”页面(使用 Ajax 分页和过滤显示“项目”列表/表格的页面)中尤其明显。在此类具有一次性渲染的页面上,即使您多次单击“下一页”,您也经常会丢失搜索条件或返回到结果的开头。
我们最终使用了“标准”渲染机制(不是一次性渲染)。 URL 看起来不太好,但我们认为利大于弊(href 看起来确实不错,它只是浏览器 URL 栏)。
另一个问题是我们网站的“可爬行性”。为了不让 302 或“url?id”影响 Google 索引,我们在 Wicket 应用程序 init 方法中添加了以下代码,以强制 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();
}
}
};
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)