init-param and context-param

100

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


@RC。那个问题没有讨论这两个参数之间的区别,它只涉及到在这两个上下文中加载的属性。 - Rohit Jain
我停在了标题处,我的错。 - user180100
5个回答

138

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

如果您想要存储特定数据,该数据限定在特定servlet范围内,则可以使用<init-param>。您在<init-param>中声明的任何内容仅可以由该特定servlet访问。 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>ServletContext.setAttribute(),您可以查看这个问题了解更多信息。context-paramweb-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");

1
如何以编程方式设置上下文参数? - Gaurav
2
@gaurav 很有趣,我能找到一个<init-param>的方法: ServletContext::setInitParameter(String name, String value) 但是没有为设置上下文参数<context-param>提供一个。 - Basil Bourque

8
考虑下面在web.xml中的定义:

考虑在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(“dbname”);


7
<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>

在上述代码中,我正在配置jersey和ApplicationContext.xml仅适用于rest层。为此,我使用</init-param>


5

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


5

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

单个 servlet多个 servlet 的区别。

其他答案给出了详细信息,这里是总结:

一个 web 应用程序即“上下文”由一个或多个 servlets 组成。

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

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