【发布时间】:2015-04-08 04:42:17
【问题描述】:
<init-param> 和 <context-param> 有什么区别!?
【问题讨论】:
-
@RC。那个问题无处讨论这两个参数之间的区别..它只是关于在两个上下文中加载的属性..
-
我停在标题上,我的错。
<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() 用法的更多信息,请查看question。 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");
【讨论】:
<init-param> 的方法:ServletContext::setInitParameter(String name, String value),但找不到设置上下文参数<context-param> 的方法。
考虑以下 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 框架中的数据库进行交互。
不过,
<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>
【讨论】:
<init-param> 如果你想为一个特定的 servlet 初始化一些参数,将被使用。当请求首先到达 servlet 时,它的 init 方法将被调用,然后是 doGet/doPost 而如果你想为整个应用程序初始化一些变量,你将需要使用 <context-param> 。每个 servlet 都可以访问上下文变量。
【讨论】:
<init-param>和<context-param>有什么区别!?
单个 servlet 与 多个 servlet。
其他答案提供了详细信息,但这里是摘要:
Web 应用程序,即“上下文”,由一个或多个 servlet 组成。
<init-param> 定义了一个可用于上下文中单个特定 servlet 的值。<context-param> 定义了一个可供上下文中所有 servlet 使用的值。【讨论】: