ServletConfig和ServletContext的区别

59
ServletConfigServletContext接口有什么区别?

5
虽然这是一个基本的问题,但它非常重要,特别是对于那些参加面试的人来说 :) - Aman Gupta
11个回答

58

ServletConfig参数针对特定的servlet,并且对其他servlet不可见。它用于初始化目的。

ServletContext参数针对整个应用程序而不是特定的servlet进行指定,并可供该应用程序中的所有servlet使用。它是应用程序范围的,因此可以在页面之间全局访问。


3
换句话说,ServletContext 参数可以在不同的浏览器(用户)之间进行访问。 - KNU
管理员电子邮件应该是上下文配置吗?数据库呢?也应该是上下文配置,对吧? - Stu_Dent

54

来源: Java 中 ServletConfig 和 ServletContext 的区别

ServletConfig

  • ServletConfigjavax.servlet.*; 包中可用。

  • 每个 Servlet 类都有一个 ServletConfig 对象。

  • ServletConfig 的对象会在 Servlet 初始化过程中创建。

  • 此配置对象只对特定的 Servlet 公开。

  • 作用域:当 Servlet 执行时,ServletConfig 对象将可用,一旦 Servlet 执行完成,它将被销毁。

  • 我们应该显式地发出请求,以便首次创建 ServletConfig 对象。

  • In web.xml – <init-param> 标签将出现在 <servlet-class> 标签下方。

以下是其在 web.xml 中的样子: (来源)

<servlet>
    <servlet-name>ServletConfigTest</servlet-name>
    <servlet-class>com.stackoverflow.ServletConfigTest</servlet-class>
    <init-param>
        <param-name>topic</param-name>
        <param-value>Difference between ServletConfig and ServletContext</param-value>
    </init-param>
</servlet>

ServletContext

  • ServletContextjavax.servlet.*;包中可用。

  • ServletContext对象是整个Web应用程序的全局对象。

  • ServletContext对象将在Web应用程序部署时创建。

  • 范围: 只要Web应用程序在执行,ServletContext对象就会一直存在,并且一旦应用程序从服务器中删除,它就会被销毁。

  • ServletContext对象甚至在发出第一个请求之前就可用。 在web.xml中,<context-param>标签将显示在<web-app>标签下方。

以下是它在web.xml下的样子:

<context-param>
    <param-name>globalVariable</param-name>
    <param-value>com.stackoverflow</param-value>
</context-param>

所以最后......

Web应用程序的数量=相应数量的ServletContext对象[每个Web应用程序一个]
Servlet类的数量=相应数量的ServletConfig对象

在Servlets JSP中ServletContext和ServletConfig之间的区别以表格形式呈现(Source)

enter image description here


20

ServletConfig是由Servlet容器实现的,用于使用init()初始化单个Servlet。也就是说,您可以使用web.xml部署描述符向Servlet传递初始化参数。为了理解,这类似于Java类中的构造函数。

ServletContext是由Servlet容器实现的,用于所有Servlet与其Servlet容器通信,例如获取文件的MIME类型、获取调度请求或写入日志文件。也就是获取有关其执行环境的详细信息。它仅适用于单个Java虚拟机。如果Web应用程序在多个JVM之间分布,则此功能将无法正常工作。为了理解,这类似于应用程序全局变量机制,适用于仅在一个JVM中部署的单个Web应用程序。

来源:http://javapapers.com/servlet/difference-between-servletconfig-and-servletcontext/


4

这个问题在他们的javadocs的介绍性文本中有回答。

ServletConfig javadoc:

由servlet容器用于在初始化期间向servlet传递信息的servlet配置对象。

ServletContext javadoc:

定义了一组方法,供servlet与其servlet容器通信,例如获取文件的MIME类型、调度请求或写入日志文件等。

每个Java虚拟机中都有一个“Web应用程序”对应的上下文(即一个“Web应用程序”是一组servlet和内容,安装在服务器的URL命名空间的特定子集下,例如/catalog,并可能通过.war文件进行安装)。

对于在部署描述符中标记为“分布式”的Web应用程序,将为每个虚拟机实例创建一个上下文实例。在这种情况下,上下文不能用作共享全局信息的位置(因为该信息不会真正成为全局)。请改用外部资源,如数据库。

ServletContext对象包含在提供servlet初始化时提供给servlet的ServletConfig对象中。

javadoc还包含可用方法的列表以及它们使用说明。这能很好地概述它们提供了什么功能和可能性。


4

enter image description here

服务器中的ServletContext和ServletConfig对象

作为Web服务器的一部分,有许多Web应用程序驻留在服务器内。对于每个Web应用程序,服务器负责创建一个对象,即servlet上下文对象。它也被称为应用程序对象。

ServletConfig对象

对于每个Web应用程序,我们将创建N个servlet。对于每个servlet,服务器将创建一个对象,即ServletConfig对象。


4

图片描述在此输入

区别:

.--------------------------------------------------.----------------------------------------------------------------------------------------------.
|                  ServletConfig                   |                                        ServletContext                                        |
:--------------------------------------------------+----------------------------------------------------------------------------------------------:
| Unique object per servlet                        | Unique object for complete application                                                       |
:--------------------------------------------------+----------------------------------------------------------------------------------------------:
| Used to provide init parameters to the servlet   | Used to provide application level init parameters that all other servlets can use.           |
:--------------------------------------------------+----------------------------------------------------------------------------------------------:
| We can’t set attributes in ServletConfig object. | We can set attributes in ServletContext that other servlets can use in their implementation. |
'--------------------------------------------------'----------------------------------------------------------------------------------------------'

3
Servlet容器会创建两个对象:Servlet上下文和Servlet配置。 Servlet上下文是公共的,即我们在webxml中存储在Servlet上下文下的数据对所有servlet都可用,并且一个应用程序中只有一个Servlet上下文对象;而在Servlet配置的情况下,它是私有的,即我们在Web.xml中使用Servlet上下文存储的数据仅对特定的servlet可用,可以有n个Servlet配置对象。
例如(如果在应用程序中有3个servlet文件,则将有3个servlet配置对象)。

3

ServletConfig是针对特定Servlet的,它在init(ServletConfig x)方法中非常有用,或者可以通过使用getServletConfig()方法来使用。如果我们需要获取一些与Servlet相关的信息,则会使用它。例如:检索有关数据库访问相关信息的Servlet可能会使用ServletConfig,因为此信息仅适用于该特定的Servlet。

然而,ServletContext是整个应用程序的。当我们需要在特定Web应用程序中的某些/所有Servlet/JSP之间共享信息时,就会使用它。可以通过使用Servlet的getServletConfig().getServletContext()方法来访问它。例如:用于计算有多少用户访问您的网站的Servlet/JSP。


0

通常两者都用于初始化目的,但一个主要的不同是,假设您想要在整个应用程序中使用一些变量或字段,则需要在web.xml加载时进行初始化,您有一个选项是ServletContext

如果您只想在特定的servlet中使用某些变量,则需要使用ServletConfit。


0

ServletConfig 用于共享特定于 Servlet 的初始化参数,而 ServletContext 用于在 Web 应用程序中共享任何 Servlet 内部的初始化参数。


我最近开始在stackoverflow上回答问题。这是我的第二个答案。我正在熟悉这个网站。 - Sridhar Jammalamadaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接