myPrimePanel
- ноль. Вам нужно будет присвоить его экземпляр, чтобы он не был нулевым.
Тем не менее, я думаю, что вы решаете эту задачу неправильно. Вы не должны добавлять компоненты в дерево на этапе рендеринга. Предположительно, вы хотите прочитать, проверить и ввести эти данные в модель некоторое время.
Создайте стартовые элементы в encodeBegin . Создайте свои конечные элементы в encodeEnd . Не переопределяйте encodeChildren и убедитесь, что getRendersChildren возвращает false (это значение по умолчанию).
Используйте атрибут связывания для предоставления динамического компонента на этапе восстановления представления. Добавьте управляемый компонент области запроса со свойством типа UIComponent и привяжите его к элементу в вашем представлении, используя EL. В получателе, если свойство имеет значение null, создайте новый экземпляр вашего пользовательского элемента управления и добавьте children .
Рассмотрим эту точку зрения:
<h:form>
<h:panelGroup id="myPanel" binding="#{componentMakerBean.panel}" />
<h:commandButton value="go" action="#{componentMakerBean.dumpValuesAction}" />
</h:form>
Панель создана и заполнена в bean-компоненте:
/** Request scope bean defined in faces-config.xml */
public class ComponentMakerBean {
private UIPanel panel;
public UIPanel getPanel() {
if(panel == null) {
panel = new HtmlPanelGroup();
for(int i=0; i<3; i++) {
panel.getChildren().add(new HtmlInputText());
}
}
return panel;
}
public void setPanel(UIPanel panel) { this.panel = panel; }
public String dumpValuesAction() {
for(Object kid : panel.getChildren()) {
if(kid instanceof ValueHolder) {
ValueHolder valueHolder = (ValueHolder) kid;
System.out.println(valueHolder.getValue());
}
}
return null; //no navigation
}
}
Во время выполнения будут выдаваться три редактируемых текстовых поля, значения которых будут напечатаны в журнале при нажатии кнопки.
Этот код был протестирован в JSP с использованием Java 5 и JSF 1.1.