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

问题描述

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

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

我在网上浏览过,在 Wicket 的文档中,它似乎被称为“版本控制”。

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

谢谢

标签: wicket

解决方案


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

例如:

Person person123 = personService.get(123);

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

在这里,标签将始终显示人在标签实例化时的心情。该人可能会在下一秒改变他/她的情绪,但标签仍会显示旧/缓存的值。

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

在这里,标签将在此标签/页面的每次渲染时渲染此人的当前情绪。

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

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


推荐阅读