В чем разница между <init-param>
и <context-param>
!?
Init-param и context-param
Ответ 1
<init-param>
и <context-param>
являются статическими параметрами, которые хранятся в файле web.xml. Если у вас есть данные, которые не часто меняются, вы можете сохранить их в одном из них.
Если вы хотите хранить определенные данные, которые ограничены определенной областью сервлета, то вы можете использовать <init-param>
. Все, что вы объявляете внутри <init-param>
, доступно только для этого конкретного сервлета. 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>
и вы можете получить доступ к этим параметрам в сервлете следующим образом:
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 или сервлете
getServletContext().getInitParameter("Country");
getServletContext().getInitParameter("Age");
Ответ 2
Рассмотрим приведенное ниже определение в 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 определен внутри элемента сервлета. Это означает, что он доступен только сервлету под декларацией, а не другим частям веб-приложения. Если вы хотите, чтобы этот параметр был доступен для других частей приложения, скажем, JSP, это должно быть явно передано JSP. Например, передается как request.setAttribute(). Это очень неэффективно и сложно кодировать.
Итак, если вы хотите получить доступ к глобальным значениям из любого места приложения без явно переданных этих значений, вам нужно использовать параметры контекста Init.
Рассмотрим следующее определение в web.xml
<web-app>
<context-param>
<param-name>myprop</param-name>
<param-value>value</param-value>
</context-param>
</web-app>
Этот параметр контекста доступен для всех частей веб-приложения и может быть извлечен из объекта Context. Например, getServletContext(). GetInitParameter ( "dbname" );
Из JSP вы можете получить доступ к параметру контекста с помощью неявного объекта приложения. Например, application.getAttribute( "dbname" );
Ответ 3
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/META-INF/PersistenceContext.xml
</param-value>
</context-param>
Я инициализировал мой PersistenceContext.xml
внутри <context-param>
, потому что все мои сервлеты будут взаимодействовать с базой данных в рамках 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>
в вышеупомянутом коде, я настраиваю трикотаж и ApplicationContext.xml
только для слоя отдыха. Для этого я использую </init-param>
Ответ 4
<init-param>
будет использоваться, если вы хотите инициализировать некоторый параметр для определенного сервлета. Когда запрос приходит к сервлету сначала, его метод init
будет вызываться тогда doGet/doPost
, тогда как если вы хотите инициализировать некоторую переменную для всего приложения, вам нужно будет использовать <context-param>
. Каждый сервлет будет иметь доступ к контекстной переменной.
Ответ 5
В чем разница между
<init-param>
и<context-param>
!?
Один сервлет против нескольких сервлетов.
Другие ответы дают подробности, но вот краткое изложение:
Веб-приложение, то есть "контекст", состоит из одного или нескольких сервлетов.
<init-param>
определяет значение, доступное отдельному сервлету в контексте.<context-param>
определяет значение, доступное всем сервлетам в контексте.