前言:很多网站为了给用户很好的用户体验性,都会提供比较友好的异常界面,现在我们在来回顾一下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. Windows下MongoDB环境搭建

    MongoDB下载 登录MongoDB官网:www.mongodb.org:点击[Download MongoDB]按钮,进入如下所示界面 选择目标操作系统及其版本,比如这里选择的是64位的Windo ...

  2. Sorted Union

    function unite(arr1, arr2, arr3) { //return arr1; var args = Array.from(arguments); var arr = args.r ...

  3. Java Web的开始学习

    今天开始学习Web了,需要的前提技能是  XML ,我还不太熟悉,今天的任务需要熟悉一下 XML-- 输入输出流  I/O     序列化反序列化,也需要看一下,我看这两块会有用到. 任务: ---- ...

  4. C++主要数据类型在计算机中所占字节大小

    遇到了数据存储的大端和小端问题,这你妹的看的一头雾水,发现我基本知识严重匮乏啊,先了解C++各数据类型在自己机子上占多少字节吧,以及这些数据类型所占字节大小与神马有关.各种查资料然后写代码检验,小结于 ...

  5. 小甲鱼python视频第七讲(课后习题)

    1.assert的作用. assert用来判断语句的真假,如果为假的话将触发AssertionError错误. 如果为真则继续执行. 2.变量互换(注意顺序) 3.成员资格运算符(in) 4.分数的划 ...

  6. 利用ASP.NET加密和解密Web.config中连接字符串

    摘自:博客园 介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Se ...

  7. button 边框

    [_saveButton.layer setMasksToBounds:YES]; [_saveButton.layer setCornerRadius:8.0]; //设置矩圆角半径 [_saveB ...

  8. Intellij Idea 12 开发Android 报Caused by: java.lang.UnsatisfiedLinkError: FindLibrary return null;

    这次开发是用的百度地图api,导入两个so文件,结果启动的时候总是报Caused by: java.lang.UnsatisfiedLinkError: findlibrary return null ...

  9. 鼠标模拟点击a标签

    今天写程序遇到的,想要用鼠标模拟点击a标签 html代码如下: <a id="jump"></a> js代码如下: var page = ....; $(' ...

  10. XproerIM产品使用手册

      1.  产品介绍 版权所有:(c)2009-2016 荆门泽优软件有限公司 保留所有权利. 产品官网:http://www.ncmem.com/apps/xproerim/index.asp 安装 ...