スプリングコントローラーのクイックガイド
1. 前書き
この記事では、SpringMVCのコアコンセプトであるコントローラーに焦点を当てます。
2. 概要
まず、一歩下がってthe concept of the Front Controller in the typical Spring Model View Controller architectureを見てみましょう。
非常に高いレベルで、私たちが見ている主な責任は次のとおりです。
-
着信リクエストを傍受する
-
リクエストのペイロードをデータの内部構造に変換します
-
さらに処理するためにデータをModelに送信します
-
Modelから処理されたデータを取得し、レンダリングのためにそのデータをViewに進めます
Spring MVCでの高レベルフローの簡単な図を次に示します。
ご覧のとおり、DispatcherServletは、アーキテクチャ内でFront Controllerの役割を果たします。
この図は、典型的なMVCコントローラーとRESTfulコントローラーの両方に適用できますが、若干の違いがあります(以下を参照)。
従来のアプローチでは、MVCアプリケーションはサービス指向ではないため、Controllerから受信したデータに基づいて最終ビューをレンダリングするView Resolverがあります。
RESTfulアプリケーションは、サービス指向であり、生データ(通常はJSON / XML)を返すように設計されています。 これらのアプリケーションはビューのレンダリングを行わないため、View Resolversはありません。通常、ControllerはHTTP応答を介して直接データを送信することが期待されています。
MVC0スタイルのコントローラーから始めましょう。
3. Mavenの依存関係
Spring MVCを操作できるようにするために、最初にMavenの依存関係を処理しましょう。
org.springframework
spring-webmvc
5.0.6.RELEASE
ライブラリの最新バージョンを入手するには、spring-webmvc on Maven Centralを確認してください。
4. プロジェクトWeb構成
ここで、コントローラー自体を確認する前に、まず単純なWebプロジェクトをセットアップし、簡単なServlet構成を行う必要があります。
最初に、web.xmlを使用せずにDispatcherServletを設定する方法を見てみましょう。代わりに、初期化子を使用します。
public class StudentControllerConfig implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext root =
new AnnotationConfigWebApplicationContext();
root.register(WebConfig.class);
root.refresh();
root.setServletContext(sc);
sc.addListener(new ContextLoaderListener(root));
DispatcherServlet dv =
new DispatcherServlet(new GenericWebApplicationContext());
ServletRegistration.Dynamic appServlet = sc.addServlet("test-mvc", dv);
appServlet.setLoadOnStartup(1);
appServlet.addMapping("/test/*");
}
}
XMLを使用せずに設定するには、クラスパスにservlet-api3.1.0があることを確認してください。
web.xmlは次のようになります。
test-mvc
org.springframework.web.servlet.DispatcherServlet
1
contextConfigLocation
/WEB-INF/test-mvc.xml
ここでは、contextConfigLocationプロパティを設定しています– Springコンテキストのロードに使用されるXMLファイルを指しています。 プロパティが存在しない場合、Springは{servlet_name}-servlet.xmlという名前のファイルを検索します。
この場合、servlet_nameはtest-mvcであるため、この例では、DispatcherServletはtest-mvc-servlet.xmlというファイルを検索します。
最後に、DispatcherServletを設定し、それを特定のURLにマップして、Front Controllerベースのシステムをここで完成させましょう。
test-mvc
/test/*
したがって、この場合、DispatcherServletはパターン/test/*内のすべての要求をインターセプトします。
5. Spring MVC Web Config
ここで、Spring Configを使用してDispatcher Servletを設定する方法を見てみましょう。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages= {
"org.example.controller.controller",
"org.example.controller.config" })
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean =
new InternalResourceViewResolver();
bean.setPrefix("/WEB-INF/");
bean.setSuffix(".jsp");
return bean;
}
}
次に、XMLを使用してDispatcher Servletを設定する方法を見てみましょう。 DispatcherServlet XMLファイルのスナップショット–DispatcherServletがカスタムcontrollersおよびその他のSpringentitiesをロードするために使用するXMLファイルを以下に示します。
/WEB-INF/
.jsp
この単純な構成に基づいて、フレームワークはもちろん、クラスパスで検出されるコントローラーBeanを初期化します。
ビューのレンダリングを担当するビューリゾルバーも定義していることに注意してください。ここではSpringのInternalResourceViewResolverを使用します。 これは、viewの名前が解決されることを想定しています。つまり、プレフィックスとサフィックス(両方ともXML構成で定義)を使用して対応するページを検索します。
したがって、たとえば、Controllerが「welcome”*,*」という名前のviewを返す場合、viewresolverは%内の“welcome.jsp”というページを解決しようとします。 (t6)sフォルダ。
6. MVCコントローラー
最終的にMVCスタイルのコントローラーを実装しないでください。
model mapとview objectを含むModelAndViewオブジェクトを返す方法に注目してください。両方とも、データレンダリングのためにView Resolverによって使用されます。
@Controller
@RequestMapping(value = "/test")
public class TestController {
@GetMapping
public ModelAndView getTestData() {
ModelAndView mv = new ModelAndView();
mv.setViewName("welcome");
mv.getModel().put("data", "Welcome home man");
return mv;
}
}
それで、ここで正確に何を設定しましたか。
まず、TestControllerというコントローラーを作成し、それを“/test”パスにマップしました。 このクラスでは、ModelAndViewオブジェクトを返し、GETリクエストにマップされるメソッドを作成しました。したがって、「test」で終わるURL呼び出しは、DispatcherServletによってルーティングされます。 sをTestControllerのgetTestDataメソッドに変換します。
そしてもちろん、適切な測定のために、いくつかのモデルデータを含むModelAndViewオブジェクトを返します。
ビューオブジェクトの名前は「welcome」に設定されています。 上で説明したように、View Resolverは、「welcome.jsp」という名前のWEB-INFフォルダー内のページを検索します。
以下に、GET操作の例の結果を示します。
URLは“test”で終わることに注意してください。 URLのパターンは“/test/test "です。
最初の“/test”はサーブレットから取得され、2番目の“/test”はコントローラのマッピングから取得されます。
7. RESTのその他のSpring依存関係
それでは、RESTfulコントローラーについて見ていきましょう。 もちろん、開始するのに適した場所は、必要な追加のMaven依存関係です。
org.springframework
spring-webmvc
5.0.6.RELEASE
org.springframework
spring-web
5.0.6.RELEASE
com.fasterxml.jackson.core
jackson-databind
2.9.5
これらの依存関係の最新バージョンについては、jackson-core、spring-webmvc、およびspring-webのリンクを参照してください。
もちろん、Jacksonはここでは必須ではありませんが、JSONサポートを有効にするための良い方法です。 そのサポートについてさらに詳しく知りたい場合は、message converters article hereをご覧ください。
8. RESTコントローラー
Spring RESTfulアプリケーションのセットアップは、MVCアプリケーションのセットアップと同じですが、View Resolversとmodel map.がない点が異なります。
APIは通常、生データをクライアントに返すだけです(通常、XMLおよびJSON表現)。したがって、DispatcherServletはview resolversおよびreturns the data right in the HTTP response bodyをバイパスします。
単純なRESTfulコントローラーの実装を見てみましょう。
@Controller
public class RestController {
@GetMapping(value = "/student/{studentId}")
public @ResponseBody Student getTestData(@PathVariable Integer studentId) {
Student student = new Student();
student.setName("Peter");
student.setId(studentId);
return student;
}
}
メソッドの@ResponseBodyアノテーションに注意してください。これはSpringにview resolverとessentially write out the output directly to the body of the HTTP responseをバイパスするように指示します。
出力のクイックスナップショットを以下に表示します。
上記の出力は、1の学生idを使用してGETリクエストをAPIに送信した結果です。
ここでの簡単な注意点は次のとおりです。the @RequestMapping annotationは、最大限に活用するために実際に調査する必要がある中心的な注釈の1つです。
9. Spring Bootと@RestControllerアノテーション
Spring Bootの@RestControllerアノテーションは基本的に、常に@ResponseBodyを定義する必要がないクイックショートカットです。
この新しいアノテーションを使用した前の例のコントローラーは次のとおりです。
@RestController
public class RestAnnotatedController {
@GetMapping(value = "/annotated/student/{studentId}")
public Student getData(@PathVariable Integer studentId) {
Student student = new Student();
student.setName("Peter");
student.setId(studentId);
return student;
}
}
10. 結論
このガイドでは、典型的なMVCアプリケーションとRESTful APIの両方の観点から、Springでコントローラーを使用する基本について説明します。
もちろん、記事のすべてのコードはover on GitHubで利用できます。