如何在 Apache Wicket 1.5 中禁用页面版本控制? setVersioned(false) 似乎还不够

How to disable page versioning in Apache Wicket 1.5? setVersioned(false) doesn't seem to be enough

我得到了这个旧的 Apache Wicket 1.5 Web 应用程序。

所有网址似乎都以 ?xxx 结尾,其中 xxx 是一个数字。这似乎是一个 Wicket "feature",它允许您对以前显示的网页进行版本控制/缓存。听起来可能不错,但实际上这对所有相关用户来说都是一件令人头疼的事情,因为即使页面上显示的基础数据发生变化并且用户强制刷新页面,旧的、陈旧的页面仍然会重新加载。

我在网上浏览过,在 Wicket 的文档中它似乎被称为 "versioning"。

我试图通过调用 setVersioned(false) 来禁用它,但没有用——我看不出有什么明显的区别。有谁知道如何让它工作?

谢谢

问题是您的应用程序将数据缓存到模型中。在 Wicket 术语中,这称为 static 模型。

例如:

Person person123 = personService.get(123);

// a static model
page.add(new Label("personMood", new Model(person123.getMood())));

这里的Label会一直显示Label实例化时人物的心情。这个人可能会在下一秒改变 his/her 心情,但 Label 仍然会显示 old/cached 值。

// a dynamic model
page.add(new Label("personMood", new Model<String>() {
  @Override public String getObject() {
     return person123.getMood();
  }
}));

此处标签将在每次呈现此 label/page 时呈现此人的 当前 心情。

url 中的 pageId 告诉 Wicket 要从页面存储中查找和加载哪个 stateful 页面。只有有状态页面才有这样的 id。如果你想摆脱它,那么你应该在你的页面中只使用无状态组件和行为。有 wicket-devutils 模块提供 StatelessChecker 来帮助您识别页面意外变为有状态的原因。

在您的情况下,我不确定哪种解决方案更容易 - 重新处理模型或使页面无状态。通常第一个更容易。