1概要

この記事では、Springフレームワークで利用可能なさまざまなハンドラアダプタの実装に焦点を当てます。

** 2

HandlerAdapter

とは何ですか?

**


HandlerAdapter

は基本的にSpring MVCで非常に柔軟な方法でHTTPリクエストの処理を容易にするインターフェースです。

メソッドを特定のURLにマッピングする

HandlerMapping

と組み合わせて使用​​されます。

その後、

DispatcherServlet



HandlerAdapter

を使用してこのメ​​ソッドを呼び出します。サーブレットはメソッドを直接呼び出すことはしません。基本的に、サーブレットはそれ自体とハンドラオブジェクトの間のブリッジとして機能し、疎結合設計になります。

このインターフェースで利用可能なさまざまなメソッドを見てみましょう。

public interface HandlerAdapter {
    boolean supports(Object handler);

    ModelAndView handle(
      HttpServletRequest request,
      HttpServletResponse response,
      Object handler) throws Exception;

    long getLastModified(HttpServletRequest request, Object handler);
}


supports

APIは、特定のハンドラインスタンスがサポートされているかどうかを確認するために使用されます。ハンドラインスタンスがサポートされているかどうかを確認するために、このインタフェースの__handle()メソッドを呼び出す前に、このメソッドを最初に呼び出す必要があります。


handle

APIは、特定のHTTPリクエストを処理するために使用されます。このメソッドは、

HttpServletRequest

および

HttpServletResponse

オブジェクトをパラメーターとして渡してハンドラーを呼び出します。

その後、ハンドラーはアプリケーションロジックを実行し、

ModelAndView

オブジェクトを返します。このオブジェクトは

DispatcherServlet

によって処理されます。


3 Mavenの依存関係


pom.xml

に追加する必要があるMavenの依存関係から始めましょう。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.4.RELEASE</version>
</dependency>


spring-webmvc

アーティファクトの最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework%22%20AND%20a%3A%22spring-webmvcにあります。 %22[ここ]


4

HandlerAdapter


の種類


4.1.

SimpleControllerHandlerAdapter


これは、Spring MVCによって登録されたデフォルトのハンドラアダプタです。これは

Controller

インターフェースを実装するクラスを扱い、リクエストをコントローラオブジェクトに転送するために使用されます。

Webアプリケーションがコントローラのみを使用する場合は、フレームワークがこのクラスをリクエスト処理用のデフォルトアダプタとして使用するため、

HandlerAdapter

を設定する必要はありません。

古いスタイルのコントローラ(

Controller

インターフェースの実装)を使用して、単純なコントローラクラスを定義しましょう。

public class SimpleController implements Controller {
    @Override
    public ModelAndView handleRequest(
      HttpServletRequest request,
      HttpServletResponse response) throws Exception {

        ModelAndView model = new ModelAndView("Greeting");
        model.addObject("message", "Dinesh Madhwal");
        return model;
    }
}

同様のXML構成

<beans ...>
    <bean name="/greeting.html"
      class="com.baeldung.spring.controller.SimpleControllerHandlerAdapterExample"/>
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>


BeanNameUrlHandlerMapping

クラスは、このハンドラアダプタのマッピングクラスです。

  • 注** :

    BeanFactoryでカスタムハンドラアダプタが定義されている場合、

    そのアダプタは自動的には登録されません。したがって、コンテキスト内で明示的に定義する必要があります。定義されておらず、カスタムハンドラアダプタを定義した場合は、ハンドラのアダプタが指定されていないという例外が発生します。


4.2.

SimpleServletHandlerAdapter


このハンドラーアダプターを使用すると、

DispatcherServlet

と連携して要求を処理するための

Servlet

を使用できます。

service()

メソッド

__.


を呼び出して、

DispatcherServlet

からの要求を適切な

Servlet__クラスに転送します。


Servlet

インタフェースを実装するBeanは、このアダプタによって自動的に処理されます。デフォルトでは登録されていないので、

DispatcherServlet

の設定ファイルに他の通常のBeanと同じように登録する必要があります。

<bean name="simpleServletHandlerAdapter"
  class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter"/>


4.3.

AnnotationMethodHandlerAdapter


このアダプタクラスは、@ @ RequestMapping__アノテーションが付けられたメソッドを実行するために使用されます。 HTTPメソッドとHTTPパスに基づいてメソッドをマッピングするために使用されます。

このアダプタのマッピングクラスは

DefaultAnnotationHandlerMappingです。これは

@ RequestMapping

アノテーションを型レベルで処理するために使用され、

AnnotationMethodHandlerAdaptor__はメソッドレベルで処理するために使用されます。

これらの2つのクラスは、

DispatcherServlet

が初期化されたときにすでにフレームワークによって登録されています。ただし、他のハンドラアダプタがすでに定義されている場合は、設定ファイルでも定義する必要があります。

コントローラクラスを定義しましょう:

@Controller
public class AnnotationHandler {
    @RequestMapping("/annotedName")
    public ModelAndView getEmployeeName() {
        ModelAndView model = new ModelAndView("Greeting");
        model.addObject("message", "Dinesh");
        return model;
    }
}


@ Controller

アノテーションは、このクラスが

controller.

の役割を果たすことを示します。


@ RequestMapping

アノテーションは、

getEmployeeName()

メソッドをURL __/nameにマッピングします。

アプリケーションがJavaベースの構成を使用するのかXMLベースの構成を使用するのかに応じて、このアダプターを構成する方法は2つあります。 Java設定を使用した最初の方法を見てみましょう。

@ComponentScan("com.baeldung.spring.controller")
@Configuration
@EnableWebMvc
public class ApplicationConfiguration implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

アプリケーションがXML構成を使用している場合は、このハンドラー・アダプターをWebアプリケーション・コンテキストXMLで構成するための2つの異なるアプローチがあります。

spring-servlet

AnnotationMethodHandlerAdapter.xml__ファイルに定義されている最初のアプローチを見てみましょう。

<beans ...>
    <context:component-scan base-package="com.baeldung.spring.controller"/>
    <bean
      class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean
      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>


<context:component-scan/>

タグは、

controller

クラスをスキャンするパッケージを指定するために使用されます。

2番目のアプローチを見てみましょう。

<beans ...>
    <mvc:annotation-driven/>
    <context:component-scan base-package="com.baeldung.spring.controller"/>
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>


<mvc:annotation-driven>

タグは自動的にこれら2つのクラスをspring MVCに登録します。このアダプタはSpring 3.2で廃止され、

RequestMappingHandlerAdapter

という新しいハンドラアダプタがSpring 3.1で導入されました。


4.4.

RequestMappingHandlerAdapter


このアダプタクラスはSpring 3.1で導入され、Spring 3.2では

AnnotationMethodHandlerAdaptor

ハンドラアダプタが非推奨になりました。


RequestMappingHandlerMapping

クラスで使用されます。このクラスは、

@ @ RequestMapping__

というアノテーションが付けられたメソッドを実行します。


RequestMappingHandlerMapping

は、ハンドラーへの要求URIのマッピングを維持するために使用されます。ハンドラが取得されると、

DispatcherServlet

が適切なハンドラアダプタに要求をディスパッチし、次に適切なハンドラアダプタが__handlerMethod()を呼び出します。

型レベルとメソッドレベルのマッピングは、3.1より前のSpringバージョンでは2つの異なる段階で処理されていました。

最初の段階は

DefaultAnnotationHandlerMapping

によってコントローラーを選択することであり、2番目の段階は

AnnotationMethodHandlerAdapter

によって実際のメソッドを呼び出すことでした。

Springバージョン3.1からは1つの段階しかありません。それはコントローラーを識別することと、要求を処理するためにどのメソッドを呼び出す必要があるかを含みます。

簡単なコントローラクラスを定義しましょう。

@Controller
public class RequestMappingHandler {

    @RequestMapping("/requestName")
    public ModelAndView getEmployeeName() {
        ModelAndView model = new ModelAndView("Greeting");
        model.addObject("message", "Madhwal");
        return model;
    }
}

アプリケーションがJavaベースの構成を使用するのかXMLベースの構成を使用するのかに応じて、このアダプターを構成する方法は2つあります。

Java設定を使用した最初の方法を見てみましょう。

@ComponentScan("com.baeldung.spring.controller")
@Configuration
@EnableWebMvc
public class ServletConfig implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

アプリケーションがXML構成を使用している場合は、このハンドラー・アダプターをWebアプリケーション・コンテキストXMLで構成するための2つの異なるアプローチがあります。

spring-servlet

RequestMappingHandlerAdapter.xml__ファイルに定義されている最初のアプローチを見てみましょう。

<beans ...>
    <context:component-scan base-package="com.baeldung.spring.controller"/>

    <bean
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <bean
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

そして、これが2番目のアプローチです。

<beans ...>
    <mvc:annotation-driven/>

    <context:component-scan base-package="com.baeldung.spring.controller"/>

    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

このタグはこれら2つのクラスを自動的にSpring MVCに登録します。


RequestMappingHandlerMappingをカスタマイズする必要がある場合は、

このタグをアプリケーションコンテキストXMLから削除し、アプリケーションコンテキストXMLで手動で構成する必要があります。


4.5.

HttpRequestHandlerAdapter


このハンドラアダプタは

__HttpRequest


sを処理するハンドラに使用されます。これは

HttpRequestHandler

インターフェースを実装します。このインターフェースには、リクエストを処理しレスポンスを生成するための単一の

handleRequest()メソッドが含まれています。

このメソッドの戻り値の型はvoidであり、他のハンドラアダプタによって生成されるような

ModelAndView

戻り値の型は生成されません。これは基本的にバイナリ応答を生成するために使用され、レンダリングするビューを生成するものではありません。

** 5アプリケーションの実行

**

アプリケーションがポート番号

8082



localhost

にデプロイされており、コンテキストルートが

spring-mvc-handlers

の場合:

http://localhost:8082/spring-mvc-handlers/----

===  **  6. 結論**

この記事では、Springフレームワークで利用可能なさまざまなタイプのハンドラアダプタについて説明しました。

ほとんどの開発者はおそらくデフォルトに固執するでしょうが、基本を超えて進む必要があるときには、フレームワークがどれほど柔軟であるかを理解する価値があります。

このチュートリアルのソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-simple[GitHubプロジェクト]にあります。