ServletContext 接口详解和具体应用

目录

1、如何获取 ServletContext 对象?

2、ServletContext 接口中的方法

3、ServletContext 的应用场景详述

4、ServletContext 的生命周期和 Servlet 的生命周期的区别

5、Spring 框架对 ServletContext 的实现


        // 有时候,不是一个东西很难,而是你跑偏了方向。

        ServletContext 是一个接口,代表了一个 Web 应用程序在容器中的上下文环境,是在整个 Web 应用程序中共享的对象。每个 Web 应用程序在容器中只有一个 ServletContext 实例,它在 Web 应用程序启动时被创建,并在 Web 应用程序关闭时被销毁

        官方释义:ServletContext 用于定义 servlet 用于与其 servlet 容器通信的一组方法,例如,获取文件的MIME类型、调度请求或写入日志文件。

1、如何获取 ServletContext 对象?

        获取 ServletContext 对象的常用方式有以下几种:

        (1)在 Servlet 中获取:可以通过 ServletConfig 对象的 getServletContext() 方法获取 ServletContext 对象,例如:

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = getServletConfig().getServletContext();
        // 使用 ServletContext 对象进行操作
    }
}

        (2)在 Filter 中获取:可以通过 FilterConfig 对象的 getServletContext() 方法获取 ServletContext 对象,例如:

public class MyFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        ServletContext context = config.getServletContext();
        // 使用 ServletContext 对象进行操作
    }
    // 其他方法省略
}

        (3)在 Listener 中获取:可以通过 ServletContextEvent 对象的 getServletContext() 方法获取 ServletContext 对象,例如:

public class MyServletContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        // 使用 ServletContext 对象进行操作
    }
    // 其他方法省略
}

        (4)在 JSP 中获取:可以通过 pageContext 对象的 getServletContext() 方法获取 ServletContext 对象,例如:

<%
    ServletContext context = pageContext.getServletContext();
    // 使用 ServletContext 对象进行操作
%>

// 有种ServletContext 无处不在的感觉

2、ServletContext 接口中的方法

  1. getServletContextName():获取 ServletContext 对象的名称。
  2. getContextPath():获取 Web 应用程序的上下文路径
  3. getInitParameter(String name):获取指定名称的初始化参数的值
  4. getInitParameterNames():获取所有初始化参数名称的枚举。
  5. setAttribute(String name, Object object):将一个对象作为属性存储在 ServletContext 中。
  6. getAttribute(String name):获取指定名称的属性的值。
  7. getAttributeNames():获取所有属性名称的枚举。
  8. removeAttribute(String name):从 ServletContext 中删除指定名称的属性。
  9. getResource(String path):返回一个 URL 对象,表示指定的路径对应的资源。
  10. getResourceAsStream(String path):返回一个 InputStream 对象,表示指定的路径对应的资源。
  11. getRealPath(String path):返回指定路径所对应的实际路径
  12. getServerInfo():获取 Servlet 容器的服务器信息。
  13. getMajorVersion():获取 Servlet 规范的主要版本号。
  14. getMinorVersion():获取 Servlet 规范的次要版本号。
  15. log(String message):向 Servlet 容器的日志文件中写入一条消息。
  16. log(String message, Throwable throwable):向 Servlet 容器的日志文件中写入一条消息和异常堆栈跟踪信息。
  17. getNamedDispatcher(String name):获取指定名称的 Servlet 调度程序。
  18. getRequestDispatcher(String path):获取指定路径的请求调度器。
  19. getServletContext():返回 ServletContext 对象的引用
  20. getServletContextName():获取 ServletContext 对象的名称。
  21. getMimeType(String file):获取指定文件的 MIME 类型
  22. getResourcePaths(String path):返回指定路径下所有可用的资源路径的集合。
  23. getContext(String uripath):获取与给定的 URL 路径相关联的 ServletContext 对象。
  24. getRequestCharacterEncoding():获取默认的请求字符编码。
  25. setRequestCharacterEncoding(String encoding):设置默认的请求字符编码。
  26. getResponseCharacterEncoding():获取默认的响应字符编码。
  27. setResponseCharacterEncoding(String encoding):设置默认的响应字符编码。
  28. declareRoles(String... roleNames):声明安全角色。
  29. getVirtualServerName():获取虚拟服务器的名称。
  30. addFilter(String filterName, String className):向 ServletContext 中添加一个过滤器
  31. addFilter(String filterName, Filter filter):向 ServletContext 中添加一个过滤器。
  32. addListener(String className):向 ServletContext 中添加一个监听器
  33. addListener(Class<? extends EventListener> listenerClass):向 ServletContext 中添加一个监听器。
  34. addListener(EventListener listener):向 ServletContext 中添加一个监听器。
  35. createFilter(Class<T> clazz):创建一个过滤器实例。
  36. createListener(Class<T> clazz):创建一个监听器实例。
  37. createServlet(Class<T> clazz):创建一个 Servlet 实例。
  38. declareRoles(Set<String> roleNames):声明安全角色。
  39. setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes):设置会话跟踪模式。
  40. getDefaultSessionTrackingModes():获取默认的会话跟踪模式。
  41. getEffectiveSessionTrackingModes():获取 ServletContext 上下文的有效会话跟踪模式。
  42. getSessionCookieConfig():获取会话 Cookie 的配置信息
  43. setSessionTimeout(int sessionTimeout):设置会话超时时间(以分钟为单位)。
  44. getSessionTimeout():获取会话超时时间(以分钟为单位)。
  45. getServletRegistration(String servletName):获取给定名称的 Servlet 注册对象。
  46. getServletRegistrations():获取所有 Servlet 注册对象的 Map。
  47. addServlet(String servletName, String className):向 ServletContext 中添加一个 Servlet。
  48. addServlet(String servletName, Servlet servlet):向 ServletContext 中添加一个 Servlet。
  49. addServlet(String servletName, Class<? extends Servlet> servletClass):向 ServletContext 中添加一个 Servlet。
  50. createServlet(Class<T> clazz):创建一个 Servlet 实例。
  51. getFilterRegistration(String filterName):获取给定名称的过滤器注册对象。
  52. getFilterRegistrations():获取所有过滤器注册对象的 Map。
  53. addFilterRegistration(FilterRegistration filterRegistration):添加一个过滤器注册对象。
  54. addListenerRegistration(EventListenerRegistration listenerRegistration):添加一个监听器注册对象。
  55. getErrorPage(String exceptionType):获取与给定异常类型关联的错误页面路径。
  56. getErrorPages():获取所有错误页面路径的集合。
  57. addErrorPage(ErrorPage errorPage):添加一个错误页面。
  58. getJspConfigDescriptor():获取 JSP 配置描述符。
  59. getServletNames():获取所有 Servlet 的名称。
  60. getServlets():获取所有 Servlet 的枚举。
  61. setSessionTimeout(Duration timeout):设置会话超时时间(以 Duration 对象表示)。
  62. getSessionIdGenerator():获取会话 ID 生成器。
  63. setSessionIdGenerator(SessionIdGenerator sessionIdGenerator):设置会话 ID 生成器。
  64. setAttribute(String name, Object value, int scope):将一个对象作为属性存储在 ServletContext 中的指定作用域中。
  65. getAttribute(String name, int scope):获取指定名称在 ServletContext 中的指定作用域中的属性的值。
  66. removeAttribute(String name, int scope):从 ServletContext 中的指定作用域中删除指定名称的属性。

        以上是 ServletContext 接口中的所有方法。

补充:什么是 MIME 类型?

        MIME(Multipurpose Internet Mail Extensions)类型,也称为媒体类型(media type)或内容类型(content type),是一种标识数据类型的标准,用于指示在传输过程中需要处理的数据的类型。MIME类型通常与文件扩展名相关联,用于表示一个文件的类型

        例如,常见的MIME类型包括:

  • text/html:HTML 文档
  • text/plain:纯文本文件
  • image/jpeg:JPEG 图像
  • image/png:PNG 图像
  • application/json:JSON 数据
  • application/pdf:PDF 文档
  • audio/mpeg:MP3 音频

        MIME类型通常由两部分组成,用斜杠(/)分隔。第一部分表示数据的类型,例如文本(text)、图像(image)、应用程序(application)等;第二部分表示数据的子类型,例如 HTML(html)、JSON(json)、JPEG(jpeg)等。有时还会使用可选参数表示具体的编码方式、语言等信息。

        在Web应用程序中,MIME类型通常用于指示服务器如何处理请求和响应中的数据,例如将数据解析为 HTML 页面或 JSON 数据。在HTTP协议中,MIME类型通过 Content-Type 和 Accept 头字段进行传输。

3、ServletContext 的应用场景详述

        ServletContext 是在 Web 应用程序中用于共享信息和资源的关键接口之一。它的主要应用场景包括:

  1. 全局参数配置:ServletContext 可以用于存储应用程序的全局参数,例如数据库连接信息、邮件服务器配置等。这些参数可以在应用程序中的任何地方访问和使用。

  2. 共享数据:ServletContext 可以用于在应用程序中共享数据和资源,例如缓存数据、共享对象等。这些数据和资源可以在应用程序中的任何 Servlet、Filter、Listener、JSP 等组件中访问和使用。

  3. 应用程序初始化:ServletContext 可以用于应用程序初始化和启动的任务,例如读取配置文件、初始化数据库连接池等。这些任务通常在应用程序启动时执行,并且只需要执行一次。

  4. 访问 Web 应用程序资源:ServletContext 可以用于访问 Web 应用程序中的资源,例如读取应用程序中的文件、访问应用程序中的 Web 服务等。

  5. 错误处理:ServletContext 可以用于处理应用程序中的错误,例如记录错误日志、发送错误报告等。这些操作通常需要在整个应用程序中进行统一处理。

        ServletContext 是一个非常重要的接口,可以用于在 Web 应用程序中共享信息和资源,执行初始化和启动任务,访问应用程序资源,处理错误等。它提供了一个全局的上下文环境,使得应用程序的各个组件可以更加灵活和高效地协作。

        下面是一些使用ServletContext的示例代码:

        (1)在 Servlet 中获取全局参数

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取 ServletContext 对象
        ServletContext context = getServletContext();
        
        // 获取全局参数
        String dbUrl = context.getInitParameter("dbUrl");
        String dbUser = context.getInitParameter("dbUser");
        String dbPassword = context.getInitParameter("dbPassword");
        
        // 使用全局参数
        Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
        // ...
    }
}

        (2)在 Servlet 中共享数据

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取 ServletContext 对象
        ServletContext context = getServletContext();
        
        // 获取共享对象
        List<String> dataList = (List<String>) context.getAttribute("dataList");
        
        // 使用共享对象
        dataList.add("new data");
        // ...
    }
}

        (3)在应用程序启动时执行初始化任务

public class MyServletContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
        // 获取 ServletContext 对象
        ServletContext context = event.getServletContext();
        
        // 执行初始化任务
        // ...
    }
    
    public void contextDestroyed(ServletContextEvent event) {
        // 应用程序关闭时执行清理任务
        // ...
    }
}

        (4)在 JSP 页面中访问应用程序资源

<%@ page import="java.io.*" %>
<%
    // 获取 ServletContext 对象
    ServletContext context = application.getServletContext();
    
    // 读取文件
    InputStream is = context.getResourceAsStream("/WEB-INF/config.properties");
    Properties props = new Properties();
    props.load(is);
    is.close();
    
    // 输出属性值
    out.println(props.getProperty("app.version"));
%>

        (5)在 Filter 中处理错误

public class MyFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (Exception e) {
            // 记录错误日志
            ServletContext context = request.getServletContext();
            context.log("Filter error", e);
            
            // 发送错误报告
            response.getWriter().write("An error occurred: " + e.getMessage());
        }
    }
}

        这些示例代码展示了ServletContext在不同场景下的使用方法,包括获取全局参数、共享数据、执行初始化任务、访问应用程序资源和处理错误等。

4、ServletContext 的生命周期和 Servlet 的生命周期的区别

        ServletContext 对象的生命周期随着 Web 应用程序的启动而开始,并在 Web 应用程序关闭时结束。当 Web 容器启动时,它会创建一个 ServletContext 实例,并在整个 Web 应用程序中共享该实例。ServletContext 实例通常用于在应用程序范围内存储数据和共享资源。

        而 Servlet 的生命周期是由容器管理的。容器创建 Servlet 实例、调用其 init() 方法进行初始化、调用其 service() 方法处理请求,并在 Web 应用程序关闭时调用其 destroy() 方法进行清理。Servlet 实例通常用于处理请求和响应,但不是在应用程序范围内共享的。

        总的来说,ServletContext 对象和 Servlet 实例都与 Web 应用程序的生命周期有关,但它们的作用和生命周期不同。ServletContext 是 Web 应用程序级别的对象,生命周期为整个 Web 应用程序的生命周期,主要用于在应用程序范围内存储数据和共享资源;而 Servlet 是请求级别的对象,生命周期由容器管理,主要用于处理请求和响应。

// ServletContext 是 Web 应用程序的生命周期,Servlet 是容器的生命周期

5、Spring 框架对 ServletContext 的实现

        在 Spring 框架中,通过 WebApplicationContext 接口实现了对 ServletContext 的封装和管理// 这个东西就是Spring中的IOC容器

        WebApplicationContext 是 ApplicationContext 接口的子接口,它专门用于管理 Web 应用程序中的 Bean。在 Web 应用程序启动时,Spring 容器会创建一个 WebApplicationContext 实例,并将其与 ServletContext 关联起来。这样,所有在 WebApplicationContext 中定义的 Bean 都可以在整个 Web 应用程序中共享使用,而不仅仅是在某个 Servlet 或 JSP 页面中。// 从这里也可以看出 ServletContext 的生命周期和 Servlet 的生命周期的区别

        WebApplicationContext 中定义的 Bean 可以通过 ServletContext 获取。在 WebApplicationContext 中定义的 Bean 可以是任何类型的 Bean,包括 Service、Dao、Controller 等。Spring 容器会负责管理这些 Bean 的生命周期,包括创建、初始化和销毁。

        同时,WebApplicationContext 还提供了一些有用的方法,例如:

  • getServletContext(): 获取与该 WebApplicationContext 相关联的 ServletContext 实例。
  • getRootWebApplicationContext(ServletContext servletContext): 获取根 WebApplicationContext 实例。
  • getWebApplicationContext(ServletContext servletContext): 获取与指定 ServletContext 关联的 WebApplicationContext 实例。

        这些方法可以让开发人员方便地操作 ServletContext 和 WebApplicationContext,从而更加灵活地管理 Web 应用程序中的 Bean。因此,Spring 框架对 ServletContext 的封装和管理可以使开发人员更加方便地进行 Web 应用程序开发。

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值