在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的Mapprivate final Map<String, Servlet> servletMap = new HashMap<>();// 创建一个装ServletContext初始化参数的Mapprivate final Map<String, String> initParameterMap = new HashMap<>();// 创建一个装ServletContext属性对象的Mapprivate final Map<String, Object> attributeMap = new HashMap<>();// 创建一个装Servlet动态注册的Setprivate final Set<BinCatServletRegistrationDynamic> registrationDynamics = new LinkedHashSet<>();// BinCatWebAppClassLoader,Web应用的类加载器private final BinCatWebAppClassLoader appClassLoader;public BinCatServletContext(BinCatWebAppClassLoader appClassLoader) throws Exception {this.appClassLoader = appClassLoader;}// 此处省略ServletContext接口中的大部分方法,仅保留几个示例方法...@Overridepublic Servlet getServlet(String name) throws ServletException {return servletMap.get(name);}@Overridepublic Enumeration<Servlet> getServlets() {Set<Servlet> servlets = new HashSet<Servlet>();servlets.addAll(servletMap.values());return Collections.enumeration(servlets);}@Overridepublic Enumeration<String> getServletNames() {Set<String> servlets = new HashSet<String>();servlets.addAll(servletMap.keySet());return Collections.enumeration(servlets);}}
