JavaWebFilter如果debug带有Filter过滤器的项目

Posted The Gao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWebFilter如果debug带有Filter过滤器的项目相关的知识,希望对你有一定的参考价值。

当客户端请求在web.xml文件中配置的标签中标签下的服务端的数据时,首先要经过Filter过滤器。

对于某些容易产生线程冲突的场景,可以通过Filter过滤器配合ThreadLocal来解决。示例中的doFilter方法实现了如果没有异常就正常向下执行直至Jdbc工具类提交事务并关闭连接,如果有异常的话就回滚事务并关闭连接。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
	try 
		filterChain.doFilter(servletRequest,servletResponse);
        JdbcUtils.commitAndClose();
     catch (Exception e) 
        JdbcUtils.rollbackAndClose();
        e.printStackTrace();
    

Filter过滤器的使用,需要自己编写实现类继承Filter接口,并重写三个方法,其中doFilter方法是最重要的。

这里模拟了一个场景,即生成订单的整个过程是不允许因为Exception导致数据库更新有问题的。比如以下代码中int i = 12 / 0;所产生的问题。

//OrderServiceImpl中
public String createOrder(Cart cart, Integer userId) 
    //保存订单
    String orderId = System.currentTimeMillis() + "" + userId;
    Order order = new Order(orderId, new Date(), cart.getTotalPrice(), 0, userId);
    orderDao.saveOrder(order);

    int i = 12 / 0;  //会产生异常

JavaWeb项目一般都是通过Web层、Service层和Dao层最终与数据库交互并响应请求的。我所写这个项目的代码的结构是,BaseServlet - OrderServlet - OrderServiceImpl - OrderDao(+ OrderItemDao + BookDao)。上述代码为OrderServiceImpl中的实现,其中最后一行会导致程序出现异常。

在Web层,当jsp的请求发过来之后,由于请求的URI为OrderServlet,因此进入OrderServlet程序中找doPost / doGet方法,这里我把这两个方法抽取到了父类中,因此是找不到的。没有就去找它的父类BaseServlet,在BaseServlet中的doPost / doGet方法,我通过反射机制映射到this.class()中的createOrder方法,createOrder方法中会调用Service层的实现。

在Service层,上述代码会将一个订单通过OrderDao保存到数据库中,但是随后就出现了异常。此时异常首先抛给Service层的程序,再抛给调用它的OrderServlet的createOrder方法,再向上抛到BaseServlet的doPost / doGet方法。此时Filter程序就可以捕获到异常,执行JdbcUtils.rollbackAndClose();回滚事务并关闭连接了。

因此Debug时,在int i = 12 / 0;语句处及几个调用点打上断点,就会清晰地看出程序间的跳转及异常处理的整个过程。

不过一定要注意的是,凡是这里面参与到的程序,所有的捕获异常处都要将捕获的异常再转为运行异常并抛出,即throw new RuntimeException(e);,否则会导致上层或者说调用者无法捕获到异常,进而执行不了JdbcUtils.rollbackAndClose();,起不到作用。如果想要添加出错了之后跳转到错误页面的功能,需要在Filter程序继续将异常抛出,即throw new RuntimeException(e);,此时会把异常抛给Tomcat,再由Tomcat统一处理。

以上是关于JavaWebFilter如果debug带有Filter过滤器的项目的主要内容,如果未能解决你的问题,请参考以下文章

AEM6从带有-debug -nofork选项的控制台开始

PHP debug_backtrace() 函数

FIL带给IPFS的创新

FIL带给IPFS的创新

FIL带给IPFS的创新

官方太和资本与协议实验室合作成立10万FIL 的生态基金