ServletContainerInitializer vs ServletContextListener

Ich versuche, ein Servlet mit servletContainerInitializer zu registrieren, aber es scheint nicht zu funktionieren. Vielleicht ist es mein Code (bitte überprüfen Sie ihn), aber ich habe mich über den Unterschied zwischen gewundertServletContainerInitializer undServletContextListener, weil der folgende Code gut läuft, wenn er als verwendet wirdServletContextListener stattdessen.

Aus der Servlet 3.0-Spezifikation:

4.4Konfigurationsmethoden (Servlets dynamisch hinzufügen):

... oder aus demonStartup Methode von aServletContainerInitializer Implementierung ...

DasServletContainerInitializer:

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/*");
    }
}

Das Servlet, das ich automatisch registrieren möchte:

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");
    }
}

Originalcode von nullhaus java examples website "nur klassenname bearbeitet" hat auch nicht funktioniert!

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();
        }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage