Olá pessoal, vamos para parte final do desenvolvimento dos componentes dinâmicos com primefaces, reitero aqui que da mesma forma que estou fazendo com os componentes do primefaces, também é feito com os componentes do jsf HtmOutputText e HtmlInputText.
Então vamos continuar, ficamos na parte da declaração abaixo:
expressionFactory = app.getExpressionFactory();
Lembrando que o expressionFactory é para criar uma fabrica de expressão EL e assim poder declarar a expressão como costumamos no JSF #{bean.variavel}.
Então com a instância criada vamos definir valores para os componentes como, por exemplo o valor e o For do OutputLabel já concatenando com a ID do InputText, abaixo:
opl.setValue("Campo " + (z + 1) + ": ");
opl.setId("lbcampo" + z);
opl.setFor("campoID" + z);
in = new InputText();
in.setId("campoID" + z);
in.setSize(2);
Você pode está perguntando porque só instanciou ou criou uma nova instância para o inputText, lembra que vamos incluir a expressionLanguage neste componente e por isso devemos fazer essa ação, caso não fizesse isso iria aparecer o NullPointerException.
Pronto com isso já sabemos que de acordo com o valor do Z teremos Campo 1,2,3,4...
<p:outputLabel value="Campo 1" id="lbcampo0" for="campoID0"/>
E também sabemos temporariamente que o inputText ficará
<p:inputText id="campoID0" size="2"/>
Agora vamos colocar a cereja no bolo, ou seja, vamos incluir a expressão para que o componente pegue o valor na view e para isso faça como abaixo:
ValueExpression ve = expressionFactory.createValueExpression(elContext, "#{bean.campo[" + z + "]}", String.class);
Veja que agora declaramos o ValueExpression, com isso estamos adicionando o que acostumamos fazer somente na view, incluir um parâmetros para capturar o valor que o usuário digitou. Note que é uma expressionFactory criando o valor pegando o contexto e definido a classe que terá o valor na view, neste caso o valor foi uma string, mas poder ser mudado de acordo com sua necessidade.
Agora devemos adicionar a ValueExpression para ser incluída no componente inputText
in.setValueExpression("value", ve);
O nome value dever ser colocado sempre, pois representa a tag value do componente inputText e a variavel ve que é o EL.
Para dar o toque final deveremos adicionar os componentes no panel que criamos no inicio como abaixo:
panel.getChildren().add(opl);
panel.getChildren().add(in);
Com isso adicionamos os componentes dinâmicos dentro do panel.
Então é isso pessoal, qualquer dúvida estou a disposição só comentar aqui ou então enviar um e-mail. Até a próxima!