2013-06-12 70 views
1

任何人都可以解释我Wicket的页面版本控制有用吗? FAQ中有一条与此主题相关的文章:Wicket页面版本控制和历史记录支持

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

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

但不幸的是我根本不理解它。当我点击第2页上的ListItem时,我希望进入该链接定义的页面 - 该项目的详细信息页面。为什么我应该在第3页上的项目的详细信息页面?

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

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

回答

3

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

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

  • 您点击'下一个'链接,它指的是第1页的链接。在服务器上,加载页面v1,执行链接逻辑(以提前分页),页面用于呈现HTML,并存储为页面v2。您可以看到11到20个项目。

  • 您点击'下一个'链接,它指向页面v2中的链接。在服务器上,页面v2被加载,链接逻辑被执行(提前分页),页面被用来呈现HTML,并被存储为页面v3。您看到的项目从21到30.

  • 您点击项目25的'details'链接,它指的是第v3页中第5个项目的链接(此页面只显示10个项目,链接,甚至如果它指的是完整列表中的第25项,则在本页中仅为第5项)。在服务器上,页面v3被加载,其逻辑被执行,页面'detail'被创建,被存储为页面v4,并且被重定向到它。您的浏览器请求第v4页,服务器加载它,并使用它来呈现您的HTML页面(不存储新版本,因为它只是渲染)。你看的项目25

  • 细节单击浏览器的“返回”按钮2次,看网页“列表”显示11至20个项目,涉及到网页V2(列表)。然后,您单击项目13的链接'详细信息'。在服务器上,页面v2已加载(而不是v4,最后一个已执行),因为单击的链接指向此页面版本。然后,执行第三项链接的逻辑,创建一个新页面的“详细信息”,并将其存储为页面v5,然后将其重定向到该页面。浏览器请求页面v5,服务器加载它,并使用它来呈现您的HTML。你看细节项目3

这一切似乎有些奇怪,如果你来自一个Struts样的背景,你永远都只是把项目ID或页面显示为链接参数。在Wicket中,通常的情况是将所有状态存储在服务器中,并且导航不是由客户端完成的(直接链接到另一个页面传递参数),而是在服务器中。链接只是要求服务器在页面对象版本中执行代码,导航是在服务器端完成的。你可以争辩说Struts风格更简单(你也可以在Wicket中这样做,它不是最优的),但是只保留服务器的状态有许多好处。拳头,一旦你习惯了,它实际上更容易。无需为分页链接添加每个参数(搜索参数,第一项,页面长度,排序列,顺序方向等)。此外,您避免了许多安全问题(您不能只将URL ID参数更改为任意值并访问其他用户的数据),并且可以控制Java代码中的所有内容,而不是混合的Java-Javascript(如果仍然可以,请执行以下操作尽管如此)。

+0

是的,现在看起来更清洁了。我也很困惑,因为我使用的是Firefox,当你按下按钮时,它会从内部历史缓冲区中呈现页面。所以它不会要求检票页。 – Behnil