我无法初始化我的 ServletContextListener。 .java class 不会编译。谁能指出我发生了什么事?
I'm unable to initialize my ServletContextListener. The .java class will not compile. Can anyone point me into what is going on?
错误消息表明我没有正确覆盖抽象 class and/or 方法。有趣的是,我正在遵循书中的代码;它应该是一个可编译的示例(Head First Java Servlets 和 JSP)
Command/Error:
javac -classpath /usr/local/Cellar/tomcat/8.5.13/libexec/lib/servlet-
api.jar:classes:. -d classes
src/com/example/MyServletContextListener.java
src/com/example/MyServletContextListener.java:6: error:
MyServletContextListener is not abstract and does not override abstract
method contextDestroyed(ServletContextEvent) in ServletContextListener
public class MyServletContextListener implements ServletContextListener
{
^1 error
这是我的代码:
package com.example;
import javax.servlet.*;
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent event){
ServletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
}
public void contextDestroyed(ServletContext event) {
//System.out.println("1");
}
}
您会注意到我尝试覆盖 contextDestroyed()(现在已注释掉),因为错误暗示它可能是问题所在,但我得到了相同的结果。然而,我正在使用的书甚至只是说不用担心,因为我们不需要清理,因为上下文只会在应用程序关闭时消失。
<context-param>
<param-name>adminEmail</param-name>
<param-value>someemail@gmail.com</param-value>
<param-name>mainEmail</param-name>
<param-value>someother@place.com</param-value>
<param-name>breed</param-name>
<param-value>Great Dane</param-value>
</context-param>
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
</web-app>
编译时这个 web.xml 在哪里重要吗?我已经在同一个目录中尝试过它,并在我作为教程的一部分设置的 etc 目录中进行了尝试。我原以为它只在运行时才重要。另外,仅供参考,我在同一个 web.xml.
中有多个 servlet
这是我的版本信息:
java 版本“1.8.0_121”
Java(TM) SE 运行时环境(build 1.8.0_121-b13)
Java HotSpot(TM) 64 位服务器 VM(内部版本 25.121-b13,混合模式)
错误消息告诉你到底出了什么问题:
MyServletContextListener is not abstract and does not override abstract
method contextDestroyed(ServletContextEvent) in ServletContextListener
contextDestroyed
方法参数的 class 需要 ServletContextEvent
而不是 ServletContext
错误消息表明我没有正确覆盖抽象 class and/or 方法。有趣的是,我正在遵循书中的代码;它应该是一个可编译的示例(Head First Java Servlets 和 JSP)
Command/Error:
javac -classpath /usr/local/Cellar/tomcat/8.5.13/libexec/lib/servlet-
api.jar:classes:. -d classes
src/com/example/MyServletContextListener.java
src/com/example/MyServletContextListener.java:6: error:
MyServletContextListener is not abstract and does not override abstract
method contextDestroyed(ServletContextEvent) in ServletContextListener
public class MyServletContextListener implements ServletContextListener
{
^1 error
这是我的代码:
package com.example;
import javax.servlet.*;
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent event){
ServletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
}
public void contextDestroyed(ServletContext event) {
//System.out.println("1");
}
}
您会注意到我尝试覆盖 contextDestroyed()(现在已注释掉),因为错误暗示它可能是问题所在,但我得到了相同的结果。然而,我正在使用的书甚至只是说不用担心,因为我们不需要清理,因为上下文只会在应用程序关闭时消失。
<context-param>
<param-name>adminEmail</param-name>
<param-value>someemail@gmail.com</param-value>
<param-name>mainEmail</param-name>
<param-value>someother@place.com</param-value>
<param-name>breed</param-name>
<param-value>Great Dane</param-value>
</context-param>
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
</web-app>
编译时这个 web.xml 在哪里重要吗?我已经在同一个目录中尝试过它,并在我作为教程的一部分设置的 etc 目录中进行了尝试。我原以为它只在运行时才重要。另外,仅供参考,我在同一个 web.xml.
中有多个 servlet这是我的版本信息: java 版本“1.8.0_121” Java(TM) SE 运行时环境(build 1.8.0_121-b13) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.121-b13,混合模式)
错误消息告诉你到底出了什么问题:
MyServletContextListener is not abstract and does not override abstract
method contextDestroyed(ServletContextEvent) in ServletContextListener
contextDestroyed
方法参数的 class 需要 ServletContextEvent
而不是 ServletContext