Play 2框架:scala在视图中迭代java对象的字段

Nik*_*sov 3 html java scala playframework playframework-2.0

我正在将Java对象传递给视图:

我不知道是否有可能将对象的所有字段都作为集合(类似于Java中的反射)然后在循环中打印它们而不是列出所有字段,如下所示:

@(item: Item)

<li data-item-id="@item.id">
    <h4>@item.name</h4>
    <h3>@item.field1</h3>
    <h3>@item.field2</h3>
    ...
</li>
Run Code Online (Sandbox Code Playgroud)

第二个问题是什么HTML标签是最相关的(而不是li,h4,h3)表示对象?

kap*_*pex 6

对此的解决方案不是使用"类似"的反射,而是实际使用反射.无论如何,任何库或框架都很可能基于反射.

objects 提供了获取声明声明和继承字段所需的所有方法.该领域类包含实际的领域,就像它的名称,类型或有价值的所有信息.

要在页面上显示的某些类:

public class Item {
    public String foo = "bar";
    public int x = 23;
}
Run Code Online (Sandbox Code Playgroud)

模板:

@(item: Item)
<ul>
  @for(field <- item.getClass().getDeclaredFields()) {
    <li>@field.getName() = @field.get(item)</li>
  } 
</ul>
Run Code Online (Sandbox Code Playgroud)

输出:

<ul>
  <li>foo = bar</li>
  <li>x = 23</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

请记住,模板可能不是正确的地方,特别是如果您想要过滤字段或其他内容.您应该将代码移动到控制器,甚至更好地移动到模型.由于您知道对象是一个Item,因此您可以创建一个getFields()方法,Item在该方法中实现更复杂的逻辑并返回字段或字段名称列表.


语义html标签的选择实际上取决于字段的内容.一般来说,如果只打印字段名称,则字段列表听起来合理.如果您打印名称和值,您可以使用定义列表dl或可能table.