【问题标题】:Stateless Apache Wicket stateless pages/requests无状态 Apache Wicket 无状态页面/请求
【发布时间】:2010-02-01 16:32:47
【问题描述】:

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

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

【问题讨论】:

标签: java wicket


【解决方案1】:

如果您有意确保页面是无状态的,setStatelessHint(boolean state) 方法很有用。

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

更多信息请看这里:Wicket Stateless pages

【讨论】:

    【解决方案2】:

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

    我发现使用 wicket-devutils 项目 中的@StatelessComponent 注释预期的无状态页面和无状态组件很有用。然后我添加 StatelessChecker 在我的 WebApplication.init() 方法中是这样的:

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

    这样我总是会得到一个关于有问题的有状态组件的异常。

    【讨论】:

      【解决方案3】:

      如果页面是可收藏的并且不包含任何非无状态组件/行为,则该页面将自动无状态并且不存储在会话中。我认为只要用户只访问无状态页面,就不会创建会话。在大多数情况下,如果有关页面显示方式的所有内容都可以仅通过无参数构造函数或采用 PageParameters 参数的构造函数来确定。普通的 Link 和 Form 类不是无状态的,因此您需要改用 StatelessForm 和 StatelessLink。

      【讨论】:

      • 谢谢杰夫。现在,那些无状态......组件的存在也很有意义。
      【解决方案4】:

      我更喜欢在测试中检查。

      所以无状态页面的每个测试都会覆盖

      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);
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        根据用户是否进行身份验证,页面可以是无状态或有状态的情况如何?

        一个示例可能是位于大多数网页顶部的典型“帐户”面板,显示当前登录的用户名、个人资料链接等,

        网站上的大多数页面都会在顶部有这个,这意味着两个页面都必须能够是有状态和无状态的,这取决于用户是否登录。

        【讨论】:

          猜你喜欢
          • 2011-02-08
          • 2016-06-08
          • 2016-07-07
          • 2018-04-17
          • 2021-04-14
          • 2012-05-21
          • 2019-12-10
          • 1970-01-01
          • 2021-10-01
          相关资源
          最近更新 更多