Как перебрать List‹T› и визуализировать каждый элемент в JSF Facelets

Мне интересно, как отобразить List<T>, как показано ниже, в Facelet:

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

Будет ли <h:dataTable> подходящим способом?


person user2061913    schedule 20.11.2013    source источник


Ответы (2)


Вам нужно будет повторить это. 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> users компонента, доступного как #{bean},

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

вот несколько примеров на его основе:

  1. <h:dataTable>, компонент пользовательского интерфейса который генерирует 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>, компонент пользовательского интерфейса который не генерирует HTML-разметку (поэтому вам придется самостоятельно написать весь этот 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 в 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>
    

Смотрите также:

person BalusC    schedule 20.11.2013

Вы можете сохранить свой список в переменной класса, дать ему геттер и (возможно) сеттер. Объявите метод 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>  
person Kuba    schedule 20.11.2013