ОК, это должно быть интересно, я думаю.Я хочу минимизировать количество вызовов для моего компонента Seam внутри итерации.Я использую Seam 2.2.1.CR1, Richfaces 3.3.3.Final, JSF 1.2 и Facelets.
Пожалуйста, посмотрите следующий фрагмент Facelet:
<rich:datatable value="#{myBean.products}" var="prod">
<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}">
#{prod.name}
</rich:column>
<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}">
#{prod.number}
</rich:column>
...
<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}">
#{prod.somethingElse1}
</rich:column>
<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}">
#{prod.somethingElse2}
</rich:column>
...
<rich:column rowspan="#{rowspan.calcHomePageProductRowspan(prod)}">
#{prod.somethingElse3}
</rich:column>
</rich:datatable>
В приведенном выше коде я вычисляю атрибут (здесь - строка, но это не имеет значения, это может быть любойатрибут или значение вообще, поэтому, пожалуйста, не сосредотачивайтесь на этом), оценивая выражение EL.Как видите, метод, который вычисляет значение, принимает в качестве аргумента текущее расширение.
Я произвел внутреннюю оптимизацию в компоненте rowspan
Seam, и он сохраняет в HashMap все уже вычисленные значения.за продуктами.Таким образом, когда выражение EL вычисляется во втором rich:column
, rowspan
сначала ищет в HashMap уже вычисленное значение и возвращает его, вместо того, чтобы заново вычислять все заново.
Хотя это лучше, чем пересчитывать все заново, мне все равно придется вызывать компонент Seam.Есть ли способ как-то вызвать компонент Seam только один раз и как-то сохранить вычисленное значение для текущей итерации?
По аналогии с Java можно было бы определить переменную внутри цикла на каждой итерации и использовать ее повторно.на протяжении всей итерации.
Примечание: Я уже провел другие Seam-ориентированные оптимизации, такие как @BypassInterceptors, компонент Seam находится в области EVENT, поэтому иерархический поиск не проводится и т. д.