簡體   English   中英

無狀態Apache Wicket無狀態頁面/請求

[英]Stateless Apache Wicket stateless pages/requests

所以我正在閱讀Wicket標簽下的另一個問題 ,比較Apache WicketApache Click 在我看來,這是一個簡明的解釋。 我比Wicket世界更熟悉Click世界。

我讀到的其中一條評論是你可以制作無狀態的Wicket頁面。 我開始考慮這個問題,無法找到一種方法來為無狀態的東西發出請求或頁面請求。 在某些情況下,這肯定會派上用場。 那么如何在沒有狀態的情況下開始使用Wicket?

Wicket默認是無狀態的,並在需要時切換到有狀態模式。 打破無狀態模式非常容易。

我發現它是有用的注釋預期無狀態頁面和無狀態組件與@StatelessComponent ,這是在檢票devutils項目中找到。 然后我在我的WebApplication.init()方法中添加一個StatelessChecker ,如下所示:

protected void init(){
    ...
    this.addPostComponentOnBeforeRenderListener(new StatelessChecker());
    ...
}

這樣我總是得到關於違規有狀態組件的例外。

如果頁面是可收藏的並且不包含任何非無狀態組件/行為,則頁面將自動無狀態並且不會存儲在會話中。 我認為只要用戶只訪問無狀態頁面,就不會創建會話。 在大多數情況下,如果關於如何顯示頁面的所有內容都可以僅使用no-args構造函數或采用PageParameters參數的構造函數來確定。 普通的Link和Form類不是無狀態的,因此您需要使用StatelessForm和StatelessLink。

我更願意在測試中檢查一下。

因此無狀態頁面的每個測試都會覆蓋

getStatelessWebPage()

默認情況下返回null。

然后在基本測試中我有通用測試,訪問頁面上的所有組件並檢查組件是否是無狀態的

@Test
public void checkForStateless()
{
    StatelessWebPage statelessPage = getStatelessWebPage();
    if (statelessPage != null)
    {
        Page page = (Page)statelessPage;
        if (!page.isPageStateless())
        {
            //find the reason
            Component statefulComponent = page.visitChildren(Component.class, new StatelessChecker());
            if (statefulComponent != null)
            {
                fail("Stateless page contains stateful component ["
                     +statefulComponent.getClass().getName()+" : "
                     + statefulComponent.getMarkupId() +"]");
            }
        }
    }
}

class StatelessChecker implements IVisitor<Component, Component>
{
    @Override
    public void component(Component component, IVisit<Component> iVisit)
    {
        if (!component.isStateless())
        {
            iVisit.stop(component);
        }
    }
}

如果您有意圖確保無狀態的頁面,則setStatelessHint(boolean state)方法很有用。

如果頁面不是無狀態,它會發出警告。

有關更多信息,請參閱此處: Wicket無狀態頁面

根據用戶是否已進行身份驗證,頁面可以是無狀態還是有狀態的情況如何?

一個示例可能是典型的“帳戶”面板,它位於大多數網頁的頂部,顯示當前登錄的用戶名,個人資料鏈接等,

網站上的大多數頁面都位於頂部,這意味着兩個頁面必須能夠同時具有狀態和無狀態,具體取決於用戶是否已登錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM