Java can';t从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

我正在编写一个j2eeweb应用程序,其中NetBeans在tomcat7.0.41中运行。我创建了一个部署描述符web.xml,其中包含四个上下文参数。我创建了一个扩展HttpServlet的类。在类的init方法中,当我从ServletConfig实例调用getInitParameterNames时,得到一个空枚举。最终,我怀疑Tomcat根本没有读取web.xml文件,因为我不得不求助于使用@WebServlet注释来访问servlet。有人能告诉我为什么我不能访问上下文参数和/或为什么Tomcat没有读取web.xml文件吗

以下是web.xml文件:

<?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.Do
request.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)
更好,所以我决定跳过这个变量作为回答。我在前面提到过它,但把它放在回答中似乎鼓励其他人使用它,这是我试图避免的。