首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServletContextListener未被调用

ServletContextListener未被调用
EN

Stack Overflow用户
提问于 2013-08-21 20:54:53
回答 7查看 25.3K关注 0票数 19

我使用Eclipse插件创建了一个Java 7项目。我的问题是,当我运行应用程序时,实现SerlvetContextListener的类不会被调用。是什么导致了这个问题?

代码语言:javascript
复制
@WebListener
public class ApplicationContextListener implements ServletContextListener{

    @Override
    public void contextInitialized(ServletContextEvent sce)
    {
        Request request = new HttpRequest(sce);
        new Thread (request).start();
        HibernateUtil.getSessionFactory();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) 
    {

    }

}

web.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <listener>com.kyrogaming.AppServletContextListener</listener>
    <!-- Jersey Mapping -->
    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.kyrogaming.webservices</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>
    <!-- end Jersey Mapping -->

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-08-21 21:00:06

在web.xml中,还需要指定<listener-class>

代码语言:javascript
复制
    <listener>
        <listener-class>
                 com.kyrogaming.AppServletContextListener
        </listener-class>
    </listener>
票数 8
EN

Stack Overflow用户

发布于 2016-04-12 08:26:34

总结JNL和Ted Goddard的回答:

若要由servlet容器加载ServletContextListener (或其他侦听器,如ServletContextAttributeListener或ServletRequestAttributeListener),需要将其告知容器。作为在API文档中描述。,有三种方法可以做到这一点:

  1. 在部署描述符(web.xml)中声明它: com.kyrogaming.AppServletContextListener
  2. 或用@WebListener注释其类(请参阅下面的“关于注释的注意事项”)
  3. 或者通过ServletContext中的方法(如addListener() )编程注册它。

关于注释的注记

方法1)和方法3)总是有效的。要使方法2(注释)工作,servlet容器必须配置为扫描类路径中的类,以找到带注释的侦听器类。

如果WEB-INF/classes**)包含属性** metadata-complete="true" (属性默认为false),则不会扫描webapp自己的类(在和库下( web.xml下的JAR))。请参阅Java规范3.0版,第8.1章,“注释和可插拔性”。

在web应用程序中,使用注释的类只有在它们位于within / classes目录中或打包到位于应用程序内的within/lib的jar文件中时才会被处理。web应用程序部署描述符在web-app元素上包含一个新的“元数据完整”属性。“元数据-完整”属性定义web描述符是否完整,或者是否应该在部署时检查jar文件的类文件中的注释和web片段。如果“元数据完整”设置为"true",则部署工具必须忽略应用程序的类文件和web片段中存在的任何servlet注释。如果未指定元数据完整属性或将其设置为"false",则部署工具必须检查应用程序的类文件以获得注释,并扫描web片段。

因此,要允许容器在JAR中找到带注释的类,请确保web.xml设置metadata-complete="false",或者根本不设置它。

请注意,设置此设置可能会延迟应用程序的启动;例如,请参见在设置元数据完成=“true”(这解决了Tomcat 7启动的缓慢问题)之后,如何处理注释呢?

不幸的是,这仍然不能解释为什么问题中的ServletContextListener没有加载。注意,问题中的web.xml并不是metadata-complete,这意味着它默认为false,因此启用了类路径扫描。可能还有其他一些问题;希望这个清单有助于找到它。

票数 31
EN

Stack Overflow用户

发布于 2014-03-03 17:43:07

在web.xml中使用元数据-complete=“false”为我解决了这个问题。

代码语言:javascript
复制
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="false">
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18367514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档