Wicket:网站层次结构

时间:2012-01-25 16:06:49

标签: wicket

这是一个普遍的问题:如何在wicket中构建我的网站及其所有页面和组件(此处为面板)。我想展示我的尝试,并希望有人可以给我建议,或者有一个好方法,或者有更好的方法。

我的结构就像:

Root:主页
Page1扩展主页
第2页扩展主页
第3页扩展主页

页面包装内容和自己的导航。他们在HomePage.html中使用wicket child获取init。

现在,当我为Page1定义一个新的Panel时,我也必须为它定义一个链接。对于链接onClick(),我将其引用的面板设置为可见,将所有其他面板设置为不可见。此外,我必须在Page1面板上定义,当我导航到Page1时会显示该面板。所有其他面板都是隐形的。

这是一次好尝试还是有更好的方法?现在我初始化任何面板,只是让它们看不见。

1 个答案:

答案 0 :(得分:2)

回答你的问题......这假设你正在使用Wicket 1.4.x。

首先,您可以拥有多个级别的Page类,通常模仿设计和功能的重叠。例如,假设您有一个人们“写”,“浏览”和“阅读”用户创建的书籍的应用程序。

RootPage - common headers/footers, javascript imports
AbstractWritePage extends RootPage - for anything regarding authoring
AbstractBrowsePage extends RootPage - browsing
AbstractReadPage extends ReadPage - reading

然后,我实现了类似的东西:

FullLibraryPage extends AbstractBrowsePage
FilterSearchPage extends AbstractBrowsePage

从长远来看,它变得复杂,但非常强大。

其次,您的Panel组件可见/不可见。如果您使用的是Wicket 1.4.x,则应该查看每个Panel的可覆盖方法onConfigure()。在此面板中,您可以设置可见性,如:

@Override
protected void onConfigure() {
    super.onConfigure();
    setVisible(!navTriggered);

}

其中navTriggered是驻留在包含页面中的布尔值。然后,你的链接可以做一个简单的事情:

@Override
protected void onClick(AjaxRequestTarget target) {
    navTriggered = false;
    target.addComponent(/* Appropriate panels; see below for multiples */);
}

这样做的好处是可以使用相同的布尔变量触发多个面板。在页面创建时创建所有面板没有任何问题,即使它们开始不可见。

最后,如果您有许多需要更改/触发/等的面板,请考虑将IVisitor与标记界面配对。有点像...

public class Panel1 implements MyPanelGroup { ... }
public class Panel2 implements MyPanelGroup { ... }

然后,您可以使用IVisitor访问页面中MyPanelGroup的每个实例,并使用可见性执行操作(设置可见性,将其添加到AjaxRequestTarget等)。

希望能回答一些问题:)