初始化参数和上下文参数


86

<init-param><context-param>!和有什么不一样?


@RC。这个问题没有在那里讨论的两个参数之间的区别..它只是在两个上下文加载性能..
罗希特耆那教的

我停在标题上,我不好。

Answers:


119

<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>VS使用的更多信息,请ServletContext.setAttribute()查看此问题context-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");

1
如何以编程方式设置上下文参数?
加拉夫

2
@gaurav有趣的是,我可以找到一种方法<init-param>ServletContext::setInitParameter(String name, String value)但是没有一种用于设置上下文参数的方法<context-param>
罗勒·布尔克

8

考虑以下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应用程序的所有部分,并且可以从Context对象中检索。例如,getServletContext()。getInitParameter(“ dbname”);

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


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

我已经初始化了我PersistenceContext.xml<context-param>因为我所有的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唯一的休息层。对于同一我正在使用</init-param>


5

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


4

<init-param><context-param>!和有什么不一样?

单个servlet多个servlet。

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

一个Web应用程序(即“上下文”)由一个或多个Servlet组成

  • <init-param>定义一个可用于单个特定servlet的值上下文中。
  • <context-param>定义一个上下文中所有servlet可用的值。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.