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

13 respostas
A

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 !!!

13 Respostas

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

A

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

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

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

A

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

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

<a4j:keepAlive beanName=“Executor”/>

<a>a4j:region</a>

<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).

A

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 ?

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!!

A

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 !

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!!

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!

A

Obrigado pela disposição em ajudar !

Hoje mais tarde tentarei essa solução proposta !

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!

A

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 !

A

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 !

A

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

A

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 !

Criado 24 de maio de 2011
Ultima resposta 28 de mai. de 2011
Respostas 13
Participantes 2