init-param和context-param

时间:2015-02-08 10:25:43

标签: java servlets

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

5 个答案:

答案 0 :(得分:100)

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

答案 1 :(得分: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>

您可以看到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”);

答案 2 :(得分:6)

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

我已在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>

在前面提到的代码中,我正在配置泽西,而ApplicationContext.xml仅用于休息层。同样我使用</init-param>

答案 3 :(得分:5)

如果要初始化特定servlet的某些参数,将使用

<init-param>。当请求首先进入servlet时,将调用init方法,然后调用doGet/doPost,而如果要为整个应用程序初始化某个变量,则需要使用<context-param>。每个servlet都可以访问上下文变量。

答案 4 :(得分:2)

  

# My code: sta_if = network.WLAN(network.STA_IF) sta_if.active(True) sta_if.connect("wifiname", "password") KEY_PATH = "/619e3d582c-private.pem.key" CERT_PATH = "/619e3d582c-certificate.pem" with open(KEY_PATH, 'r') as f: PVT_KEY = f.read() with open(CERT_PATH, 'r') as f: CERT_KEY = f.read() client = MQTTClient(client_id="esp32_micropython_shafik", server="xxxxxxxxxxx.iot.eu-west-1.amazonaws.com", port = 8883, keepalive = 10000, ssl = True, ssl_params = { "cert": CERT_KEY, "key": PVT_KEY, "server_side":False } ) def checkwifi(): while not sta_if.isconnected(): time.sleep_ms(500) print(".") sta_if.connect() def publish(): while True: checkwifi() msg = b'hello shafik' client.publish(b"weather", msg) time.sleep(1) print("type", type(PVT_KEY)) client.connect() publish()` def get_aaa(file): print("\n\naaa\n") print(file) def get_bbb(file): print("\n\nbbb\n") print(file) def get_fff(file): print("\n\nfff\n") print(file) def main(): with open('text.txt', 'r') as myfile: file = myfile.read() get_aaa(file) get_bbb(file) get_fff(file) main() 之间有什么区别!?

单个servlet 多个servlet。

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

一个Web应用程序(即“上下文”)由一个或多个servlets 组成。

  • def get_aaa(file): print("\n\naaa\n") print(file) def get_bbb(file): print("\n\nbbb\n") print(file) def get_fff(file): print("\n\nfff\n") print(file) def main(): with open('text.txt', 'r') as file: get_aaa(file.read()) file.seek(0) get_bbb(file.read()) file.seek(0) get_fff(file.read()) main() 定义了上下文中单个特定servlet 可用的值。
  • <init-param>定义了一个上下文中可供所有servlet 使用的值。