JavaEE应用程序的理想错误页面

JavaEE应用程序的理想错误页面,java,jsp,servlets,exception-handling,Java,Jsp,Servlets,Exception Handling,我很难整合应用程序中的错误。目前,我的error.jsp如下所示(部分): 现在的问题是,当我被转发到error.jsppage…而不是看到MyExceptionclass.中的实际错误时,我看到的是NullPointerException,因为javax.servlet.error.status\u code中没有任何内容,页面被声明为isErrorPage=“true” 在这种情况下我该怎么办?一种解决方案是创建一个完全不同的error.jsp(名为error1.jsp)页面,并将异常从My

我很难整合应用程序中的错误。目前,我的
error.jsp
如下所示(部分):

现在的问题是,当我被转发到
error.jsp
page…而不是看到
MyException
class.中的实际错误时,我看到的是
NullPointerException
,因为
javax.servlet.error.status\u code
中没有任何内容,页面被声明为
isErrorPage=“true”


在这种情况下我该怎么办?一种解决方案是创建一个完全不同的error.jsp(名为error1.jsp)页面,并将异常从
MyException
类转发到该页面。尽管如此,我还是希望所有东西都放在一个地方

将所有详细信息放在日志中,只向用户显示一条含糊不清的消息,说明出现了问题,而不管异常是什么。因此,您的错误页面可能看起来像(引用twitter):


技术上有些问题。

不要捕捉和转发,只需让异常冒泡即可。另一种选择是,如您所说,创建两个包含公共内容的单独页面,并且只在
iErrorPage
定义中有所不同。

您可以创建一个自定义stackTrace jsp标记,并将其包含在一个特殊的错误页面中:

标记文件(WEB-INF/tags/stackTrace.tag)


这是我的眼睛。下面是一个通用的应该是什么样子。你会发现它很有用

<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<jsp:useBean id="date" class="java.util.Date" />
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Error</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <h1>Error</h1>
        <p>Unfortunately an unexpected error has occurred. Below you can find the error details.</p>
        <h2>Details</h2>
        <ul>
            <li>Timestamp: <fmt:formatDate value="${date}" type="both" dateStyle="long" timeStyle="long" />
            <li>Action: <c:out value="${requestScope['javax.servlet.forward.request_uri']}" />
            <li>Exception: <c:out value="${requestScope['javax.servlet.error.exception']}" />
            <li>Message: <c:out value="${requestScope['javax.servlet.error.message']}" />
            <li>Status code: <c:out value="${requestScope['javax.servlet.error.status_code']}" />
            <li>User agent: <c:out value="${header['user-agent']}" />
        </ul>
    </body>
</html>

web应用程序中不需要让用户报告错误。但问题仍然存在。当jsp页面被标记为
isErrorPage
时,
javax.servlet.error.status\u code
中必须包含某些内容,否则会引发空指针异常。我想在上一个问题中,您建议如果我想避免将异常放入server.log,那么我需要捕获它们,这是唯一的选项。这就是我现在捕获并转发的原因。是的,考虑到另一个问题(我最初没有将两者联系起来),那么转发听起来就不那么糟糕了。如果我
抛出ex
,那么错误堆栈将写入server.log。我希望它只写在
my_system.log
(来自
log.error
)我真的不明白这是个什么问题。您已经在使用
log.error()
将其记录到自己的日志中。如果您想禁用服务器stderr日志记录,只需在服务器配置中进行配置即可。理想情况下,我希望这样做!这样,我就可以把它记录到自己的日志中,然后扔掉,而不用处理异常了!如何在GlassFish中配置/禁用stderr日志记录。我也可以在谷歌上搜索,但不确定要搜索什么,我真的不知道这是个什么问题。您可以完全忽略服务器自己的日志文件。无论如何,您可以在管理控制台中配置日志记录。@BalusC感谢您提供另一个极好的答案。这一个也很好的参考。
catch(MyException ex){
    log.error(ex.getMessage(), uivex);
    String originalURL = "/errorpages/error.jsp?errorcode=" + (ex.getMajor() + ex.getMinor()) + "&errormessage=" + ex.getMessage();
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address);
    dispatcher.forward(request,response);   
}
<%@ page isErrorPage="true" %>

Something went technically wrong. 
<%@tag description="Prints stack trace of the specified Throwable"
          pageEncoding="UTF-8"%>

<%-- content (prints stack trace) --%>
<%
      java.io.PrintWriter pOut = new java.io.PrintWriter(out);
      try {
         // The Servlet spec guarantees this attribute will be available
         Throwable err = (Throwable) 
             request.getAttribute("javax.servlet.error.exception");

         if(err != null) {
            if(err instanceof ServletException) {
               // It's a ServletException: we should extract the root cause
               ServletException se = (ServletException) err;
               Throwable rootCause = se.getRootCause();
               if(rootCause == null) {
                  rootCause = se;
               }
               out.println("** Root cause is: " + rootCause.getMessage());
               rootCause.printStackTrace(pOut);
            }else {
               // It's not a ServletException, so we'll just show it
               err.printStackTrace(pOut);
            }
         }else {
            out.println("No error information available");
         }

         // Display cookies
         out.println("\nCookies:\n");
         Cookie[] cookies = request.getCookies();
         if(cookies != null) {
            for(int i = 0; i < cookies.length; i++) {
               out.println(cookies[i].getName() + "=[" + 
                   cookies[i].getValue() + "]");
            }
         }

      }catch(Exception ex) {
         ex.printStackTrace(pOut);
      }
%>
<%@ page isErrorPage="true" %>
<html>
   <head>
    <title>Error</title>
   </head>
   <body>
      <div>
         <textarea class="para error">
            Aww Snap!! :( Something went wrong where it was not supposed to. 
            Must be something
            <a href="http://en.wikipedia.org/wiki/Jack_the_Ripper">Jack</a> did!
            Please report this to the dev team.

            <!-- 
               <util:stackTrace />
            -->

         </p>
      </div>
   </body>
</html>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<jsp:useBean id="date" class="java.util.Date" />
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Error</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <h1>Error</h1>
        <p>Unfortunately an unexpected error has occurred. Below you can find the error details.</p>
        <h2>Details</h2>
        <ul>
            <li>Timestamp: <fmt:formatDate value="${date}" type="both" dateStyle="long" timeStyle="long" />
            <li>Action: <c:out value="${requestScope['javax.servlet.forward.request_uri']}" />
            <li>Exception: <c:out value="${requestScope['javax.servlet.error.exception']}" />
            <li>Message: <c:out value="${requestScope['javax.servlet.error.message']}" />
            <li>Status code: <c:out value="${requestScope['javax.servlet.error.status_code']}" />
            <li>User agent: <c:out value="${header['user-agent']}" />
        </ul>
    </body>
</html>
} catch (MyException ex) {
    log.error(ex.getMessage(), uivex);
    throw ex; // Or throw new ServletException(ex.getMessage(), ex);
}