Springコントローラのクイックガイド
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について]から入手できます。