【Spring MVC】Mavenプロジェクトのセットアップ

概要

Spring MVCフレームワークを使用して開発を進める際、Mavenプロジェクトの基本的なセットアップ方法についてまとめた。

 

前提

プロジェクトの具体的な作成方法については以下に記載。

あわせて読みたい

概要 Springを学びなおすにあたり、Spring MVCでHello Worldしたのでその方法についてまとめた。 今回はアノテーションベースのBean定義方法で実装した。   Spring MVCの特徴 Spr[…]

【Spring MVCでHello Worldする方法】mavenプロジェクトアイキャッチ

 

プロジェクトのセットアップ

Mavenプロジェクトを作成した後、開発を進めるにあたって最低限必要そうな資材などをまとめた。

 

ファイル構成

ファイル構成は以下となる。

ファイル構成


prototype ⇒作成するプロジェクト
│ 
└─src 
    └─main
         ├─java 
         │   └─com 
         │       └─example 
         │              └─prototype
         │                     └─web
         │                         └─controller ⇒コントローラー層を格納するパッケージ(パッケージはなんでもいい)
         │─resources
         │    ├─META-INF ⇒プロパティ、設定ファイル等を格納するフォルダ
         │    │    └─spring ⇒Bean定義ファイルを格納するフォルダ
         │    │         ├─springMVCContext.xml ⇒WebアプリケーションコンテキストのDIコンテナが参照するBean定義
         │    │         └─applicationContext.xml ⇒ルートアプリケーションコンテキストのDIコンテナが参照するBean定義
         │    │
         │    └─logback.xml ⇒ログ設定
         │    
         └─webapp 
               └─WEB-INF 
                     ├─common ⇒共通処理を行うjspなどを格納する
                     ├─views ⇒jspファイルを格納する
                     └─web.xml
 

 

Mavenプロジェクトを作成した時点でjavaフォルダやresourcesフォルダなどは作成されないため、手動で作成する。

 

Bean定義ファイル

DIコンテナで管理するBean定義ファイルを作成する。

 

WebアプリケーションコンテキストのBean定義ファイル

プレゼンテーション層で使用されるBeanを管理する。

springMVCContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
       ">

	<!-- アノテーションを有効にする -->
    <mvc:annotation-driven />

	<!-- コンポーネントを表すアノテーションがついたクラスをスキャンする -->
    <context:component-scan base-package="com.example.prototype.web.controller" />

	<!-- WEB-INF/viewsフォルダ配下のjspファイルをさがす -->
    <mvc:view-resolvers>
        <mvc:jsp prefix="/WEB-INF/views/" suffix=".jsp" />
    </mvc:view-resolvers>
</beans>

 

コンポーネントスキャンを設定することで、controllerパッケージ配下のControllerコンポーネントをDIコンテナに登録できる。

 

ルートアプリケーションコンテキストのBean定義ファイル

アプリケーション全体で使用されるBeanを管理する。
コメントアウトしているが、サービス層以下の「@Service」「@Repository」「@Component」などが付与されたコンポーネントをBean管理したい場合、コンポーネントスキャンを有効にする。

applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<!-- コンポーネントスキャン -->
	<!-- <context:component-scan base-package="com.example.prototype.biz" /> -->
</beans>

 

web.xml

WEBアプリケーション全体に関する設定を行う。

 

DIコンテナの設定

サーブレットコンテナ上にDIコンテナを作成する。
Bean定義ファイルを参照させることで、Bean定義ファイル内に設定したコンポーネントがDIコンテナに登録される。

web.xml


<?xml version="1.0" encoding="UTF-8"?>

<web-app>
	<!-- WebアプリケーションコンテキストのDIコンテナ作成 -->
	<servlet>
		<servlet-name>app</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:/META-INF/spring/springMVCContext.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>app</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- ルートアプリケーションコンテキストのDIコンテナ作成 -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:/META-INF/spring/applicationContext.xml
		</param-value>
	</context-param>
</web-app>

 

 

HTMLエスケープ

EL式で表示されるすべての文字列をHTMLエスケープさせたい場合、以下の設定を追加する。

web.xml


<!-- EL式で表示するすべての文字列に対してHTMLエスケープを行う -->
<context-param>
	<param-name>defaultHtmlEscape</param-name>
	<param-value>true</param-value>
</context-param>

 

文字化け防止

クライアントからサーバー側へパラメータ送信時、文字化け防止を行うため以下のフィルターを追加する。

web.xml


<!-- クライアント側からサーバー側へパラメータ送信時の文字化け防止 -->
<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
	<filter-class>
		org.springframework.web.filter.CharacterEncodingFilter
	</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

 

pom.xml

Mavenプロジェクトのビルドファイルを設定する。
ビルドファイルを更新したら、基本的に「Maven clean」「Maven install」を行うことで、ビルドファイルに記載した依存資材を取得できる。

Spring MVC

Spring MVCフレームワークを使用するために最低限必要なモジュールは以下となる。

 

pom.xml


<!-- ゲッターセッターの記述を省略できるlombokモジュール -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.22</version>
	<scope>provided</scope> <!--
	providedスコープが指定されたライブラリは、コンパイル時にのみ必要とされる。 -->
</dependency>
<!-- HTTPリクエストやセッション管理などのWebアプリケーション用モジュール -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>4.0.1</version>
	<scope>provided</scope>
</dependency>
<!-- Spring-MVCに必要なモジュール -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.1.20.RELEASE</version>
</dependency>
<!-- JSTLに必要なモジュール -->
<dependency>
	<groupId>org.apache.taglibs</groupId>
	<artifactId>taglibs-standard-jstlel</artifactId>
	<version>1.2.5</version>
</dependency>

 

Javaのバージョン

pom.xml内でJavaのバージョンを指定できる。
例えば以下はJavaのバージョン11を使用する例。

pom.xml


<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<maven.compiler.source>11</maven.compiler.source>
	<maven.compiler.target>11</maven.compiler.target>
</properties>

 

※Javaのバージョンを変更した場合、プロジェクト右クリック>プロパティ>「プロジェクト・ファセット」のJavaのバージョンも変更すること

 

画面まわり

画面側で使用するタグや資材の参照を集約することで、jspに都度同じ設定を記載する必要がなくなる。

 

タグライブラリ

タグライブラリを集約して定義しておき、jspを表示する際にインクルードさせる。

 

集約ファイル

タグ周りの参照設定を集約している。

include.jsp


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

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

 

web.xml

以下のように設定することで、すべてのjspファイルを表示する際に対象のjspの先頭にinclude.jspを含むことができる。

web.xml


<!-- 拡張子「.jsp」ファイルはすべてUTF-8でエンコーディングされて、 各JSPの先頭にinclude.jspを含むようにする設定。 -->
<jsp-config>
	<jsp-property-group>
		<url-pattern>*.jsp</url-pattern>
		<page-encoding>UTF-8</page-encoding>
		<include-prelude>/WEB-INF/common/include.jsp</include-prelude>
	</jsp-property-group>
</jsp-config>

 

静的ファイルの参照

cssとjsを必要に応じてそれぞれjspファイルに定義してインクルードする。
以下はjspに直接インクルードの記載をする必要がある。

 

css

jspの<head>タグ内で「<%@ include file=”/WEB-INF/common/header_common.jsp”%>」と記載して参照する。

header_common.jsp


<%-- Bootstrap CSS --%>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">

 

js

jspの</body>タグ手前で参照させる。

footer_common.jsp


<%-- Optional Bootstrap JS and jQuery --%>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

 

ログ出力

logbackによってSpringフレームワークの処理やHibernate、JDBCなどのデバッグレベルの情報を確認できる。
開発環境ではログレベルをDEBUGに、本番環境ではINFOに切り替えて適宜情報を確認する。

 

logbackの使い方

logbackは以下の手順で使用できる。

①pom.xmlにlogbackまわりのモジュールを追加
②logback.xmlをクラスパス上に作成
pom.xmlにモジュール追加

logback機能を使用するためのモジュールは以下。

pom.xml


<!-- logback -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.4.11</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>2.0.9</version>
</dependency>

 

logback.xmlの作成

logback.xmlはログのフォーマット、レベル、出力先などをログ設定を記載する。
クラスパス上に配置することで対象のlogback.xmlが自動検出される。

logback.xml


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- コンソール出力の設定 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -
				%msg%n</pattern>
		</encoder>
	</appender>

	<!-- ファイル出力の設定 -->
	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
		<file>C:/workspace/prototype/logs/app.log</file>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -
				%msg%n</pattern>
		</encoder>
	</appender>

	<!-- ログレベルの設定 -->
	<root level="DEBUG">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</root>
</configuration>

 

ログまわりの設定の詳細は以下となる。

・%d{yyyy-MM-dd HH:mm:ss} :日時
・%thread:スレッド名
・%-5level:ログレベル
・%logger{36}:ロガー名
・%msg:ログメッセージ
・ConsoleAppender:ログを標準出力(コンソール)に出力
・FileAppender:ログを「C:/workspace/prototype/logs/app.log」に出力
・ログレベル:
【INFO】⇒INFO、WARN、ERRORレベルのログが出力される
【DEBUG】⇒DEBUG、INFO、WARN、ERRORレベルのログが出力される
スポンサーリンク