2015-09-22 2 views
1

Должен ли я ожидать, что результаты UIComponent#getClientId() могут измениться в пользовательской сессии? Я хотел бы сохранить полную ссылку clientId на UIComponent и использовать ее позже.Может ли UIComponent clientIds меняться по запросам?

Когда пользователь добавляет динамический компонент:

myBean.setClientId(composite.getClientId()); 

Намного позже в сессии, когда пользователь "Сэйв":

String clientId = myBean.getClientId(); 
UIComponent composite = view.findComponent(clientId); 
  • Может быть различные реализации JSF не гарантируют тот же ClientId через сеанс?
  • Возможно динамическое добавление и удаление UIComponents (или прихоть) приведет к тому, что один из контейнеров на пути изменит индекс по запросам?

Я видел этот большой Q & A, и я не уверен, если он полностью отвечает на вопрос о сохранении ClientId и использовать его несколько запросов в конце сеанса или в динамической форме: when-and-how-is-clientid-generated-in-jsf

Спасибо

ответ

0

Если идентификатор клиента содержит автогенерированный идентификатор, поскольку разработчик не указал идентификатор фиксированного компонента через атрибут id, тогда нет никакой гарантии, что он будет таким же в другом запросе. Конечно, нет, если дерево компонентов программно управляется библиотеками компонентов или даже самим собой, добавляя/удаляя компоненты без фиксированного идентификатора. Автогенерированный идентификатор на «том же» компоненте может затем изменяться в зависимости от положения компонента в общем дереве.

Это не специфическая реализация JSF. Спецификация JSF гарантирует, что (сгенерированный) идентификатор клиента будет одинаковым для всего запроса. Смотри также javadoc:

Возвращение из этого метода должен быть неизменным в течение всего срока службы экземпляра, если свойство идентификатор компонента не изменяется, или компонент, помещают в NamingContainer которого клиент ID изменяется (например, UIData). Однако даже в этих случаях последовательные вызовы этого метода всегда должны возвращать одно и то же значение.

экземпляры компонентов пользовательского интерфейса являются запрошенными. Таким образом, #{myBean} в вашем примере абсолютно не должен быть в более широкой области действия, чем область запроса, чтобы гарантировать, что идентификатор клиента можно повторно использовать, чтобы найти именно нужный компонент. Если #{myBean} находится в более широкой области, то это технически будет работать только в том случае, если идентификатор клиента состоит из только фиксированных идентификаторов.

Тем не менее, манипулирование деревом компонентов через Java - плохая идея. Вместо этого используйте JSTL. См. Также a.o. How does the 'binding' attribute work in JSF? When and how should it be used?

+0

В настоящее время я использую clientId-путь, у которого нет идентификаторов 'j_idt #', но теперь я думаю, что я избегу проблемы, сделав мои основные компоненты уникальными и найду их с помощью 'root.visitTree()' (ex : ''). – AAron

+0

Благодарим вас за советы и советы по дереву компонентов Java. Всегда ищу альтернативные подходы, но в настоящее время я получил чистый/солидный подход, который удовлетворяет моим требованиям.Посмотрите на JSTL, чтобы попытаться понять дизайн, который вы предлагаете. – AAron

Смежные вопросы