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

时间:2013-06-12 15:31:49

标签: wicket

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

  

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

     

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

但不幸的是我根本不明白。当我在第2页上单击ListItem时,我希望到达该链接所定义的页面 - 该项目的详细信息页面。我为什么要进入第3页上该项目的详细信息页面?

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

那么这个版本的运作方式是什么?

1 个答案:

答案 0 :(得分: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次,并参阅页面v2(列表),查看显示项目11到20的页面'列表'。然后单击项目13的链接“详细信息”。在服务器上,加载页面 v2 (不是v4,最后一个执行),因为单击的链接指向此页面版本。然后,执行第3项链接的逻辑,创建新页面“详细信息”,存储为页面 v5 ,然后重定向到它。浏览器请求页面v5,服务器加载它,并使用它来呈现HTML。您会看到第3项的详细信息。

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

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