所以我在比较another question和Apache Wicket的Wicket标记下阅读Apache Click。在我看来,这是一个简明的解释。我对Wicket世界比对Click世界更熟悉。
我读到的一条评论是你可以制作无状态的Wicket页面。我开始考虑这个问题,无法找到一种方法来为无状态的东西发出请求或页面请求。在某些情况下,这肯定会派上用场。那么如何在没有状态的情况下开始使用Wicket?
答案 0 :(得分:16)
Wicket默认是无状态的,并在需要时切换到有状态模式。打破无状态模式非常容易。
我发现使用@StatelessComponent
注释目标无状态页面和无状态组件很有用,可以在 wicket-devutils项目中找到它。然后我补充说
我的StatelessChecker
方法中的WebApplication.init()
是这样的:
protected void init(){
...
this.addPostComponentOnBeforeRenderListener(new StatelessChecker());
...
}
这样我总是会对有问题的有状态组件有例外。
答案 1 :(得分:8)
如果页面是可收藏的并且不包含任何非无状态组件/行为,那么该页面将自动无状态并且不会存储在会话中。我认为只要用户只访问无状态页面,就不会创建会话。在大多数情况下,如果关于如何显示页面的所有内容都可以仅使用no-args构造函数或采用PageParameters参数的构造函数来确定。普通的Link和Form类不是无状态的,所以你需要使用StatelessForm和StatelessLink。
答案 2 :(得分: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);
}
}
}
答案 3 :(得分:3)
如果您有网页,您有意确保无状态,setStatelessHint(boolean state)
方法很有用。
如果页面不是无状态,它会发出警告。
有关详细信息,请参阅此处:Wicket Stateless pages
答案 4 :(得分:0)
根据用户是否已进行身份验证,页面可以是无状态还是有状态的情况怎么样?
一个示例可能是典型的“帐户”面板,它位于大多数网页的顶部,显示当前登录的用户名,个人资料链接等。
网站上的大多数页面都位于顶部,这意味着两个页面必须能够同时具有状态和无状态,具体取决于用户是否已登录。