Servlet以及jsp异常的处理

转载 2015年07月10日 09:52:14
在servlet或者jsp运行的过程中,会出现一些异常,当这些异常在程序当中没有进行处理时,就会显示一个默认的异常页面,这可不是一件美妙的事情。因为容器默认的异常页面会显示一些异常的相关信息,这些信息对于程序员来说,是调试的好帮手;可是对于最终用户来说,那无异于天书,那我们怎么在出现一些异常信息的时候,让程序跳转到我们期望跳转的页面呢?我们来看servlet和jsp当中异常的处理。
       1 在web.xml中配置错误代码页面
        在程序运行的过程当中,会出现一些错误信息的代码,如404(找不到相应页面),503(服务不可用)等等的错误代码,一般出现这种错误代码的时候,容器(本文以tomcat为例)会自动跳转到相应的默认页面,如出现404,服务器会跳转到一下页面(如图):
        这对于最终用户来说,是非常不够人性化的一个页面,我们怎么才可以配置当出现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中错误代码和异常信息的处理,就总结完了……
       打完,收工……该洗澡去了……

博客转自http://blog.163.com/zhao_jiahong/blog/static/21347816820131410832841/

Servlet以及jsp异常的处理

在servlet或者jsp运行的过程中,会出现一些异常,当这些异常在程序当中没有进行处理时,就会显示一个默认的异常页面,这可不是一件美妙的事情。因为容器默认的异常页面会显示一些异常的相关信息,这些信息...
  • feipeixuan
  • feipeixuan
  • 2014年03月19日 15:02
  • 770

Servlet中异常处理机制

1 声明式异常处理 声明式异常处理是在web.xml文件中声明对各种异常的处理方法。这是通过元素来声明的。 元素的结构为error-page:[error-code/exception-type]...
  • D_dragon_bamboo
  • D_dragon_bamboo
  • 2016年07月15日 23:03
  • 1218

JSP应用的自我理解之二:JSP的异常处理机制及具体实现

JSP中规定了异常处理机制,具体需要完成以下两个步骤: 1、
  • chenshuo8725
  • chenshuo8725
  • 2014年04月06日 09:34
  • 1036

JSP+Servlet的请求处理方法的指定

1、在JSP界面中的请求中添加一个标记方法的属性method 2、新建一个对应请求的servlet类,并添加doGet和doPost方法,并使用其中之一作为主要方法来使用调用 3、在作为主要方法的...
  • wanglizheng825034277
  • wanglizheng825034277
  • 2015年05月11日 22:09
  • 897

JSP和Servlet面试题

1.讲下servlet的执行流程。 Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()《启动顺序根据web.xml里的startup-o...
  • t0404
  • t0404
  • 2016年07月12日 22:44
  • 10022

[Servlet&JSP] 部署描述设置

Servlet的设置以下是在web.xml中设置servlet的范例片段: Some club.chuxing.SomeServlet 1 ...
  • u011331383
  • u011331383
  • 2015年12月16日 16:21
  • 1084

jsp转换为Servlet规则

jsp转换为servlet规则
  • zhengdianwei
  • zhengdianwei
  • 2014年05月15日 09:31
  • 1200

jstl与servlet动态jsp交互实现

本文主要描述servlet当中如何向台jsp页面传值,本例传值部分分为三个部分,1 传入普通字符串 2 传入普通List 3 传入带有多个Map的list,页面对传入的值通过jstl和el表达式来进行...
  • shazhenzhong
  • shazhenzhong
  • 2008年09月09日 09:58
  • 2113

JSP转译为Servlet错误可能发生的3个时候

JSP终究会转译为Servlet, 所以错误可能发生在3个时候: JSP转换为Servlet源代码时. 如果在JSP页面中编写了一些错误语法, 而使得容器在转译JSP时不知...
  • u012934551
  • u012934551
  • 2016年01月14日 21:42
  • 627

韩顺平Servlet与JSP视频课程心得与体会

1.同一用户在不同页面共享数据有四种方式:cookie技术,sendRedirect()转向技术,隐藏表单技术,session技术2.服务器为每一个请求的浏览器分配一个唯一的Session,因此它会占...
  • lishirong
  • lishirong
  • 2014年12月02日 09:47
  • 1927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Servlet以及jsp异常的处理
举报原因:
原因补充:

(最多只允许输入30个字)