【问题标题】:Error page in web.xmlweb.xml 中的错误页面
【发布时间】:2011-05-25 19:27:55
【问题描述】:

我有一个这样的问题:我在 web.xml 中的 java.lang.Exception 类型上设置了默认错误页面,因此它必须显示在 servlet 和 jsp 中的所有异常上。但是当我想测试这个页面(我关闭连接)时,它不会出现在浏览器中。在经过测试的 servlet 中,我使用数据库,因此如果没有连接,它将引发异常。在 servlet 中,我捕获了这个异常和throw new ServletException()。同样在 catch 块中,我首先记录消息,然后抛出异常。那么为什么我的tomcat没有显示这个错误页面呢?而不是这个,它显示空白页,在服务器输出中我可以看到这些错误消息

编辑

 <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/errorPages/InternalError.jsp</location>
    </error-page>

我将错误页面保存在 /errorPages 必须显示的页面称为 InternalError.jsp

该页面必须在移动到使用 El 的 jsp 页面后显示,以显示来自数据库的数据,该数据在该 jsp 中抛出会话中的对象

【问题讨论】:

  • 向我们展示web.xml 片段。

标签: jsp tomcat servlets


【解决方案1】:

在这种情况下,当响应已经由 servlet 或导致异常的 JSP 提交时,您将得到一个空白页面。换句话说,当 HTTP 响应标头已经发送到 Web 浏览器时。这是一个不归路

为防止这种情况,您需要确保仅在 所有 业务代码完成其工作时才开始写入响应(最好不要在 servlet 中这样做,而只是转发到 JSP)并且您的 JSP 确实包含任何单行业务代码(通常由 scriptlets &lt;% %&gt; 表示)。

因此,例如,如果您在 servlet 中执行此操作

response.getWriter().write("blah");
throw new ServletException("epic fail");

或者当异常被“中途”抛出一个 JSP 时

<p>Some HTML</p>
<% throw new ServletException("epic fail"); %>
<p>Some more HTML</p>

那么你得到一个空白页的风险很大。

【讨论】:

  • 通过在 servlet 而不是 JSP 中完成业务工作。 JSP 应仅用于演示。另见stackoverflow.com/questions/3177733/…
  • 我在jsp中没有业务逻辑。 Jsp 仅包含来自有权访问数据库的对象的格式化输出,如下所示: 其中 Obj 是有方法 getInfo 正在访问数据库
  • 您不应该在 getter 方法中执行任何业务逻辑。而是在构造函数中执行它,或者如果它确实需要在每个请求的基础上执行,那么您应该将它放在请求范围内。这样,当 servlet 将要创建它并将其存储在范围中时,将在请求被转发到 JSP 之前很久就会抛出异常。
  • 如果我在创建 Obj 类的对象时将所有数据加载到构造函数中,它将在我的程序运行期间使用大量内存。我有很多这样的 get 方法可以按需访问数据库
  • 这样的God类?那么代码肯定需要重构。根据 MVC 意识形态,您最终需要在 servlet(控制器)而不是 JSP(视图)中完成业务工作。
猜你喜欢
  • 2013-12-14
  • 2017-02-08
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2017-01-19
  • 2012-08-20
  • 2013-12-18
相关资源
最近更新 更多