Wicket页面版本控制和历史记录支持

Wicket页面版本控制和历史记录支持,wicket,Wicket,谁能解释一下Wicket的页面版本控制有什么用?中有一篇文章与此主题相关: Wicket存储支持浏览器后退按钮的页面版本 假设您有一个在ListItems中包含链接的分页ListView,并且您已经单击以显示项目的第三页。在第三个页面上,单击链接以查看该项目的详细信息页面。现在,服务器上当前可用的状态是,当您单击链接时,您在第3页。然后单击浏览器的返回按钮两次(即返回到列表第3页,然后返回到列表第2页,但全部在浏览器中)。当您在第2页时,服务器状态是您在第3页。如果没有版本控制,单击第2页上的L

谁能解释一下Wicket的页面版本控制有什么用?中有一篇文章与此主题相关:

Wicket存储支持浏览器后退按钮的页面版本

假设您有一个在ListItems中包含链接的分页ListView,并且您已经单击以显示项目的第三页。在第三个页面上,单击链接以查看该项目的详细信息页面。现在,服务器上当前可用的状态是,当您单击链接时,您在第3页。然后单击浏览器的返回按钮两次(即返回到列表第3页,然后返回到列表第2页,但全部在浏览器中)。当您在第2页时,服务器状态是您在第3页。如果没有版本控制,单击第2页上的ListItem链接实际上会将您带到第3页上某个项目的详细信息页面

但不幸的是,我一点也不明白。当我单击第2页上的ListItem时,我希望能够进入由该项目的Link-details页面定义的页面。为什么我要进入第3页项目的详细信息页面

此外,当在浏览器中按下后退按钮时,它根本不会调用服务器。是这样吗


那么这个版本控制是如何工作的呢?

不,当您按下后退按钮时,不会通知服务器。我将尝试解释示例中发生的情况:

  • 您第一次访问您的应用程序。在服务器上,将创建一个页面“列表”,用于呈现您在浏览器中看到的HTML,并存储为第v1页。您将看到列表的前10项

  • 您单击“下一步”链接,它指向第v1页中的链接。在服务器上,加载页面v1,执行链接逻辑(以推进分页),页面用于呈现HTML,并存储为页面v2。您可以看到从11到20的项目

  • 单击“下一步”链接,它指向第v2页中的链接。在服务器上,加载第v2页,执行链接逻辑(以推进分页),该页用于呈现HTML,并存储为第v3页。您可以看到从21到30的项目

  • 单击第25项的“详细信息”链接,它指的是第v3页中第5项的链接(该页仅显示10项,该链接即使指的是完整列表中的第25项,在该页中也只是第5项)。在服务器上,加载页面v3,执行其逻辑,创建页面“详细信息”,存储为页面v4,并将您重定向到该页面。浏览器请求页面v4,服务器加载它,并使用它呈现HTML页面(没有存储新版本,因为它只是呈现)。您可以看到第25项的详细信息

  • 您点击浏览器的“后退”按钮2次,并查看显示项目11至20的页面“列表”,参见第v2页(列表)。然后单击项目13的“详细信息”链接。在服务器上,加载了第v2页(不是最后执行的第v4页),因为单击的链接指向此页面版本。然后,执行第三项链接的逻辑,创建一个新的页面“详细信息”,存储为第5页,并将您重定向到该页面。浏览器请求页面v5,服务器加载它,并使用它呈现HTML。您可以看到第3项的详细信息

如果您来自类似Struts的背景,那么所有这些都可能看起来很奇怪,您总是将项目id或要显示的页面作为链接参数。在Wicket中,通常的情况是将所有状态存储在服务器中,导航不是由客户端完成的(直接链接到另一个传递参数的页面),而是在服务器中完成的。一个链接只是要求服务器执行页面对象版本中的代码,导航是在所有服务器端完成的


您可能会认为Struts样式更简单(您也可以在Wicket中实现,但它不是最优的),但将状态仅保留在服务器中有许多优点。首先,一旦你习惯了,它实际上就容易多了。无需将每个参数添加到分页链接(搜索参数、第一项、页面长度、排序列、订单方向等)。此外,您还避免了许多安全问题(您不能只是将URL id参数更改为任意值并访问其他用户的数据),并且可以控制Java代码中的所有内容,而不是混合Java Javascript(不过,如果您愿意,您仍然可以这样做)。

是的,在我看来,现在更干净了。我也很困惑,因为我使用的是Firefox,当你按下back按钮时,它会从它的内部历史缓冲区呈现页面。所以它没有向wicket索要页面。