Tratar erro 404
Pessoal,
Minha aplicação é assim:
Para tratar o erro 404, coloquei um arquivo erro400.jsp junto aos arquivos da aplicação e no xml adicionei:
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:
Carrega tudo normalmente
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
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
Curtidas 0
Respostas
Marcos Paulo
09/08/2015
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]
Creio que tal artigo pode lhe ser bastante útil!
[url]http://uaihebert.com/tratando-excecoes-em-uma-aplicacao-web/[/url]
GOSTEI 0
Carlos Rocha
09/08/2015
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:
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
Logo, basta fazer um /erro404.jsp que o pegamos no mesmo nível.
Mas
Se essa paginaInexistente.jsp estiver mais interna,
Os links da página erro404.jsp já não funcionam embora se chamarmos diretamente:
Algum recurso?
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?
GOSTEI 0
Marcos Paulo
09/08/2015
Pensando bem, não sei bem como resolver, me desculpa.
GOSTEI 0
Carlos Rocha
09/08/2015
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
E o web.xml
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á?
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á?
GOSTEI 0
Carlos Rocha
09/08/2015
Segui a seguinte solução e acabou dando certo:
topoErro.jsp
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!
<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!
GOSTEI 0