Servlet nao mostra nada até que o while seja finalizado

10 respostas
S

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...

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); 
	}

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

10 Respostas

S

alguém ai sabe por que?

davidbuzatto

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 é?

S

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

tveronezi

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

S

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

Meu projeto nao encontra as classes do pacote javax.websocket

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

tveronezi

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.

davidbuzatto

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

tveronezi

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.

S
  • 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…

S

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

Criado 3 de fevereiro de 2013
Ultima resposta 6 de fev. de 2013
Respostas 10
Participantes 3