下面的内容,是做为j2ee小白的本人的一点个人理解,记录下来,供自己及同样在苦苦研究的网友参考,若有错误,请各位大神不吝指教
学习了JSP中的Filter,对Filter中的chain有以下理解。
1.Filter中的chain中存放了处理不同request的filter实例,JSP中使用Filter的目的就是为了在action处理request前,通过Filter中的 doFilter方法,对request进行预处理。猜想,每一个request均有一个Filter实例来处理,由在实现Filter类时,由 @WebFilter(filterName="log",urlPattern={"/*"})来指定 ,本例中,所有的request,均被log类来预处理。猜想,对于每个相同 request,仅使用同一个实例来处理。对于request请求,web容器(如Tomcat)会使用一个单独的线程来接收,每接收一个 request,web容器(Tomcat)边向chain中追加一个实例。链表的结构如下:
2.猜想,存在另一个线程,从链表中逐个取出实例,并执行,执行过程中,当遇到chain.doFilter时,便查询chain,查看是否还有节 点。若有,则进入先一个实例中,执行request的预处理代码(chain.doFilter()之前的代码),然后,在执行 chain.doFilter(),继续检查链表,查看是否有节点,若有,继续嵌套,如下图所示。若已到链表结尾,则执行对应实例 chain.doFilter后的代码(对服务器的响应进行后处理)。然后,返回到前一个节点的chain.doFilter,继续执行前一个节点的”对 服务器响应进行后处理的代码”。执行流程,如下图所示。