Не знаю, о чем я знаю.
трудно кэшировать эту информацию, потому что:
- Взаимосвязь между экземпляром UIComponent и его ClientID сек может быть 1: N. Это необходимо для таких компонентов, как UIData, которые управляют состоянием их детей. Возвращаемое значение от getClientId может быть контекстно-зависимым.
- Срок службы UIComponent экземпляр, вероятно, не будет превышать запрос. Некоторые реализации StateManager могут быть сконфигурированы так, чтобы сохранять состояние просмотра в сеансе, и в этом случае время жизни объектов может быть больше, но заставляя ваш код полагаться на это делает его хрупким, и было бы легко ввести утечки памяти.
- Виды могут быть динамическими. По общему признанию, это кросс-кейс, но программно можно использовать add, remove and move.
Я бы доказал, что это проблема, прежде чем пытаться применить другой подход.
Вы не говорите, что вам нужен ClientId с для, но я предполагаю, что для некоторой формы поддержки JavaScript. Рассмотрим writing a custom component и выпустите свою разметку через свой рендер. Это можно использовать с атрибутом for, аналогичным label control. Найти соседа в том же NamingContainer относительно легко. Вы можете использовать код, как это в вашей реализации визуализатора:
// untested code!
String clientId = mycomponent.getClientId(context);
// get id of target control
String _for = mycomponent.getFor();
int n = clientId.lastIndexOf(NamingContainer.SEPARATOR_CHAR);
String targetClientId = clientId.substring(0, n)
+ NamingContainer.SEPARATOR_CHAR + _for;
ResponseWriter writer = context.getResponseWriter();
// write markup
компоненты, как правило, нужно разделить контейнер именования использовать друг друга ClientId в любом случае, так что это не является большим препятствием. Если вы можете сделать компонент дочерним, легче найти родителя.
Конечно, этот подход также имеет проблемы. Это делает ваше дерево пользовательского интерфейса еще большим, с эффектом детонации при обработке жизненного цикла и управлении состоянием. Независимо от того, стоит ли компромисс, это потребует тестирования.
EDIT:
Я думал об этом в минувшие выходные. Поскольку 50% запросов JSF, похоже, касаются того, как работать с идентификаторами, я написал сообщение, поэтому я могу просто сослаться на него - JSF: working with component IDs. В состав включен механизм кэширования идентификаторов (вид!) с некоторым примером кода.
FYI: этот алгоритм будет работать только в том случае, если идентификатор уникален для представления.Возвращаясь к спецификации недавно, я заметил, что идентификаторы компонентов должны быть уникальными только для ближайшего NamingContainer. – McDowell