SpringプロジェクトにSpring MVCを設定する。

前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。

ponsuke-tarou.hatenablog.com

環境

Spring MVC を設定します。

pom.xmlに依存関係を追加します。

  • pom.xml に追記して依存関係を追加していきます。
Spring MVC のモジュールを指定します。

spring-webmvc を指定すると Spring Web やその他のSpring Frameworkの依存モジュールへの依存関係を解決できます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
Hibernate(ハイバネート) Validator を指定します。

Hibernate Validatorは、Bean Validation のリファレンス実装です。
Spring MVC は Bean Validation の仕組みを利用して入力チェックをします。
fits.hatenablog.com
you-tk.hatenablog.com

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
JCL inplement over SLF4 と Logback を指定します。

Spring はJCL(Apache Commons Logging)のAPIを使ってログ出力を行います。
そのため、SLF4JのAPIにロギング処理をブリッジするJCLの実装クラスを提供するライブラリである JCL inplement over SLF4 と
SLF4Jの実装クラスを提供するライブラリであるLogbackを指定します。
ponsuke-tarou.hatenablog.com

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

ContextLoaderListener のセットアップ

ContextLoaderListener クラスをサーブレットコンテナに登録することで、Webアプリケーション用のアプリケーションコンテキストを生成できます。
www.weblio.jp
qiita.com

空のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
}
作成したコンフィギュレーションクラスをweb.xmlに設定して、アプリケーションコンテキストを生成できるようにします。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <listener>
    <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. -->
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <context-param>
    <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextClass</param-name>
    <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
  </context-param>
  <context-param>
    <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextConfigLocation</param-name>
    <param-value>example.config.AppConfig</param-value>
  </context-param>

DispatcherServlet のセットアップ

DispatcherServletクラスをサーブレットコンテナに登録することで、Spring MVC のフロントコントローラを利用できるようにします。
Spring MVCではWebアプリケーション用のアプリケーションコンテキストとは別に、DispatcherServlet 用のアプリケーションコンテキストを作成します。

DispatcherServlet 用のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * DispatcherServlet用のコンフィギュレーションクラス.
 * EnableWebMvcアノテーション を指定すると、Spring MVC を利用するために必要となるコンポーネントのBean定義が自動で行われる.
 * ComponentScanアノテーション を指定すると、value属性に指定されたパッケージの配下にある Component や Controller などの
 * アノテーションを付与したクラスがスキャンされ、アプリケーションコンテキストにBean登録される.
 */
@Configuration
@EnableWebMvc
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    // WebMvcConfigurerAdapterクラスを継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズできる。
}
DispatcherServletクラスをサーブレットコンテナに登録します。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>
      <!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. -->
      <param-name>contextClass</param-name>
      <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
    </init-param>
    <init-param>
      <!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. -->
      <param-name>contextConfigLocation</param-name>
      <param-value>example.config.WebMvcConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

日本語が文字化けしないようにCharacterEncordingFilter のセットアップをします。

CharacterEncordingFilterクラスをサーブレットコンテナに登録することで、画面から入力した日本語が文字化けしないようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
      <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <!-- encodingパラメータにリクエストパラメータの文字エンコーディングとしてUTF-8を指定します. -->
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <!--
       forceEncodingパラメータにリクエストとレスポンスの文字エンコーディングを上書きするかを指定します.
       trueを指定してリクエストは強制的に指定したUTF-8に上書きされ、レスポンスもUTF-8となります.
       -->
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定します. -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Viewを判別できるように ViewResolver をセットアップします。

Spring MVC では、ViewResolver を使用してView名を解決して使用するViewを判別します。
以下メソッドを作成したWebMvcConfigに追加します。

    /** ViewResolverのセットアップ用メソッド. */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // ViewResolverRegistryクラスのjspメソッドを呼び出し JSP 用のViewResolverをセットアップします。
        // これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
        registry.jsp();
    }

JSPからSpring MVCのtaglibが利用できるように定義を追加します。

以前作成したinclude.jspに定義を追加します。
ponsuke-tarou.hatenablog.com

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

次回は、簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

この本を読みながらやっています。

www.shoeisha.co.jp