前言:很多网站为了给用户很好的用户体验性,都会提供比较友好的异常界面,现在我们在来回顾一下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>
然后我们在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 }
然后在配置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>
现在我们再次开启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 }
在这里我们并没有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 }
然后再次配置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>
然后启动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 }
从中我们可以看出采用了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异常就说这么多了,随着技术不停的更新,处理异常的方式也越来越多但是这些基础的还是应该了解和学习下的