У меня есть приложение JSF2, которое отображает большую таблицу со сложным содержимым.К сожалению, каждый запрос обрабатывается до 6 секунд.Используя простой отладочный вывод внутри слушателя фазы, я мог видеть, что потеря производительности распределяется равномерно по всем фазам, которые обрабатывают дерево компонентов.Поэтому я запустил профилировщик, чтобы посмотреть, что происходит, и обнаружил, что более 300.000 ValueExpressions оцениваются во время одного простого запроса.
Они разрешаются в действительно простые методы получения без какой-либо логики, поэтому проблема заключается не в выполнениикод этих выражений, но синтаксический анализ строки выражения и вызов метода получения.Это приводит к нескольким вопросам:
1.) Есть ли способ ускорить разрешение выражений метода.Может быть, скрытый флаг «включить кэширование» или что-то в этом роде.
2.) Кажется, что большинство выражений оцениваются не внутри фазы ответа рендеринга, где они действительно необходимы, а во время других фаз.Кажется, нет необходимости разрешать, например, styleClass
во время любой другой фазы, кроме фазы рендеринга.Могу ли я предотвратить это?
3.) Конечно, сведение к минимуму количества выражений EL на моей странице Facelets должно помочь повысить производительность, но, похоже, я не могу этого сделать: Многие атрибуты (например, * 1010).* пример, упомянутый выше) фактически зависит от строки таблицы, но может быть задан только для столбца.Таким образом, имея 10 столбцов, каждое выражение вычисляется слишком часто.Я видел примеры, когда атрибут rowClasses
таблицы используется для условного стиля строк, но поскольку таблица сортируется, это не сработает без использования моего собственного механизма сортировки.Есть ли лучший способ реализовать это?
4.) Еще один простой вопрос: есть ли способ кэшировать переменные в дереве компонентов (точно так же, как ui:repeat
обеспечивает доступ к содержимому списка и разрешаетвыражение для получения списка только один раз, но только для одной переменной)?
Большое спасибо за все ответы и подсказки!
РЕДАКТИРОВАТЬ:
После дальнейшего изучения я обнаружил, что для каждого rendered=#{someExpression}
выражение оценивается 6 раз в строке непосредственно на этапе ответа рендеринга.Я знаю, что JSF может вызывать моих получателей более одного раза, но я думал, что это произойдет, потому что они могут быть вызваны внутри каждой фазы.Во время рендеринга эти значения не должны изменяться, поэтому я предполагаю, что они могут быть кэшированы.
Шагая по коду в отладчике, он выглядит как javax.faces.component.ComponentStateHelper
(который появляется в каждой из трассировок стека, ведущих коцененный вызов метода) предоставляет карту для выполнения именно такого рода кэширования.Однако, похоже, это не работает так, как я ожидаю, и всегда переоценивает выражение ...