How Tomcat works 之第十一章之StandardWrapperValue

StandardWrapperValue类是StandardWrapper实例的基本值。这个值仅做了两件事情。


                      1    执行与这个Servlet相关的所有过滤器

                      2   调用sender的service方法


为了做这些,StandardWrapperValue类中的invoke方法必须实现以下操作:


                     1   通过调用StandardWrapper的allocate方法获取这个Servlet的一个实例,这个Servlet维护StandardWrapper。

                     2   调用私有方法createFilterChain方法创建一个过滤器链

                     3   调用过滤器链的doFilter方法。其中包括调用Servlet的service方法。

                     4   释放过滤器链

                     5  调用这个wrapper的deallocate方法

                     6  如果这个Servlet永久无效,调用wrapper的unload方法。


下面高亮部分是invoke方法:


                       // Allocate a servlet instance to process this request
   try {
      if (!unavailable) {
          servlet = wrapper.allocate();
      }
   }
   ...
   // Acknowlege the request
   try {
      response.sendAcknowledgement();
   }
   ...
   // Create the filter chain for this request
   ApplicationFilterChain filterChain = createFilterChain(request,
       servlet);
   // Call the filter chain for this request
   // This also calls the servlet's servicet() method
   try {
       String jspFile = wrapper.getJspFile();
      if (jspFile != null)
          sreq.setAttribute(Globals.JSP_FILE_ATTR, jspFile);
       else
          sreq.removeAttribute(Globals.JSP_FILE_ATTR);
      if ((servlet != null) && (filterChain != null)) {
          filterChain.doFilter(sreq, sres);
      }
       sreq.removeAttribute(Globals.JSP_FILE_ATTR);
   }

   ...
   // Release the filter chain (if any) for this request
   try {
       if (filterChain != null)
          filterChain.release();
   }
    ...
   // Deallocate the allocated servlet instance
   try {
       if (servlet != null) {
          wrapper.deallocate(servlet);
       }
   }
    ...
   // If this servlet has been marked permanently unavailable,
   // unload it and release this instance
   try {
       if ((servlet != null) && (wrapper.getAvailable() ==
          Long.MAX_VALUE)) {
          wrapper.unload();
       }

   }
    ...

上述中最重要的是调用createFilterChain方法和过滤器链的doFilter方法。createFilterChain方法创建一个ApplicationFilterChain的实例并增加了所有的过滤器,应该应用于这个StandardWrapper表示的Servlet。为了更好理解ApplicationFilterChain类,需要先理解FilterDef类和ApplicationFilterConfig类。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值