c: forEach.items вызывается повторно

Окружение: Seam, Richfaces

Следующий фрагмент кода приводит к тому, что метод getUsers вызывается несколько раз, как мне избежать этого в моем приложении, чтобы он вызывался только один раз.

<c:forEach items="#{userHome.getUsers()}" var="_user">
</c:forEach>

person Joe    schedule 07.04.2010    source источник


Ответы (2)


Эмпирическое правило заключается в том, чтобы избегать тегов <c: при использовании JSF (если вы не уверены, что они работают должным образом).

Здесь вам лучше заменить его на:

<a4j:repeat value="#{userHome.users}" var ="_user">
</a4j:repeat>

(или <ui:repeat> при использовании лицевых панелей)

P.S. Я предполагаю, что getUsers() - это EL-расширение JBoss, но я бы посоветовал не использовать его расширенные функции, если это действительно не нужно.

person Bozho    schedule 07.04.2010

И ради всего святого, если вы заботитесь о производительности, избегайте использования инфраструктуры EntityHome/Query. Просто поставьте точку останова или вывод на свой getResultList() и посмотрите, сколько раз он вызывается. Теперь попробуйте сделать то же самое с обычным компонентом шва. Вы увидите значительные изменения (!)

person Shervin Asgari    schedule 07.04.2010
comment
Я видел такое поведение, когда методы вызывались много раз, разве аннотация Factory не должна решать эту проблему. - person Joe; 08.04.2010
comment
Это один подход. Вы также можете использовать Unwrap. Но у вас не может быть фабрики для всех ваших методов. (Можно, но это не мудро). - person Shervin Asgari; 08.04.2010