Javaでサーブレットを登録する方法

Javaでサーブレットを登録する方法

1. 前書き

この記事ではan overview of how to register a servlet within Java EE and Spring Boot.を提供します。具体的には、Java EEにJavaサーブレットを登録する2つの方法を見ていきます。1つはweb.xmlファイルを使用し、もう1つはアノテーションを使用します。 次に、XML構成、Java構成、および構成可能なプロパティを使用して、サーブレットをSpringBootに登録します。

サーブレットに関する優れた入門記事は、hereにあります。

2. JavaEEへのサーブレットの登録

JavaEEにサーブレットを登録する2つの方法を見てみましょう。 まず、web.xmlを介してサーブレットを登録できます。 または、Java EE@WebServletアノテーションを使用することもできます。

2.1. web.xml経由

Java EEアプリケーション内にサーブレットを登録する最も一般的な方法は、サーブレットをweb.xmlファイルに追加することです。


    index.html
    index.htm
    index.jsp


    Example
    com.example.Example


    Example
    /Example

ご覧のとおり、これには2つのステップが含まれます。(1)サーブレットをservletタグに追加し、サーブレットが存在するクラスへのソースパスも指定するようにします。(2)URLパスを指定します。サーブレットはurl-patternタグで公開されます。

Java EEweb.xmlファイルは通常WebContent/WEB-INFにあります。

2.2. 注釈経由

次に、カスタムサーブレットクラスの@WebServletアノテーションを使用してサーブレットを登録しましょう。 これにより、server.xmlでのサーブレットマッピングとweb.xmlでのサーブレットの登録が不要になります。

@WebServlet(
  name = "AnnotationExample",
  description = "Example Servlet Using Annotations",
  urlPatterns = {"/AnnotationExample"}
)
public class Example extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("

Hello World!

"); } }

上記のコードは、そのアノテーションをサーブレットに直接追加する方法を示しています。 サーブレットは、以前と同じURLパスで引き続き使用可能です。

3. SpringBootへのサーブレットの登録

Java EEにサーブレットを登録する方法を示したので、SpringBootアプリケーションにサーブレットを登録するいくつかの方法を見てみましょう。

3.1. プログラムによる登録

Spring Bootは、Webアプリケーションの100%プログラムによる構成をサポートしています。

まず、WebApplicationInitializerインターフェースを実装し、次にWebMvcConfigurerインターフェースを実装します。これにより、特定の構成設定を指定する代わりに、事前設定されたデフォルトをオーバーライドできるため、時間を節約し、操作が可能になります。すぐに使用できるいくつかの実証済みの設定。

WebApplicationInitializerの実装例を見てみましょう。

public class WebAppInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext container) throws ServletException {
        AnnotationConfigWebApplicationContext ctx
          = new AnnotationConfigWebApplicationContext();
        ctx.register(WebMvcConfigure.class);
        ctx.setServletContext(container);

        ServletRegistration.Dynamic servlet = container.addServlet(
          "dispatcherExample", new DispatcherServlet(ctx));
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
     }
}

次に、WebMvcConfigurerインターフェースを実装しましょう。

@Configuration
public class WebMvcConfigure implements WebMvcConfigurer {

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver
          = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
          .addResourceLocations("/resources/").setCachePeriod(3600)
          .resourceChain(true).addResolver(new PathResourceResolver());
    }
}

上記では、.jspビューと静的リソース提供をサポートするために、JSPサーブレットのデフォルト設定の一部を明示的に指定しています。

3.2. XML構成

Spring Boot内でサーブレットを構成および登録する別の方法は、web.xmlを使用することです。


    dispatcher
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        /WEB-INF/spring/dispatcher.xml
    
    1



    dispatcher
    /

Springで構成を指定するために使用されるweb.xmlは、JavaEEで見られるものと似ています。 上記では、servletタグの下の属性を介してさらにいくつかのパラメーターを指定する方法を確認できます。

ここでは、別のXMLを使用して構成を完了します。



    

    
        
        
    

Springweb.xmlは通常src/main/webapp/WEB-INFに存在することに注意してください。

3.3. XMLとプログラムによる登録の組み合わせ

XML構成アプローチとSpringのプログラム構成を組み合わせてみましょう。

public void onStartup(ServletContext container) throws ServletException {
   XmlWebApplicationContext xctx = new XmlWebApplicationContext();
   xctx.setConfigLocation('classpath:/context.xml');
   xctx.setServletContext(container);

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

ディスパッチャサーブレットも設定しましょう。



    
    

3.4. Beanによる登録

ServletRegistrationBeanを使用して、サーブレットをプログラムで構成および登録することもできます。 以下では、HttpServletjavax.servlet.Servletインターフェースを実装)を登録するためにこれを行います。

@Bean
public ServletRegistrationBean exampleServletBean() {
    ServletRegistrationBean bean = new ServletRegistrationBean(
      new CustomServlet(), "/exampleServlet/*");
    bean.setLoadOnStartup(1);
    return bean;
}

このアプローチの主な利点は、Springアプリケーションに複数のサーブレットと異なる種類のサーブレットの両方を追加できることです。

より具体的な種類のHttpServletであり、セクション3.1で検討した構成へのWebApplicationInitializerプログラムアプローチで使用される最も一般的な種類であるDispatcherServlet,を単に利用する代わりに、より単純なHttpServletサブクラスインスタンス。4つの関数(doGet()doPost()doPut()、およびdoDelete())を介して4つの基本的なHttpRequest操作を公開します。 JavaEE。

HttpServletは抽象クラスであることに注意してください(したがって、インスタンス化することはできません)。 ただし、カスタム拡張機能を簡単に作成できます。

public class CustomServlet extends HttpServlet{
    ...
}

4. プロパティを使用したサーブレットの登録

サーブレットを構成および登録するもう1つの方法は、PropertyLoader, PropertySource,またはPropertySourcesインスタンスオブジェクト.を介してアプリにロードされたカスタムプロパティファイルを使用することです。

これにより、中間的な種類の構成と、埋め込まれていないサーブレットにほとんど直接的な構成を提供しないapplication.propertiesをカスタマイズする機能が提供されます。

4.1. システムプロパティアプローチ

application.propertiesファイルまたは別のプロパティファイルにいくつかのカスタム設定を追加できます。 DispatcherServletを構成するためのいくつかの設定を追加しましょう。

servlet.name=dispatcherExample
servlet.mapping=/dispatcherExampleURL

カスタムプロパティをアプリケーションにロードしましょう。

System.setProperty("custom.config.location", "classpath:custom.properties");

そして、次の方法でこれらのプロパティにアクセスできます。

System.getProperty("custom.config.location");

4.2. カスタムプロパティアプローチ

custom.propertiesファイルから始めましょう:

servlet.name=dispatcherExample
servlet.mapping=/dispatcherExampleURL

その後、すぐに使えるプロパティローダーを使用できます。

public Properties getProperties(String file) throws IOException {
  Properties prop = new Properties();
  InputStream input = null;
  input = getClass().getResourceAsStream(file);
  prop.load(input);
  if (input != null) {
      input.close();
  }
  return prop;
}

そして今、これらのカスタムプロパティを定数としてWebApplicationInitializer実装に追加できます。

private static final PropertyLoader pl = new PropertyLoader();
private static final Properties springProps
  = pl.getProperties("custom_spring.properties");

public static final String SERVLET_NAME
  = springProps.getProperty("servlet.name");
public static final String SERVLET_MAPPING
  = springProps.getProperty("servlet.mapping");

次に、それらを使用して、たとえばディスパッチャサーブレットを設定できます。

ServletRegistration.Dynamic servlet = container.addServlet(
  SERVLET_NAME, new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping(SERVLET_MAPPING);

このアプローチの利点は、.xmlのメンテナンスがないことですが、コードベースの再デプロイを必要としない、変更が容易な構成設定を備えています。

4.3. PropertySourceアプローチ

上記を実現するためのより高速な方法は、SpringのPropertySourceを利用することです。これにより、構成ファイルにアクセスしてロードできます。

PropertyResolverは、ConfigurableEnvironment,によって実装されるインターフェースであり、サーブレットの起動時と初期化時にアプリケーションのプロパティを使用できるようにします。

@Configuration
@PropertySource("classpath:/com/yourapp/custom.properties")
public class ExampleCustomConfig {
    @Autowired
    ConfigurableEnvironment env;

    public String getProperty(String key) {
        return env.getProperty(key);
    }
}

上記では、依存関係をクラスに自動接続し、カスタムプロパティファイルの場所を指定します。 次に、String値を渡す関数getProperty()を呼び出すことにより、顕著なプロパティをフェッチできます。

4.4. PropertySourceプログラマティックアプローチ

上記のアプローチ(プロパティ値の取得を含む)と以下のアプローチ(これらの値をプログラムで指定できるようにする)を組み合わせることができます。

ConfigurableEnvironment env = new StandardEnvironment();
MutablePropertySources props = env.getPropertySources();
Map map = new HashMap(); map.put("key", "value");
props.addFirst(new MapPropertySource("Map", map));

キーを値にリンクするマップを作成し、そのマップをPropertySourcesに追加して、必要に応じて呼び出しを有効にします。

5. 組み込みサーブレットの登録

最後に、SpringBoot内の組み込みサーブレットの基本的な構成と登録についても見ていきます。

An embedded servlet provides full web container (Tomcat, Jetty, etc.) functionality without having to install or maintain the web-container separately

シンプルなライブサーバーの展開に必要な依存関係と構成を追加できます。このような機能は、苦痛なく、コンパクトに、すばやくサポートされています。

このTomcatの実行方法のみを見ていきますが、Jettyやその他の方法でも同じアプローチを実行できます。

埋め込まれたTomcat8 Webコンテナの依存関係をpom.xmlで指定しましょう。


    org.apache.tomcat.embed
     tomcat-embed-core
     8.5.11

次に、ビルド時にMavenによって生成された.warにTomcatを正常に追加するために必要なタグを追加しましょう。


    embeddedTomcatExample
    
        
            org.codehaus.mojo
            appassembler-maven-plugin
            2.0.0
            
                target
                
                    
                        launch.Main
                        webapp
                    
            
            
            
                
                    package
                    
                        assemble
                    
                
            
        
    

Spring Bootを使用している場合は、代わりにSpringのspring-boot-starter-tomcat依存関係をpom.xmlに追加できます。


    org.springframework.boot
    spring-boot-starter-tomcat
    provided

5.1. プロパティを介した登録

Spring Bootは、application.propertiesを介して可能なほとんどのSpring設定の構成をサポートします。 必要な組み込みサーブレットの依存関係をpom.xmlに追加した後、次のようないくつかの構成オプションを使用して、組み込みサーブレットをカスタマイズおよび構成できます。

server.jsp-servlet.class-name=org.apache.jasper.servlet.JspServlet
server.jsp-servlet.registered=true
server.port=8080
server.servlet-path=/

上記は、DispatcherServletと静的リソース共有を構成するために使用できるアプリケーション設定の一部です。 組み込みサーブレット、SSLサポート、およびセッションの設定も利用できます。

ここにリストするには構成パラメーターが多すぎますが、完全なリストはSpring Boot documentationで確認できます。

5.2. YAMLによる構成

同様に、YAMLを使用して埋め込みサーブレットコンテナを設定できます。 これには、専用のYAMLプロパティローダー(YamlPropertySourceLoader)を使用する必要があります。これにより、YAMLが公開され、アプリ内でキーと値を使用できるようになります。

YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader();
PropertySource yamlProps = sourceLoader.load("yamlProps", resource, null);

5.3. TomcatEmbeddedServletContainerFactoryによるプログラム構成

組み込みサーブレットコンテナのプログラムによる構成は、EmbeddedServletContainerFactoryのサブクラス化されたインスタンスを介して可能です。 たとえば、TomcatEmbeddedServletContainerFactoryを使用して、組み込みTomcatサーブレットを構成できます。

TomcatEmbeddedServletContainerFactoryは、org.apache.catalina.startup.Tomcatオブジェクトをラップし、追加の構成オプションを提供します。

@Bean
public ConfigurableServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcatContainerFactory
      = new TomcatServletWebServerFactory();
    return tomcatContainerFactory;
}

次に、返されたインスタンスを設定できます。

tomcatContainerFactory.setPort(9000);
tomcatContainerFactory.setContextPath("/springboottomcatexample");

これらの特定の設定はそれぞれ、前述の方法のいずれかを使用して構成可能にすることができます。

org.apache.catalina.startup.Tomcatオブジェクトに直接アクセスして操作することもできます。

Tomcat tomcat = new Tomcat();
tomcat.setPort(port);
tomcat.setContextPath("/springboottomcatexample");
tomcat.start();

6. 結論

この記事では、register a Servlet in a Java EE and Spring Boot application.へのいくつかの方法を確認しました

このチュートリアルで使用されているソースコードは、Github projectで入手できます。