Não carrega a página no retorno do SERVLET [RESOLVIDO]

18 respostas
P

Pessoal,

Estou na tela de login, e ao validar no servlet eu abro uma página com iframe, mas quando retorna, o iframe fica pequeno, ai teho que dar um refresh (F5) na página e ai volta ao normal...

Tem alguma maneira de eu fazer a página carregar no retorno do SERVLET? ou mudar algo no webxml ? pois na url fica o nome do servlet...

No SERVLET:

request.getRequestDispatcher("home.jsp").forward(request, response);
				

//  TENTEI ASSIM TBM:

response.sendRedirect("home.jsp");[quote]

Mas a página precisaria dar um refresh antes de abrir...

18 Respostas

E

Quer resolver o problema de forma fácil? Use Ajax, no seu ajax vc pode retornar sua jsp(chegando tudo pronto) ou dados xml ou json(onde vai vir só o objeto) e vc coloca onde quiser os dados.
Iframe eu acho uma merda q inventaram e dá mais dor de cabeça q nao sei oq…
Ou tem q ser iframe por padrão da empresa?

P

Oi Edu, obrigado pela resposta…

Tem que ser algo que não fique carregando a página…

Mas tentei Ajax até a última… mas com essas dos Browsers estava ficando loco, não consegui adaptar para IE e CHROME…

Estava pensando em usar as funções do Ajax de submit, mas ainda apanho muito dele…

Pensei em criar uma página de erros e direcionamentos, assim que o servlet tratar, enviar para essa jsp e dela enviar de volta para a jsp com iframe, mas acho isso meio estranho pois o servlet já serve para isso…

Não sei se existe alguma configuração no web.xml para quando o Servlet responder ele realemnte direcionar e não deixar o nome da servlet na url…

E

Seguinte, use jquery e seus problemas de browser vao acabar, é simples e funciona no ie, chrome, firefox.
Com 5 linhas de javascript vc faz isso. Tenta aew, se nao conseguir vai postando oq esta empacando q a gente vai ajudando.

P

Oi Edu, não sei nem por onde começar, vc poderia me dar uma luz?

Procuro por algo que de submit? que da refresh na tela?

E

Cara pra dar refresh na tela inteira nao pode usar iframe
Posta um pouco do codigo aew pra mim ver oq vc quer fazer

P

O que preciso no momento é que funcionasse corretamente a devolução do Servlet, mas quando ele devolve tem um javascript que redimensiona o iframe que não funciona, então tenho que apertar o F5.

Outro caso é na tela de login, quando forço o erro, a mensagem de login e/ou senha inválido só aparece se eu apertar o F5.

Tela de login:

 <% if (request.getSession().getAttribute("loginUsuario") != null) {%>
	
  <script type="text/javascript">  
      
      if (window.top != window.self) {  
        window.top.location="3.jsp"; // AQUI VERIFICO SE TEM USUARIO NA SESSION SE SIM, ENCAMINHA PARA A TELA PRINCIPAL, MAS ESTÁ COM O PROBLEMA 
      }  
    
  </script>	
 <%} else {%>
<style>

#content {position:relative;} 
</style>
    <body>
	
	
	
<div id="content">		
<center>
	<form action="ServletValidaLogin" method="post">
		<input type="hidden" id="msgRetornoLogin" value="<c:out value="${msgRetornoLogin}"/>" />
		<br>
		<br>
		<br>
		<br>
		<br>
		<br>
		<table border="1px" cellspacing="0" cellpadding="6">
			<tr class="tabelaAcesso">
				<td style="border-color: white" style="border-style:groove"	colspan="3">Acessar</td>
			</tr>
			<tr class="textoAcesso">
				<td align="left" style="border-color: white" style="border-style:groove">Login:</td>
				<td><input type="text" name="login" id="login" align="left" maxlength=15 style="background-color: #DCDCDC"></td>
			</tr>
			<tr class="textoAcesso">
				<td align="left" style="border-color: white" style="border-style:groove">Senha:</td>
				<td><input type="password" name="senha" id="senha" align="left" maxlength=15 style="background-color: #DCDCDC"></td>
			</tr>
		</table>
		<br>
		<input type="submit" value="Acessar">
	</form>
</center>
</div>

</body>

	<script>
		var msgRetornoLogin = document.getElementById("msgRetornoLogin");

		if (msgRetornoLogin != null && msgRetornoLogin.value != "") {

			alert(msgRetornoLogin.value);

		}
	</script>
<%} %>



SERVLET DO LOGIN:


public ServletValidaLogin() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");

		VerificaUsuario verifica = new VerificaUsuario();
		String login = "a";//request.getParameter("login");
		String senha = request.getParameter("senha");
		String msgRetornoLogin = null;
		
		try {
			boolean status = verifica.verificarUsuario(login, senha);

			boolean a = true;
			if (a == true) { // teste

				request.getSession().setAttribute("loginUsuario", login);  
				

				//request.getRequestDispatcher("3.jsp").forward(request, response); JÁ TENTEI ASSIM TAMBÉM
				
				response.sendRedirect("3.jsp");
				
				
			} else {
				msgRetornoLogin = "Login e/ou Senha inválido(s)";
				request.setAttribute("msgRetornoLogin", msgRetornoLogin);
				request.getRequestDispatcher("access.jsp").forward(request, response); // ASSIM, ELE DEIXA O NOME DA SERVLET NA URL E PRECISO APERTAR F5 PARA MOSTRAR ERRO
			}

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}


AO ENTRAR NA TELA COM IFRAME, TENHO UM SUBMIT, QUE ESTÁ COM O MESMO PROBLEMA


Tela que tem o iframe

		<div>
			<iframe src="teste.jsp" name="destino" frameborder="0" id="destino" scrolling="yes"/></iframe>
		</div>


		<div><input name="pesquisaRel" id="pesquisaRel" type="submit" value="Pesquisar"/></div>


Uso esse script para ajustar o iframe :

if ( window.addEventListener ) {
    document.getElementById('destino').addEventListener('load',ResizeI,false);
    window.addEventListener('resize',ResizeAllF,false);
} else {
    document.getElementById('destino').attachEvent('onload',ResizeI);
    window.attachEvent('onresize',ResizeAllF);
}



SERVLET DO IFRAME:


protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		List<ListaFiltro> relatorioAtual = new ArrayList<ListaFiltro>();
		
		// Consultar campos do Filtro
		ValidaData validaData = new ValidaData();

		String dataIni = request.getParameter("dataIni");
		String dataFin = request.getParameter("dataFin");
		String horaIni = request.getParameter("horaIni");
		String horaFin = request.getParameter("horaFin");
		String[] MultiplosDadosFiltro = request.getParameterValues("MultiplosDadosFiltro");
		

		
		if (MultiplosDadosFiltro == null){
		System.out.println("VAZIO");
			msgRetornoFiltro = "Selecione um Campo";
			request.setAttribute("msgRetornoFiltro", msgRetornoFiltro);
			request.getRequestDispatcher("error.jsp").forward(
					request, response);  // AQUI ESTOU TENTANDO CRIAR UMA TELA PARA ADMINISTRAR ERRO E SUCESSO.
			
		} else {
			
			try {
				System.out.println(" dataIni: " + dataIni + " dataFin: " + dataFin + " horaIni: " + horaIni + " horaFin: " + horaFin);
				VerificarFiltroResultado vrGera = new VerificarFiltroResultado();
				
				relatorioAtual = vrGera.Verificador(MultiplosDadosFiltro);

				
				// Preenche a lista para gerar o arquivo caso apertem o botão
				String[] teste = MultiplosDadosFiltro;   
				String retorno = "";         
				        if(teste!= null){   
				            for (String s : teste) {  
				                retorno  += s+",";   
				            }   
				        }   
				request.setAttribute("MultiplosDadosAtuais2", retorno);  
				
				
				request.setAttribute("relatorioAtual", relatorioAtual);
				request.getRequestDispatcher("teste.jsp").forward(
						request, response);
				
			} catch (BiffException e) {

				e.printStackTrace();
			} catch (ClassNotFoundException e) {

				e.printStackTrace();
			} catch (SQLException e) {

				e.printStackTrace();
			} catch (Exception e) {

				e.printStackTrace();
			}

			}

	}
freakazoid
Pacato:
Pessoal,

Estou na tela de login, e ao validar no servlet eu abro uma página com iframe, mas quando retorna, o iframe fica pequeno, ai teho que dar um refresh (F5) na página e ai volta ao normal...

Tem alguma maneira de eu fazer a página carregar no retorno do SERVLET? ou mudar algo no webxml ? pois na url fica o nome do servlet...

No SERVLET:

request.getRequestDispatcher("home.jsp").forward(request, response);
				

//  TENTEI ASSIM TBM:

response.sendRedirect("home.jsp");[quote]

Mas a página precisaria dar um refresh antes de abrir...

Qual o erro que dá? 404?

P

Olá freakazoid,

Não… o erro que dá é que fica o nome da Servlet na url, como se não tivesse encaminhado para a tela 3.jsp, ai eu tenho que apertar o F5 para recarregar ai funciona, ou mostra a mensagem de login inválido (quando está) ou ajusta o frame (se o login tiver correto)

Não é mensagem de erro e sim o problema… não sei se consegui ser claro? pq as vezes penso e não escrevo rsrs

E

mais não é mais fácil fazer um filtro de login, se o cara não estiver na sessao envia para tela de login senao trabalha normalmente…
criar um filtro de login com umas 5 linhas fica mais fácil, mais legivel e elegante doq esse monte de código não, ou tem algo q eu não vi?

P

Então edu, mas tem a parte de carregar o iframe, que vem reduzido e só dando f5 que ele aumenta, pois uso aquele js para redimensionar

freakazoid

Altera o nome no seu url-pattern, no mapeamento da sua servlet

<servlet>
    <servlet-name>servletOiMundo</servlet-name>
    <servlet-class>
        br.com.guj.servlet.OiMundo
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>servletOiMundo</servlet-name>
    <url-pattern>/oi</url-pattern>   
</servlet-mapping>

Acredito que vc protegeu a sua pagina dentro do web-inf, de modo a forçar o usuário a logar para ter acesso, aí ao invés de dar um redirect vc pode fazer um foward.

P

Oi Frekazoid não é isso não…

Não funcionou… apenas mudou o nome na url…

Mas o meu problema não está apenas em mudar o nome, mas sim de realmente ele abrir a página 3.jsp, mesmo eu usando o forward no servlet, ele não carrega a página, ele simplesmente direciona para ela.

O caso é que a página 3.jsp abre, mas fica com o iframe torto, ai precisa de um F5 para arrumar, mas como não está realmente na 3.jsp (e sim com o nome da servlet na url) ele fica em branco ao tentar dar um refresh.

freakazoid

Pacato:
Oi Frekazoid não é isso não…

Não funcionou… apenas mudou o nome na url…

Mas o meu problema não está apenas em mudar o nome, mas sim de realmente ele abrir a página 3.jsp, mesmo eu usando o forward no servlet, ele não carrega a página, ele simplesmente direciona para ela.

O caso é que a página 3.jsp abre, mas fica com o iframe torto, ai precisa de um F5 para arrumar, mas como não está realmente na 3.jsp (e sim com o nome da servlet na url) ele fica em branco ao tentar dar um refresh.

OK vamos por partes! O primeiro o problema é carregar a pagina com dados, correto?
Esse dados vem de onde? Request? Session? DB?

Se vier na Request, VC precisa na sua servlet recupera-los e setar novamente na Request.

P

O meu problema não está como o iframe pega ou encaminha a página.

O meu problema está em dois ciclos.

1º: Ao validar o login:

Quando dou submit no servlet, ele não retorna a mensagem de erro, pois fica branco:

(Anexo 1)

2: ciclo, acessar a página.

E quando mudo o servlet (simulando o acesso com sucesso) abre o iframe com tamanho pequeno, e agora nem apertando F5 não vai, pois fica apontando para o ServletValidaLogin, e não para a tela 3.jsp.

Quando eu coloquei uma tela de JSP para usar como direcionamento: ( página access.jsp–> página Valida --> Servlet --> página Valida --> 3.jp OU access.jsp) aparecia a página 3.jsp com esse problema do tamanho do iframe, ai era só eu apertar F5 que funcionava (MAS ainda ficava na url a valida.jsp e não a 3.jsp)

(Anexo 2)

Códigos usados no Anexo 3

P

A solução alternativa (gambiarra) que eu achei foi a de tratar em uma jsp e não em um Servlet, devido ao redirecionamento que não recarregava a página:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="br.com.pgpm.usuario.VerificaUsuario"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">	
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">	
</head>

<style>
	
*{margin:0;padding:0;}

html,body {overflow:hidden; width:100%; height:100%;}

</style>

	<body>

	<%
		VerificaUsuario verifica = new VerificaUsuario();
		String login = request.getParameter("login");
		String senha = request.getParameter("senha");
		boolean status = verifica.verificarUsuario(login, senha);

			if (verifica.verificarUsuario(login, senha) == true) {
			out.println("Login feito com sucesso " + verifica.login);

			request.getSession().setAttribute("loginUsuario", login);  				

			%> 
			<script>
				location.href = "index.jsp";
			</script>
			<% 

		} else {
	%>

	<script>
		alert("Login e/ou Senha inv\u00e1lido(s)");
		location.href = "login.jsp";
	</script>

	<%
		}
	%>
</body>
</html>
P

Pessoal, gambiarra Wins:

Não consegui usar o servlet para redirecionar corretamente para atender minha necessidade, então uso uma jsp como servlet e faço o tratamento de redirecionar com location.href:

<body>

	<%
		VerificaUsuario verifica = new VerificaUsuario();
		String login = request.getParameter("login");
		String senha = request.getParameter("senha");
		boolean status = verifica.verificarUsuario(login, senha);

			if (verifica.verificarUsuario(login, senha) == true) {
			out.println("Login feito com sucesso " + verifica.login);

			request.getSession().setAttribute("loginUsuario", login);  				

			%> 
			<script>
				location.href = "index.jsp"
			</script>
			<% 

		} else {
	%>

	<script>
		alert("Login e/ou Senha inv\u00e1lido(s)");
		location.href = "login.jsp";
	</script>

	<%
		}
	%>
</body>
E

eita pacato, q coisa mais feia do mundo
da próxima vez escute oq os outros falam, leia sobre filtro em java pra web

P

Oi Edu… eu sei disso :frowning:

Eu queria muito ter adicionado filtros… mas sou novo ainda em desenvolvimento web (acho que percebeu né :slight_smile: ) mas não tenho tempo hábil de fazer… a minha área é mais para desenvolver protótipos não será o sistema final, mas eu tento fazer o mais próximo possível.
Como não consegui aprender rápido a colocar os filtros eu tive que apelar para isso…

Outro problema do filtro é que eu acho que iria deparar de novo com a parte de redirecionar… pois o tratamento dele é semelhante a de um servlet não é?

Obrigado mais uma vez

Criado 28 de agosto de 2014
Ultima resposta 8 de set. de 2014
Respostas 18
Participantes 3