Problems Nesting <h:dataTable>
gzoller Feb 17, 2007 8:05 PMI'm trying to nest <h:dataTable> with <s:link> elements without success. Actually I can render a 2-level nested data table but if I click on the innermost links I get null passed to the action method. Clicking on the top-level links works fine and the expected objects are passed tomy action method. Frustrating!
The rendered nested tables look something like this (everything rendered is a clickable s:link element--bold represents the outer table and regular text the inner nested tables):
One Big Projects Small Projects Two Hot Cold Three Misc
A list of trivial Blah objects holds the One/Two/Three. Each Blah also has a list of Bucket objects. This is supposed to simulate a 1-to-m Entity relationship loaded from a database. I also have a stateful session bean, Year, that manages things.
Here's the important clip from my xhtml that renders the tables.
<h:dataTable id="outerTable"
var="z"
value="#{list}">
<h:column>
<s:link value="#{outer.name}" action="#{year.selectItem(outer)}"/>
<h:dataTable id="innerTable"
var="inner"
value="#{outer.buckets}">
<h:column>
<s:link value="#{inner.name}" action="#{year.selectBucket(inner)}"/>
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>
Here are the important bits from Year.java
@Stateful
@Name("year")
@Scope(ScopeType.SESSION)
public class YearBean implements Year {
@DataModel
private List<Blah> list;
@Create
public void init() {
// Create & populate 2-tier data structure simulating loaded Entites
list = new ArrayList<Blah>();
List<Bucket> b = new ArrayList<Bucket>();
b.add( new Bucket("Big Projects"));
b.add( new Bucket("Small Projects"));
list.add(new Blah("One",b));
b = new ArrayList<Bucket>();
b.add( new Bucket("Hot"));
b.add( new Bucket("Cold"));
list.add(new Blah("Two",b));
b = new ArrayList<Bucket>();
b.add( new Bucket("Misc"));
list.add(new Blah("Three",b));
}
public String selectBucket(Bucket bucket) {
if( bucket == null )
System.out.println("+++>>> Null Bucket Selected! ");
else
System.out.println("++++>>> Bucket selected: " + bucket.getName());
return "bucket";
}
public String selectItem(Blah blah) {
if( blah == null )
System.out.println("+++>>> Null Blah Selected! ");
else
System.out.println("++++>>> Blah selected: " + blah.getName());
return "blah";
}
}
And finally Blah.java and Bucket.java:
@Name("blah")
public class Blah {
private String name;
@DataModel
private List<Bucket> buckets;
public Blah(){}
public Blah(String name, List<Bucket> buckets) {
this.name = name;
this.buckets = buckets;
}
public String getName() { return name; }
public List<Bucket> getBuckets() { return buckets; }
}
@Name("bucket")
public class Bucket {
private String name;
public Bucket(){}
public Bucket(String name) {
this.name = name;
}
public String getName() { return name; }
}