Java 无状态Apache Wicket无状态页面/请求

Java 无状态Apache Wicket无状态页面/请求,java,wicket,Java,Wicket,所以我在Wicket标签下阅读并比较。在我看来,这是一个简洁的解释。我更熟悉Wicket世界,而不是Click世界 我读到的一条评论是,您可以创建无状态Wicket页面。我开始思考这个问题,但想不出一种方法来对无状态的东西发出请求或页面请求。这在某些情况下肯定会派上用场。那么如何开始使用没有状态的Wicket呢?如果一个页面是可书签的,并且不包含任何非无状态的组件/行为,那么该页面将自动成为无状态的,不会存储在会话中。我认为,只要用户只访问无状态页面,就不会创建会话。在大多数情况下,如果关于页面

所以我在Wicket标签下阅读并比较。在我看来,这是一个简洁的解释。我更熟悉Wicket世界,而不是Click世界


我读到的一条评论是,您可以创建无状态Wicket页面。我开始思考这个问题,但想不出一种方法来对无状态的东西发出请求或页面请求。这在某些情况下肯定会派上用场。那么如何开始使用没有状态的Wicket呢?

如果一个页面是可书签的,并且不包含任何非无状态的组件/行为,那么该页面将自动成为无状态的,不会存储在会话中。我认为,只要用户只访问无状态页面,就不会创建会话。在大多数情况下,如果关于页面显示方式的所有内容都可以仅通过无参数构造函数或采用PageParameters参数的构造函数来确定。正常的链接和表单类不是无状态的,因此您需要使用无状态的表单和无状态的链接。

Wicket默认为无状态,并在需要时切换到有状态模式。打破无状态模式非常容易

我发现用
@StatelessComponent
注释预期的无状态页面和无状态组件非常有用,这可以在wicket devutils项目中找到。然后我补充说 我的
WebApplication.init()
方法中的
StatelessChecker
,如下所示:

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

通过这种方式,我总是会得到一个关于有问题的有状态组件的异常。

如果您有有意确保无状态的页面,那么
setStatelessHint(布尔状态)
方法非常有用

如果页面不是无状态的,它会发出警告


有关更多信息,请参见此处:

我更喜欢在测试中检查

因此,对于无状态页面覆盖的每个测试

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() +"]");
            }
        }
    }
}

类无状态检查器实现IVisitor
{
@凌驾
公共空心构件(构件构件、IVisit IVisit)
{
如果(!component.isStateless())
{
iVisit.stop(组件);
}
}
}

根据用户是否已授权,页面可能是无状态或有状态的情况如何

典型的“帐户”面板就是一个例子,它位于大多数网页的顶部,显示当前登录的用户名、配置文件链接等


网站上的大多数页面顶部都会有这样的内容,这意味着根据用户是否登录,这两个页面必须同时具有状态和无状态。

谢谢Geoff。现在那些无国籍的人的存在。。。组件也有意义。上面的链接不起作用,请尝试以下操作:
class StatelessChecker implements IVisitor<Component, Component>
{
    @Override
    public void component(Component component, IVisit<Component> iVisit)
    {
        if (!component.isStateless())
        {
            iVisit.stop(component);
        }
    }
}