Usando um item de um pool de objetos em uma pag. jsp

5 respostas
J

Pessoal,
tenho uma aplicação em que ao se logar o usuário entra numa área, digamos, SalaDeReunioes.
Acontece que os usuários estão divididos grupos, e cada grupo tem a sua própria sala.
Quando o primeiro membro de um grupo se loga, a sala do grupo dele é instanciada. Para os demais acessos, os outros membros tem que acessar a mesma sala (e referenciar, portanto, o mesmo objeto)
Eu criei uma classe chamada PoolDeSalas, com um ArrayList de salas para gerenciar essas salas e um método getSala(idDaSala).
Mas não estou conseguindo criar o código jsp necessário para fazer com que todos os usuários de um grupo acessem o mesmo objeto do pool.
Alguém ajuda?

5 Respostas

mcampelo

Isto não é um caso para ser resolvido com Singleton?

http://c2.com/cgi/wiki?SingletonPattern

[]'s
Marco Campêlo

J
Não é bem um Singleton, porque eu posso ter várias instâncias de SalaDeReunioes, uma para cada grupo. Mas eu preciso garantir que os usuários de um mesmo grupo estejam referenciando o mesmo objeto sala. Para ajudar, olha o que eu tentei:
<jsp:useBean id="poolDeSalas" class="pacote.PoolDeSalas" scope="application" />
<c:if test="${empty sala}" >
    <c:set var="salaEscolhida" value="${paramValues.salaescolhida}" />
    <c:set var="sala" value="${poolDeSalas.?????}" scope="session" />
</c:if>
Essa parte poolDeSalas.????? é que é o nó da história: como recuperar uma das salas do pool, passando o id salaEscolhida? O código do PoolDeSalas é assim:
public class PoolDeSalas
{    
    private ArrayList salas = new ArrayList();
    
    public SalaDeReunioes getSala(String idDaSala)
    {
        //busca da sala no pool
        Iterator it = salas.iterator();
        SalaDeReunioes aSala = null;
        while(it.hasNext())
        {
            aSala = (SalaDeReunioes)it.next();
            if(aSala.getId().equals(idDaSala))
                return aSala;
        }
        
        //se a sala não existir, busca no banco
        SalaDeReunioesDAO salaDAO = DAOFactory.getDAOFactory(Controle.getMecanismoDePersistencia()).getSalaDeReunioesDAO();
        aSala = salaDAO.recupera(idDaSala);
        salas.add(aSala);
        return aSala;   
    }       
}
Valeu.
J

Pessoal, consegui o comportamento esperado, com o seguinte scriptlet:

<% //inicialização da sala na primeira entrada.
SalaDeReunioes sala = (SalaDeReunioes)session.getAttribute("sala");
if(sala == null)
{
 String salaEscolhida = request.getParameter("salaescolhida");
 sala = poolDeSalas.getSala(salaEscolhida);
 session.setAttribute("sala", sala);
}
 %>

Mas depois de ter tido o trabalho de aprender jstl para me livrar dos scriplets, eu não queria usar um scriplet para isso… :cry:
O problema está na necessidade de chamar o getSala do pool. Como fazer isso em jstl?
Valeu

danieldestro

Dica: pq ao invés de ArrayList vc não usa um HashMap? Ai vc guarda a sala pela chave (id).

J

Daniel, a idéia do HashMap é legal, agiliza a busca.
Se eu tivesse todas as salas já carregadas na memória (o que não me parece uma boa idéia) eu poderia então “pegar” a sala pelo id mais ou menos assim:

${pool.salas[chave]}

Certo?
Mas aí o meu pool não seria um pool, no sentido de carregar as salas sob demanda…
O problema basicamente consiste no seguinte: como chamar um método que não seja um get/set de uma classe usando jstl? (vou fazer um post só para isso).
De qqr forma, valeu pela dica.

Criado 26 de abril de 2005
Ultima resposta 28 de abr. de 2005
Respostas 5
Participantes 3