Wicket - 实现复杂组件的最佳方式

时间:2018-02-01 04:56:55

标签: java forms components wicket reusability

我已经在Wicket中开始了一个有很多表单的应用程序,所以我正在寻找如何编写好的组件,可重用,主要是易于维护。

从指南中读取best practices,它表示要解耦更复杂的组件(在示例中是带有标签和面板的表单),使其自包含,定义创建每个表单组件的方法:

public class BlogEditPage extends WebPage {
...
    private Form<Blog> createBlogEditForm() {
        Form<Blog> form = newBlogEditForm();
        form.add(createHeadlineField());
        form.add(createContentField());
        form.add(createTagField());
        form.add(createViewRightPanel());
        form.add(createCommentRightPanel());
        form.setOutputMarkupId(true);
        return form;
    }

    // more methods here
}

起初这对我来说听起来很奇怪,但考虑到每个组件都有它自己的复杂性,验证规则,它是有道理的(这样它也可以很容易地重复使用)。

但是在same section中,它还表示不向组件创建工厂......现在它很奇怪,因为上面的代码片段就像工厂一样工作,而页面上有工厂来构建组件。即使创建表单组件的方法是私有的,只有表单才能使用它,并且可重用性丢失。因此,考虑到第二个建议,这些方法(即隐式组件工厂)不是一个好习惯。

欢迎任何关于如何创建复杂组件的说明(使用一些代码示例会更好)。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我们使用这种方法,它可以正常工作。

您展示的方法不是工厂。查看文档中的示例。 它们有类似LabelFactory.createLabel(id, model);的东西但是上面显示的方法并非如此。

在您显示的方法中,删除单词create。我们的组件如下所示:

   private AjaxFallbackDefaultDataTable table() {
      List<AbstractColumn> columns = new ArrayList<>();
      columns.add(new PropertyColumn(Model.of("Login"), "login", "login"));
      columns.add(new PropertyColumn(Model.of("First Name"), "firstName", "firstName"));
      columns.add(new PropertyColumn(Model.of("Last Name"), "lastName", "lastName"));
      AjaxFallbackDefaultDataTable dt = new AjaxFallbackDefaultDataTable("table", columns, new UserProvider(), 50);
      dt.setOutputMarkupPlaceholderTag(true);
      return dt;
   }

没有工厂。我们使用的另一个约定是方法的名称和组件的wicket id必须相同。这简化了代码导航。