web-dev-qa-db-ja.com

Spring MVCおよびServlets 3.0-web.xmlが必要ですか?

典型的なSpring MVC Webアプリでは、web.xmlDispatcherServletを次のように宣言します

<!-- MVC Servlet -->
<servlet>
    <servlet-name>sample</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>sample</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

リスナー、フィルターなどとともに.

Servlet-api 3.0では、サーブレットを@WebServletに追加する代わりに、アノテーションweb.xmlを使用して宣言できます。 Spring 3.2には、そのコンテキスト構成用の@Configurationおよび@EnableXYZがすでにあります。 DispatcherServletに似たものはありますか? xmlなしで完全なSpringアプリケーションを構成する方法はありますか?

30

JEE6で、アプリケーションコンテナーがサーブレット3.0に対応している場合、必要なことは次のとおりです。

  1. ServletContainerInitializer を実装するカスタムクラスを作成します(つまりcom.foo.FooServletContainer
  2. META-INF/servicesという名前のjavax.servlet.ServletContainerInitializerフォルダに、上記の実装の名前を含むファイルを作成します(com.foo.FooServletContainer

Spring 3には、上記のものを実装するSpringServletContainerInitializerという名前のクラスがバンドルされています(META-INF/servicesでファイルを自分で作成する必要はありません。このクラスは WebApplicationInitializer の実装を呼び出すだけです。したがって、クラスパスでそれを実装するクラスを1つ提供するだけでかまいません(次のコードは上記のドキュメントから抜粋)。

public class FooInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        WebApplicationContext appContext = ...;

        ServletRegistration.Dynamic dispatcher =
           container.addServlet("dispatcher", new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
 }

web.xmlについては以上ですが、@Configuration@EnableWebMvcなどを使用してWebアプリケーションを構成する必要があります。

41
Alex

はい、Webアプリケーションサーブレット3.0以降を起動するのに_web.xml_は必要ありません。 Alexがすでに述べたように、WebApplicationInitializerクラスを実装し、onStartup()メソッドをオーバーライドできます。 WebApplicationInitializerは、Spring MVCによって提供されるインターフェースで、実装が検出され、サーブレット3コンテナーの初期化に自動的に使用されます。

Xmlなしで完全なSpringアプリケーションを構成する方法はありますか?

別の方法を追加するためだけにこの回答を追加します。 WebApplicationInitializerを実装する必要はありません。 WebApplicationInitializerという名前のAbstractDispatcherServletInitializerの抽象基本クラス実装により、メソッドをオーバーライドしてサーブレットマッピングとDispatcherServlet構成の場所を指定するだけで、DispatcherServletを簡単に登録できます。

_public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}
_
1
Aniket Thakur