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

所以我正在阅读Wicket标签下的另一个问题 ,比较Apache Wicket和Apache Click 。 在我看来,这是一个简明的解释。 我比Wicket世界更熟悉Click世界。

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

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

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

我发现用@StatelessComponent注释无意义的无状态页面和无状态组件很有用,它可以在wicket-devutils项目中找到 。 然后我在我的WebApplication.init()方法中添加一个StatelessChecker ,如下所示:

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

这样我总是得到关于违规有状态组件的例外。

我更愿意在测试中检查一下。

因此无状态页面的每个测试都会覆盖

 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 { @Override public void component(Component component, IVisit iVisit) { if (!component.isStateless()) { iVisit.stop(component); } } } 

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

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

有关更多信息,请参阅此处: Wicket无状态页面

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

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

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