zoukankan      html  css  js  c++  java
  • javaweb回顾第四篇Servlet异常处理

    前言:很多网站为了给用户很好的用户体验性,都会提供比较友好的异常界面,现在我们在来回顾一下Servlet中如何进行异常处理的。

    1:声明式异常处理

    什么是声明式:就是在web.xml中声明对各种异常的处理方法。

    是通过<error-page>元素来声明的,<error-page>下面有几个子元素如下图

    error-code:http错误代码

    exception-type:java异常类的完整名

    location:响应http错误代码或者java异常的资源路径

    下面通过例子一一讲解:

    1:首先我们做个最简单的先在程序中加一个FileNotFound.html文件,文件内容如下

     1 <html>
     2 <head>
     3 <meta charset="UTF-8">
     4 <title>页面没有发现</title>
     5 </head>
     6 <body>
     7 你访问的页面并不存在,或者被移到其他位置。<p>
     8 如有其他问题请联系<a href="#">管理员</a>
     9 </body>
    10 </html>
    View Code

    然后我们在web.xml中加入下面代码

    <error-page>
            <error-code>404</error-code>
            <location>/FileNotFound.html</location>
    </error-page>

    如果开启tomcat 在浏览器输入http://localhost:8080/servlet-test/index1.jsp

    然后会出现下面

    2:然后我们发现如果我声明越来越多的异常时候会出现越来越多的html这样的静态代码,那么可以能否在后台操作呢,答案是肯定的,现在我们用一个Servlet类来进行响应

    首先来看一副关于servlet相关属性的图

    现在我以其中status_code作为例子先建立一个ErrorHandlerServlet如下

     1 public class ErrorHandlerServlet extends HttpServlet{
     2 
     3     private static final long serialVersionUID = 1L;
     4     protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException
     5     {
     6 
     7         response.setContentType("text/html;charset=gb2312");
     8         PrintWriter out=response.getWriter();
     9         Integer status_code=(Integer)request.getAttribute("javax.servlet.error.status_code");        
    10         out.println("<html><head><title>错误列表</title></head>");
    11         out.println("<body>");
    12 
    13         switch(status_code)
    14         {
    15         case 401:
    16             out.println("<h2>http错误码:"+status_code+"</h2>");
    17             out.println("你并没有被授权");
    18             out.println("如有其他问题请联系<a href='#'>管理员</a>");
    19             break;
    20         case 404:
    21             out.println("<h2>http错误码:"+status_code+"</h2>");
    22             out.println("你访问的页面并不存在,或者被移到其他位置");
    23             out.println("如有其他问题请联系<a href='#'>管理员</a>");
    24             break;
    25         }
    26         
    27         out.println("</body></html>");
    28         out.close();
    29     }
    ErrorHandlerServlet

    然后在配置web.xml

     1 <servlet>
     2         <servlet-name>ErrorHandlerServlet</servlet-name>
     3         <servlet-class>com.lp.servlet.ErrorHandlerServlet</servlet-class>
     4     </servlet>
     5     <servlet-mapping>
     6         <servlet-name>ErrorHandlerServlet</servlet-name>
     7         <url-pattern>/errorHandler</url-pattern>
     8     </servlet-mapping>
     9     <error-page>
    10         <error-code>404</error-code>
    11         <location>/errorHandler</location>
    12     </error-page>
    web.xml

    现在我们再次开启tomcat 在浏览器输入http://localhost:8080/servlet-test/index1.jsp

    可以看到如下图

    3:我们发现发现关于exception-type都没有用上那么关于怎么用exception-type呢下面来用实例讲解

    我们在写一个关于文件操作的Servlet类FileExceptionServlet

     1 public class FileExceptionServlet extends HttpServlet{
     2     /**
     3      * 
     4      */
     5     private static final long serialVersionUID = 1L;
     6     public  void doGet(HttpServletRequest request,HttpServletResponse response) throws FileNotFoundException  
     7     {        
     8             File file=new File("1.txt");
     9             FileInputStream fileInputStream=new F
    10     }
    11 }
    FileExceptionServlet

    在这里我们并没有1.txt文件,注意声明的FileNotFoundException异常在配置中会用的到

    同样我们在写一个关于处理Servlet异常的ExceptionHandlerServlet类

     1 public class ExceptionHandlerServlet extends HttpServlet{
     2 
     3     /**
     4      * 
     5      */
     6     private static final long serialVersionUID = 1L;
     7     protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException
     8     {
     9         response.setContentType("text/html;charset=gb2312");
    10         PrintWriter out=response.getWriter();
    11         out.println("<html><head><title>错误列表</title></head>");
    12         out.println("<body>");
    13         out.println("应用程序出错");
    14         out.println("错误原因可能是某个服务器端文件被删除");
    15         out.println("请联系<a href='#'>管理员</a>");    
    16         out.println("</body></html>");
    17         out.close();
    18     }
    ExceptionHandlerServlet

    然后再次配置web.xml

     1 <servlet>
     2         <servlet-name>ExceptionHandlerServlet</servlet-name>
     3         <servlet-class>com.lp.servlet.ExceptionHandlerServlet</servlet-class>
     4     </servlet>
     5     <servlet-mapping>
     6         <servlet-name>ExceptionHandlerServlet</servlet-name>
     7         <url-pattern>/exceptionHandler</url-pattern>
     8     </servlet-mapping>
     9     <error-page>
    10         <exception-type>java.io.FileNotFoundException</exception-type>
    11         <location>/exceptionHandler</location>
    12     </error-page>
    web.xml

    然后启动tomcat输入http://localhost:8080/servlet-test/exceptionHandler看到

    2:编程式的异常处理

    这个在实际开发中运用的比较多主要采取try catch捕获异常 然后进行处理。举一个小例子比喻我们上面说的文件操作,如果发现文件不存在的时候我们可以把这个错误记录在日志便于查阅,ok我看一下

     1 public  void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException  
     2     {    
     3         try {
     4             File file=new File("1.txt");
     5             @SuppressWarnings("unused")
     6             FileInputStream fileInputStream=new FileInputStream(file);
     7         } catch (FileNotFoundException e) {
     8             getServletContext().log(e.getMessage());
     9             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"文件未能发现");
    10         }
    11     }
    View Code

    从中我们可以看出采用了sendError这个方法,目的就是可以把一些错误信息很好的展现出来,日志这里就是简单提下,在实际中可能根据不同业务选择的不一样。

    然后再次配置wen.xml

    <servlet>
            <servlet-name>FileExceptionServlet</servlet-name>
            <servlet-class>com.lp.servlet.FileExceptionServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>FileExceptionServlet</servlet-name>
            <url-pattern>/fileexception</url-pattern>
        </servlet-mapping>

    再次运行http://localhost:8080/servlet-test/fileexception

    好了,关于Servlet异常就说这么多了,随着技术不停的更新,处理异常的方式也越来越多但是这些基础的还是应该了解和学习下的

  • 相关阅读:
    iOS类似QQ好友展开和合并列表的实现代码
    UIPickerView常见属性、常见方法(包括代理方法和数据源方法)的一些说明
    xcode 最近打开文件列表显示为空或不显示最近打开的项目或(no recent projects)解决办法
    KSImageNamed-Xcode插件在xcode 6.4/6.3或其他版本中不能使用解决方案
    喜欢的一句话
    progressdialog的setProgress没反应
    android gradle升级(手动|速度快些)
    详解java继承
    (转)详解Android中AsyncTask的使用
    android selector的item属性
  • 原文地址:https://www.cnblogs.com/LipeiNet/p/5684003.html
Copyright © 2011-2022 走看看