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 中,您应该有 Collection
个 Room
对象,每个对象都将提供有关房间价格和类型的信息。此外,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>
我正在使用 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 中,您应该有 Collection
个 Room
对象,每个对象都将提供有关房间价格和类型的信息。此外,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>