@DataModel s:link h:commandButton h:dataTable
djfjboss Dec 6, 2007 12:03 PMI'm very puzzled regarding the behaviour and interaction of the above components. I have used them successfully in some contexts, but am having problems with them in other contexts but can't see any pattern.
My understanding was that s:link is to be preferred over the non-Seam h:commandButton but things do not seem to be quite that simple as this simple example demonstrates:
<rich:panel> <f:facet name="header">Why Doesn't This Work?</f:facet> <h:form> <h:dataTable value="#{accountService.things}" var="thing"> <h:column> <f:facet name="header">Name</f:facet> <h:outputText id="name" size="10" required="true" value="#{thing.name}"> </h:outputText> </h:column> <h:column> <f:facet name="header">Size</f:facet> <h:outputText id="size" size="10" required="true" value="#{thing.size}"> </h:outputText> </h:column> <h:column> <s:link value="Select" action="#{accountService.selectThing(thing)}" /> </h:column> <h:column> <h:commandButton value="Select" action="#{accountService.selectThing(thing)}" /> </h:column> <h:column> <s:link value="Select (dsm)" action="#{accountService.selectThing()}" /> </h:column> <h:column> <h:commandButton value="Select (dsm)" action="#{accountService.selectThing()}" /> </h:column> </h:dataTable> <h:commandButton value="Show Choices" action="#{accountService.getThings()}" /> </h:form> </rich:panel>
and the corresponding service class:
@DataModel private List<Thing> things; @DataModelSelection("things") private Thing selectedThing; public List<Thing> getThings() { ThingRepository repository = new ThingRepository(); things = repository.getThings(); return things; } public String selectThing() { log.info("### DJF Selected: " + selectedThing); return null; } public String selectThing(Thing thing) { selectedThing = thing; log.info("### DJF Selected: " + selectedThing); return null; }
(yes I know I should use a static for the repository ...)
The repository spits out:
One_1
Two_22
Three_333
Four_4444
Five_55555
Size_666666
I then select the second, third, fourth and fifth lines (in that order) with the following surprising (to me at least) results:
16:54:43,322 INFO [AccountService] ### DJF Selected: null
16:54:44,665 INFO [AccountService] ### DJF Selected: Three_333
16:54:45,931 INFO [AccountService] ### DJF Selected: One_1
16:54:47,353 INFO [AccountService] ### DJF Selected: One_1
One out of four is correct! Why null? Why does it incorrectly select the first element when I have selected a different element?