Primefaces 数据表仅在一行中合并数据

Primefaces datatable combine data in only one row

我正在使用 tomcat8 和 primefaces 5.1,我有以下代码:

<p:dataTable var="price" value="#{HOTEL.hotel}">

<p:column headerText="Тип стая">
<h:outputText value="Единична" />
<h:outputText value="Двойна" />
<h:outputText value="Апартамент" />
<h:outputText value="Студио" />
</p:column>

<p:column headerText="Брой">
<h:outputText value="#{HOTEL.hotel.room_1}" />
<h:outputText value="#{HOTEL.hotel.room_2}" />
<h:outputText value="#{HOTEL.hotel.apartment}" />
<h:outputText value="#{HOTEL.hotel.studio}" />
</p:column>

<p:column headerText="Цена">
<h:outputText value="#{HOTEL.hotel.room_1_price}" />
<h:outputText value="#{HOTEL.hotel.room_2_price}" />
<h:outputText value="#{HOTEL.hotel.apartment_price}" />
<h:outputText value="#{HOTEL.hotel.studio_price}" />
</p:column>

</p:dataTable>

当使用上面的代码时,我只得到一行 table 并且一行中的所有数据不是我认为的每个 outputText 的不同行。我想要 4 行和其中的适当数据。我希望第一列与硬编码值保持一致,然后为每个列提供来自数据库的相应值。

您以错误的方式使用了 dataTable 组件。它只是在表格视图中显示数据,您唯一应该做的就是为其提供 Collection 模型对象并明确 告诉 哪个 属性 来自模型实例应该显示在特定列下。

此外,我认为您的模型中存在一些问题,即房间类型("Single"、"Double" 等)应该是房间定义的一部分,但不是硬-在 dataTable 列中编码。房间的价格也是如此。此外,hotel 应包含 Collection 个房间。

因此,您可以引入一个名为 Room 的 class,它将保存酒店房间的属性。

enum RoomType {
    SINGLE, DOUBLE, APPARTMENT, STUDIO;
}

class Room {
    private RoomType type;

    private Double price;

    //constructors, accessors, etc.
}

然后,在 hotel bean 中,您应该有 CollectionRoom 对象,每个对象都将提供有关房间价格和类型的信息。此外,hotel 有责任为给定类型的房间提供可用性,这就是它应该公开更多方法的原因。类似于:

public class Hotel {
    private List<Room> rooms;

    public Integer checkAvailabilityFor(RoomType type) {
        //for example
        switch (type) {
            case SINGLE: { return 5; }
            case DOUBLE: { return 2; }
            case APPARTMENT : { return 1; }
            case STUDIO: { return 3; }
        }
    }

    //accessor(s) for the rooms list
}

最后,在 dataTable 组件中,您将拥有类似的内容:

<p:dataTable var="room" value="#{HOTEL.hotel.rooms}">

    <p:column headerText="Type">
        <p:outputText value="#{room.type}" />
    </p:column>

    <p:column headerText="Rooms available">
        <p:outputText value="#{HOTEL.hotel.checkAvailabilityFor(room.type)}" />
    </p:column>

    <p:column headerText="Price">
        <p:column value="#{room.price}" />
    </p:column>

</p:dataTable>