init-param和context-param

min*_*ina 79 java servlets

<init-param>和之间的区别是什么<context-param>

Sai*_*ula 110

<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>
Run Code Online (Sandbox Code Playgroud)

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

out.println(getInitParameter("Greetings"));
Run Code Online (Sandbox Code Playgroud)

如果要存储整个应用程序通用的数据,并且如果它不经常更改,则可以使用<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>
Run Code Online (Sandbox Code Playgroud)

应用程序在JSP或Servlet中的用法

getServletContext().getInitParameter("Country");
getServletContext().getInitParameter("Age");
Run Code Online (Sandbox Code Playgroud)

  • @gaurav有趣的是,我可以找到`&lt;init-param&gt;`的方法: [`ServletContext::setInitParameter(String name, String value)`](https://jakarta.ee/specifications/servlet/4.0/apidocs/ javax/servlet/ServletContext.html#setInitParameter-java.lang.String-java.lang.String-),但不是用于设置上下文参数“&lt;context-param&gt;”。 (2认同)

SMA*_*SMA 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>
Run Code Online (Sandbox Code Playgroud)

您可以看到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>
Run Code Online (Sandbox Code Playgroud)

此上下文参数可用于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>
Run Code Online (Sandbox Code Playgroud)

我初始化了我的PersistenceContext.xml内部<context-param>因为我的所有servlet都将与MVC框架中的数据库进行交互.

Howerver,

<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>
Run Code Online (Sandbox Code Playgroud)

在前面提到的代码中,我正在配置平针织和ApplicationContext.xml唯一的休息层.对于我正在使用的相同</init-param>


小智 5

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


Bas*_*que 5

\n

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

\n
\n\n

单个 servlet多个 servlet。

\n\n

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

\n\n

一个 Web 应用程序,即 \xe2\x80\x9ccontext\xe2\x80\x9d,由一个或多个 servlet组成。

\n\n
    \n
  • <init-param>定义上下文中单个特定 servlet可用的值。
  • \n
  • <context-param>定义一个可用于上下文中所有 servlet 的值。
  • \n
\n