Я сталкивался с этой ситуацией довольно много раз, и я нашел свое решение, но не уверен, что оно хорошее.
Мне нужно вызвать какую-то службу, которая взаимодействует с базой данных, а затем поделиться результатом между несколькими компонентами.
Рассмотрим этот пример:
<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 для взаимодействия с базой данных.Я назвал это так, чтобы показать, что он делает , но это оказалось обманчивым.Извините за это.