ServletContainerInitializer与ServletContextListener

Ism*_*ush 39 servlets initialization

我试图注册使用servletContainerInitializer一个servlet,但它似乎不工作,也许这是我的代码(好心审查),但是我到想知道的区别ServletContainerInitializerServletContextListener,因为使用时follwing代码运行正常ServletContextListener,而不是.

从servlet 3.0规范:

4.4

配置方法(动态添加servlet):

......或者从实施onStartup方法ServletContainerInitializer......

ServletContainerInitializer:

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/*");
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试自动注册的servlet:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

来自nullhaus java示例网站的原始代码"只有类名编辑"也没有用!

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 46

ServletContainerInitializer实现旨在捆绑在一个JAR文件中,该文件又被放入/WEB-INF/libwebapp中.JAR文件本身应该有一个/META-INF/services/javax.servlet.ServletContainerInitializer包含ServletContainerInitializerJAR中实现的FQN的文件 .请注意,此文件不应放在webapp本身!

这允许webapp模块开发人员让他们的JAR文件挂钩webapp的启动和关闭周期.确实,他们也可以使用ServletContextListenerwith @WebListenerfor this,但是如果webapp自己的web.xml文件metadata-complete="true"设置了属性,<web-app>这意味着webapp不应该扫描JAR以获取注释(这节省了启动时间),这是行不通的.

ServletContainerInitializer不工作,你的具体情况只能意味着你实际上没有开发一个模块的JAR文件,而只是一个部分集成到自己的Web应用程序.在这种情况下,对你ServletContainerInitializer来说没用,你应该使用它ServletContextListener.

@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.
    }

}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 别客气.它与JDBC 4.0驱动程序中的概念相同.如果JDBC驱动程序JAR文件中有`/ META-INF/services/java.sql.Driver`文件,这样的驱动程序可以自动进行自动注册,而不需要`Class#forName()`.另见http://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html (3认同)

Ram*_*PVK 5

检查您是否已经配置了ServletContainerInitializer.应该在文件中配置ServletContainerInitializer类名:

META-INF/services/javax.servlet.ServletContainerInitializer
Run Code Online (Sandbox Code Playgroud)

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

com.marmoush.javaexamples.nullhaus.servlet.MyInit
Run Code Online (Sandbox Code Playgroud)

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

这是任何解释的例子.