2013-06-12 65 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