【问题标题】:How to use j2html when have a method that needs to return multiple tags?当有一个需要返回多个标签的方法时如何使用j2html?
【发布时间】:2018-01-25 21:25:56
【问题描述】:

当有一个方法需要返回多个标签时如何使用j2html

所以这里我有一个可重用的方法,它为特定选项构造标签和输入字段。标签放在一个 td 中,输入字段放在另一个 td 字段中,都在一个 tr 中,然后返回 tr。

从逻辑上讲,这只是一件事(用户输入),因此在单个方法中而不是在标签和输入的单独方法中具有意义。这适用于我的网页,其中我有一系列行,每行都包含标签和输入字段,所有行都在表格中很好地排列。 (来自 Java 背景,我认为将 table 用作简单的布局管理器,然后尝试完全使用 CSS 是一种更明智的方法)

public Tag addInputTextTr(UserOption userOption, String value, String className)
{
    return tr(
            td(label(userOption.getLabelMsg())
                    .withTitle(userOption.getTooltipMsg())),
            td(input()
                    .withType(Html.TEXT)
                    .withName(userOption.getOption()).withValue(value)
                    .withClass(className)
            )
    );
}

调用代码

addInputTextTr(UserOption.LICENSE_GUID1, licenseGuid1, LICENSE_INPUTFIELD_CLASS)

我的问题是有时我需要三个表格单元格,这样我就可以在行尾添加一个按钮。所以为了解决这个问题,我应该只从这个函数返回 tds 并在调用方法中自己包装到 tr 中,但是我不能只返回两个 tds 除非我包装到一个列表中,那么这意味着我必须在调用代码中使用 each()这使它复杂化了。我不能在 span() 中返回它们,因为 tr() 中不允许 span()。

public List<Tag> addInputTextTds(UserOption userOption, String value, String className)
    {
        List<Tag> tds = new ArrayList<>();
        tds.add(
            td(label(userOption.getLabelMsg())
                    .withTitle(userOption.getTooltipMsg())));
        tds.add(
            td(input()
                    .withType(Html.TEXT)
                    .withName(userOption.getOption()).withValue(value)
                    .withClass(className)
            )
        );
        return tds;
    }

现在调用代码

tr(
   each(addInputTextTds(UserOption.LICENSE_EMAIL, licenseEmail, LICENSE_INPUTFIELD_CLASS),
           next -> next
   )
),

我一直在寻找可以用于存储多个元素的 j2html 返回类型?

【问题讨论】:

  • @Stormcloud,好主意我会试一试

标签: j2html


【解决方案1】:

为此我花了一段时间尝试不同的解决方案。我能想到的最简单的是:

public static void main(String[] args) {
    String html =
        html(
          body(
            ul(
              makeSomeChildren()
            )
          )
        ).renderFormatted();
}

private static DomContent makeSomeChildren() {
    return join(b("Child 1"), b("Child 2"));
}

产生:

<html>
    <body>
        <ul>
            <b>Child 1</b><b>Child 2</b>
        </ul>
    </body>
</html>

【讨论】:

  • 是的。我让我原来的解决方案太复杂了。我现在用更简单的东西编辑了它。诀窍是将makeSomeChildren() 的返回类型更改为DomContent,因为join() 返回UnescapedText。希望这会有所帮助
  • 啊,它只适用于文本而不适用于 td 等元素吗?
  • 不完全——你可以在join 中拥有任何你喜欢的东西,只是join 将子元素转换为恰好包含HTML 标记的文本。实际上,子元素将在容器之前呈现。顺便说一句,我认为这就是为什么父对象的格式化渲染并不总是按预期工作的原因。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2013-11-09
  • 2017-08-05
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多