Problema com inclusão de valores do inputText num ArrayList do bean

Boa noite pessoal,

Estou tentando fazer um codigo que faça aparecer na tela uma quantidade de inputText de acordo com o numero de inputs de um web service. Até aí tudo bem.
O problema aparece quando tenho que incluir os valores que o usuário digita em cada campo em um ArrayList do bean. Estou tentando chamar a função de inclusão quando o inputText perde o focus. No caso de só existir 1 inputText, funciona normalmente. No caso de existir mais de 1, quando eu passo para o próximo campo, a palavra que estava escrita no primeiro some (isso pq estou utilizando a mesma variavel para serem os values dos inputText) e ele não consegue inserir corretamente (só insere o segundo).

Esse é o codigo:

<c:forEach var=“item” items="${Executor.inputs2}">
${item}
<h:inputText id=“textoInput” style=“FONT-SIZE: small; FONT-FAMILY: ‘Arial’;
text-align:left;color:Black; width : 100px;” value="#{Executor.inputAtual}">
<a4j:support event=“onblur”
actionListener="#{Executor.incluirInputNaLista}" />


</h:inputText>

 	    </c:forEach>

inputAtual é a string que pega o valor digitado no inputText e incluirInputNaLista é a função de incluir o input na lista de inputs.

Se alguém puder ajudar, agradeço !!!

Creio q isso tenha a ver com requests … toda vez que vc da um <a4j:support event=“onblur” >
ele faz um request novo perdendo o valor da variavel

sou iniciante em jsf essas coisas mais creio q seja isso

Mas como eu resolvo esse problema com os requests ? Vc sabe ?

[quote=kritiuns]Creio q isso tenha a ver com requests … toda vez que vc da um <a4j:support event=“onblur” >
ele faz um request novo perdendo o valor da variavel

sou iniciante em jsf essas coisas mais creio q seja isso[/quote]

Então cara … se vc setar o bean q guarda o valor da variavel do input para session e usar o annotation @keepAlive vc consegue manter a variavel viva

[quote=kritiuns]Então cara … se vc setar o bean q guarda o valor da variavel do input para session e usar o annotation @keepAlive vc consegue manter a variavel viva
[/quote]

Amigo, mudei o codigo para (setando o bean para session):

<a4j:keepAlive beanName=“Executor”/>
a4j:region
<a4j:outputPanel id=“inputs” ajaxRendered=“true”>
<h:outputText value=“Inputs do serviço” />

 	    <c:forEach var="item" items="${Executor.inputs2}">
 	    ${item}	
 	    <h:inputText id="textoInput" style="FONT-SIZE: small; FONT-FAMILY: 'Arial'; 
 	    text-align:left;color:Black; width : 100px;"  value="#{Executor.inputAtual}">
 	    <br/>
 	    <a4j:support event="onchange"  
                actionListener="#{Executor.incluirInputNaLista}" 
                 ajaxSingle="true"/> 
		 
		</h:inputText>
		
 	    </c:forEach>
 	    
 	   </a4j:outputPanel>
 	    </a4j:region>

Agora o problema mudou: eu digito um input e quando mudo de caixa de texto ele insere o primeiro input certo, porém ja preenche automaticamente a segunda caixa com o texto da primeira. Aí eu apago o que tem na segunda e digito o que quero. Qunado submeto, ele novamente insere certo, mas muda o texto da primeira caixa para ficar igual ao da segunda.
O problema é que estou utilizando a mesma variavel em todas as caixas de texto (pq desenho elas dinamicamente e não sei de antemão quantas existirão).

Alguém sabe informar se teria como eu ir guardando todas as saidas desses inputtext em uma lista, ao invés de em uma variável ?

faz assim …

<c:forEach var="item" items="${Executor.inputs2}"> 
${item}	
<h:inputText id="textoInput" style="FONT-SIZE: small; FONT-FAMILY: 'Arial'; 
text-align:left;color:Black; width : 100px;" value="#{item}"> 
<br/> 
<a4j:support event="onchange" 
actionListener="#{Executor.incluirInputNaLista}" 
ajaxSingle="true"/> 

estou vendo que vc não usa a variavel que vc instancia quando faz o forEach pra nada nesse código sendo assim …

deixe a variavel inputs2 do seu bean assim:

List<String>inputs2 = new ArrayList<String>();

com essas mudanças vc tera oq precisa…

caso essa sua lista seja de um outro objeto … adicione uma propriedade a mais nesse objeto do tipo string e pegue ele na hora do forEach

fazendo isso …

public class ObjetoDaLista{
   //atributos que ja tenho
   String valorDoInput;
}

utilizando ele no código assim

text-align:left;color:Black; width : 100px;" value="#{item.valorDoInput}"> 

espero ter ajudado Brow!!

Oi amigo,

Não sei se entendi o que vc disse, mas fiz do jeito que falou e não funcionou. Quando coloco o value do inputText pra ser #{item}, quando eu abro a página as caixas de texto já ficam preenchidas com os valores que eu tenho na lista inputs2. Consequentemente, na hora de inserir, vem os mesmos valores…

minha variavel esta assim:

ArrayList Inputs2 = new ArrayList();

Outra coisa, se eu colocar o #{item}, que é um elemento do ArrayList, como vou fazer na hora de inserir (atualmente faço com a função abaixo, pois tenho o valor do inputAtual):

public void incluirInputNaLista(ActionEvent event) {
System.out.println(“Entrei no incluirInputNaLista”);
Executor.getListaInputsEntrada().add(this.getInputAtual());
}

Muito Obrigado pela ajuda !

[quote=kritiuns]faz assim …

<c:forEach var="item" items="${Executor.inputs2}"> 
${item}	
<h:inputText id="textoInput" style="FONT-SIZE: small; FONT-FAMILY: 'Arial'; 
text-align:left;color:Black; width : 100px;" value="#{item}"> 
<br/> 
<a4j:support event="onchange" 
actionListener="#{Executor.incluirInputNaLista}" 
ajaxSingle="true"/> 

estou vendo que vc não usa a variavel que vc instancia quando faz o forEach pra nada nesse código sendo assim …

deixe a variavel inputs2 do seu bean assim:

List<String>inputs2 = new ArrayList<String>();

com essas mudanças vc tera oq precisa…

caso essa sua lista seja de um outro objeto … adicione uma propriedade a mais nesse objeto do tipo string e pegue ele na hora do forEach

fazendo isso …

public class ObjetoDaLista{
   //atributos que ja tenho
   String valorDoInput;
}

utilizando ele no código assim

text-align:left;color:Black; width : 100px;" value="#{item.valorDoInput}"> 

espero ter ajudado Brow!!
[/quote]

crie uma classe que contenha a string recebida pelo seu webservice e a string que sera adicionada para a nova lista.

mude o seu código para

text-align:left;color:Black; width : 100px;" value="#{item.stringNova}"> 
<a4j:support event="onblur" 
actionListener="#{Executor.incluirInputNaLista}">

<f:setPropertyActionListener value="#{item.stringNova}"
                            target="#{Executor.inputAtual}" />

</a4j:support>

não sei se isso vai funcionar no seu caso …( nunca testei esse setProperty com o a4jsupport ) mas vale a pena tentar…

já estou ficando sem recursos pois também sou novo nesses frameworks hehehe …

segue um link muito bom para exemplos de richfaces (veja se existe algo nesse site próximo ao que vc precisa fazer.)
http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=editDataTable&cid=926686

Abraço!

Obrigado pela disposição em ajudar !

Hoje mais tarde tentarei essa solução proposta !

[quote=kritiuns]crie uma classe que contenha a string recebida pelo seu webservice e a string que sera adicionada para a nova lista.

mude o seu código para

text-align:left;color:Black; width : 100px;" value="#{item.stringNova}"> 
<a4j:support event="onblur" 
actionListener="#{Executor.incluirInputNaLista}">

<f:setPropertyActionListener value="#{item.stringNova}"
                            target="#{Executor.inputAtual}" />

</a4j:support>

não sei se isso vai funcionar no seu caso …( nunca testei esse setProperty com o a4jsupport ) mas vale a pena tentar…

já estou ficando sem recursos pois também sou novo nesses frameworks hehehe …

segue um link muito bom para exemplos de richfaces (veja se existe algo nesse site próximo ao que vc precisa fazer.)
http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=editDataTable&cid=926686

Abraço!

[/quote]

Tentei essa solução e o código agora não está gravando nada na string “target”.

Meu código ficou assim:
<a4j:repeat value="#{Executor.inputs2}" var=“item”>
<h:outputText value="#{item}" />
<h:inputText id=“textoInput” style=“FONT-SIZE: small; FONT-FAMILY: ‘Arial’;
text-align:left;color:Black; width : 100px;” value="#{Executor.novaString}">

 	    <a4j:support event="onblur"  
                            actionListener="#{Executor.incluirInputNaLista}">
          
                             <f:setPropertyActionListener value="#{Executor.novaString}"  
                              target="#{Executor.inputAtual}" />  
                        
             </a4j:support>  
	
		         </h:inputText>
		<br/>

</a4j:repeat>

Explicando melhor: Executor é a classe onde tenho que pegar a string recebida do usuário e adicionar na lista de inputs. Nova String é uma string auxiliar e inputAtual é a string que quero realmente inserir na lista de inputs. Não sei se entendi direito a sugestão, mas “item” é um objeto do tipo string (é a label do input que quero inserir), logo não sei o que você quis dizer quando coloca “item.stringNova” como value do inputText, kritiuns.

Valeu !

Descobri que a variavel inputAtual (target) só estava sendo setada depois da execução da função “incluirInputNaLista” e por isso vinha vazia quando executava.

Mudei uma coisa: ao invés de actionListener, estou utilizando action e a variavel está sendo setada antes da execução da função, como que quero.

Ficou assim:

<a4j:support event=“onchange”
action="#{Executor.incluirInputNaLista}">

           <f:setPropertyActionListener  target="#{Executor.inputAtual}"
            value="#{Executor.novaString}" />  

Porém, como estou no trabalho, não posso testar o caso em que aparecem mais de 1 inputText, pra ver como está.
Creio que nesse caso aconteça o mesmo problema de as strings serem copiadas. Por exemplo, quando eu digitar o primeiro input, todas as caixas de texto vão ficar com o value igual à string que digitei, pois elas utilizam a mesma variavel. Não sei como contornar isso : / .

Valeu !

é, com 1 input somente, funciona
mas quando tem mais de 1, buga tudo também : /

Mudei o código, seguindo a dica de uma amigo que vi em outro forum…
Está funcionando como eu quero, mas ainda não consegui entender a lógica perfeitamente

O .jsp ficou assim:

<a4j:repeat value="#{Executor.inputs2}" var="item">
 	   <h:outputText value="#{item}" />
 	   <h:inputText id="textoInput" style="FONT-SIZE: small; FONT-FAMILY: 'Arial';
			text-align:left;color:Black; width : 100px;" value="#{Executor.novaString}"
			valueChangeListener="#{Executor.incluirInputNaLista}" > 
 	   
 
	
		
		</h:inputText> 
		<br/>
		</a4j:repeat>

E o bean:

public void incluirInputNaLista(ValueChangeEvent value){
value.getOldValue();
value.getNewValue();
System.out.println("InputAtual do incluir= "+(String)value.getNewValue());
Executor.getListaInputsEntrada().add((String)value.getNewValue());
}

Valeu pessoal !