Servlet 3.0规范说:
setInitParameter
boolean setInitParameter(java.lang.String name,
java.lang.String value)
Sets the context initialization parameter with the given name and value on this ServletContext.
Parameters:
name - the name of the context initialization parameter to set
value - the value of the context initialization parameter to set
Returns:
true if the context initialization parameter with the given name and value was set successfully on this ServletContext, and false if it was not set because this ServletContext already contains a context initialization parameter with a matching name
Throws:
IllegalStateException - if this ServletContext has already been initialized
UnsupportedOperationException - if this ServletContext was passed to the ServletContextListener#contextInitialized method of a ServletContextListener that was neither declared in web.xml or web-fragment.xml, nor annotated with WebListener
Since:
Servlet 3.0
据我所知,在部署Web应用程序时会初始化servlet上下文。当我说,servletConfig.getServletContext().setInitParameter("email", "foo@bar.com")
内部的servlet doGet()我得到IllegalStateException.
答案 0 :(得分:8)
正如您在javadoc中看到的那样,如果您在初始化ServletContext
之后尝试调用该方法,则会引发异常
IllegalStateException - 如果此ServletContext已初始化
在3.0之前的Servlet应用程序中,您可以使用以下配置设置上下文参数
<context-param>
<param-name>some-param</param-name>
<param-value>some-value</param-value>
</context-param>
这将设置一个上下文范围的参数,任何Servlet应用程序组件都可以访问它。
从3.0开始,您可以将部署配置移动到Java代码。通常,您将实现ServletContainerInitializer
接口。 Servlet容器将找到您的实现,实例化它并执行其onStartup
方法,将未初始化的ServletContext
交给您。
然后,您可以使用setInitParameter
方法设置上下文参数,就像在部署描述符中一样。当您的onStartup()
方法返回时,Servlet容器会进一步处理以设置Web应用程序。完成后,它会初始化ServletContext
,您的应用程序就可以处理请求了。