Servlet容器启动的时候必须创建一个ServletContext(Servlet上下文),用于管理容器中的所有Servlet对象。在创建BinCatServletContext的时候需要创建并初始化所有的Servlet并存储到servletMap中。
    BinCatServletContext代码片段:

    1. package com.anbai.sec.server.servlet;
    2. import javax.servlet.*;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.descriptor.JspConfigDescriptor;
    5. import java.io.File;
    6. import java.io.InputStream;
    7. import java.net.MalformedURLException;
    8. import java.net.URL;
    9. import java.util.*;
    10. import java.util.concurrent.ConcurrentHashMap;
    11. public class BinCatServletContext implements ServletContext {
    12. // 创建一个装动态注册的Servlet的Map
    13. private final Map<String, Servlet> servletMap = new HashMap<>();
    14. // 创建一个装ServletContext初始化参数的Map
    15. private final Map<String, String> initParameterMap = new HashMap<>();
    16. // 创建一个装ServletContext属性对象的Map
    17. private final Map<String, Object> attributeMap = new HashMap<>();
    18. // 创建一个装Servlet动态注册的Set
    19. private final Set<BinCatServletRegistrationDynamic> registrationDynamics = new LinkedHashSet<>();
    20. // BinCatWebAppClassLoader,Web应用的类加载器
    21. private final BinCatWebAppClassLoader appClassLoader;
    22. public BinCatServletContext(BinCatWebAppClassLoader appClassLoader) throws Exception {
    23. this.appClassLoader = appClassLoader;
    24. }
    25. // 此处省略ServletContext接口中的大部分方法,仅保留几个示例方法...
    26. @Override
    27. public Servlet getServlet(String name) throws ServletException {
    28. return servletMap.get(name);
    29. }
    30. @Override
    31. public Enumeration<Servlet> getServlets() {
    32. Set<Servlet> servlets = new HashSet<Servlet>();
    33. servlets.addAll(servletMap.values());
    34. return Collections.enumeration(servlets);
    35. }
    36. @Override
    37. public Enumeration<String> getServletNames() {
    38. Set<String> servlets = new HashSet<String>();
    39. servlets.addAll(servletMap.keySet());
    40. return Collections.enumeration(servlets);
    41. }
    42. }