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?
Usando um item de um pool de objetos em uma pag. jsp
5 Respostas
Isto não é um caso para ser resolvido com Singleton?
http://c2.com/cgi/wiki?SingletonPattern
[]'s
Marco Campêlo
<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>
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;
}
}
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… 
O problema está na necessidade de chamar o getSala do pool. Como fazer isso em jstl?
Valeu
Dica: pq ao invés de ArrayList vc não usa um HashMap? Ai vc guarda a sala pela chave (id).
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.