javaEE servlet以及jsp 异常处理

在servlet或者jsp运行的过程中,会出现一些异常,当这些异常在程序当中没有进行处理时,就会显示一个默认的异常

页面,这可不是一件美妙的事情。因为容器默认的异常页面会显示一些异常的相关信息,这些信息对于程序员来说,

是调试的好帮手;可是对于最终用户来说,那无异于天书,那我们怎么在出现一些异常信息的时候,让程序跳转到我

们期望跳转的页面呢?我们来看servlet和jsp当中异常的处理。

1 在web.xml中配置错误代码页面

在程序运行的过程当中,会出现一些错误信息的代码,如404(找不到相应页面),503(服务不可用)等等的错误代

码,一般出现这种错误代码的时候,容器(本文以tomcat为例)会自动跳转到相应的默认页面,如出现404,服务器

会跳转到一下页面(如图):

javaEE servlet以及jsp 异常处理_第1张图片

这对于最终用户来说,是非常不够人性化的一个页面,我们怎么才可以配置当出现404错误的时候,跳转到我们希望

的页面呢?

我们可以在web.xml中配置错误页面来实现。

配置方法:

在web.xml中加入如下的配置

<error-page>
    <error-code>404</error-code>   <!-- 要捕捉的错误代码-->
    <location>/not_found.jsp</location>   <!--出现要捕捉的错误代码时,跳转到的页面-->
</error-page>

这样,当出现404错误的时候,页面就自动跳转到我们希望的页面(not_found.jsp)了。我们可以在web.xml中配置多

个这样的错误代码的页面。这种错误代码的配置,对于jsp以及servlet都能够起作用。

2 异常信息的配置

当在servlet或者jsp运行过程中出现异常的时候,我们又怎么能让程序跳转到我们希望的页面呢?有一种做法同上面一

样,在web.xml中进行配置,以控制程序在出现异常的时候,跳转到我们希望的页面。但是在此处,配置稍微有点不

同,配置如下:

<error-page>
    <exception-type>java.lang.NullPointerException</exception-type>  <!---要捕捉的异常类型->
    <location>/null_pointer_handler.jsp</location>   <!--出现异常时,跳转的页面-->
</error-page>

这样,我们在出现未捕捉的NullPointerException异常时,就可以跳转我们期望的页面。但是有一点一定要注意,

<exception-type>标签中一定要写类的全名。

3 异常处理servlet

在我们程序的处理过程中,可能出现多个未知的异常。我们可以写一个相应的servlet来对异常进行处理,以便我们对

所有的异常才去相同的处理措施,或者跳转到相应的页面,具体做法如下:

为了能捕捉到所有我们未处理的异常,我们首先应该在web.xml中配置异常处理,配置方法与异常信息配置一样。在

这里,我们为了捕捉到所有可能出现的异常,我们在<exception-type>标签中要捕捉的异常是java.lang.Throwable。

注意,除了这个配置之外,servlet的正常配置也是要配置的,切记切记!

<error-page>
    <exception-type>java.lang.Throwable</exception-type>  
    <location>/servlet/exceptionHandler</location>  
</error-page>

然后我们写一个servlet,异常的相关信息会存放在request的attribute当中,我们在request中可以取出异常的相关信

息。详细的异常相关信息如下所示:

javax.servlet.error.status_code             类型为Integer        错误状态代码
javax.servlet.error.exception_type          类型为Class          异常的类型
javax.servlet.error.message                 类型为String         异常的信息
javax.servlet.error.exception               类型为Throwable      异常类
javax.servlet.error.request_uri             类型为String         异常出现的页面
javax.servlet.error.servlet_name            类型为String         异常出现的servlet名

如果我们要取出出现的异常,可以使用request.getAttribute("javax.servlet.error.exception")来得到。下面是一个异常

处理servlet的代码:

public void doPost(HttpServletRequest request, 
   HttpServletResponse response)
    throws ServletException, java.io.IOException {
    //check the servlet exception       
    Throwable throwable = (Throwable)request.getAttribute("javax.servlet.error.exception");
    String servletName = (String)request.getAttribute("javax.servlet.error.servlet_name");
    if (servletName == null)
       servletName = "Unknown";
    String requestUri = (String)request.getAttribute("javax.servlet.error.request_uri");
    if (requestUri == null)
      requestUri = "Unknown";
    response.setContentType("text/html");
    java.io.PrintWriter out = response.getWriter( );
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Error page</title>");  
    out.println("</head>");
    out.println("<body>");

    if (throwable == null){
      out.println("<h2>The error information is not available</h2>");
      out.println("Please return to the <a href=\"" + 
        response.encodeURL("http://localhost:8080/home") + 
          "\">home page</a>.");
   } else{
          out.println("<h2>Here is the error information</h2>");
  
  out.println(
      "The servlet name associated with throwing the exception: "+
        servletName + "<br><br>");

  out.println("The type of exception: " + 
       throwable.getClass( ).getName( ) + "<br><br>");

  out.println("The request URI: " + requestUri + "<br><br>");
  out.println("The exception message: " + throwable.getMessage( ));
   }
  out.println("</body>");
  out.println("</html>");
  
  } 

当然,我们也可以建立一个异常处理的jsp,原理是一样的。有兴趣,大家可以试试。

4 在jsp中配置异常页面

为了让jsp页面在出现异常后跳到异常处理页面,我们可以在jsp页面的page属性中配置errorPage,然后异常处理页面

中的page属性当中的isErrorPage设置为true。这样,一旦jsp页面出现异常,就会跳转到异常处理页面中。

如,我们有两个页面format.jsp和exception_handler.jsp,format.jsp是我们正常的页面,而exception_handler.jsp页面

为异常处理页面。为了保证format.jsp页面出现异常后,会自动跳转到exception_handler.jsp页面,我们可以分别在两

个页面中做如下设置:

format.jsp

<%@ page errorPage="/exception_handler.jsp" %>


exception_handler.jsp

<%@ page isErrorPage="true" %>

这样就可以完成异常的控制了。

5 错误代码的发送

有些人说,在servlet或者jsp中,我们可以控制出现那种异常,用throw语句抛出异常就可以了,但是我们怎么控制错

误代码的出现呢?这个问题也非常的简单。要发送出一个错误代码,不管是在servlet还是在jsp中,我们都可以利用

response.sendError(错误代码)来发送出一个错误代码。

比如说,我们要发送一个501的错误代码, response.sendError(501)就可以了。

OK,关于servlet和jsp中错误代码和异常信息的处理,就总结完了……


例子代码:

一 声明式异常处理:

例:一个Servlet从文件中读取配置信息,如果文件不存在的,就会抛出java.io.FileNotFoundException异常。

第一步:FileExceptionServlet.java(产生异常的类)

 package org.sunxin.ch06.servlet;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class FileExceptionServlet extends HttpServlet
    {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException,IOException
    {
    FileInputStream fis=new FileInputStream("config.inc");
    Properties pps=new Properties();
    pps.load(fis);
    //读取属性的代码,省略。[nextpage]
    fis.close();
    }
    }
第二步:异常处理Servlet类。ExceptionHandlerServlet.java
  package servlet;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class ExceptionHandlerServlet2 extends HttpServlet
    {
    protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, java.io.IOException
    {
    resp.setContentType("text/html;charset=GB2312");
    PrintWriter out = resp.getWriter();
    out.println("<html><head><title>错误页面</title></head>");
    out.println("<body>");
    String uri=(String)req.getAttribute("javax.servlet.error.request_uri");
    Object excep=req.getAttribute("javax.servlet.error.exception");
    out.println(uri+" 运行错误。");
    out.println("<p>错误原因:"+excep);
    out.println("</body></html>");
    out.close();
    }
    }
第三步:web.xml文件中声明Servlet
<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/ExcepHandler</location>
    </error-page>
    <exception-type>子元素指定了Java异常类的名字
    <locaiton>子元素指定了对异常处理的Servlet类

二 程序式异常处理

程序式异常处理就是在Web程序中利用try-catch语句进行捕获异常,并对捕获异常进行响应的处理。

1 在try-catch语句中处理异常

catch(SQLException se)
    {
    getServletContext()。log("ServletContext.log(): 数据库操作失败!"+
    se.toString());
    log("GenericServlet.log(): 数据库操作失败!"+se.toString());
    resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
    "数据库操作出现问题,请联系管理员。");
    }
[1] 捕捉到异常时,分别用ServletContext接口的log()方法和GenericServlet抽象类的log()方法记录数据库操作失

败的原因。

区别:

如果调用GenericServlet类的log()方法 它会在日志消息的前面加上Servlet的名字

而调用ServletContext接口的log()方法 则只记录消息本身

这两个log()方法会把日志信息写入到日志文件中。 在tomcat6 产生的日志文件名以及文件存放的位置是

%CATALINA_HOME%\logs\localhost.当前日期。log。

[2] 调用响应对象的sendError()方法发送HTTP错误代码,Servlet容器会发送一个包含了这些信息的错误页面到浏览

2 使用RequestDispatcher来处理异常

产生异常的Servlet

 try
    {
    int a=5;
    int b=0;
    int c=a/b;
    }
    catch(ArithmeticException ae)
    {
    req.setAttribute("javax.servlet.error.exception",ae);
    req.setAttribute("javax.servlet.error.request_uri",req.getRequestURI());
    RequestDispatcher rd=req.getRequestDispatcher("ExcepHandler2");
    rd.forward(req,resp);
    }
处理异常的Servlet
package servlet;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class ExceptionHandlerServlet2 extends HttpServlet
    {
    protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, java.io.IOException
    {
    resp.setContentType("text/html;charset=GB2312");
    PrintWriter out = resp.getWriter();
    out.println("<html><head><title>错误页面</title></head>");
    out.println("<body>");
    String uri=(String)req.getAttribute("javax.servlet.error.request_uri");
    Object excep=req.getAttribute("javax.servlet.error.exception");
    out.println(uri+" 运行错误。");
    out.println("<p>错误原因:"+excep);
    out.println("</body></html>");
    out.close();
    }
    }
说明:

[1] 将异常对象和抛出异常的servlet的位置作为HttpServletRequest对象的属性保存到请求对象中。

[2] 通过请求对象的getRequestDispatcher()方法得到RequestDispatcher对象 调用RequestDispatcher对象的

forward()方法将请求转发给 ExcepHandler2

[3] ExcepHandler2可以从请求对象中取出javax.servlet.error.exception和javax.servlet.error.request_uri属性



参考链接:http://www.yiibai.com/servlets/servlets_exception_handling.html#servlets_exception_handling

http://java.chinaitlab.com/ServletJsp/897636.html

你可能感兴趣的:(servlet)