初始化参数和上下文参数

init-param and context-param

<init-param><context-param> 有什么区别!?

<init-param> 如果你想为特定的 servlet 初始化一些参数,将被使用。当请求首先到达 servlet 时,它的 init 方法将被调用,然后 doGet/doPost 而如果你想为整个应用程序初始化一些变量,你将需要使用 <context-param> 。每个 servlet 都可以访问上下文变量。

考虑 web.xml

中的以下定义
<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>TestServlet</servlet-class>
    <init-param>
        <param-name>myprop</param-name>
        <param-value>value</param-value>
    </init-param>
</servlet>

您可以看到 init-param 是在一个 servlet 元素中定义的。这意味着它只对声明下的 servlet 可用,对 Web 应用程序的其他部分不可用。如果您希望此参数可用于应用程序的其他部分,请说 JSP 这需要显式传递给 JSP。例如作为 request.setAttribute() 传递。这是非常低效且难以编码的。

因此,如果您想从应用程序中的任何位置访问全局值而不显式传递这些值,则需要使用 Context Init 参数。

考虑 web.xml

中的以下定义
 <web-app>
      <context-param>
           <param-name>myprop</param-name>
           <param-value>value</param-value>
      </context-param>
 </web-app>

此上下文参数可用于 Web 应用程序的所有部分,并且可以从上下文对象中检索。例如,getServletContext().getInitParameter(“dbname”);

从 JSP 您可以使用应用程序隐式对象访问上下文参数。例如,application.getAttribute(“数据库名称”);

<context-param> 
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath*:/META-INF/PersistenceContext.xml
    </param-value>
</context-param>

我已经在 <context-param> 中初始化了我的 PersistenceContext.xml,因为我的所有 servlet 都将与 MVC 框架中的数据库交互。

然而,

<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:ApplicationContext.xml
        </param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.organisation.project.rest</param-value>
    </init-param>
</servlet>

在上述代码中,我正在配置球衣和 ApplicationContext.xml 仅用于休息层。同样,我正在使用 </init-param>

<init-param><context-param> 是存储在 web.xml 文件中的静态参数。如果您有任何不经常更改的数据,您可以将其存储在其中一个中。

如果你想存储限制在特定servlet范围的特定数据,那么你可以使用<init-param>。你在<init-param>中声明的任何东西只能访问特定的 servlet.The init-param<servlet> 标签内声明。

<servlet>
     <display-name>HelloWorldServlet</display-name>
     <servlet-name>HelloWorldServlet</servlet-name>
     <init-param>
         <param-name>Greetings</param-name>
         <param-value>Hello</param-value>
     </init-param>
</servlet>

您可以按如下方式在 servlet 中访问这些参数:

out.println(getInitParameter("Greetings"));

如果要存储 整个应用程序 通用的数据,并且不经常更改,则可以使用 <context-param> 而不是 servletContext.setAttribute()应用上下文的方法。有关 <context-param> VS ServletContext.setAttribute() 用法的更多信息,请查看此 questioncontext-param 在标签 web-app 下声明。 您可以按如下方式声明和访问 <context-param>

<web-app>
    <context-param>
        <param-name>Country</param-name>
        <param-value>India</param-value>
    </context-param>
    <context-param>
        <param-name>Age</param-name>
        <param-value>24</param-value>
    </context-param>
</web-app>

应用程序在 JSP 或 Servlet

中的使用
getServletContext().getInitParameter("Country");
getServletContext().getInitParameter("Age");

What is the difference between <init-param> and <context-param> !?

单个 servlet多个 servlet。

其他答案提供了详细信息,但这里是摘要:

一个网络应用程序,即一个“上下文”,由一个或多个servlet

组成
  • <init-param> 定义上下文中单个特定 servlet 可用的值。
  • <context-param> 定义了上下文中所有 servlet 可用的值。