Fórum Tratar erro 404 #528203

09/08/2015

0

Pessoal,

Minha aplicação é assim:
Aplicação 
              /Admin
                             arquivos do Admin
              /Usuarios
                              arquivos do Usuarios
              arquivos da aplicação


Para tratar o erro 404, coloquei um arquivo erro400.jsp junto aos arquivos da aplicação e no xml adicionei:

  <error-page>   
    <error-code>404</error-code>   
    <location>/erro404.jsp</location>   
  </error-page>


Bom, enquanto as páginas inexistentes estiverem entre os aquivos da aplicação os links de estilo e imagens ocorrem normalmente.

Basta que a página inexistente esteja dentro de uma das páginas da aplicação que os links de estilo e imagens ocorrem com erro. Ou seja, não carregam.

Exemplo:

Aplicação / págianaInesistente.jsp


Carrega tudo normalmente


Aplicação / Admin / págianaInesistente.jsp


A página 404.jsp carrega tudo normalmente. Mas os links de estilo e imagens ocorrem com erro. Ou seja, não carregam.

O que fazer?

Esse erro também ocorre quando existe transferência nos Servlets usando RequestDispatcher em vez de resposnse.sendRedirect
Carlos Rocha

Carlos Rocha

Responder

Posts

10/08/2015

Marcos Paulo

Boa tarde Carlos Rocha, tudo bem?

Creio que tal artigo pode lhe ser bastante útil!

[url]http://uaihebert.com/tratando-excecoes-em-uma-aplicacao-web/[/url]
Responder

Gostei + 0

10/08/2015

Carlos Rocha

Oi Marcos Paulo.

Obrigado pelo retorno. De fato, concordo contigo, já tinha visto.

Mas eu problema é outro.

Do jeito que ele fez eu também fiz. Na verdade, basta declarar o erro 404 e sua página no web.xml que já funciona.

Ele deu o seguinte exemplo de página:

http://localhost:8080/Servlet/ASD


Esse ASD pode ser tanto uma pasta ASD que não existe ou um Servlet com o mesmo nome.

Meu caso é diferente. Imagina um a página de que não exista na aplicação. Basta essa página estar na raiz da aplicação que a página erro404.jsp abre normalmente.

Mas, se essa página inexistente for chamada de dentro de uma pasta existente na raiz, aí a página erro404.jsp abre normalmente. Porém, os links de imagens e css não funcionam.

Imagino que isso ocorra por que quando geramos, no web.xml o servlet, indiciamos sua localização para /Servlet, o que leva sua execução para a raiz

Estrutura

Aplicação/ 
                /Servlet
                /erro404.jsp
                /paginaInexistente.jsp


Logo, basta fazer um /erro404.jsp que o pegamos no mesmo nível.

Mas

Se essa paginaInexistente.jsp estiver mais interna,

Aplicação/ 
                /Servlet
                /erro404.jsp
                /PastaExistente/paginaInexistente.jsp


Os links da página erro404.jsp já não funcionam embora se chamarmos diretamente:

http://localhost:8080/aplicacao/erro404.jsp


Algum recurso?
Responder

Gostei + 0

10/08/2015

Marcos Paulo

Pensando bem, não sei bem como resolver, me desculpa.
Responder

Gostei + 0

10/08/2015

Carlos Rocha

Acho que entendi!

Se enviarmos cada ocorrência de página inexistente para a página erro404.jsp diretamente, caso a página inexistente esteja fora de seu nível, os links falharão.

Porém, se ao invés disso enviarmos toda ocorrência para o Servlet, ele sempre estará em /Servlet (pelo xml). Então, à partir do Servlet, a página erro404.jsp sempre estrá lá!

Mas esta ocorrndo o seguinte

Criei o Servlet Erro404Servlet

package erros;

import java.io.IOException;
 

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Erro404Servlet")
public class Erro404Servlet extends HttpServlet 
{
    private static final long serialVersionUID = 1L;
 
    public void doPost(HttpServletRequest req, HttpServletResponse res)    throws ServletException, IOException
    {
    	Throwable throwable = (Throwable) req.getAttribute("javax.servlet.error.exception");
        Integer statusCode = (Integer) req.getAttribute("javax.servlet.error.status_code");
 
        req.setAttribute("errorType", throwable);
        req.setAttribute("statusCode", statusCode);
 
        //colocando o setStatus OK
        res.setStatus(HttpServletResponse.SC_OK);
        
        // We have to remove the exception from the request. If we do not remove the IE9 will not display out error page.
        // IE9 will think that some error created a crash inside our application if we do not remove the exception from the request.
        req.setAttribute("javax.servlet.error.exception", null);
        req.setAttribute("javax.servlet.error.status_code", null);
        
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/erro404.jsp");
        requestDispatcher.forward(req, res);        
    }
 
    public void doGet(HttpServletRequest req, HttpServletResponse res)    throws ServletException, IOException
    {
        doPost(req, res);
    }   
}
}

E o web.xml
...  
<servlet>
    <servlet-name>Erro404Servlet</servlet-name>
    <servlet-class>imwsaogotardo.src.erros.Erro404Servlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Erro404Servlet</servlet-name>
    <url-pattern>/imwsaogotardo/Erro404Servlet</url-pattern>
  </servlet-mapping>
  <error-page>
    <error-code>404</error-code>
    <location>/Erro404Servlet</location>
  </error-page>
...


Mas toda vez que chama o Servlet ele abre a página não encontrada (erro404.jsp) mas dá o mesmo problema. Ou seja, quando a paginaInexistente.jsp está fora do nivel do root, os links não de erro404.jsp não funcionam do mesmo jeito!

Porque será?
Responder

Gostei + 0

11/08/2015

Carlos Rocha

Segui a seguinte solução e acabou dando certo:

<jsp:useBean id="constantes" class="util.Constantes" /> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
<!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">
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath() %>/_global/_css/estiloSite.css" />
<title>${constantes.tituloSite}</title>
</head>
<body>

 <div id="topo"> <jsp:include page="<%=request.getContextPath() %>/_global/topoErro.jsp" /> </div>
 <div id="meio"> <jsp:include page="erro404Conteudo.jsp" /> </div>
 <div id="mapa"> <jsp:include page="<%=request.getContextPath() %>/_global/mapaErro.jsp" /> </div>
 <div id="creditos"> <jsp:include page="<%=request.getContextPath() %>/_global/creditosErro.jsp" /> </div>

 </body>
</html>


topoErro.jsp

<div id="topoMeio">
 <map name = "menuTopo">
  <area shape="rect" coords="20,60,180,120" href="<%=request.getContextPath() %>/equipe.jsp" alt="Equipe" />
  <area shape="rect" coords="400,0,600,160" href="<%=request.getContextPath() %>/index.jsp" alt="Logo" />
  <area shape="rect" coords="820,0,970,170" href="<%=request.getContextPath() %>/pastor.jsp" alt="Pastor" />
 </map>
  <img src="<%=request.getContextPath() %>/_img/topo.png" usemap="#menuTopo" />
</div>


Mas essa solução me levou à outro problema de padrões.

Nesse caso, para eu conseguir usar o Dispatcher em meus Servelts ao invés de sendRedirect, eu terei que usar essa técnica em todos os links e em todas as imagens.

É isso mesmo?

Esse é o padrão de ´projeto que vocês que já programam java EE utilizam?

Só lembrando que eu estou usando esse projeto exatamente para adquirir conhecimento de java EE e de Padrões de projeto!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar