利用java filter 实现业务异常拦截 异常信息集中处理

来源:互联网 发布:手机游戏防闪退软件 编辑:程序博客网 时间:2024/05/16 07:41

1、缘由:我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理机制,我们在业务层会跑出我们遇到业务处理异常 ,然后交由struts处理将提示信息到一个页面进行显示,来提示用户的相关操作,这里我们会根据以上情景设计一下怎么来显示该功能。

2、解决方法:我们的业务异常通常都是抛出的,就是unchecked exception,所以最后总会到达调用该方法的最外层进行捕获,一般我们都会在action中调用我们的业务方法 ,而业务方法可能会跑出异常,此时我们就可以在此时做些文章了, 我们可以利用filter,来捕获我们抛出的异常,然后跳转到一个统一页面,进行信息提示了。

3、具体代码:

①自定义异常类,我想这个就不用多说了 ,大家都是会的:

BsException.java

[java] view plaincopyprint?
  1. package com.ajun.exception;  
  2.   
  3.   
  4. /** 
  5.  * 业务异常类 
  6.  * @author ajun 
  7.  * @http://blog.csdn.net/ajun_studio 
  8.  */  
  9. public class BsException extends RuntimeException {  
  10.   
  11.     //异常代码  
  12.     private String key;  
  13.       
  14.     private Object[] values;//一些其他信息  
  15.       
  16.     public BsException() {  
  17.         super();  
  18.     }  
  19.   
  20.     public BsException(String message, Throwable throwable) {  
  21.         super(message, throwable);  
  22.     }  
  23.   
  24.     public BsException(String message) {  
  25.         super(message);  
  26.     }  
  27.   
  28.     public BsException(Throwable throwable) {  
  29.         super(throwable);  
  30.     }  
  31.       
  32.     public BsException(String message,String key){  
  33.         super(message);  
  34.         this.key = key;  
  35.     }  
  36.       
  37.     public BsException(String message,String key,Object value){  
  38.         super(message);  
  39.         this.key = key;  
  40.         this.values = new Object[]{value};  
  41.     }  
  42.       
  43.     public BsException(String message,String key,Object[] values){  
  44.         super(message);  
  45.         this.key = key;  
  46.         this.values = values;  
  47.     }  
  48.   
  49.     public String getKey() {  
  50.         return key;  
  51.     }  
  52.   
  53.     public Object[] getValues() {  
  54.         return values;  
  55.     }  
  56. }  
既然要用到filter ,自然少不了实现Filter接口,拦截你想要的请求,然后,就可以捕获异常了,此时你可以对你的chain.doFilter进行try catch,然后判断你想捕获的异常,很简单 ,请看代码:

[java] view plaincopyprint?
  1. package com.ajun.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. import com.ajun.exception.BsException;  
  15.   
  16. /** 
  17.  * 业务异常过滤器 
  18.  * @author ajun 
  19.  * @http://blog.csdn.net/ajun_studio 
  20.  */  
  21. public class ExceptionFiler implements Filter {  
  22.   
  23.     private String errorPage;//跳转的错误信息页面  
  24.       
  25.       
  26.     public void destroy() {  
  27.           
  28.     }  
  29.   
  30.     public void doFilter(ServletRequest req, ServletResponse res,  
  31.             FilterChain chain) throws IOException, ServletException {  
  32.   
  33.          HttpServletResponse response = (HttpServletResponse) res;  
  34.          HttpServletRequest request = (HttpServletRequest) req;  
  35.          //捕获你抛出的业务异常  
  36.          try {  
  37.             chain.doFilter(req, res);  
  38.         } catch (RuntimeException e) {  
  39.             if(e instanceof BsException){//如果是你定义的业务异常  
  40.                 request.setAttribute("BsException", e);//存储业务异常信息类  
  41.                 request.getRequestDispatcher(errorPage).forward(request, response);//跳转到信息提示页面!!  
  42.             }  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  
  46.        //初始化读取你配置的提示页面路径  
  47.     public void init(FilterConfig config) throws ServletException {  
  48.         //读取错误信息提示页面路径  
  49.         errorPage = config.getInitParameter("errorPage");  
  50.         if(null==errorPage || "".equals(errorPage)){  
  51.             throw new RuntimeException("没有配置错误信息跳转页面,请再web.xml中进行配置\n<init-param>\n<param-name>errorPage</param-name>\n<param-value>/error.jsp</param-value>\n </init-param>\n路径可以是你自己设定的任何有效路径页面!!");  
  52.             //System.out.println("没有配置错误信息跳转页面");  
  53.         }  
  54.     }  
  55.   
  56. }  

Filter在web.xml中的配置如下:

[html] view plaincopyprint?
  1. <filter>  
  2.     <filter-name>ExceptionFilter</filter-name>  
  3.     <filter-class>com.ajun.filter.ExceptionFiler</filter-class>  
  4.     <init-param>  
  5.         <param-name>errorPage</param-name>  
  6.         <param-value>/error.jsp</param-value>  
  7.     </init-param>  
  8. </filter>  
  9. <filter-mapping>  
  10.     <filter-name>ExceptionFilter</filter-name>  
  11.     <url-pattern>*.do</url-pattern>  
  12. </filter-mapping>  

下面写个servlet ,在请求的时候抛出你定义业务异常来试验一下吧

[java] view plaincopyprint?
  1. package com.ajun.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. public class ExServlet extends HttpServlet {  
  12.   
  13.       
  14.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  15.             throws ServletException, IOException {  
  16.   
  17.         this.doPost(request, response);  
  18.           
  19.     }  
  20.   
  21.       
  22.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.   
  25.         TestService t = new TestService();  
  26.         t.add();//模拟调用业务层方法,在此方法内抛出异常,此异常会在filter中进行捕获。  
  27.           
  28.     }  
  29.   
  30. }  
web.xml配置上述servlet

[html] view plaincopyprint?
  1. <servlet>  
  2.   <servlet-name>ExServlet</servlet-name>  
  3.   <servlet-class>com.ajun.servlet.ExServlet</servlet-class>  
  4. </servlet>  
  5.   
  6. <servlet-mapping>  
  7.   <servlet-name>ExServlet</servlet-name>  
  8.   <url-pattern>*.do</url-pattern>  
  9. </servlet-mapping>  

测试时在servlet中被调用的业务类

TestService.java

[java] view plaincopyprint?
  1. package com.ajun.servlet;  
  2.   
  3. import com.ajun.exception.BsException;  
  4.   
  5. public class TestService {  
  6.   
  7.     public void add(){  
  8.           
  9.         System.out.println("add () was called!!");  
  10.         if(true){  
  11.             throw new BsException("in add() throws exception!!");//抛出异常,根据你的业务逻辑  
  12.         }  
  13.     }  
  14. }  

现在部署项目,在你的浏览器内输入:http://localhost:8080/BsException/ajun.do

成功跳转到error.jsp:显示:in add() throws exception!!

在后台得到:

[java] view plaincopyprint?
  1. add () was called!!  
  2. com.ajun.exception.BsException: in add() throws exception!!  
  3.     at com.ajun.servlet.TestService.add(TestService.java:11)  
  4.     at com.ajun.servlet.ExServlet.doPost(ExServlet.java:26)  
  5.     at com.ajun.servlet.ExServlet.doGet(ExServlet.java:17)......  

成功了,赶紧去实现吧。。。
0 0