Вы можете использовать Task.WhenAll
, как указано, или Task.WaitAll
, в зависимости от того, хотите ли вы, чтобы нить подождал. Взгляните на ссылку для объяснения того и другого.
Вы можете использовать EL в атрибуте id
для компонента JSF, но переменная EL должна быть доступна во время сборки времени, тогда как дерево компонентов JSF должно быть создано. Тем не менее, <ui:repeat>
работает во время отображения времени визуализации, тогда как вывод HTML должен быть создан на основе дерева компонентов JSF. <ui:repeat var>
недоступен во время времени сборки, а #{class2.name}
- null
, что полностью объясняет полученную вами ошибку. То, что оно работает в <h:outputText>
, связано с тем, что оно выполняется во время визуализации рендеринга.
Если вы замените <ui:repeat>
на <c:forEach>
, который выполняется во время времени сборки, тогда он будет работать так, как вы намерены. <c:forEach>
будет генерировать физически несколько <h:form>
компонентов в дереве компонентов JSF, каждый из которых генерирует индивидуально свой собственный вывод HTML (в отличие от <ui:repeat>
, в котором тот же самый компонент <h:form>
повторно используется несколько раз для генерации HTML output).
<c:forEach var="class2" items="#{bean.list}" varStatus="status">
<h:form id="#{class2.name}">
<h:outputText value="#{class2.name}" />
</h:form>
</c:forEach>
Однако я действительно удивляюсь, зачем вам это нужно. Обычно нет необходимости динамически назначать идентификаторы компонентов. JSF уже обеспечит уникальность идентификатора. В приведенном ниже примере
<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
<h:form id="form">
<h:outputText value="#{class2.name}" />
</h:form>
</ui:repeat>
будет отображаться в нескольких формах с каждым уникальным идентификатором, заполненным индексом итерации <ui:repeat>
. Если вам действительно нужно использовать #{class2.name}
для некоторых целей JavaScript / jQuery (вы нигде не указали конкретное функциональное требование в вопросе, для которого вы думали, что это будет правильное решение, так что это просто догадки), а затем просто оберните его простой HTML-элемент ванили:
<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
<div id="#{class2.name}">
<h:form id="form">
<h:outputText value="#{class2.name}" />
</h:form>
</div>
</ui:repeat>
Или задайте его как класс стилей компонента JSF, который также можно выбрать с помощью селектора CSS:
<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
<h:form id="form" styleClass="#{class2.name}">
<h:outputText value="#{class2.name}" />
</h:form>
</ui:repeat>