Java 8 导叶碎片,缺少结束标记

Java 8 导叶碎片,缺少结束标记,java-8,wicket,Java 8,Wicket,我正试图遵循中给出的示例。我的理解是,根据手册,我的代码应该生成一个带有单个复选框的HTML表单。没有。我在这里误解了什么 特别是,我的英语中有一个莫名其妙的例外: org.apache.wicket.markup.MarkupException: Close tag not found for tag: <div wicket:id="formElement">. For Fragment Components only raw markup is allow in between

我正试图遵循中给出的示例。我的理解是,根据手册,我的代码应该生成一个带有单个复选框的HTML表单。没有。我在这里误解了什么

特别是,我的英语中有一个莫名其妙的例外:

org.apache.wicket.markup.MarkupException: Close tag not found for tag: <div wicket:id="formElement">. For Fragment Components only raw markup is allow in between the tags but not other Wicket Component.. Component: [Fragment [Component id = formElement]]
应该是:

<body>
  <p>Foo</p>
  <form>
    <div wicket:id="formElement"></div>
      <wicket:fragment wicket:id="chk">
        <input type="checkbox">
      </wicket:fragment>

    <input type="submit" value="request">

  </form>
</body>

不幸的是,“片段”不可重用,因为硬编码的
wicket:id
用于查找HTML标记块并将其添加到目标容器中。并且不能添加具有相同ID的两个组件。

Wicket Fragment是一个内联面板。也就是说,您只需将其Java代码放在标记提供程序的Java文件中,将其HTML放在标记提供程序的HTML代码中

您案例中的问题是缺少一个HTML元素,该元素将使用片段生成的HTML

我将用面板来解释,因为我认为这更容易,但它们或多或少是一样的。使用面板时,需要声明类似于
的内容,然后在Java代码中声明类似于:

add(new MyPanel("myPanel", ...));
Wicket将呈现MyPanel并将生成的HTML用作
的子级

对于Fragment,它是相同的-您需要:

  • 声明:
  • 标记:
    (就像

谢谢,我理解它的工作原理。看起来非常可笑的是,由于硬编码的、不可变的id,一个人只能向一个特定的父级“添加”一次特定的片段。正如我在回答中指出的,我现在的问题是如何重用相同的片段,比如说,自动生成web表单。但这将是另一个问题。此外,我已经使用了2个Thymeleaf模板。为此,您需要使用一个转发器,例如RepeatingView或ListView。使用这些组件,您可以有许多子组件(面板、片段、任何组件)。因此,您可以动态地决定为每个子级使用哪个片段。ApacheISIS()Wicket viewer使用它根据实体类动态自动生成web表单。
<body>
  <p>Foo</p>
  <form>
    <div wicket:id="formElement"></div>
      <wicket:fragment wicket:id="chk">
        <input type="checkbox">
      </wicket:fragment>

    <input type="submit" value="request">

  </form>
</body>
  public Home() {
    RepeatingView rv = new RepeatingView("formElement");
    Fragment chkbox = new Fragment("formElement", "chk", this);

    rv.add(chkbox);
    this.add(rv);
  }
add(new MyPanel("myPanel", ...));