在Servlet
容器启动的时候必须创建一个ServletContext
(Servlet
上下文),用于管理容器中的所有Servlet
对象。在创建BinCatServletContext
的时候需要创建并初始化所有的Servlet
并存储到servletMap
中。
BinCatServletContext代码片段:
package com.anbai.sec.server.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.descriptor.JspConfigDescriptor;
import java.io.File;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class BinCatServletContext implements ServletContext {
// 创建一个装动态注册的Servlet的Map
private final Map<String, Servlet> servletMap = new HashMap<>();
// 创建一个装ServletContext初始化参数的Map
private final Map<String, String> initParameterMap = new HashMap<>();
// 创建一个装ServletContext属性对象的Map
private final Map<String, Object> attributeMap = new HashMap<>();
// 创建一个装Servlet动态注册的Set
private final Set<BinCatServletRegistrationDynamic> registrationDynamics = new LinkedHashSet<>();
// BinCatWebAppClassLoader,Web应用的类加载器
private final BinCatWebAppClassLoader appClassLoader;
public BinCatServletContext(BinCatWebAppClassLoader appClassLoader) throws Exception {
this.appClassLoader = appClassLoader;
}
// 此处省略ServletContext接口中的大部分方法,仅保留几个示例方法...
@Override
public Servlet getServlet(String name) throws ServletException {
return servletMap.get(name);
}
@Override
public Enumeration<Servlet> getServlets() {
Set<Servlet> servlets = new HashSet<Servlet>();
servlets.addAll(servletMap.values());
return Collections.enumeration(servlets);
}
@Override
public Enumeration<String> getServletNames() {
Set<String> servlets = new HashSet<String>();
servlets.addAll(servletMap.keySet());
return Collections.enumeration(servlets);
}
}