The moose likes JSF and the fly likes Iterating tags in Seam (ui:repeat and c:forEach) Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » JSF
Bookmark "Iterating tags in Seam (ui:repeat and c:forEach)" Watch "Iterating tags in Seam (ui:repeat and c:forEach)" New topic

Iterating tags in Seam (ui:repeat and c:forEach)

Denis Zjukow
Ranch Hand

Joined: Mar 15, 2006
Posts: 39

Having struggled for a couple of days I finally gave up and decided to ask for help.

I use Seam with Facelets. What I want is to show a list of entities in a table cell i.e a single cell may contain a comma-separted list.

Let's say I have two entity types: Item and Subitem. An instance of type Item may have a number of Subitems. In my case the relation between these two entity types is many-to-many.

So if I have Item1 with three subitems: Subitem1, Subitem2 and Subitem3, I want to see something like this:

Please note that I don't want a comma after the last subitem in a cell (Subitem3 in this case). Nothing special, an obvious requierment, isn't it?

The first thing I tried was ui:repeat:

Everything's fine except for the fact that there is a nasty comma after the last subitem. This made me try c:forEach tag:

Unfortunately this code won't work! It just leaves my favorite column empty. It seams that c:forEach do not see variable item.
I then tried to find a way to add the conditional logic to ui:repeat, but haven't managed to find anything like c:forEach's 'varStatus'.

Any ideas? Thank you all in advance!
K Bbb

Joined: Sep 28, 2007
Posts: 4
you can use <ui:fragment rendered="#{conditional}">

also you could render the 1st item outside the loop, then set the start index to 1 on the loop and then in the loop render the comma first, then the loop item

finaly you can move the code into the java side and don't loop at all..
K Bbb

Joined: Sep 28, 2007
Posts: 4
also.. most of the time it doesn't work to mix c: tags with h: tags, c: tags are compile time, h: tags are render time. you can sometimes put an h: tag inside a c: tag, but not the other way.
Jaikiran Pai

Joined: Jul 20, 2005
Posts: 10067

I guess, the JSF forum is the right place for this question. You might get more answers there. I will move this there for you.

[My Blog] [JavaRanch Journal]
Mark Spritzler

Joined: Feb 05, 2001
Posts: 17250

"K Bbb",

Great information there, but please change your display name to meet the JavaRanch Naming Policy of using your real first and real last names, thanks


Perfect World Programming, LLC - Two Laptop Bag - Tube Organizer
How to Ask Questions the Smart Way FAQ
Denis Zjukow
Ranch Hand

Joined: Mar 15, 2006
Posts: 39
Thank you, K Bbb. I like the idea of conditional rendering. That's exactly what I was looking for.

However, it just seems strange to me that there is nothing like c:forEach among built-in facelet tags. I wish ui:repeat had same functionality as c:forEach, but it unfortunately doesn't.
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
subject: Iterating tags in Seam (ui:repeat and c:forEach)