如果Servlet无法使用了,调用包装器的 unload 方法
// 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();
}
} /**
* The set of initialization parameters for this filter, keyed by
* parameter name.
*/
private Map<String, String> parameters = new HashMap<String, String>();用HashMap存储了初始化参数,它有get方法,增加属性的方法是addInitParameter(String name, String value)。 String filterClass = filterDef.getFilterClass();
ClassLoader classLoader = null;
if (filterClass.startsWith("org.apache.catalina."))
classLoader = this.getClass().getClassLoader();
else
classLoader = context.getLoader().getClassLoader();
.....
Class<?> clazz = classLoader.loadClass(filterClass);
this.filter = (Filter) clazz.newInstance();
filter.init(this);
return (this.filter);还是没有什么要说的。private ArrayList<ApplicationFilterConfig> filters = new ArrayList<ApplicationFilterConfig>();
看到了把,数组形式来存放链条。
典型的责任链模式。
public void doFilter(ServletRaquest request, ServletResponse response,FilterChain chain)
throws java.io.IOException, ServletException
在ApplicationFilterChain的doFilter方法中,它会将自己作为第三个参数传递给它。
我们看一个Filter实现类的例子
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// do something here
...
chain.doFilter(request, response);
}循环往复了http://blog.csdn.net/dlf123321/article/details/40078583
等所有的Filter都执行完了,就是下面的代码
if ((request instanceof HttpServletRequest) &&
(response instanceof HttpServletResponse)) {
servlet.service((HttpServletRequest) request,
(HttpServletResponse) response);
} else {
servlet.service(request, response);
}
什么时候Filter才算执行完了呢?
private Iterator<ApplicationFilterConfig> iterator = null;
....
if (this.iterator == null)
this.iterator = filters.iterator();
// Call the next filter if there is one
if (this.iterator.hasNext()) {
//执行filter
}
...
//调用servlet的service的代码块
...
how tomcat works 读书笔记 十一 StandWrapper 下
原文:http://blog.csdn.net/dlf123321/article/details/41260463