当前位置:   article > 正文

利用java filter 实现业务异常拦截 跳转到错误信息提示页面_拦截器过滤error页面

拦截器过滤error页面

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

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

3、具体代码:

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

BsException.java

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

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

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

  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 ,在请求的时候抛出你定义业务异常来试验一下吧

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

  1. <servlet>
  2. <servlet-name>ExServlet</servlet-name>
  3. <servlet-class>com.ajun.servlet.ExServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>ExServlet</servlet-name>
  7. <url-pattern>*.do</url-pattern>
  8. </servlet-mapping>

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

TestService.java

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

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

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

在后台得到:

  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)......

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/cp456/article/detail/61361
推荐阅读
相关标签
  

闽ICP备14008679号