40

servletContainerInitializerを使用してサーブレットを登録しようとしていますが、機能しないようです。おそらくそれは私のコードです(親切に確認してください)が、との違いについて疑問に思いました。ServletContainerInitializer代わりにServletContextListener次のコードを使用すると正常に実行されるためです。ServletContextListener

サーブレット3.0仕様から:

4.4

構成方法(サーブレットを動的に追加する):

...または実装の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/*");
    }
}

自動登録しようとしているサーブレット:

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

nullhausjavaサンプルWebサイトの元のコード「クラス名のみが編集されました」も機能しませんでした。

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

2 に答える 2

51

実装は、 WebアプリケーションServletContainerInitializerにドロップインされるJARファイルにバンドルされることを目的としています/WEB-INF/lib。JARファイル自体には、JAR内の実装/META-INF/services/javax.servlet.ServletContainerInitializerのFQNを含むファイルが含まれ ている必要があります。ServletContainerInitializerしたがって、このファイルはWebアプリ自体に配置しないでください。

これにより、webappモジュールの開発者は、JARファイルをwebappの起動とシャットダウンのサイクルにフックさせることができます。ServletContextListenerこれにwithを使用することもできたのは事実ですが@WebListener、Webアプリケーション自体のweb.xmlファイルにmetadata-complete="true"属性が設定されている場合は機能<web-app>しません。つまり、WebアプリケーションはJARをスキャンしてアノテーションを取得するべきではありません(起動時間を節約できます)。

特定のケースServletContainerInitializerでが機能しないということは、実際にモジュールJARファイルを開発していないことを意味するだけであり、独自のWebアプリケーションに不可欠な部分にすぎません。その場合、は役に立たないので、代わりに使用する必要があります。ServletContainerInitializerServletContextListener

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

}

参照:

于 2012-05-28T12:30:12.173 に答える
5

ServletContainerInitializerが適切に構成されているかどうかを確認してください。ServletContainerInitializerクラス名は、ファイル内で構成する必要があります。

META-INF/services/javax.servlet.ServletContainerInitializer

ファイルにはクラス名のみが含まれている必要があります。あなたの場合のExの場合、次のようになります。

com.marmoush.javaexamples.nullhaus.servlet.MyInit

ファイル(META-INF / services / javax.servlet.ServletContainerInitializer)は、WEB-INF/libのライブラリJARにバンドルできます。

これが説明する例です。

于 2012-05-28T11:27:55.957 に答える