Primefaces - JSF, данные в списке не могут отображаться в p: datatabe

У меня есть список пользователей, которых я хочу отображать на странице JSF с использованием начертания p:datatable. У меня нет исключения, но я не могу отобразить данные, которые есть в списке, даже заголовки столбцов не отображаются, на самом деле я использую 'getUserListe()'method, чтобы получить данные из базы данных, вызывающей мой уровень обслуживания, чтобы быть уверенным из этого я добавил sysprint () некоторых userDomain свойств (мой класс модели), когда я обращаюсь к URL-адресу, я хочу заполнить свой datatable данными из UserListe, поэтому я вызываю его value="#{userMB.userListe}", проблема в том, что список не отображается. но когда страница заряжена, это означает, что вызывается getUserListe (), в моей консоли свойства печатаются успешно, кто-то имеет представление об этом ?? :

часть моего управляемого bean-компонента:

@ManagedBean(name="userMB")
@RequestScoped
public class UserManagedBean implements Serializable {

        private List<UserDomain> userListe ;
    public List<UserDomain> getUserListe() {
            this.userListe = new ArrayList<UserDomain>();
            this.userListe.addAll(getUserServicee().getAll());
            for(UserDomain u : userListe)
                System.out.println(u.getFirstName());
            return userListe;
        }

        public void setUserListe(List<UserDomain> userListe) {
            this.userListe = userListe;
        }

часть моего файла jsf.xhtml:

<h:form>
        <h:outputText value="USER's rights list: "></h:outputText>
        <p:dataTable id="userss" var="userr" value="#{userMB.userListe}" style="width: 10%">

            <h:column>
                    <f:facet name="header"><h:outputText value="FirstName" /></f:facet>                     
                    <h:outputText value="#{userr.firstName}"  />                    
            </h:column>

            <h:column>
                    <f:facet name="header"><h:outputText value="LastName" /></f:facet>                  
                    <h:outputText value="#{userr.lastName}"  />                 
            </h:column>

            <h:column>                  
                    <f:facet name="header"><h:outputText value="Action" /></f:facet>                    
                    <h:commandLink value="Edit" action="#{userMB.editAction(userr)}"  />                
            </h:column>

        </p:dataTable> 

        <h:commandButton value="OK" action="#{userMB.userProp}" />
    </h:form>

Обратите внимание, что у моего пользователя все геттеры и сеттеры его свойств настроены правильно, спасибо за помощь.


person maouven    schedule 01.08.2012    source источник
comment
<h:column> работает с <h:dataTable>, измените его на <p:column>. Сделайте свой bean-компонент @ViewScoped и переместите бизнес-логику вашего getUserListe в другой метод, для этого прочтите Между страницей jsf и управляемым bean-компонентом, почему метод получения вызывается дважды   -  person Luiggi Mendoza    schedule 01.08.2012
comment
Луигги прав, использование столбца p: исправит это, и вы должны загружать эти данные один раз, а не для каждого запроса значения.   -  person Daniel B. Chapman    schedule 01.08.2012
comment
спасибо @LuiggiMendoza за ваш ответ, вы правы, и Дэниел, как я могу загрузить данные только один раз, это с помощью preperty onload или как ?? Еще раз большое спасибо за вашу помощь.   -  person maouven    schedule 01.08.2012
comment
Чтобы загрузить список только один раз, загрузите список в методе с аннотацией @PostConstruct и сохраните список в переменной-члене UserManagedBean. Затем в getUserListe () просто верните переменную. Причина в том, что getUserListe () будет многократно вызываться JSF при рендеринге страницы.   -  person baraber    schedule 01.08.2012
comment
@maouven вы можете создать метод, который извлекает данные и вызывает их в конструкторе bean-компонента и в других методах, таких как действие commandButton для обновления данных. Предполагая, что это ваш случай, было бы лучше сделать ваш bean-компонент ViewScoped, RequestScoped будет создавать bean-компонент в каждом запросе (даже в запросах ajax!).   -  person Luiggi Mendoza    schedule 01.08.2012
comment
@baraber хороший ответ, есть дополнительное объяснение, сделанное BalusC в ссылке (и ссылках там), которые я опубликовал в своем комментарии.   -  person Luiggi Mendoza    schedule 01.08.2012


Ответы (1)


Я сделал, как сказал @luiggi в своем комментарии, изменив <h:column> на <p:column>, и он работает нормально, так что спасибо. Я также изменил свой управляемый компонент с @RequestScoped на @ViewScoped.

еще одна вещь, которую я хочу добавить и поделиться с вами, - это то, что я провел некоторое исследование после прочтения комментариев к этому сообщению, поэтому я нашел другое решение, которое кажется лучше, чем другие, чтобы загрузить список только один раз. слушатель системного события, поэтому в моем файле jsf я добавляю

<f:view>
    <f:event type="preRenderView" listener="#{userMB.loadUserListe}" />
...

метод loadUserListe() в моем компоненте вызывает код бизнес-логики, который создает список пользователей. Конечно, jsf-страница заключена в f: view. Также обратите внимание, что для использования этого слушателя требуется как минимум JSF 2.0.

спасибо всем за вашу помощь и извините за мой английский, я надеюсь, что этот ответ поможет другим

person maouven    schedule 01.08.2012