Reputation: 129
I'm using richFaces 3.3 and JSF 1.2.
In my sample application I need to display List of items in and contains also i.e( 2 columns having and third one is )
If I try to give List with in another List as value for rich:columns means its not working but direct bean value is working ???
mainClass
having getter , setter of String item1 , String item2, List priceList
mainList
contains item 1
item 2
List<price> priceList like that...
so in <rich:dataTable> if i try to give value like
<rich:dataTable id="positions" value="#{bean.mainList}" var="var">
<rich:column>
<f:facet name="header">
<h:outputText value="item1"/>
</f:facet>
<h:outputText id="contname" value="#{var.item1}">
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="item2"/>
</f:facet>
<h:outputText id="contname" value="#{var.item2}">
</rich:column>
<rich:columns value="#{var.priceList}" var="partnerPriceItem" columns="2" index="ind">
<f:facet name="header">
<h:outputText id="output#{ind}" value="#{partnerPriceItem.id}" />
</f:facet>
<h:outputText id="price#{ind}" value="#{partnerPriceItem.price}" />
</rich:columns>
</rich:dataTable>
here for first 2 columns working fine. but when I try to give referencing from another List means not working ??
output like
item 1 item 2 price1 price2 price3
1 2 100 200 300
2 2 50 100 75
Upvotes: 0
Views: 3704
Reputation: 85779
To resolve your problem, you need to use the rich:dataTable
and rich:subTable
. There is an example in the exadel live demo site.
Let's have a look in the code (this is not the real code of the site, it's just an example to get the idea):
Java Classes
//POJOs
public class Expenses {
private Date day;
private decimal meals;
private decimal hotels;
private decimal transports;
//getters and setters for the attributes;
}
public class Record {
private String city;
private List<Expenses> items;
private decimal totalMeals;
private decimal totalHotels;
private decimal totalTransport;
private decimal total;
//getters and setters for the attributes;
}
public class ExpReport {
private List<Record> records;
private decimal totalMeals;
private decimal totalHotels;
private decimal totalTransport;
private decimal grandTotal;
//getters and setters for the attributes;
}
//Managed Bean
public class Report {
private ExpReport expReport;
//getter and setter for the attribute;
}
We have the managed bean Report that contains an instance of ExpReport. Inside ExpReport we have a List of Records (the list we want to display in the table), but each record has its own inner List of Expenses (the list we want to display along with the records). Now, we just need to set up our rich:dataTable and the rich:subTable in it to get the magic flowing in our jsp.
Note: You can get more info on the documentation of rich:column.
<!-- Here we set the data list for the dataTable as the list of records of our
object expReport. Also, the name of the iterator will be 'record' -->
<rich:dataTable width="100%" value="#{report.expReport.records}" var="record">
<f:facet name="header">
<!-- This columnGroup tag component will define a group of columns for
the header of the dataTable (the body of the dataTable can has
more columns, for this example there will be the same).-->
<rich:columnGroup>
<rich:column rowspan="2">
<rich:spacer />
</rich:column>
<rich:column colspan="3">
<h:outputText value="Expenses" />
</rich:column>
<rich:column rowspan="2">
<h:outputText value="subtotals" />
</rich:column>
<!-- The 'breakBefore' attribute tells the column to start from the
next row to be rendered in the dataTable. This attribute doesn't
affect the rows generated in rich:extendedDataTable. For more
info, see the documentation (link above the code). -->
<rich:column breakBefore="true">
<h:outputText value="Meals" />
</rich:column>
<rich:column>
<h:outputText value="Hotels" />
</rich:column>
<rich:column>
<h:outputText value="Transport" />
</rich:column>
</rich:columnGroup>
</f:facet>
<!-- Now, let's set the content of the rows of the dataTable -->
<!-- This column will show city from our 'record' iterator. -->
<rich:column colspan="5">
<h:outputText value="#{record.city}" />
</rich:column>
<!-- After printing the city, we want to show the data from the expenses
made in this record. For this, we will use the subTable tag
component, setting the 'record.items' list as the data list for
subTable and naming the inner iterator 'expense'. The syntax for the
subTable is like the dataTable. -->
<rich:subTable value="#{record.items}" var="expense">
<rich:column>
<h:outputText value="#{expense.day}" />
</rich:column>
<rich:column>
<h:outputText value="#{expense.meals}">
<f:convertNumber pattern="$####.00" />
</h:outputText>
</rich:column>
<rich:column>
<h:outputText value="#{expense.hotels}">
<f:convertNumber pattern="$####.00" />
</h:outputText>
</rich:column>
<rich:column>
<h:outputText value="#{expense.transport}">
<f:convertNumber pattern="$####.00" />
</h:outputText>
</rich:column>
<rich:column>
<rich:spacer />
</rich:column>
</rich:subTable>
</rich:dataTable>
Sorry for my bad english, I hope this can be helpful in your application.
Upvotes: 1