Servlet nao mostra nada até que o while seja finalizado

Bom dia estou com uma servlet que executa um loop infinito para mostrar novas mensagens para o usuário, mas a mensagem so é mostrada quando eu de alguma forma saio do while
alguém ajuda por favor…

Método doGEt da servlet…

[code]protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	Usuario usuariologado = (Usuario) request.getSession().getAttribute("usuariologado");
	UserChat usuarioChat = new UserChat(usuariologado.getNome(), usuariologado.getNumero_matricula());
	usuarioChat.setResponse(response);
	usuarioChat.setRequest(request);
	
	Sala.sendMessage(new Mensagens (usuarioChat, "entrou na sala: " + new SimpleDateFormat("hh:mm").format(new Date())));
	
	while (usuarioChat.isConnected()) {  
	    try {  
	    	// espera pela proxima mensagem  
	    	Mensagens msg = usuarioChat.getNewMessage();  
	    	
	    	// checa a sessao  
	    	usuarioChat.checkSession();
	    	
	    	// se for uma mensagem, mostra ela, se nao, verifica a conexao  
	    	
			   if(msg != null){  
				   PrintWriter out = response.getWriter();  
	    		    out.println("<HTML>");  
	    		    out.println("<HEAD>");  
	    		    out.println("<TITLE>mensagens</TITLE>");  
	    		    out.println("</HEAD>");  
	    		    out.println("<BODY>");  
	    		    out.println("<div>"+ msg.getHTMLCode()+"</div>");  
	    		    out.println("</BODY>");  
	    		    out.println("</HTML>");
			
			 
			    	}else{  
			    		Sala.sendMessage(null);
			    	} 
			    	  
												  
	    } catch (Exception e) {  
	    	//Sala.sendMessage( new Mensagens(usuarioChat, e.getMessage())); 
	    	System.out.println("Erro "+ e.getMessage());
	        usuarioChat.disconnect();  
	    }  
	  
	}
	
	// tira o usuario da lista e tira sua sessao  
			Sala.removeUser(usuarioChat); 
}
[/code]

obs: estou criando um chat web baseado no tutorial do site.

alguém ai sabe por que?

Porque é assim que um Servlet funciona. Ele só vai “retornar” quando tudo tiver sido feito ou o output stream tiver sido fechado. Sua implementação deve ser alterada, para o cliente ficar pedindo as conversas do bate papo. É um bate papo não é?

sim é um bate papo…
voce tem a sugestão de como eu faria isso?

websockets
http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html

[quote=tveronezi]websockets
http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html
[/quote]

Meu projeto nao encontra as classes do pacote javax.websocket

uso o Tomcat (7.0.33) tem algo q tenho q fazer?

Esse pacote ainda não existe. O que existe é o "org.apache.catalina.websocket"
Websockets ainda não tem especificação (JSR-000356 em review), apenas soluções proprietárias.

Mesmo websockets sendo uma solução interessante, você não precisa usar necessariamente.

Você pode fazer algo do tipo:
Crie um servlet que busque no banco as mensagens que tem identificador maior que um id passado como parâmetro, por exemplo, se você tem as mensagens 6, 7, 8, 9 e 10 e você passar 6, eleretornanrá as mensagens 7, 8, 9 e 10. No lado do cliente, quando o usuário logar do bate papo, obtenha o id da última mensagem inserida na tabela. A partir dessa id, você vai fazer uma requisição ao servlet (usando Ajax), passando esse id como parâmetro. Essa requisição será feita usando um setInterval, para poder executá-la de tempos em tempos. A cada execução, você obtém as mensagens, escreve elas na tela e guarda o o maior id. Na próxima requisição, mande esse id como parâmetro para o servlet. Entendeu a ideia? Ela pode ser melhorada, mas o básico é assim.

[]'s

Concordo com davidbuzatto.
Vc pode usar Servlets também, mas ao invés de vc ficar fazendo uma requisição a cada x segundos, vc pode usar o relativamente novo “async call” https://blogs.oracle.com/enterprisetechtips/entry/asynchronous_support_in_servlet_3 (Servlet 3.0)

Desta maneira vc salva uma boa quantidade de bandwidth e tem o browser atualizado quase que instantaneamente.

[]s,
Thiago.

  • fiz o chat aqui usando o banco…

  • Fiz com que a pagina de mostrar mensagens que esta dentro de um iframe ficasse atualizando e acessando o banco a cada 2 segundos ficou o chat meia boca mais vou pesquisar um meio mais profissional de fazer isso para melhorar meu chat.

  • tveronezi vou pesquisar sobre o “async call” pra ver si faço algo de boa qualidade…

fiz usando usando Servlets assíncronos ficou bem melhor valeu tveronezi

fiz baseado neste tutorial

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/async-servlet/async-servlets.html