Dúvidas com Array no Struts

5 respostas
B

Olá pessoal, após ler vários posts antigos e outros sites não consegui resolver o meu problema.

É bem simples, eu to tentando imprimir os dados de dois ArrayList no JSP usando as tags do struts mas não sei como fazer isso.

Eu consigo imprimir somente 1 dos arrays e o outro ele não acha. Aqui vai alguns trechos de código importante

O JSP:

<jsp:useBean id="accounts" scope="request" class="java.util.ArrayList"/> 
            <jsp:setProperty name="accounts" property="accounts" value="<%=session.getAttribute("accounts")%>" /> 
            <logic:iterate id="user" name="users">
                <tr>      
                    <td><a href="edit.do?id=<bean:write name="user" property="id"/>"><bean:write name="user" property="id"/></a></td>
                    <td><bean:write name="user" property="firstName"/></td>
                    <td><bean:write name="user" property="lastName"/></td>
                    <td><bean:write name="user" property="email"/></td>
                    <td><bean:write name="user" property="address"/></td>
                    
                    <logic:empty name="accounts" property="accounts">
                        <td>
                            O Usuário não possui contas para acessar!
                        </td>
                    </logic:empty>        
                    
                    <logic:notEmpty property="accounts" name="accounts">
                        <td>
                            <logic:iterate id="account"  name="accounts">
                                <bean:write name="account" property="id"/>
                            </logic:iterate>
                        </td>
                    </logic:notEmpty>
                </tr>
            </logic:iterate>

O Action do struts-config.xml:

<action   path="/actions/listUsers"
                  name="users"                  
                  type="control.actions.ListUsersAction"                  
                  input="/error.jsp" attribute="accounts"
                  scope="request">
            <forward name="listUsers" path="/listUsers.jsp"/>            
        </action>

A Classe control.actions.ListUsersAction:

public class ListUsersAction extends CommonAction{
    private static Logger logger =
            Logger.getLogger(ListUsersAction.class.getName());
       
    public ActionForward commonExecute( ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) {
    ActionErrors errors = new ActionErrors();
    
    logger.warn("ListUsersAction.commonExecute()"); 
    
    HttpSession session = request.getSession();
    
    // Pega a fábrica de UserManager da sessão    
    IF_UserManagerFactory userFactory = (IF_UserManagerFactory) session.getAttribute("userfactory");
    IF_UserManager userManager = userFactory.createUserManager();  
       
    Collection c = new ArrayList();
    Collection u = new ArrayList();
   
    try {
        // Pega todos os usuários do BD e poe numa lista
        c = userManager.getAll();
    } catch (DAOException e) {
        // Mensagem para o usuário:
        errors.add("label", new ActionError("error.listfailed"));
        saveErrors(request, errors);
        
        // Log do erro:
        String message = "Erro ao listar os usuários";
        logger.fatal(message, e);
        
        // Salva a corrente de exceções:
        request.setAttribute("MYEXCEPTION", new DAOException(message, e));
        
        // Return to the error page
        return (mapping.findForward("error"));
    }
    try{
        // Pega todas as contas do usuário e poe numa lista
        Iterator i = c.iterator();
        User user;
        while(i.hasNext()){
            user = (User)i.next();
            u.add( userManager.getOwnedAccounts( user.getId() ) );
        }
    }
    catch (DAOException e) {
        // Mensagem para o usuário:
        errors.add("label", new ActionError("error.listfailed"));
        saveErrors(request, errors);
        
        // Log do erro:
        String message = "Erro ao obter od ID das contas de acesso do usuário";
        logger.fatal(message, e);
        
        // Salva a corrente de exceções:
        request.setAttribute("MYEXCEPTION", new DAOException(message, e));
        
        // Return to the error page
        return (mapping.findForward("error"));
    }
    session.setAttribute("users", c);
    //session.setAttribute("accounts", u);
    //session.setAttribute("users", u);
    
    return (mapping.findForward("listUsers"));
    }    
}

No JSP só aparece o ArrayList de “users”.
Tem como eu definir 2 arrays para um mesmo atributo? //session.setAttribute(“users”, u);

Quando eu defino outro atributo para a sessão – //session.setAttribute(“accounts”, u); – não consigo acessa-lo no JSP.
Quando eu tento fazer-lo, da o seguinte erro

org.apache.jasper.JasperException: Cannot find any information on property 'accounts' in a bean of type 'java.util.ArrayList' 149966 [http-8084-Processor24] WARN org.apache.struts.util.RequestUtils - No FormBeanConfig found under 'accounts'

Como eu faria isso?

5 Respostas

A

Bem,

para comecar, uma dica, de nomes comuns a suas variaveis e nao, isso aqui.

Collection c = new ArrayList();

Nao sei o que uma collection c faz.

Agora, preste atenção, onde esta sendo definido o property accounts ??
da uma melhorada no seu codigo. Se vc quer pegar o usuario do banco, o Id dele, entra no site da apache que vc tem algo pronto.

Abs

georgesq

em vez de vc usar o iterate, pq num usa notEmpty???

assim ele só vai passar na parte q te interessa se o List tiver conteúdo.

outra dica é, use o formBean do Struts, assim vc não precisar ficar colocando objetos direto no session e sim no formBean da sua action.

B

Marsola2K:
É, realmente quanto aos nomes eu não to dando muita atenção.
O ‘properties accounts’ esta sendo definido na segunda linha do trecho do código do jsp que eu postei. Há algum problema em ser definido aí?

Georgesq:
Como eu faço um loop com o notEmpty? O Iterate já não faz a verificação de fim de lista, então pq fazer um loop com o notEmpty?
Eu usei uma lógica de ‘empty’ ‘notEmpty’ para mostrar uma mensagem de vazio ou o conteúdo da lista.

Pois é, eu uso muitos formBeans do Struts em diversas ocasiões, mas em algumas ações, colocar uma lista em ‘session’ é mais pratico pois não precisa criar um formBean mas pelo visto, no meu caso vou ter que criar mesmo um formBean para colocar as duas listas.

B

Pois é, a minha dúvida continua. Como eu acesso os valores de um ArrayList que é parte de um formBean no JSP usando as tags do Struts??

Alguém tem algum exemplo?

Eu to tentando fazer algo do tipo

<logic:notEmpty property="cameras" name="loginFormBean">
    <table border=1 bgcolor="#FFFFCC">
                <tr>
                    <th>IdCamera</th>
                    <th>Status</th>                
                </tr>                        
                <logic:iterate id="camera" name="loginFormBean" property="cameras">
                    <tr>      
                        <td><bean:write name="camera" property="camId"/></td>
                        <logic:equal name="camera" property="active" value="0">
                            <td>Ativada</td>
                        </logic:equal>
                        <logic:notEqual name="camera" property="active" value="0">
                            <td>Desativada</td>
                        </logic:notEqual>
                    </tr>
                </logic:iterate>
    </table>
</logic:notEmpty>

Mas não ta dando certo! O erro diz:
javax.servlet.ServletException: No getter method for property: “camId” of bean: “camera”

Mas quando eu retiro a linha que ta dando erro –

<bean:write name=“camera” property=“camId”/> – funciona!

Isso ta me deixando louco pois existe o getter de camId no loginFormBean!

Alguém tem alguma idéia?
Eu já vi que pode ser erro do nome do método, mas eu já testei com vários nomes e nada da certo!

B

Ae pessoal,

finalmente, após semanas convivendo frustradamente com este problema, consegui resolver!

Vamos supor que você quer visualizar alguns dados na sua aplicação struts e você não quer criar um FormBean. Para isso, basta definir como atributo da sua sessão uma classe ou coleção que o Struts faz o resto pra você.
Como exemplo, atribua uma coleção para a sessão de sua aplicação
session.setAttribute(“images”, arrayImagens); –
sendo que ‘arrayImagens’ é um ArrayList preenchido com objetos ‘Image’

public class Image implements Serializable{
    
    private int     idImages;           // Id da imagem
    private String  date;               // Data de captura da imagem
    private String  name;               // Nome da imagem
    
    /** Creates a new instance of Image */
    public Image(int id, String data, String nome, int ori) {
        this.idImages = id;
        this.date     = data;
        this.name     = nome;
    }

    public String getDate() {
        return date;
    }

    public int getIdImages() {
        return idImages;
    }

    public String getName() {
        return name;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public void setIdImages(int idImages) {
        this.idImages = idImages;
    }

    public void setName(String name) {
        this.name = name;
    }

}

E quer visualizar as informações dos elementos da sua coleção no JSP usando as tags beans do Struts. Para isso você deve iterar sobre sua coleção dessa forma:

<logic:iterate id="image" name="images">
                    <bean:write name="image" property="idImages"/>
                    <bean:write name="image" property="date"/>
                    <bean:write name="image" property="name"/>
        </logic:iterate>

Aonde:
‘name’ é o nome da Coleção que foi definido na sessão.
‘id’ é o nome da instancia do Bean que irá ser criado a cada iteração.
A cada iteração, o Struts cria um bean com o elemento da coleção e para renderizar os dados da classe usa-se a tag
<bean:write name=“image” property=“idImages”/>
Aonde:
‘name’ é o nome do bean, definido no ‘id’ da iteração,
‘property’ é o nome do atributo da classe que foi instanciada pelo bean. (foi neste detalhe que eu passei despercebido). A sua classe deve ser um Bean – conter getters e setters para todos os atributos seguindo o padrão de nomes de métodos (getXxx, setXxx).

Simples assim!

É isso pessoal, qualquer dúvida quanto a esta solução, é só me perguntar que eu tento responder.

Falows.

Criado 29 de janeiro de 2007
Ultima resposta 1 de fev. de 2007
Respostas 5
Participantes 3