How iterate over List<T> and render each item in JSF Facelets

data-presentation, facelets, jsf, list

Solution

You're going need to iterate over it. JSF 2 offers three iteration components out the box. Provided that the `User` entity look like below,

@Entity
public class User {
    private @Id Long id;
    private String username;
    private String email;
    private LocalDate birthdate;
    // Add/generate getters+setters.
}

and that the search results are assigned as a `List<User> users` property of a bean which is available as `#{bean}`,

@Named @RequestScoped
public class Bean {
    private List<User> users;
    // Add/generate postconstruct+getter.
}

here are some examples based on it:

`<h:dataTable>`, an UI component which generates a HTML `<table>`.

<h:dataTable value="#{bean.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.username}</h:column>
    <h:column><a href="mailto:#{user.email}">#{user.email}</a></h:column>
    <h:column>#{user.birthdate}</h:column>
</h:dataTable>

`<ui:repeat>`, an UI component which generates no HTML markup (so, you'd have to write all that HTML in the desired fashion yourself, which could easily be changed to e.g. `<ul><li>`, or `<dl><dt><dd>`, or `<div><span>`, etc):

<table>
    <ui:repeat value="#{bean.users}" var="user">
        <tr>
            <td>#{user.id}</td>
            <td>#{user.username}</td>
            <td><a href="mailto:#{user.email}">#{user.email}</a></td>
            <td>#{user.birthdate}</td>
        </td>
    </ui:repeat>
</table>

`<c:forEach>`, a tag handler which runs during view build time instead of view render time (background explanation here: JSTL in JSF2 Facelets... makes sense?), it also doesn't produce any HTML markup:

<table>
    <c:forEach items="#{bean.users}" var="user">
        <tr>
            <td>#{user.id}</td>
            <td>#{user.username}</td>
            <td><a href="mailto:#{user.email}">#{user.email}</a></td>
            <td>#{user.birthdate}</td>
        </td>
    </c:forEach>
</table>

See also:

- Java EE 6 tutorial - Adding components to a page - using `<h:dataTable>`

- How and when should I load the model from database for h:dataTable

Problem

I am wondering how to display a `List<T>` as obtained below in a Facelet: ``` public List<T> searchByString(String string) { return getEntityManager().createNamedQuery("Userdetails.findByUsername").setParameter("username", "%" + string + "%").getResultList(); } ``` Would a `<h:dataTable>` be a suitable way?

Original source

Related problems