小门片段,缺少结束标记

时间:2018-08-08 13:39:23

标签: java-8 wicket

我正在尝试遵循Wicket manual中给出的示例。据我了解,根据手册,我的代码应生成带有单个复选框的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]]

至少可以使用结束标签,不是吗?

HTML正文部分:

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

Java部分:

public Home() {
    RepeatingView rv = new RepeatingView("formElement");
    Fragment chkbox = new Fragment("formElement", "chk", rv);
    rv.add(chkbox);
    this.add(rv);
  }

2 个答案:

答案 0 :(得分:1)

应该是:

<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);
  }

不幸的是,“片段”无法重用,因为硬编码的wicket:id都被用于查找 HTML标记块和用于添加它到目标容器。而且您不能添加两个具有相同ID的组件。

答案 1 :(得分:0)

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

您所遇到的问题是您缺少一个HTML元素,该元素将占用Fragment生成的HTML。

我将与Panel进行解释,因为我认为它比较容易,但它们或多或少是相同的。使用Panel时,您需要声明类似<div wicket:id="myPanel">的内容,然后在Java代码中声明类似的内容:

add(new MyPanel("myPanel", ...));

Wicket将呈现MyPanel并将生成的HTML用作<div wicket:id="myPanel">的子代。

与Fragment相同-您需要:

  • 声明:<div wicket:id="someId">
  • 标记:<wicket:fragment>(就像<wicket:panel>一样)