1前書き

この記事では、Spring MVCの中心的な概念であるコントローラに焦点を当てます。


2概要

まず始めに、典型的なSpring

Model View Controller

アーキテクチャにおける

Front Controller

の概念** を見てみましょう。

非常に高いレベルでは、これが私たちが見ている主な責任です。

  • 着信要求を傍受する

  • リクエストのペイロードをの内部構造に変換します。

データ
** さらなる処理のためにデータを

Model

に送信します


  • Model

    から処理されたデータを取得し、そのデータを

レンダリング用の

View

これが

Spring MVC

のハイレベルフローの簡単な図です:

リンク:/uploads/SpringMVC.png[]

ご覧のとおり、

DispatcherServlet

はアーキテクチャ内の

Front Controller

の役割を果たします。

この図は一般的なMVCコントローラとRESTfulコントローラの両方に適用できますが、若干の違いがあります(後述)。

従来のアプローチでは、

MVC

アプリケーションはサービス指向ではないため、

Controller

から受け取ったデータに基づいて最終的なビューをレンダリングするV __iew Resolverがあります。


RESTful

アプリケーションは、サービス指向で生データ(通常はJSON/XML)を返すように設計されています。これらのアプリケーションはビューをレンダリングしないので、

View Resolvers

はありません –

Controller

は一般にHTTPレスポンスを通して直接データを送信することが期待されています。

MVC0スタイルのコントローラーから始めましょう。


3 Mavenの依存関係


Spring MVC

と連携できるようにするには、まずMavenの依存関係を処理しましょう。

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

最新版のライブラリを入手するには、https://mvnrepository.com/artifact/org.springframework/spring-webmvc[spring-webmvc[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-api

3.1.0があることを確認してください。


web.xml

は次のようになります。

<servlet>
    <servlet-name>test-mvc</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/test-mvc.xml</param-value>
    </init-param>
</servlet>

ここでは

contextConfigLocation

プロパティを設定しています – Springコンテキストをロードするために使用される

XML

ファイルを指しています。プロパティがそこにない場合、Springは

\ {servlet

name} -servlet.xml__という名前のファイルを検索します。

私たちの場合、

servlet

name



test-mvc

なので、この例では

DispatcherServlet



test-mvc-servlet.xml__というファイルを検索します。

最後に、

DispatcherServlet

を設定し、それを特定の

URL

にマッピングします。これで、

Front Controller

ベースのシステムが完成します。

<servlet-mapping>
    <servlet-name>test-mvc</servlet-name>
    <url-pattern>/test/** </url-pattern>
</servlet-mapping>

したがって、この場合

DispatcherServlet

はパターン

/test/**

内のすべての要求を傍受します。


5 Spring MVC Web設定


Spring Config

を使用して

Dispatcher Servlet

を設定する方法を見てみましょう。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages= {
  "org.baeldung.controller.controller",
  "org.baeldung.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サーブレットを設定する方法を見てみましょう。

DispatcherServlet XML

ファイルのスナップショット –

DispatcherServlet

がカスタム

controllers

およびその他の

Spring


entities

をロードするために使用する

XML__ファイルを以下に示します。

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

この単純な設定に基づいて、フレームワークはクラスパスで見つかるコントローラBeanを初期化します。

ビューのレンダリングを担当するView Resolverも定義しています。ここではSpringの

InternalResourceViewResolver

を使用します。

これは

view

の名前が解決されることを期待しています、それは接頭辞と接尾辞(両方とも

XML

設定で定義される)を使って対応するページを見つけることを意味します。

したがって、たとえば

Controller

が「

welcome」** という名前の

view

を返した場合、

view


resolver



WEB-INF

フォルダー内の

「welcome.jsp」__というページを解決しようとします。


6. MVCコントローラー

MVCスタイルのコントローラをようやく実装しないようにしましょう。


ModelAndView

オブジェクトがどのように返されているかに注目してください。これには

model map



view object

が含まれています。両方ともデータレンダリングのためにV

__iew 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

によって

TestController



getTestData

メソッドにルーティングされます。

そしてもちろん、

ModelAndView

オブジェクトにモデルデータを含めて適切に返しています。

ビューオブジェクトの名前は“

welcome

”に設定されています。前述のように、

View Resolver



WEB-INF

フォルダー内で「

welcome.jsp

」というページを検索します。

以下に

GET

操作の例の結果を見ることができます。

リンク:/uploads/result__final.png[]


URL



“test”

で終わることに注意してください。

URL

のパターンは

“/test/test

“です。

最初の

“/test”

はサーブレットからのもので、2番目のものはコントローラのマッピングからのものです。

** 7. RESTに対するより多くのSpring依存性

**

それでは、RESTfulコントローラを見てみましょう。もちろん、開始するのに良い場所は、私たちが必要とする追加のMaven依存関係です。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.5</version>
    </dependency>
</dependencies>


jackson-core

、https://mvnrepository.com/artifact/org.springframework/spring-webmvc[spring-を参照してください。これらの依存関係の最新バージョンへのリンクは、webmvc]およびhttps://mvnrepository.com/artifact/org.springframework/spring-web[spring-web]リンクにあります。


Jackson

はもちろんここでは必須ではありませんが、JSONサポートを有効にするには確かに良い方法です。そのサポートをもっと深く掘り下げたい場合は、/spring-httpmessageconverter-restのリンクを見てください[message converters article here]。

** 8 RESTコントローラ

**


Spring RESTful

アプリケーションの設定は

MVC

アプリケーションの設定と同じですが、唯一の違いはV

iew Resolvers




model map.__がないことです。

APIは通常、生データ(通常は

XML

および

JSON

表現)を単純にクライアントに返します。したがって、

DispatcherServlet



view resolvers

をバイパスし、

HTTP応答本体

にデータを返します**

簡単な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

をバイパスさせ、

本質的に出力をHTTP応答の本体に直接書き出す

ように指示します

出力の簡単なスナップショットを以下に示します。

リンク:/uploads/16th__july-3.png[]

上記の出力は、受講生

id

of

1

を使用して

GET

要求をAPIに送信した結果です。

ここに1つの簡単なメモがあります –


@ RequestMapping

アノテーション

は、最大限の可能性を最大限に活用するために本当に探求する必要があるこれらの中心的なアノテーションの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でコントローラを使用する基本を探ります。

もちろん、この記事のすべてのコードはhttps://github.com/eugenp/tutorials/tree/master/spring-all[Giuthubについて]から入手できます。