2

我想知道如何List<T>在 Facelet 中显示如下获得的:

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

<h:dataTable>是一种合适的方式吗?

4

2 回答 2

13

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

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

并且搜索结果被分配为List<User> usersbean 的属性,该属性可用作#{bean},

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

以下是一些基于它的示例:

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

    <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>,一个在视图构建时间而不是视图渲染时间运行的标签处理程序(这里的背景解释:JSTL in JSF2 Facelets ... 有意义吗?),它也不会产生任何 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>
    

也可以看看:

于 2013-11-20T14:43:25.123 回答
1

您可以将 List 保存在类变量中,给它一个 getter 和(也许)一个 setter。将方法声明searchByStringvoid并用假设为 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>  
于 2013-11-20T14:41:48.613 回答