前言:很多网站为了给用户很好的用户体验性,都会提供比较友好的异常界面,现在我们在来回顾一下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. web工程中URL地址的推荐写法

    三.web工程中URL地址的推荐写法 使用c标签<c:url value="" /> 会自动添加项目名 -> value中的值 前面要加 “/” 在JavaWeb ...

  2. C#委托使用:多播 ,向委托注册多个方法

    private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); ...

  3. RAID配置

    一.madam -a      检测设备名称 -n      指定硬盘数量 -l       指定raid级别 -C     创建 -f       模拟硬盘故障 -r      移除硬盘 -a    ...

  4. u-boot 编译时间

    给定的格式FORMAT 控制着输出,解释序列如下: %%    一个文字的 %  %a    当前locale 的星期名缩写(例如: 日,代表星期日)  %A    当前locale 的星期名全称 ( ...

  5. Easyui 关闭弹出框后还显示验证提示信息

    今天下午做form表单,然后可以保存,可以关闭.可是关闭的时候老是会在屏幕左上角显示验证提示框,很是着急. 如图: 可能是easyui自己框架的问题,或许是因为网上有的人,自己代码写得有问题,没有调试 ...

  6. 2748: [HAOI2012]音量调节

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  7. Js之Dom学习-三种获取页面元素的方式、事件、innerText和innerHTML的异同

    一.三种获取页面元素的方式: getElementById:通过id来获取 <body> <input type="text" value="请输入一个 ...

  8. MySQL双机热备份

    系统: CentOS release 6.6 (Final) MySQL: mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) ...

  9. github 仓库管理

    一.远程仓库有master和dev分支1. 克隆代码 git clone https://github.com/master-dev.git # 这个git路径是无效的,示例而已 2. 查看所有分支 ...

  10. RMQ_ST算法

    RMQ (Range Minimum/Maximum Query)算法 1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数 ...