powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF dataTable многократный вызов метода бина
8 сообщений из 8, страница 1 из 1
JSF dataTable многократный вызов метода бина
    #39237530
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые гуру, просветите пожалуйста чайника - начал изучать JSF и такая засада.
При старте приложения при построении грида вызывается 3 раза метод getNames(), при обновлении странички
кнопкой "Test" getNames() вызывается 12 раз. JSF менял разные версии. Количество этих повторных вызовов не зависит от кол-ва строк или столбцов.

Почему так?


код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
<h:dataTable value="#{tableData.names}" var="name">
            <h:column> #{name.last},</h:column>
            <h:column> #{name.first} </h:column>
</h:dataTable>
<h:commandButton value="Test"/>
-----------------------------------
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;

@ManagedBean
@SessionScoped
public class TableData implements Serializable {
    private static final Name[] names = new Name[]
            {
                    new Name("William", "Dupont"),
                    new Name("Anna", "Keeney"),
                    new Name("Mariko", "Randor"),
                    new Name("John", "Wilson")
            };

    public Name[] getNames() {
        System.out.println("getNames()");
        return names;
    }
};
--------------------------------------
import java.io.Serializable;

public class Name implements Serializable {
    private String first;
    private String last;

    public Name(String first, String last) {
        this.first = first;
        this.last = last;
    }

    public void setFirst(String newValue) {
        first = newValue;
    }

    public String getFirst() {
        return first;
    }

    public void setLast(String newValue) {
        last = newValue;
    }

    public String getLast()
    {
        return last;
    }
}

...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237611
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JSF Lifecycle , он такой.
Основной смысл в том, что кроме модели на сервере сохраняется/восстанавливается представление, и эта работа с представлением требует многократных обращений к модели (на каждой фазе). Поэтому в jsf приложении желательно, чтобы get-методы были чистыми геттерами, в все, что касается жизненного цикла, происходило в слушателях.
...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237630
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra, я почти ничего не понял, отсюда дилетанский вопрос - я понял что в getName() методе запрос к серверу БД делать нельзя - иначе сервак быстро ляжет от 12 запросов вместо одного. Куда можно поместить запрос к серверу БД чтобы он вызывался на построение таблицы только 1 раз? И как это связать с методом или полем бина jsf? Использую jDBC и результат получаю в CachedRowSet.
...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237642
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Геттеры должны быть чистыми геттерами, если совсем никак, то хотя бы сделать их ленивыми:
Код: java
1.
2.
3.
4.
5.
6.
    public Name[] getNames() {
        if (names==null) {
          //получить из базы
        }
        return names;
    }
...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237644
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли такой запрос к серверу БД поместить в конструктор бина а затем присвоить значения полям, или лучше какой другой способ?
...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237663
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, в общем случае надо считать, что бин создается при каждом запросе пользователя, и если он @SessionScoped, то в него записывается сохраненное ранее состояние. Помещать что-то в конструктор бесполезно и даже вредно.
Всё, что происходит в программе - это ответ на события, вся работа должна идти от слушателей, для этого в jsf имеется куча методов и интерфейсов.
...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237677
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JSF dataTable многократный вызов метода бина
    #39237719
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraГеттеры должны быть чистыми геттерами, если совсем никак, то хотя бы сделать их ленивыми:
Код: java
1.
2.
3.
4.
5.
6.
    public Name[] getNames() {
        if (names==null) {
          //получить из базы
        }
        return names;
    }



а если, в то время как names != null, произошло изменение на бэкенде - показывать юзеру старые данные?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF dataTable многократный вызов метода бина
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]