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

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:

[code]
request.getRequestDispatcher(“home.jsp”).forward(request, response);

// JÁ TENTEI ASSIM TBM:

response.sendRedirect(“home.jsp”);[quote][/code]

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

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?

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…

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.

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?

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

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

			}

	}

[quote=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:

[code]
request.getRequestDispatcher(“home.jsp”).forward(request, response);

// JÁ TENTEI ASSIM TBM:

response.sendRedirect(“home.jsp”);[quote][/code]

Mas a página precisaria dar um refresh antes de abrir… [/quote]

Qual o erro que dá? 404?

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

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?

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

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.

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.

[quote=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.[/quote]

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.

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

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:

[code]<%@ 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”%>

*{margin:0;padding:0;} html,body {overflow:hidden; width:100%; height:100%;}
<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>

<%
	}
%>
[/code]

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:

[code]

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

<%
	}
%>
[/code]

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

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