概要
Spring MVCフレームワークを使用して開発を進める際、Mavenプロジェクトの基本的なセットアップ方法についてまとめた。
前提
プロジェクトの具体的な作成方法については以下に記載。
概要 Springを学びなおすにあたり、Spring MVCでHello Worldしたのでその方法についてまとめた。 今回はアノテーションベースのBean定義方法で実装した。 Spring MVCの特徴 Spr[…]
プロジェクトのセットアップ
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は以下の手順で使用できる。
②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>
ログまわりの設定の詳細は以下となる。
・%thread:スレッド名
・%-5level:ログレベル
・%logger{36}:ロガー名
・%msg:ログメッセージ
・ConsoleAppender:ログを標準出力(コンソール)に出力
・FileAppender:ログを「C:/workspace/prototype/logs/app.log」に出力
・ログレベル:
【INFO】⇒INFO、WARN、ERRORレベルのログが出力される
【DEBUG】⇒DEBUG、INFO、WARN、ERRORレベルのログが出力される