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

1:声明式异常处理

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

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

error-code:http错误代码

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

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

下面通过例子一一讲解:

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

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

然后我们在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如下

 public class ErrorHandlerServlet extends HttpServlet{

     private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException
{ response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
Integer status_code=(Integer)request.getAttribute("javax.servlet.error.status_code");
out.println("<html><head><title>错误列表</title></head>");
out.println("<body>"); switch(status_code)
{
case 401:
out.println("<h2>http错误码:"+status_code+"</h2>");
out.println("你并没有被授权");
out.println("如有其他问题请联系<a href='#'>管理员</a>");
break;
case 404:
out.println("<h2>http错误码:"+status_code+"</h2>");
out.println("你访问的页面并不存在,或者被移到其他位置");
out.println("如有其他问题请联系<a href='#'>管理员</a>");
break;
} out.println("</body></html>");
out.close();
}

ErrorHandlerServlet

然后在配置web.xml

 <servlet>
<servlet-name>ErrorHandlerServlet</servlet-name>
<servlet-class>com.lp.servlet.ErrorHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandlerServlet</servlet-name>
<url-pattern>/errorHandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/errorHandler</location>
</error-page>

web.xml

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

可以看到如下图

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

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

 public class FileExceptionServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request,HttpServletResponse response) throws FileNotFoundException
{
File file=new File("1.txt");
FileInputStream fileInputStream=new F
}
}

FileExceptionServlet

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

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

 public class ExceptionHandlerServlet extends HttpServlet{

     /**
*
*/
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException
{
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
out.println("<html><head><title>错误列表</title></head>");
out.println("<body>");
out.println("应用程序出错");
out.println("错误原因可能是某个服务器端文件被删除");
out.println("请联系<a href='#'>管理员</a>");
out.println("</body></html>");
out.close();
}

ExceptionHandlerServlet

然后再次配置web.xml

 <servlet>
<servlet-name>ExceptionHandlerServlet</servlet-name>
<servlet-class>com.lp.servlet.ExceptionHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ExceptionHandlerServlet</servlet-name>
<url-pattern>/exceptionHandler</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.io.FileNotFoundException</exception-type>
<location>/exceptionHandler</location>
</error-page>

web.xml

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

2:编程式的异常处理

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

 public  void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException
{
try {
File file=new File("1.txt");
@SuppressWarnings("unused")
FileInputStream fileInputStream=new FileInputStream(file);
} catch (FileNotFoundException e) {
getServletContext().log(e.getMessage());
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"文件未能发现");
}
}

从中我们可以看出采用了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异常就说这么多了,随着技术不停的更新,处理异常的方式也越来越多但是这些基础的还是应该了解和学习下的

javaweb回顾第四篇Servlet异常处理的更多相关文章

  1. javaweb回顾第六篇谈一谈Servlet线程安全问题

    前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例 ...

  2. JavaWeb学习总结第四篇--Servlet开发

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  3. javaweb回顾第七篇jsp

    1:为什么会有JSP jsp全名(java server pages)中文叫做java服务器页面.在Servlet那一篇我们发现用Servlet可以生成动态页面,但是我们却在Servlet中却写了大量 ...

  4. javaWeb核心技术第四篇之Javascript第二篇事件和正则表达式

    - 事件 - 表单提交(掌握) "onsubmit" - 单击事件(掌握) "onclick" - 页面加载成功事件(掌握) "onload" ...

  5. javaweb回顾第十篇JSTL

    前言:JSTL(JSP Standard Tag Library)JSP标准标签库.它的目的是为了简化JSP的开发,如何没有JSTL可能我们开发的时候就需要写大量的自定义标签,无疑会加大开发难度,有了 ...

  6. javaweb回顾第五篇浅谈会话

    1:什么是会话 通俗来说就是客户和服务器的一次私密谈话,客户发送请求以后服务器能够识别请求是来自同一个客户,他们是1对1的关系. 了解会话以后我们就要去考虑如何去实现这些问题下面一一进行解析 2:会话 ...

  7. javaweb回顾第十一篇过滤器(附实现中文乱码问题)

    1:过滤器概念 过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器.那么我用图来表示过滤器(可以有多个过滤器)运行的过程 2:Filt ...

  8. javaweb回顾第八篇如何创建自定义标签

    前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...

  9. javaweb回顾第三篇数据库访问

    前言:本篇主要针对数据库的操作,在这里不适用hibernate或者mybatis,用最原始的JDBC进行讲解,通过了解这些原理以后更容易理解和学习hibernate或mybatis. 1:jdbc的简 ...

随机推荐

  1. Servlet实现重定向的两种方式

    使用Servlet实现请求重定向:两种方式 1. response.setStatus(302); response.setHeader("location", "/Re ...

  2. Notepad++ 快捷键 大全

    Notepad++ 快捷键 大全Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+Z 撤消Ctrl+Y 恢复Ctrl+A 全选Ctrl+F 键查找对话框启动Ctrl+H 查找/替换对话框 ...

  3. poj3050

    #include <stdio.h> #include <set> #include <string> using namespace std; int a[6]; ...

  4. redhat 5 中文乱码及中文输入法解决方法

    安装redhat时中文显示乱码(小方框)解决方法 在安装linux的时候,安装完了中文出现乱码或者是当时选错了选成了英文的,到时候中文显示乱码,下面说一下问题的解决: 在首次安装RHEL5时,如果选择 ...

  5. centos下 redis安装配置及简单测试

    1:安装redis(使用的的环境是centos6.7 redis-2.6.14) 将redis-2.6.14.tar.gz文件拷贝到/usr/local/src 目录下 解压文件  tar zxvf ...

  6. Java list的用法排序及遍历

    原文地址:http://baike.xsoftlab.net/view/208.html 1用法 ·ArrayList ·LinkedList 2排序 ·数字排序 ·中文排序 ·实体类排序 3遍历 · ...

  7. 用scala实现一个sql执行引擎-(下)

    执行 上一篇讲述了如何通过scala提供的内置DSL支持,实现一个可以解析sql的解析器,这篇讲如何拿到了解析结果-AST以后,如何在数据上进行操作,得到我们想要的结果.之前说到,为什么选择scala ...

  8. Iometer介绍与使用

    Iometer简介 IO Meter是Intel开发的用来测试磁盘和网络I/O性能的软件,在目前测试磁盘系统性能中很常用.在IO Meter中用户可以自行设置进行读写或者写入测试的数据块和队列深度等参 ...

  9. 搭建struts2框架

    struts是一个经典的MVC模式拦截器比过滤器拦截的力度更大 搭建struts2框架1.引入lib包 9个(2.3版本的)common-fileupload;common-io;common-lan ...

  10. 写在Python前

    Python是用C编写的一种解释型语言,和shell一样,变量可以直接使用,而且就像C中的宏替换,但是Python同样支持进行底层的调用,可以很容易的和各种语言进行融合,俗称"胶水语言&qu ...