Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: maouvenОтветов: 1

У меня есть список пользователей, которых я хочу отображать на странице 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>

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

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

jsfjakarta-eeprimefaces

Ответы

Ответ 1 · maouven

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы