前言:很多网站为了给用户很好的用户体验性,都会提供比较友好的异常界面,现在我们在来回顾一下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. Ubuntu 14.04 (32位)上搭建Hadoop 2.5.1单机和伪分布式环境

    引言 一直用的Ubuntu 32位系统(准备下次用Fedora,Ubuntu越来越不适合学习了),今天准备学习一下Hadoop,结果下载Apache官网上发布的最新的封装好的2.5.1版,配置完了根本 ...

  2. mac操作快捷键

  3. 彻底卸载sublime txt

    最近彻底重装系统之后,安装sublime txt3, 自己设置了一些,总是觉得不是很对劲,想重新安装. 结果每次安装之后,总是有一些配置文件和卸载之前的是一样的,重复几次总是如此,于是网上搜资料,怎么 ...

  4. POJ Ant Counting DP

    dp[i][j]表示前i种蚂蚁组成元素个数为j的集合有多少种. 则dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + ... + dp[i-1][ max(0,j-a[i]) ...

  5. option2

    option = { tooltip : { show: true, trigger: 'item' }, legend: { data:['邮件营销','联盟广告','直接访问','搜索引擎'] } ...

  6. Java起源、发展历程、环境变量、第一个Java程序等【1】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...

  7. 斯坦福第十六课:推荐系统(Recommender Systems)

    16.1  问题形式化 16.2  基于内容的推荐系统 16.3  协同过滤 16.4  协同过滤算法 16.5  矢量化:低秩矩阵分解 16.6  推行工作上的细节:均值归一化 16.1  问题形式 ...

  8. 取得ascii的例子

    取得ascii的例子:    String abc = "hello world";    int m = abc.c_str()[0];    ShowMessage(m); i ...

  9. Keepalived+tomcat的HA配置

    需要节点 NODE1—————-IP:192.168.0.2 NODE2—————-IP:192.168.0.3 VIP—————-IP:192.168.0.10 以下操作在2台机器上都要运行 先编辑 ...

  10. mysql 5.6并行复制事件分发机制

    并行复制相关线程 在MySQL 5.6并行复制中,当设置set global slave_parallel_workers=2时,共有4个复制相关的线程,如下: +----+------------- ...