Dúvida no Struts : como iterar em um array de tipo primitivo?

4 respostas
B

Olá pessoal,

eu gostaria de fazer um select com os valores de um array de tipo primitivo usando tags do Struts no jsp.

Infelizmente, a tag logic:iterate não é compatível com array de tipos primitivos - An array of Java objects (but not primitive data types such as “int”) - então eu não sei como eu poderia resolver meu problema.

Tentei fazer com um Collection de ‘int’ no meu form bean mas também não é possível iterar sobre eles, nem fazer um array de ints ( int fib[] = new int[] )

Alguém sabe algum jeito de contornar isso?
Alguma sugestão de abordagem?
Não precisa ser exatamente usando tags do struts mas ia ser bem mais fácil fazer o select pois ia ser só 2 linhas praticamente do tipo

<html:select property=“fibonatti” name=“formBean”>
<html:options collection=“fib”/>

Obrigado!

4 Respostas

P

não sei se vai te ajudar mas… troque int[] por Integer[] porque esse código:

int[] i = new int[2];
        i[0] = 10;
        i[1] = 11;

equilave

Integer[] i = new Integer[2];
        i[0] = 10;
        i[1] = 11;
B

Valeus pela dica plic_ploc, eu já tinha tentado usar a classe Integer mas não deu certo. Não tem um método GetValue() ou semelhantes que seja membro dela. Vou tentar usar ela de novo aqui e posto os resultados.

B

Olá pessoal, consegui resolver o problema que eu havia reportado. Usei a dica dada pelo plic_ploc e complementei com alguns detalhes.

A classe Integer realmente não funciona como Bean, não há getters nem setters porém, serviu para outras utilidades.

A solução encontrada não foi do jeito ideal que eu espera encontrar, tive que fazer código no JSP.

Fiz algo parecido com isso no JSP:

// aqui pelo menos identifica que o meu Collection não esta vazio
            <logic:notEmpty property="years" name="calendarFormBean">
                /* Aqui esta o truque! Useri a tag <jsp:useBean> e então, pude acessar a 
                   instância do meu FormBean que foi previamente definido na Classe Action.
                 */
                <jsp:useBean id="calendarFormBean" 
                                class="control.beans.calendarFormBean" scope="request"/>
                <td>
                    <%
                    // getYears() retorna um Collection cheio de Integers
                    java.util.Iterator it = calendarFormBeanormBean.getYears().iterator();
                    
                    // Cria um 'select' com os valores contidos no array de anos
                    out.println("<select name='years'>");
                    while(it.hasNext()){
                        Integer aux = (Integer)it.next();
                        out.print(" <option value='"+aux.toString() +"1>" );
                        out.println(aux.toString() +"</option>");
                    }
                    out.println("</select>");
                    %>
                </td>
            </logic:notEmpty>

Porém, agora estou com outro problema: não consigo utilizar a referência para o calendarFormBean em outro trecho de código jsp, entre <% %> distintos, da erro dizendo que não foi possível encontrar a variável. Para piorar, quando uso a tag <jsp:useBean id=“calendarFormBean” class=“control.beans.calendarFormBean” scope=“request”/> em outro ponto do JSP, da erro dizendo que o ‘name’ já esta sendo utilizado e se eu der outro id, algo como ‘calendarFormBean2’ não acha a intância de ‘calendarFormBean’.

Alguém sabe resolver este outro problema? Como acessar uma variável em diferentes porções de códigos JSP, trechos de <% %> distintos?

Valeus!

B

Olá pessoal,

consegui resolver o meu problema de variáveis compartilhadas no JSP.
Na verdade, é uma dúvida bem básica pra quem não ta acostumado a programar no JSP.

Para declarar uma variável que seja visível no escopo da classe, ela deve estar entre tags <%! %> , iniciados com o ponto de exclamação. Isso faz com que no .class gerado da compilação do JSP, as variáveis ficarão definidos no escopo da classe e não no método.

Essa foi fácil.

Descobri também que as tags alteram o escopo. Não tive a oportunidade de verificar como que estas tags são compiladas mas pelo jeito deve ter um try-catch circundando elas.

A solução final ficou:

/* Aqui esta o truque! Useri a tag <jsp:useBean> e então, pude acessar a 
                    instância do meu FormBean que foi previamente definido na Classe Action.
                    Não precisa/devo usar a tag <logc:notEmpty>
                  */
                 <jsp:useBean id="calendarFormBean" 
                                 class="control.beans.calendarFormBean" scope="request"/>
                 <%!
                      // Variáveis globais da classe
                      java.util.Iterator it = null;
                  %>
                 <td>
                     <%
                     // getYears() retorna um Collection cheio de Integers
                    it = calendarFormBeanormBean.getYears().iterator();
                     
                     // Cria um 'select' com os valores contidos no array de anos
                     out.println("<select name='years'>");
                     while(it.hasNext()){
                         Integer aux = (Integer)it.next();
                         out.print(" <option value='"+aux.toString() +"1>" );
                         out.println(aux.toString() +"</option>");
                     }
                     out.println("</select>");
                     %>
                 </td>

Espero que este tópico resolva algumas dúvidas que a comunidade possa ter. Fico devendo o código compilado do JSP para mostrar o escopo das variáveis.

Até mais!

Criado 4 de maio de 2007
Ultima resposta 10 de mai. de 2007
Respostas 4
Participantes 2