Problemas com Logic:iterate

26 respostas
D

Bom dia!

Estou querendo exibir os valores que coloquei numa List. Essa list eu declarei no VO pai e no VO filho eu coloquei as variáveis para armazenar em outra tabela no banco. Como que eu posso usar o logic:iterate para buscar todos os valores no banco?

Eu tentei da seguinte maneira:

<logic:present name="SoftwareFornecedorVO" >        
  		<logic:iterate name="SoftwareFornecedorVO" id="fornecedor" indexId="idx">
  			<TR>
  				<TD width="5%"><input type="text" name="fornec" value="<bean:write name="fornecedor" property="codFornecedor"/>" size="15" /></TD>
  			</TR>             
  		</logic:iterate>
  	</logic:present>
  </TR>

o nome da list é softwareFornecedor, o VO pai é SoftwareVO e o VO filho é SoftwareFornecedorVO. A variável que eu preciso mostrar é ‘codSoftware’. Alguem pode me dar uma mão?

[]'s

26 Respostas

the_negao

Você colocou sua lista na session?

request.getSession().setAttribute("SoftwareFornecedorVO", [SEU LIST]);
D

não!

isso eu coloco onde? No Action?

aconstantino

Isso, vc coloca na Action que manda para esta página…

Dá para colocar na request tmb:

request.setAttribute("SoftwareFornecedorVO", [SEU LIST]);
D

Acho que não to conseguindo expor meu problema, vou colocar o código para vcs entenderem:

Código na Action de Insert e o código que chama a página de Details:

public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws WebActionException, GpbrBusinessException {
        BusinessDelegate delegate = getBusinessDelegate();
        Serializable serializable = null;
        Collection persistCollection = new LinkedList();
        SoftwareVO softwareVO = (SoftwareVO) ((PersistentObjectGenerate) form).getPersistentObj(); 
        persistCollection.add(softwareVO);
        persistCollection.addAll(softwareVO.getSoftwareFornecedor());

        try {
            serializable = delegate.insert(persistCollection);
        } catch (GpbrPersistException e) {
            throw new WebActionException("Erro ao inserir registro", e);
        } catch (GpbrBusinessException e) {
            throw e;
        }
        persistedObject(mapping, form, request, response, serializable);
        cleanSession(mapping, form, request);
        request.setAttribute(BasicAction.MESSAGE_ATTRIBUTE, "Inclusão realizada com sucesso!");
        return dispatch(mapping, form, request, response, CommandTypeConstants.INSERIR);
    }

    public ActionForward showDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws GpbrPersistException, WebActionException {
        try {
        	SoftwareVO softwareVO = (SoftwareVO) getBusinessDelegate().findById(((PersistentObjectGenerate)form).getPersistentObj());
            request.setAttribute("softwareVO", softwareVO);
        } catch (GpbrPersistException e) {
            throw new GpbrPersistException("Erro ao fazer consulta de Software.", e);
        }
        return mapping.findForward("detailCadSoftware");
    }

Código no VO Pai ( SoftwareVO ):

public class SoftwareVO extends ValueObject {
    public Integer id;
    private List softwareFornecedor;

    public List getSoftwareFornecedor() {
		return softwareFornecedor;
	}

	public void setSoftwareFornecedor(List softwareFornecedor) {
		this.softwareFornecedor = softwareFornecedor;
	}

    public void setId(Integer id) {
    	if(softwareFornecedor != null) {
    		Iterator i = softwareFornecedor.iterator();
    		while(i.hasNext()) {
    			SoftwareFornecedorVO softwareFornecedor = (SoftwareFornecedorVO) i.next();
    			softwareFornecedor.setCodSoftware(id);
    		}
    	}
        this.id = id;
    }
    public String[] getRelationshipAttributes() {
        return new String[] {"softwareFornecedor"};


    }	

}

Código no VO filho ( SoftwareFornecedorVO ):

public class SoftwareFornecedorVO extends SoftwareVO {
	public Integer codSoftware;
	public Integer codFornecedor;
	
	public Integer getCodSoftware(){
		return codSoftware;
	}
	
	public void setCodSoftware(Integer codSoftware){
		this.codSoftware = codSoftware;
	}
	
	public Integer getCodFornecedor() {
		return codFornecedor;
	}
	
	public void setCodFornecedor(Integer codFornecedor){
		this.codFornecedor = codFornecedor;
	}
}

Código no Form:

public class SoftwareForm extends FormBean {
    private String id = "";
    private String[] fornec;

    public Serializable getPersistentObj() {
        SoftwareVO softwareVO = new SoftwareVO();
        List listSoftwareFornecedor = new ArrayList();
        for(int i = 0; fornec != null && i < fornec.length; i++) {
        	String codFornecedor = fornec[i];
        	SoftwareFornecedorVO softwareFornecedor = new SoftwareFornecedorVO();
        	softwareFornecedor.setCodFornecedor(Integer.valueOf(codFornecedor));
        	listSoftwareFornecedor.add(softwareFornecedor);
        }
        softwareVO.setSoftwareFornecedor(listSoftwareFornecedor);
        if (StringUtils.trimToNull(id) != null) {
        	softwareVO.setId(NumberUtils.createInteger(id));
        }
        return softwareVO;
        
    }
    public String[] getFornec(){
    	return fornec;
    }
   
    public void setFornec(String[] fornec){
    	this.fornec = fornec;
    }
}

Tentei o que vcs falaram, mas continua não funcionando =/

Acho que com o código fica mais fácil de entender, ele não mostra nada e também não da erro nenhum.

[]'s

aconstantino

Acho que o que está acontecendo é que você está tentando iterar uma VO e não uma collection… Tente setar uma collection

D

E como que eu seto uma collection?

aconstantino

A sua List é uma Collection:

getSoftwareFornecedor()

Assim:

request.setAttribute("testeLista", softwareVO.getSoftwareFornecedor());

ai vc itera assim:

&lt;logic:iterate name="testeLista" id="fornecedor" indexId="idx"&gt;
D

Desse jeito:

<TR class="lbl1">
   	<logic:present name="listSoftwareFornecedor" >        
   		<logic:iterate name="testeLista" id="fornecedor" indexId="idx">

   			<TR>
   				<TD width="5%"><input type="text" name="fornec" value="<bean:write name="fornecedor" property="codFornecedor"/>" size="15" /></TD>
   			</TR>             
   		</logic:iterate>
   	</logic:present>
   </TR>
public ActionForward showDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws GpbrPersistException, WebActionException {
        try {
        	SoftwareVO softwareVO = (SoftwareVO) getBusinessDelegate().findById(((PersistentObjectGenerate)form).getPersistentObj());
            request.setAttribute("softwareVO", softwareVO);
            request.setAttribute("testeLista", softwareVO.getSoftwareFornecedor());
        } catch (GpbrPersistException e) {
            throw new GpbrPersistException("Erro ao fazer consulta de Software.", e);
        }
        return mapping.findForward("detailCadSoftware");
    }

Não aparece nada e não da erro nenhum, se eu mudar o jsp para:

<TR class="lbl1">
       
   		<logic:iterate name="testeLista" id="fornecedor" indexId="idx">

   			<TR>
   				<TD width="5%"><input type="text" name="fornec" value="<bean:write name="fornecedor" property="codFornecedor"/>" size="15" /></TD>
   			</TR>             
   		</logic:iterate>

   </TR>

Aparece o erro " [ServletException in:/views/software/cadSoftware_detail.jsp] Cannot find bean testeLista in any scope’ "

aconstantino

Vc está debugando? está certo de que ele está setando a lista na requisição?

D

qdo eu debugo, ele entra na primeira linha " <logic:present name=“listSoftwareFornecedor” > "e sai dela…cotninua a execução sem nenhum erro!

aconstantino

Ele entra no iterate?
Se não, tira a tag <logic:present> e </logic:present>

D

não…ele ‘ameaça’ entrar e sai fora rsrs

se eu tiro, ele da aquele erro que eu falei “bean … in any scope”

Marcel_Horner

Primeiro vc tem que corrigir o “logic:present” passando o mesmo nome que vc setou para a sua lista. Depois vc tem que definir o tipo de objeto que existe dentro da sua lista, no caso “SoftwareFornecedorVO”, nao esquecendo de incluir o pacote onde esta a sua classe. Parece que faltou uma tag TABLE e uma TD ai no seu codigo, nao?

Acredito que o codigo abaixo deve funcionar:

<TR class="lbl1">
    <TD>
        <TABLE>
        <logic:present name="testeLista" >        
            <logic:iterate name="testeLista" id="fornecedor" indexId="idx" type="br.com.nome_do_seu_pacote.SoftwareFornecedorVO">
                <TR>
                    <TD width="5%">
                        <input type="text" name="fornec" value="<bean:write name="fornecedor" property="codFornecedor"/>" size="15" />
                    </TD>
                </TR>             
            </logic:iterate>
        </logic:present>
        </TABLE>
    </TD>
</TR>
D

Continua com o mesmo problblema, não aparece nada e não dá nenhum erro!

aconstantino

qual é o scope da action no struts-config.xml ?

Marcel_Horner

Pelo que vc postou do codigo me parece estar tudo correto.

Tente incluir o atributo scope=“request” na suas tags equal e iterate. Para testar vc pode tantar incluir a sua lista na sessao e setar o scope para session.

Vc tem certeza que o softwareVO.getSoftwareFornecedor() retorna alguma coisa? E que o sistema esta executando a action showDetail que vc postou?

D

o showDetail funciona pq ele mostra os outros campos, só não mostra os campos da collection!

E o softwareVO.getSoftwareFornecedor() acho que não está pegando nada! Quando eu debuguei, fui nas variáveis e na ‘list softwarefornecedor’ estava ‘null’

Marcel_Horner

Entao esta ai o problema. A lista que vc esta mandando o iterate exibir eh o resultado deste softwareVO.getSoftwareFornecedor():

request.setAttribute("testeLista", softwareVO.getSoftwareFornecedor());

D

Entendi mais ou menos…não entendi como funciona o iterator…acho que preciso criar um business delegate

Alguém pode me dizer como que eu crio uma list…array…nao sie o nome, q eu mesmo seto, defino os valores dentro do código e depois eu tento exibir ela no .jsp, apenas para eu ver como funciona!

Tipo…eu queria criar minha list ou linkedlist com os valores ‘3 e 4’ por exemplo…ai eu quero mostrar essa linked list no arquivo .jsp

[]'s

Marcel_Horner

Substitua o codigo abaixo:

request.setAttribute("testeLista", softwareVO.getSoftwareFornecedor());

Por:

ArrayList testeLista = new ArrayList(); testeLista.add("3"); testeLista.add("4"); request.setAttribute("testeLista", testeLista);
Substitua a declaracao do seu iterate por:

<logic:iterate name="testeLista" id="fornecedor" indexId="idx" type="java.lang.String">

E remova o atributo property do bean:write, deixando assim:

<bean:write name="fornecedor"/>

Veja se assim exibe o 3 e o 4 no seu jsp.

D

Não exibiu…deu o seguinte erro:

[ServletException in:/views/software/cadSoftware_detail.jsp] /views/software/cadSoftware_detail.jsp(59,83) According to TLD, tag bean:write must be empty, but is not'

e no jsp, eu declarei da seguinte maneira:

<TR class="lbl1">
     <TD>
         <TABLE>
       
             <logic:iterate name="testeLista" id="fornecedor" indexId="idx" type="java.lang.String">
                 <TR>
                     <TD width="5%">
                        <TD width="5%"><input type="text" name="fornecedor" value="<bean:write name="fornecedor"> "/></TD>
                     </TD>
                 </TR>             
             </logic:iterate>

         </TABLE>
     </TD>
 </TR>

Removi o input type=“text” e continua aparecendo a mesma mensagem! Não tem nada preenchido

Marcel_Horner

O problema esta na tag bean:write, inlcluia a barra antes de fechar a tag:

<TD width="5%"><input type="text" name="fornecedor" value="<bean:write name="fornecedor"/> "/></TD>
D

Ah garoto…agora funcinou :smiley:

Entendi como funciona o logic:iterate, mas voltando ao problema principal…eu envio os dados para a tabela através do VO filho ( SoftwareFornecedorVO ), então eu preciso buscar ele e trazer ele preenchido correto? Mas a list ‘softwareFornecedor’, eu criei ela no VO pai ( SoftwareVO ). Como que eu posso popular ele e exibir ele sendo que a lista está no pai e qm envia é o filho?

Eu vou precisar criar um BusinessDelegate para o SoftwareFornecedorVO, como este abaixo, para popular o VO do mesmo:

SoftwareVO softwareVO = (SoftwareVO) getBusinessDelegate().findById(((PersistentObjectGenerate)form).getPersistentObj());

Mas depois, como que vou popular a lista ‘softwareFornecedor’ para trazer e exibir no jsp?

Teve algo que eu esqueci de postar, é como eu populo para inserir, através do form…vou postar ele aqui abaixo:

List listSoftwareFornecedor = new ArrayList();
        for(int i = 0; fornec != null && i < fornec.length; i++) {
        	String codFornecedor = fornec[i];
        	SoftwareFornecedorVO softwareFornecedor = new SoftwareFornecedorVO();
        	softwareFornecedor.setCodFornecedor(Integer.valueOf(codFornecedor));
        	listSoftwareFornecedor.add(softwareFornecedor);
        }
        softwareVO.setSoftwareFornecedor(listSoftwareFornecedor);

Alguma luz para eu prosseguir? :smiley:

[]'s

D

Eu tentei o seguindo código no Action:

public ActionForward showDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws GpbrPersistException, WebActionException {
        try {
        	SoftwareVO softwareVO = (SoftwareVO) getBusinessDelegate().findById(((PersistentObjectGenerate)form).getPersistentObj());            
        	request.setAttribute("softwareVO", softwareVO);
        	SoftwareFornecedorVO softwareFornecedorVO = (SoftwareFornecedorVO) getBusinessDelegate().findById(((PersistentObjectGenerate)form).getPersistentObj());
        	request.setAttribute("softwareFornecedorVO", softwareFornecedorVO);


        } catch (GpbrPersistException e) {
            throw new GpbrPersistException("Erro ao fazer consulta de Software.", e);
        }
        return mapping.findForward("detailCadSoftware");
    }

mas ele da erro na linha 94 que é a SoftwareFornecedorVO softwareFornecedorVO …

Marcel_Horner

Parece que vc esta utilizando algum framework para persistencia, certo?

Eu nao conheco esses frameworks e nao vou poder lhe ajudar muito nesse caso. Sugiro que vc crie um novo topico para que possas obter ajuda mais rapidamente.

Beleza?

D

ok :smiley:

Valew pela ajuda Marcel!!

Criado 7 de agosto de 2006
Ultima resposta 8 de ago. de 2006
Respostas 26
Participantes 4