Spring MVCのHandlerAdapters
1. 概要
この記事では、Springフレームワークで利用できるさまざまなハンドラーアダプターの実装に焦点を当てます。
2. Handleradapterとは何ですか?
HandlerAdapterは基本的に、SpringMVCで非常に柔軟な方法で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. メーベン依存
pom.xmlに追加する必要があるMaven依存関係から始めましょう:
org.springframework
spring-webmvc
4.3.4.RELEASE
spring-webmvcアーティファクトの最新バージョンはhereにあります。
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構成:
BeanNameUrlHandlerMappingクラスは、このハンドラーアダプターのマッピングクラスです。
Note:カスタムハンドラーアダプターがBeanFactory,で定義されている場合、このアダプターは自動的に登録されません。 したがって、コンテキストで明示的に定義する必要があります。 定義されておらず、カスタムハンドラーアダプターを定義している場合、ハンドラー用のアダプターが指定されていないことを示す例外が表示されます。
4.2. SimpleServletHandlerAdapter
このハンドラー・アダプターを使用すると、任意のServletを使用してDispatcherServletを操作して要求を処理できます。 service()メソッド.を呼び出すことにより、DispatcherServletから適切なServletクラスに要求を転送します。
Servletインターフェースを実装するBeanは、このアダプターによって自動的に処理されます。 デフォルトでは登録されていないため、他の通常のBeanと同様にDispatcherServletの構成ファイルに登録する必要があります。
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.example.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で定義されている最初のアプローチを見てみましょう。
<context:component-scan />タグは、controllerクラスをスキャンするパッケージを指定するために使用されます。
2番目のアプローチを見てみましょう。
<mvc:annotation-driven>タグは、これら2つのクラスをSpringMVCに自動的に登録します。 このアダプターはSpring3.2で非推奨になり、RequestMappingHandlerAdapterと呼ばれる新しいハンドラーアダプターがSpring3.1で導入されました。
4.4. RequestMappingHandlerAdapter
このアダプタクラスはSpring3.1で導入され、Spring 3.2のAnnotationMethodHandlerAdaptorハンドラアダプタは非推奨になりました。
executes methods annotated with @RequestMappingであるRequestMappingHandlerMappingクラスで使用されます。
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.example.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で定義されている最初のアプローチを見てみましょう。
そして、これが2番目のアプローチです。
このタグは、これら2つのクラスをSpring MVCに自動的に登録します。
RequestMappingHandlerMapping,をカスタマイズする必要がある場合は、このタグをアプリケーションコンテキストXMLから削除し、アプリケーションコンテキストXMLで手動で構成する必要があります。
4.5. HttpRequestHandlerAdapter
このハンドラーアダプターは、HttpRequestsを処理するハンドラーに使用されます。 HttpRequestHandlerインターフェースを実装します。これには、要求を処理して応答を生成するための単一のhandleRequest()メソッドが含まれています。
このメソッドの戻り値の型はvoidであり、他のハンドラーアダプターによって生成されるようなModelAndViewの戻り値の型を生成しません。 基本的にバイナリ応答を生成するために使用され、レンダリングするビューは生成されません。
5. アプリケーションを実行する
アプリケーションがポート番号8082のlocalhostにデプロイされ、context-rootがspring-mvc-handlersの場合:
http://localhost:8082/spring-mvc-handlers/
6. 結論
この記事では、Springフレームワークで使用可能なさまざまなタイプのハンドラーアダプターについて説明しました。
ほとんどの開発者はおそらくデフォルトに固執するでしょうが、基本を超える必要がある場合にフレームワークがどれほど柔軟であるかを理解することは十分に価値があります。
このチュートリアルのソースコードはGitHub projectにあります。