init-param e context-param

88

Qual é a diferença entre <init-param>e <context-param>!?

mina
fonte
@RC. Essa pergunta em nenhum lugar discute a diferença entre esses dois parâmetros .. É apenas sobre propriedades carregadas nos dois contextos ..
Rohit Jain
Parei no título, meu mal.

Respostas:

122

<init-param>e <context-param>são parâmetros estáticos que são armazenados no arquivo web.xml. Se você tiver dados que não mudam com frequência, pode armazená-los em um deles.

Se você deseja armazenar dados específicos que estão confinados a um escopo de servlet específico , você pode usar. <init-param>Qualquer coisa que você declarar dentro <init-param>é acessível apenas para aquele servlet específico. O init-param é declarado dentro da <servlet>tag.

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

e você pode acessar esses parâmetros no servlet da seguinte forma:

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

Se você deseja armazenar dados que são comuns a todo o aplicativo e não mudam com frequência, você pode usar o método em <context-param>vez do servletContext.setAttribute()contexto do aplicativo. Para obter mais informações sobre o uso do <context-param>VS, ServletContext.setAttribute()dê uma olhada nesta pergunta . context-param são declarados sob a tag web-app. Você pode declarar e acessar o da <context-param>seguinte forma

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

Uso no aplicativo em um JSP ou Servlet

getServletContext().getInitParameter("Country");
getServletContext().getInitParameter("Age");
Sai Upadhyayula
fonte
1
como definir o parâmetro de contexto de forma programática?
Gaurav
2
@gaurav Interessante, posso encontrar um método para <init-param>: ServletContext::setInitParameter(String name, String value)mas não um para definir um parâmetro de contexto <context-param>.
Basil Bourque
8

Considere a definição abaixo em 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>

Você pode ver que init-param é definido dentro de um elemento de servlet. Isso significa que ele está disponível apenas para o servlet sob declaração e não para outras partes do aplicativo da web. Se você deseja que este parâmetro esteja disponível para outras partes do aplicativo, digamos que um JSP, ele precisa ser explicitamente passado para o JSP. Por exemplo, passado como request.setAttribute (). Isso é altamente ineficiente e difícil de codificar.

Portanto, se você deseja obter acesso a valores globais de qualquer lugar dentro do aplicativo sem passar explicitamente esses valores, você precisa usar os parâmetros Context Init.

Considere a seguinte definição em web.xml

 <web-app>
      <context-param>
           <param-name>myprop</param-name>
           <param-value>value</param-value>
      </context-param>
 </web-app>

Este parâmetro de contexto está disponível para todas as partes do aplicativo da web e pode ser recuperado do objeto Context. Por exemplo, getServletContext (). GetInitParameter (“dbname”);

De um JSP, você pode acessar o parâmetro de contexto usando o objeto implícito do aplicativo. Por exemplo, application.getAttribute (“dbname”);

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

Eu inicializei meu PersistenceContext.xmlno <context-param>porque todos os meus servlets estarão interagindo com o banco de dados no framework 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>

no código citado, estou configurando jersey e ApplicationContext.xmlapenas a camada de descanso. Pelo mesmo estou usando</init-param>

Ankur Piyush
fonte
5

<init-param>será usado se você quiser inicializar algum parâmetro para um servlet específico. Quando a solicitação chega ao servlet primeiro, seu initmétodo será chamado então, doGet/doPostse você quiser inicializar alguma variável para a aplicação inteira, você precisará usar <context-param>. Cada servlet terá acesso à variável de contexto.

Adeel Ahmad
fonte
4

Qual é a diferença entre <init-param>e <context-param>!?

Servlet único versus servlets múltiplos.

Outras respostas fornecem detalhes, mas aqui está o resumo:

Um aplicativo da web, ou seja, um “contexto”, é composto por um ou mais servlets .

  • <init-param>define um valor disponível para um único servlet específico dentro de um contexto.
  • <context-param>define um valor disponível para todos os servlets em um contexto.
Basil Bourque
fonte