2015-11-09 1 views
0

У меня есть переменная сеанса, которая необходима для фильтрации моего JPA запроса следующим образом:Загрузка переменной сеанса до начала строительства UI

activities = JPAContainerFactory.make(ActivityEntity.class, DCSAdminUI.PERSISTENCE_UNIT); 
activities.addContainerFilter(new Compare.Equal("organisation.rowid", OrgID)); 

Мое мнение может получить переменную сеанса в методе enter() следующим образом:

@Override 
    public void enter(ViewChangeEvent event) { 

     OrgID = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("org"); 
     buildLayout(); 

    } 

Проблема в том, что я не знаю, как взять переменную из метода enter() и использовать ее при построении пользовательского интерфейса. Как вы можете видеть из приведенного выше метода enter(), я вручную вызываю buildLayout(), который выполняет построение пользовательского интерфейса. Это работает, но я получаю представление, которое реконструируется внутри себя каждый раз, когда я перехожу к другому виду и обратно к этому. Я знаю, что enter() вызывается перед конструктором, но то, что я не понимаю, почему конструктор не кажется, называется, если я явно не называть его в методе enter()

Любая помощь или указатели будут оценены

+0

Осторожно с терминологией, «конструктор» имеет очень специфическое значение на земле Java. Я предполагаю, что с «конструктором» вы ссылаетесь на этот метод buildLayout() здесь, а не на конструктор некоторого класса. – Gimby

+0

Под «конструктором» я имел в виду фактический конструктор, потому что я попытался использовать ручной метод 'buildLayout()', а также попытался загрузить переменную непосредственно в конструктор (без метода 'buildLayout()') на основе того, что я прочитал что конструктор автоматически вызывается после метода 'enter()'. Если я ошибаюсь, тогда вы правы, и мне нужно быть осторожным с терминологией! – Mimzo

+0

Итак, вы говорите о реальном конструкторе. Увы, вы, по-видимому, не можете быть конкретными в отношении какого конструктора, о котором вы говорите. Конструкторы не получают вызовы с помощью фреймворков или кода, они вызываются JVM под водой, когда создается новый экземпляр объекта. Если вы говорите о конструкторе класса, который этот метод enter() является частью, то он наиболее определенно вызывается перед вызовом enter(), а не после. – Gimby

ответ

0

Конструктор вашего класса вида фактически вызывается либо вами, когда вы добавляете свои виды в навигатор, либо через фреймворк, когда вы переходите к представлению. Это зависит от перегруженного варианта Navigator#addView(), который вы используете.

Судя по вашему вопросу, я предполагаю, что вы хотите избежать того, чтобы каждый раз, когда вы посещаете представление, выполняется либо запрос JPA, либо выполняется некоторая форма рекурсивного построения пользовательского интерфейса (что бы вы ни называли «построенный внутри себя»).

Лучше всего подходит для вашей проблемы, если бы вы отделили свой код пользовательского интерфейса от своей логики данных. То есть сохранить данные (JPAContainer) вне представления вообще. Затем вы можете создать пользовательский интерфейс в своем конструкторе по умолчанию View (используйте в этом случае Navigator#addView(String, Class<? extends View>)). Вы должны взглянуть на Model-View-Presenter design pattern, чтобы получить представление о том, как достичь этого разделения проблем. Чтение переменной сеанса OrgID затем произойдет в презентаторе.

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

 Смежные вопросы

  • Нет связанных вопросов^_^