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类。