【问题标题】:How iterate over List<T> and render each item in JSF Facelets如何迭代 List<T> 并在 JSF Facelets 中呈现每个项目
【发布时间】:2015-10-13 02:09:46
【问题描述】:

我想知道如何在 Facelet 中显示下面获得的List&lt;T&gt;

public List<T> searchByString(String string) {
    return getEntityManager().createNamedQuery("Userdetails.findByUsername").setParameter("username", "%" + string + "%").getResultList();
}

&lt;h:dataTable&gt; 是否合适?

【问题讨论】:

    标签: list jsf facelets data-presentation


    【解决方案1】:

    您将需要对其进行迭代。 JSF 2 提供了三个开箱即用的迭代组件。假设User 实体如下所示,

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

    并且搜索结果被分配为 bean 的 List&lt;User&gt; users 属性,该属性可用作 #{bean}

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

    这里有一些基于它的例子:

    1. &lt;h:dataTable&gt;,一个生成 HTML &lt;table&gt; 的 UI 组件。

      <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. &lt;ui:repeat&gt;,一个不生成 HTML 标记的 UI 组件(因此,您必须自己以所需的方式编写所有 HTML,可以很容易地更改为例如 &lt;ul&gt;&lt;li&gt;&lt;dl&gt;&lt;dt&gt;&lt;dd&gt;,或&lt;div&gt;&lt;span&gt;等):

      <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. &lt;c:forEach&gt;,一个标签处理程序,它在视图构建时间而不是视图渲染时间运行(这里的背景说明:JSTL in JSF2 Facelets... makes sense?),它也不会产生任何 HTML 标记:

      <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>
      

    另见:

    【讨论】:

      【解决方案2】:

      您可以将您的 List 保存在一个类变量中,给它一个 getter 和(也许)一个 setter。将searchByString 方法声明为void 并使用假设为a(假设您使用PrimeFaces)调用它:

      <p:commandLink update="@form" process="@this" action="#{myBean.searchByString}"> 
      

      我的豆子:

      public void searchByString(String string) {     
          userList = getEntityManager().createNamedQuery("Userdetails.findByUsername").setParameter("username", "%" + string + "%").getResultList();
      }
      

      如果您的表格位于您刚刚更新的表格中,您可以在其中显示 List

       <p:dataTable var="user" value="#{myBean.userList}">  
          <p:column headerText="Name">  
              <h:outputText value="#{user.name}" />  
          </p:column>  
       </p:dataTable>  
      

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 2013-09-22
        • 1970-01-01
        • 2013-10-31
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        相关资源
        最近更新 更多