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过滤器的项目的主要内容,如果未能解决你的问题,请参考以下文章