Fiz um chat em jsf assim:
a cada vez que um usuario se loga e manda uma mensagem, esta é adicionada numa tabela dentro de um escopo se sessão, sendo atualizada pelo poll
até ae tudo bem, as 2 sessoes estao recebendo a mensagem e mandando sem problemas
O chat nao tem privado, todas as mensagens sao publicas
Porém acontece o seguinte
Eu me logo
Vc se loga
Eu mando mensagem para todos
Como so tem vc na sala, vc responde
Outra pessoa entra no chat
ela consegue ver todas as mensagens anteriores
Eu queria fazer que nem um bate papo do uol, que a pessoa so ve as mensagens a partir da hora, que ela entrou, entende?
Será que eh um problema de arquitetura?(detalhe: fiz com um bean so de sessao)Uma sessao nao conhece a outra, so conhece essa tabela …
Meu cod ta assim:
public String login(){
ExternalContext extCon = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) extCon.getSession(true);
setCor(getCorEscolhida());
session.setAttribute("User", usuario);
session.setAttribute("Cor", getCor());
mensagens = new ArrayList();
Mensagem msg = new Mensagem();
SimpleDateFormat sdf = new SimpleDateFormat( "hh:mm:ss" );
String hora= sdf.format( new Date() );
msg.setHora(hora);
msg.setMsgGenerica("entrou online");
msg.setUsuario(usuario);
msg.setCor(cor);
getMensagens().add(msg);
return "sala";
}
public String enviar()
{
int a=geraCorUsuario();
int b=geraCorUsuario();
int c=geraCorUsuario();
ExternalContext extCon = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) extCon.getSession(true);
String userName = (String) session.getAttribute("User");
String cor = (String) session.getAttribute("Cor");
Mensagem msg = new Mensagem();
SimpleDateFormat sdf = new SimpleDateFormat( "hh:mm:ss" );
String hora= sdf.format( new Date() );
msg.setHora(hora);
msg.setMsgGenerica(mensagemrecebida);
msg.setUsuario(userName);
msg.setCor(cor);
getMensagens().add(msg);
return null;
}
cria um atributo de sessão do usuário do site com a data/hora que ele logou.
Como vc tem a data/hora das mensagens enviadas, na hora de vc exibir as mensagens para os usuários vc testa horaMensagem > horaLogin.
O problema eh q essa tabela eh unica
Se eu tiver que exibir so as depois que ele logou, ao atualizar, isso vai mudar para todas as sessoes
As mensagens antigas nao vao aparecer pros usuarios antigos, que entraram antes desse usuario
Você poderia colocar um campo timestamp na sua tabela e gravar na sessão do uduário o momento que ele logou. Sendo assim, vc faz a pesquisa na tabela com uma condição que o tempo sempre deve ser maior que o tempo em que o usuário logou. Acho que resolve o seu problema.
[quote=carlavb]O problema eh q essa tabela eh unica
Se eu tiver que exibir so as depois que ele logou, ao atualizar, isso vai mudar para todas as sessoes
As mensagens antigas nao vao aparecer pros usuarios antigos, que entraram antes desse usuario[/quote]
O que eu quis dizer é o seguinte:
Vamos supor que vc esteja usando um dataTable para exibir mensagens e um outputLabel para exibi-las.
Vc pode fazer com rendered…
mas eh isso que eu nao quero, que seja unica para todas…
eu quero que eu, que so entrei no chat depois de fulano, so veja as conversar depois da hora que eu loguei…
nao todas…se eu entrei antes de x, e x antes de a, eu vou ver todas as conversas de mesma forma
isso que eu nao quero…
entende?
do jeito que eu to fazendo, todas as sessoes recebem as mensagem sem eu ter que adicionar em todas as sessoes, eu apenas adiciono uma linha de conversa na tabela e todas recebem, graças ao a4j:poll, porem eu queria que as tabelas ainda tievessem essa propriedade sem terem que serem alteradas por completo quando eu quiser mexer na logica de so mostrar X registros na sessao…
Outra coisa, se você coloca uma restrição do tipo: hora > xxxx então, para cada usuário, os dados só serão exibido a partir dakela hora.
Agora, tem dois detalhes nesse abordagem:
primeiro, vc tem que usar o formato de data em DD/MM/AAA-HH:MM:SS
segundo, você deve guardar quando o usuário logou. E não pode usar estático. Mas esse é simples, basta criar um bean que guarda o valor. Como o bean será modificado apenas uma vez, enquanto o usuário estiver logado, o bean guarda o momento que ele logou.
junte os post’s anteriores e forme a seguinte solução.
Jogue o bean com as conversas para o scopo de aplicação e quando for mostrar as conversas faça o teste da hora da conversa > hora login do usuário, conforme sugestão anterior.
Eu ja tinha posto com escopo de aplicação
Como o de aplicação atualiza para todos, e nao por sessao, se eu restringir com o IF, ele vai limitar as conversas para todos, como relatei antes
[quote=carlavb]Eu ja tinha posto com escopo de aplicação
Como o de aplicação atualiza para todos, e nao por sessao, se eu restringir com o IF, ele vai limitar as conversas para todos, como relatei antes
=/[/quote]
Carla, veja bem,
o bean com as conversas vai ficar no escopo de aplicação.
O IF vc vai colocar na página Jsf e não no java. A página Jsf não tem escopo.
olha, tentei dessa forma, e quando outro usuaário de loga, beleza, ele nao ve as mensagens antigas
Porem basta que qualquer um mande outra mensagem, para um, a tabela mostrat tudo de novo
Me parece que o IF do JSTL so testa quando a página é instanciada, e depois não mais
tá ae meu código: