Problemas com Logic:iterate

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

Você colocou sua lista na session?

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

não!

isso eu coloco onde? No Action?

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

Dá para colocar na request tmb:

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

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

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

E como que eu seto uma collection?

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;

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’ "

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

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

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

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

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

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>

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

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

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?

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’

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());

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