首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServletContainerInitializer对ServletContextListener

ServletContainerInitializer对ServletContextListener
EN

Stack Overflow用户
提问于 2012-05-27 19:18:50
回答 2查看 20.3K关注 0票数 40

我正在尝试使用servletContainerInitializer注册servlet,但它似乎不起作用,也许是我的代码(请检查一下),但是我开始怀疑ServletContainerInitializerServletContextListener之间的区别,因为当作为ServletContextListener使用时,折叠代码运行得很好。

Servlet3.0规范中:

4.4 配置方法(动态添加servlet): ..。或者来自onStartup实现的ServletContainerInitializer方法.

The ServletContainerInitializer

代码语言:javascript
复制
package com.marmoush.javaexamples.nullhaus.servlet;

import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class MyInit implements ServletContainerInitializer {
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        System.out.println("hello");
        ServletRegistration reg = ctx.addServlet("q31","com.marmoush.javaexamples.nullhaus.servlet.Q31");
        reg.addMapping("/q31/*");
    }
}

我试图自动注册的servlet:

代码语言:javascript
复制
package com.marmoush.javaexamples.nullhaus.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Q31 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("hello world");
    }
}

来自nullhaus示例网站的原始代码“只编辑类名”也不起作用!

代码语言:javascript
复制
package com.marmoush.javaexamples.nullhaus.servlet;

import java.util.Set;

import javax.servlet.Servlet;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class MyInit implements ServletContainerInitializer {
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        try {
            Class klass = Class.forName("com.marmoush.javaexamples.nullhaus.servlet.Q31");
            Class<Q31> clazz = (Class<Q31>) klass;
            Servlet s = ctx.createServlet(clazz);
            ServletRegistration.Dynamic d = ctx.addServlet("q31", s);
            d.addMapping("/baz/*");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-28 12:30:12

ServletContainerInitializer实现的意图是捆绑在JAR文件中,而JAR文件又被丢弃在webapp的/WEB-INF/lib中。JAR文件本身应该有一个/META-INF/services/javax.servlet.ServletContainerInitializer文件,其中包含JAR中ServletContainerInitializer实现的FQN。请注意,这个文件不应该被放置在webapp本身!

这允许webapp模块开发人员让他们的JAR文件在webapp的启动和关闭周期挂钩。的确,他们也可以使用带有ServletContextListener@WebListener,但是如果webapp自己的web.xml文件在<web-app>中设置了metadata-complete="true"属性,这将无法工作,这意味着set应用程序不应该扫描JAR以获得注释(这可以节省启动时间)。

ServletContainerInitializer在您的特定情况下不能工作,这只意味着您实际上并不是在开发模块JAR文件,而只是您自己的web应用程序的一部分。在这种情况下,ServletContainerInitializer对于您来说是无用的,您应该使用ServletContextListener

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

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during server startup.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during server shutdown.
    }

}

另请参阅:

票数 54
EN

Stack Overflow用户

发布于 2012-05-28 11:27:55

检查是否配置了ServletContainerInitializer适当的。应该在文件中配置ServletContainerInitializer类名:

代码语言:javascript
复制
META-INF/services/javax.servlet.ServletContainerInitializer

文件应该只包含类名。对于Ex,在您的情况下,它应该看起来像:

代码语言:javascript
复制
com.marmoush.javaexamples.nullhaus.servlet.MyInit

可以将文件(META-INF/services/javax.servlet.ServletContainerInitializer)捆绑在WEB/lib中的库JAR中。

这是任何解释示例的方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10776599

复制
相关文章

相似问题

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