Java can';t从web.xml读取上下文参数
我正在编写一个j2eeweb应用程序,其中NetBeans在tomcat7.0.41中运行。我创建了一个部署描述符web.xml,其中包含四个上下文参数。我创建了一个扩展HttpServlet的类。在类的init方法中,当我从ServletConfig实例调用getInitParameterNames时,得到一个空枚举。最终,我怀疑Tomcat根本没有读取web.xml文件,因为我不得不求助于使用@WebServlet注释来访问servlet。有人能告诉我为什么我不能访问上下文参数和/或为什么Tomcat没有读取web.xml文件吗 以下是web.xml文件:Java can';t从web.xml读取上下文参数,java,tomcat,web.xml,Java,Tomcat,Web.xml,我正在编写一个j2eeweb应用程序,其中NetBeans在tomcat7.0.41中运行。我创建了一个部署描述符web.xml,其中包含四个上下文参数。我创建了一个扩展HttpServlet的类。在类的init方法中,当我从ServletConfig实例调用getInitParameterNames时,得到一个空枚举。最终,我怀疑Tomcat根本没有读取web.xml文件,因为我不得不求助于使用@WebServlet注释来访问servlet。有人能告诉我为什么我不能访问上下文参数和/或为什么T
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>preptimeminutes</param-name>
<param-value>60</param-value>
</context-param>
<context-param>
<param-name>preptimehours</param-name>
<param-value>0</param-value>
</context-param>
<context-param>
<param-name>servings</param-name>
<param-value>1</param-value>
</context-param>
<context-param>
<param-name>calories</param-name>
<param-value>100</param-value>
</context-param>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
预科时间分钟
60
预科时间
0
一份
1.
卡路里
100
30
以下是init方法的代码:
@Override
public void init(ServletConfig servletConfig) throws ServletException
{
int preptemp;
String tempString1, tempString2;
Enumeration<String> e = servletConfig.getInitParameterNames();
this.servletConfig = servletConfig;
servletContext = servletConfig.getServletContext();
try
{
while(e.hasMoreElements())
{
servletContext.log(e.nextElement());
}
} ...
}
@覆盖
public void init(ServletConfig ServletConfig)抛出ServletException
{
int PREPTEM;
字符串tempString1、tempString2;
枚举e=servletConfig.getInitParameterNames();
this.servletConfig=servletConfig;
servletContext=servletConfig.getServletContext();
尝试
{
而(e.hasMoreElements())
{
log(e.nextElement());
}
} ...
}
谢谢
Jason Mazzotta您似乎想读取
ServletContex
的参数(用于整个应用程序的参数),但最终还是读取了ServletConfig
(用于特定servlet的参数)
另一个潜在问题是您正在重写init(ServletConfig)
而不是init()
。第一个方法不应该被重写,因为它处理许多servlet生命周期任务,比如将servlet添加到可用的servlet池。如果您想在初始化过程中添加一些内容,应该重写init()
方法,该方法稍后由init(ServletConfig)
调用
所以试试类似的东西
@Override
public void init() throws ServletException
{
ServletContext servletContext = getServletContext();
Enumeration<String> e = servletContext.getInitParameterNames();
try
{
while(e.hasMoreElements())
{
servletContext.log(e.nextElement());
}
} ...
}
@覆盖
public void init()引发ServletException
{
ServletContext=getServletContext();
枚举e=servletContext.getInitParameterNames();
尝试
{
而(e.hasMoreElements())
{
log(e.nextElement());
}
} ...
}
查看web.xml和Servlet中的代码片段会有帮助。web.xml是否部署到正确的位置?它是否在启动时报告了任何错误?启动时没有报告任何错误。xml文件位于context.xml.Dorequest.getServletContext().getInitParameter(“preptimeminutes”)中列出的docBase的web-INF子目录中代码>工作?为什么要覆盖init(ServletConfig)
?此方法具有预定义的场景,用于处理将servlet添加到可用servlet池的问题。至少在该方法的开头添加super(servletConfig)
,或者更好地覆盖init()
,不带参数,并使用getServletContext().getInitParameterNames()
获取可用的上下文参数名称。还要记住,init
默认情况下在第一次请求servlet时调用,而不是在服务器启动时调用(除非您更改它)。。。。或者从init(ServletConfig)调用super(config)
。
@EJP同意,但是重写init()
而不是init(ServletConfig)
更好,所以我决定跳过这个变量作为回答。我在前面提到过它,但把它放在回答中似乎鼓励其他人使用它,这是我试图避免的。