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

2024-04-16

我们已经使用 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(使用前将#替换为@)

RenderStrategy.ONE_PASS_RENDER 是摆脱 Wicket 应用程序中的 ?1 等页面版本参数的合理方法吗? 的相关文章

  • MySQL:使用 PREPARE 命令命名参数?

    MySQL 中是否可以使用PREPARE命令与命名参数例如PDO in PHP 这是我的例子 SET s SELECT FROM MY TABLE WHERE my column 1 AND my column 2 PREPARE stmt
  • 如何在 C# 中将对象类型传递给类型参数

    我有一个具有类型参数的函数 public static object SetValuesToObject Type tClass DataRow dr return object 我不知道如何传递一个类作为该函数的参数 在这里我想传递参数类
  • 在自动模式下如何获取相机准确的白平衡参数值?

    我有一个Camera http developer android com reference android hardware Camera html白平衡设置为自动的对象 是否可以找到在拍照时应用的真实白平衡参数 似乎没有办法做到这一点
  • 动态设置布局参数

    我正在使用 CameraPreview 示例 API 演示 我需要添加一些覆盖 SurfaceView 的视图 按钮等 为此 我尝试设置它们的参数 但它们始终出现在屏幕的左上角 这是onCreate方法的代码 Override protec
  • 根据 URL 参数选择下拉菜单 - PHP 还是 jQuery?

    根据 URL 参数为我的表单选择输出 选定 的最佳方法是什么 在我的 URL 中 我可能有这个参数 term retail 我如何告诉下面的代码选择零售选项
  • 如果是 Edge 浏览器,则将自定义参数传递给 window.open

    从父窗口说 A 尝试使用 window open 打开另一个窗口 ChildWindow htm 我无法从 A 传递字符串值 var dialog window open Child Window htm title width 550px
  • 带参数的 C# ReportViewer 本地报表

    大家下午好 过去 2 周的大部分时间我都在寻求有关 C WinForm 应用程序问题的帮助 我有一个表单 其中有一个 DataGridView 显示从数据库中提取的详细信息 当用户双击该网格中的一行时 代码从 CustomerID 列中获取
  • C# 如何选择歧义和参数

    假设我有以下方法 public static void MyCoolMethod params object allObjects public static void MyCoolMethod object oneAlone params
  • 是否可以将 getopts 与位置参数混合使用?

    我想设计一个 shell 脚本作为几个脚本的包装器 我想指定参数myshell sh using getopts并将其余参数以相同的顺序传递给指定的脚本 If myshell sh执行方式如下 myshell sh h hostname s
  • Wicket、页面堆栈和内存使用情况

    Wicket 应用程序序列化并缓存所有页面以支持有状态组件 以及支持后退按钮 以及其他可能的原因 我有一个使用 setResponsePage 在屏幕之间导航的应用程序 在很短的时间内 会话就会变得相当大 因为所有先前的页面都存储在会话中
  • 在 Wicket 中使用 javascript(引导程序)

    首先 我使用 JavaScript 资源引用在 Wicket 中正确添加了 JavaScript response renderJavaScriptReference http code jquery com jquery latest j
  • Wicket setResponsePage() 方法如何工作?

    在学习 JSP 和 servlet 时 我听说了重定向和调度 他们中的哪一个做 Wicket 的setResponsePage 履行 What setResponsePage确实取决于几个因素 您调用 setResponsePage 的次数
  • 如何向 SDL 线程发送附加参数?

    是的 我知道如何创建 SDL 线程 int myfunc void data my code SDL CreateThread mythread SDL CreateThread myfunc NULL 但如果我想做类似的事情怎么办 int
  • Spring Boot 文件上传错误请求 400

    你好 我正在使用 Spring Boot 和 AngularJs 编写一个 Web 应用程序 需要一个简单的文件上传 但目前无法正常工作 我已经读到 当 mvc 依赖项存在时 Spring Boot 应该自动配置分段上传本身 从 https
  • 如何在存储过程中调用存储过程(带2个参数)?

    我有具有相同参数 服务器名称和日期 的存储过程 我想编写一个存储过程并在该 SP 中执行它们 称为 SP All CREATE PROCEDURE dbo SP All AS BEGIN exec sp 1 myDate datetime
  • 根据给定的索引集获取参数包的子集

    好吧 这确实是一件困难的事情 我希望能够通过在给定的一组有效索引处选择参数类型来获取参数包的子集 然后使用该参数包作为函数的参数列表 IE template
  • SSIS ODBC SQL 参数

    我在 odbc 源数据流任务中有一个 SQL 命令需要采用参数 但不存在添加参数的选项 我尝试将数据库添加为与 ODBC 提供程序的 ADO NET 连接 但也没有可用的参数 还尝试将其作为 OLEDB 连接 但没有可用于 ODBC 的提供
  • 如何执行带有参数的命令?

    如何在 Java 中执行带有参数的命令 我试过了 Process p Runtime getRuntime exec new String php var www script php m 2 这是行不通的 String options n
  • Powershell“特殊”开关参数

    我有下面的powershell功能 Function Test Param Parameter string Text default text Write Host Text Text 我希望能够像下面这样调用这个函数 测试 文本 应该在
  • 将参数传递给基类构造函数

    如果基类和派生类都有带参数的构造函数 那么我们在哪里将参数传递给基类构造函数 像这样 public class DerivedClass BaseClass public DerivedClass int derivedParam Stri

随机推荐

  • PHP登录将密码存储在txt中[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在 我知道将密码存储在文本文件中并不安全 但不用担心 安全不是我的目标 这就像那些 hackme 网站之一 所以 我需要知道 如何将
  • 如何测试 sbt 解析器

    在我的本地计算机上 我有一个常春藤缓存 该缓存已通过处理多个项目而被填充 图书馆X使用解析器加载Y在项目中A 同一个图书馆X项目中使用的B 解析这个库没有问题 因为它在我的本地缓存中 当我的一位同事加载项目时B他得到了图书馆的错误X无法解决
  • 使用 SQL 查找给定 x、y 坐标的填充矩形

    给定以下填充的 x y 坐标 0 0 0 1 0 2 1 0 1 1 1 2 2 0 2 1 2 2 4 0 4 1 5 0 5 1 如何编写 SQL 查询来确定所有填充的矩形 矩形由其左上角和右下角定义 期望的结果 x1 y1 x2 y2
  • UWP StoreProductQueryResult 不返回任何产品

    我们无法返回 Windows 应用商店应用程序的附加产品列表 我们在 Windows 应用商店中有一个包含 3 个订阅附加组件的应用程序 这些附加组件被标记为隐藏 因为我们不希望它们只能通过我们的应用程序在商店中可见 我们正在开发针对 Wi
  • 通过键盘快捷键重新缩进 XML

    我正在浏览数百个 xml 文件 当我在记事本 中打开它们时 我必须对每个文件执行 HTML Tidy gt re indent XML 对于一个文件来说 这一步骤并不会花费太长的时间 但是加起来就会产生很多很多的文件 有没有办法将其放在记事
  • Linux 上的 mpc / mpd:如何播放本地 wav 文件

    我正在尝试将本地文件添加到 mpd 通过 mpc 并播放它 我的平台是OpenWRT嵌入式linux 因此 从手册页来看 它指出 mpc add
  • 如何将 .sql 文件的内容读入 R 脚本以运行查询?

    我已经尝试过readLines和read csv功能 但随后不起作用 以下是该内容的内容my script sql file SELECT EmployeeID FirstName LastName HireDate City FROM E
  • Node Express 中的 res.sendfile 并传递数据

    有没有办法从 Node JS 应用程序重定向到 HTML 文件 例如 res sendFile http expressjs com api html res sendFileExpress 并将 JSON 数据传递到 html 文件 我知
  • Bash 子 shell:括号:() VS 美元括号:$()

    在 bash 中 两者 and 创建一个子shell 彼此之间有什么区别 它们的典型用途是什么 只是创建一个复合命令 运行括号内的命令 做同样的事情 但也替换输出 来自文档 list list在子shell环境中执行 变量赋值和内置 影响
  • Docker Swarm如何实现卷共享?

    Docker Swarm 可以管理两种类型的存储 volume and bind While bindDocker 文档不建议这样做 因为它在本地目录 在每个 swarm 节点上 与任务之间创建了绑定 volume没有提到实现 所以我不明白
  • apache centos 上的多个 php

    如何在 Centos 6 5 上同时运行多个 php 版本 就是这样 要求Centos 6 5 可能适用于 6 6 和 7 Apache Apache 2 2 15 可能与其他版本一起使用 本指南安装和使用FASTCGI 请参阅替代安装的注
  • 获取 JavaScript 数组中的下一个和上一个元素

    我有一个很大的数组 带有非连续的 ID 看起来像这样 PhotoList 89725 new Array PhotoList 89725 ImageID 89725 PhotoList 89725 ImageSize 123 PhotoLi
  • 如何创建ear文件,并在其中包含war和jar文件

    我正在尝试从命令提示符创建 EAR 文件 我用过 jar cvf myServletWAR ear 但我的问题是 如何让这个 EAR 文件中包含 WAR 文件和 JAR 文件 我需要单独创建war文件并包含在ear文件中吗 我无法为此使用
  • 使用prepareForReuse的正确方法是什么?

    需要帮助了解如何在 UIKit 中使用prepareForReuse 这文档 https developer apple com reference uikit uitableviewcell 1623223 prepareforreuse
  • Django:为索引列指定 HASH 而不是 BTREE

    Django 模型中有没有好的方法来指定特定的索引存储类型 例如 MySQL 的默认存储类型是 BTREE 而对于我的特定列 使用 HASH 哈希表 作为存储类型可能会更有效 如果不创建自定义字段或修改 django 核心 我找不到一个好方
  • 黑莓中的队列线程

    我查看了 BB API 5 0 但找不到任何串行执行一批线程的方法 我知道 BB 对启动的线程数量有限制 所以如果用户点击速度足够快但我找不到像线程池这样的东西 我不想启动 7 是否有一个简单的解决方案 或者我是否必须创建一个数据结构 如果
  • Swift 2 错误处理和 while

    例如下面的代码 while let data Provider getData 使用 Swift 2 你会遇到两个错误 条件绑定的初始化程序必须具有可选类型 而不是 字符串 调用可以抛出 但它没有标记为 try 并且错误不会被处理 在这里进
  • 小样式自定义评级栏(只读自定义评级栏)

    我尝试创建一个自定义评级栏 我不使用style因为我只用过一次 所以 我创建了一个layer list in the drawable文件夹 其名称是custom rating bar xml
  • 在 UIWebView 中打开的 HTML 页面中自动填充用户名和密码

    使用 UIWebView 自动填充数据时如何使用 RegsEx 查找登录表单 我使用以下代码来获取所有表单数据 int NoOfForms self browser stringByEvaluatingJavaScriptFromStrin
  • RenderStrategy.ONE_PASS_RENDER 是摆脱 Wicket 应用程序中的 ?1 等页面版本参数的合理方法吗?

    我们已经使用 Wicket 1 3 7 几年了 目前正在将我们的项目升级到 wicket 6 x 我对页面版本参数做了很多研究 例如 1 附加到每个 URL 以及如何删除它们 不幸的是 在官方文档中找不到这方面的详细信息 在这样做的同时 我