parameters - RenderStrategy.ONE_PASS_RENDER 是一种在 Wicket 应用程序中摆脱 ?1 等页面版本参数的合理方法吗?

标签 parameters wicket stateful

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

我对附加到每个 URL 的页面版本参数(例如 ?1)以及如何摆脱它们进行了大量研究。 (不幸的是,在官方文档中找不到这方面的详细信息。)同时我阅读了很多声明(来自 Wicket 开发人员 用户喜欢

It is needed to keep track of the page version, otherwise it would not be possible to be stateful





You need to make your pages stateless to get rid of it



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

昨天偶然发现RenderStrategy.ONE_PASS_RENDER .

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

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

问题:还有其他我(还)不知道的缺点吗?有什么可以期待的惊喜吗?

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

提前致谢。

最佳答案

我们经历了类似的升级路径,升级后我的第一 react 是“哇,这些都是一些讨厌的 URL...”。

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

带有 Ajax 组件的页面可能是有状态的:当用户与页面交互时,您可以添加组件、删除其他组件等。使用 URL 参数中的页面 ID,如果您使用 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();
                    }
                }
            };
        }
    });

关于parameters - RenderStrategy.ONE_PASS_RENDER 是一种在 Wicket 应用程序中摆脱 ?1 等页面版本参数的合理方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14585858/

相关文章:

c - 4个参数? 3?

java - Wicket 无法解析测试中的属性

java - 在java中继承类是否可以,即使它不适合这项工作

java - Wicket:如何在运行时添加链接地址

kubernetes - 根据初始连接将流量定向到 Kubernetes Pod

flutter - 如何为仅限于实例的复选框小部件定义变量?

keras - 批处理内的 LSTM 状态

java - 使用 String[] args 参数作为 .setQ 参数中的变量 (Google Drive API V3)

java - 将一个对象添加到将另一个对象作为参数的 ArrayList

javascript - 创建一个将参数转换为数组的函数