listjsffaceletsdata-presentation

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


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?


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:

    1. <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>
      
    2. <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>
      
    3. <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: