【问题标题】:JSP exception implicit objectJSP异常隐式对象
【发布时间】:2014-03-31 00:38:58
【问题描述】:

我有一个小的 Java Web 应用程序。它使用 MVC,使用 HttpServlet 作为控制器和几个用于视图的 JSP。

Servlet 捕获了几个异常,例如 SQLExceptions,我需要在“ErrorPage”JSP 中处理这些异常。 (带有指令<%@page isErrorPage="true" %> 的JSP。) 问题是,如何从 Servlet 中设置“异常”JSP 隐式对象?

(我正在使用 RequestDispatcher 对象将控制权传递给错误页面。)

【问题讨论】:

  • 关于如何配置和使用错误页面以及如何利用JSP隐式异常,请参阅下面我的回复。

标签: java jsp servlets exception-handling


【解决方案1】:

这是用法,

page1.jsp

<%@page errorPage="errorpage.jsp" %>
<%
  //this has your code that throws some exception

%>

jsp页面抛出的异常会根据你的errorPage配置被捕获。

errorpage.jsp

<%@ page isErrorPage='true' %>
<%
out.print("Error Message : ");  
out.print(exception.getMessage());
%>

异常对象代表所有错误和异常。异常隐式对象的类型为 java.langThrowable。您可以使用 page 指令的 isErrorPage 属性访问您声明为错误页面的页面上的异常对象。

仅当 JSP 使用页面指令将 isErrorPage 设置为 true 时,才会创建异常对象。当 JSP 生成错误并将该错误转发到错误页面时,容器将错误页面的 JSP 异常对象设置为生成的错误

除了exception.getMessage(),您还可以在exception 对象上调用printStackTrace()toString()

这是你问的吗?或者你想在你的 Servlet 类中处理异常?

另外,如果你像这样配置你的 web.xml,

<error-page>  
   <exception-type>java.lang.Throwable</exception-type>  
   <location>/errorpage.jsp</location>  
</error-page>

然后对于所有异常都会调用此错误页面,您可以使用上面提到的exception 对象并调用其方法以获取异常详细信息。 如果要为特定异常配置特定错误页面,请相应更改&lt;exception-type&gt;

注意,异常是由容器在遇到异常时设置的。如果您只是将控件转发到您的错误页面,它只会显示该页面。

更新:

try {
//sample code
    data= dao.find(something);
}
catch (SQLException e) {
    throw new ServletException("The query got failed", e);
}

Servlet 容器处理 ServletException 。当容器在执行 servlet 时捕获它时,它的原因将被解包并与 web.xml 中的任何特定条目进行比较,并且将显示最接近的匹配项。

<error-page>
    <exception-type>java.sql.SQLException</exception-type>
    <location>/errorpage.jsp</location>
</error-page>

更新 2

再举一个例子:

web.xml

<servlet>
    <servlet-name>servlet1</servlet-name>
    <servlet-class>com.examples.example.Servlet1</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
<error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/errorpage.jsp</location>
</error-page>
<error-page>
    <exception-type>java.sql.SQLException</exception-type>
    <location>/errorpage.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/errorpage.jsp</location>
</error-page>

Servlet1.java

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String s = null;
            if (s.equals("")) {

            }
        } catch (Exception ex) {
            throw new ServletException("my custom exception message");
        }
    }

errorpage.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" isErrorPage='true'%>
<html>
<head>
<title>Error Page</title>
</head>
<body>
    <%
        out.print("Error Message : ");
        out.print(exception.getMessage());
    %>
</body>
</html>

【讨论】:

  • 感谢您的回复。
  • 感谢您的回复。我知道那个操作。但就我而言,异常是在 Servlet 中捕获的,我想在 JSP 错误页面中对其进行管理。
  • 我想知道你为什么要这样做。如果你能够在 servlet 中捕获异常,那么你为什么要在 jsp 中再次处理它?不推荐,但您可以将异常对象设置为请求属性并转发到错误页面。您可以在jsp中获取异常对象的属性。但这与错误页面默认配置无关
  • 如果你在 servlet 中捕获,那么在 jsp 中管理似乎无效
  • 谢谢你,笨蛋!它可以抛出 ServletException,然后容器通过带有 标记的平均部署描述符捕获它,以将控制权传递给 JSP 页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2018-01-29
  • 2018-04-02
相关资源
最近更新 更多