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



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


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