init-param和context-param

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

<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"); 

在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”);

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

我在<context-param>初始化了我的PersistenceContext.xml ,因为我的所有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> 

在前面提到的代码中,我只将Jersey和ApplicationContext.xmlconfiguration为rest层。 对于我正在使用的</init-param>

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