Не создавайте компоненты вручную, если все можно просто сделать в представлении.Эта конструкция потерпит неудачу, если компонент находится в более широкой области, чем область запроса.См. Также, например, Атрибут Binding приводит к дублированию идентификатора компонента, найденного в представлении
Следуйте показательному примеру " TabView with Model ", который позволяет динамически заполнять вкладки через здравый смыслмодель и <p:tabView value="..." var="...">
как у <ui:repeat>
/ <h:dataTable>
.
Например, это представление
<h:form>
<p:tabView value="#{bean.tabs}" var="tab">
<p:tab title="#{tab.title}">
#{tab.content}
<p:commandButton value="Close" action="#{bean.remove(tab)}" update="@form" />
</p:tab>
</p:tabView>
<p:commandButton value="Add Tab" action="#{bean.add}" update="@form" />
</h:form>
с этим контроллером
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
private List<Tab> tabs;
@PostConstruct
public void init() {
tabs = new ArrayList<>();
}
public void add() {
tabs.add(new Tab("tab" + tabs.size(), "some content"));
}
public void remove(Tab tab) {
tabs.remove(tab);
}
public List<Tab> getTabs() {
return tabs;
}
}
и с этой моделью
public class Tab {
private String title;
private String content;
public Tab(String title, String content) {
this.title = title;
this.content = content;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}