Сохранение локальной переменной вида в JSF 2.0 - PullRequest
1 голос
/ 22 сентября 2011

Я сталкивался с этой ситуацией довольно много раз, и я нашел свое решение, но не уверен, что оно хорошее.

Мне нужно вызвать какую-то службу, которая взаимодействует с базой данных, а затем поделиться результатом между несколькими компонентами.

Рассмотрим этот пример:

<p:outputPanel id="myPanel">
  <c:set var="myVar" value="#{myService.retrieveVarFromDB(param)}" />
  <my:comp1 val="#{myVar.field1}" />
  <my:comp2 val="#{myVar.field2}" />
  <my:comp3 val="#{myVar.field3}" />
</p:outputPanel>

Здесь myVar может быть переоценено несколько раз по запросу обновления ajax.Но хорошо то, что myService вызывается только один раз каждый раз, а не для каждого компонента, который использует myVar .Некоторые из моих коллег делают это следующим образом:

  <my:comp1 val="#{myService.retrieveVarFromDB(param).field1}" />
  <my:comp2 val="#{myService.retrieveVarFromDB(param).field2}" />

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

Итак, есть ли более элегантное решение этой проблемы без использования <c:set />?

Редактировать:
Вычисление myVar только один раз не работает для меня, потому что, как я говорил ранее, мне нужно переоценить это несколько раз.Например, когда пользователь выбирает элемент из какого-либо компонента выбора, на сервер отправляется запрос ajax, который, в свою очередь, выполняет вызов базы данных, переоценивая значение myVar .

Edit2:
myService на самом деле является управляемым компонентом, который использует введенную ссылку EJB для взаимодействия с базой данных.Я назвал это так, чтобы показать, что он делает , но это оказалось обманчивым.Извините за это.

1 Ответ

1 голос
/ 22 сентября 2011

Геттер звонки необычайно дешевы. Они дорогие, только если вы зарабатываете больше, чем просто возвращаете собственность. Вместо этого я предлагаю выполнить работу в (пост) конструкторе bean-компонента и предоставить новый метод получения, который возвращает только этот результат.

Для псевдонимов длинных выражений EL вы всегда можете использовать <ui:param>.

Что касается смешивания JSTL с JSF, они могут привести к сбою bean-объектов вида и могут привести к непредвиденному поведению при использовании в итерации компонентов JSF, таких как <ui:repeat> и <h:dataTable>. JSTL и JSF не работают синхронно, как вы ожидаете от кодирования. Это JSTL, который запускается сначала сверху вниз во время построения представления JSF (для создания дерева компонентов JSF), а затем это JSF, который снова выполняется сверху вниз во время визуализации представления JSF (для генерации HTML).

Смотри также:


Обновление , согласно вашему редактированию:

Расчет myVar только один раз не работает для меня, потому что, как я уже говорил ранее, мне нужно пересмотреть его несколько раз. Например, когда пользователь выбирает элемент из какого-либо компонента выбора, на сервер отправляется запрос ajax, который, в свою очередь, обращается к базе данных, переоценивая значение myVar.

Просто сделайте это в методе слушателя действия, который вызывается запросом ajax. Прежде всего, не злоупотребляйте добытчиком за это.

<f:ajax listener="#{bean.itemChanged}" />

с

public void itemChanged() {
    myVar = myService.retrieveVarFromDB(param);
}

тогда вы можете использовать #{bean.myVar} в представлении.

...