*

Spring5入門[STS(Spring Tool Suite)の環境作成と簡単なWebアプリの作成]

公開日: : 最終更新日:2017/06/24 Java, Spring , , ,


スポンサードリンク



Struts1ももう過去の遺物になり、SAStrutsもEOLとなりもう半年以上が経過しました。
とは言え、すぐにSAStrutsから脱却できるわけでもなく・・・
そのような製品が多いと思います。そんなこんなで選択肢としては、Angular2やReactを利用して革命的にコードを書き換える
との選択肢もありだとは思いますが、なかなかそこまでお金も時間もないのが現実だと思いますし、
現実的な選択肢はJava EE or Springの2択だとも思います。

と前置きが長くなりましたが、今回からSpringのエントリーを書かせていただこうと思います。
当然ですが、自動テストの比重が大きい内容にしていきます。

第一回目はSTS(Spring Tool Suite)の環境構築と簡単なWebアプリとなります。
なお、SAStrutsからの移行の場合を想定して、ViewはJSPを利用しますので、Spring Bootは利用いたいません。

内容は以下の通りです。

  • STS(Spring Tool Suite)環境の構築
  • 画面を表示するだけの画面の作成とテストの実装
  • 入力項目を有する画面の作成とテストの実装

1. STS(Spring Tool Suite)環境の構築

STSのダウンロード

http://spring.io/tools/sts/allにアクセスして
以下の画像の赤枠部分のご利用の環境のリンクをクリックします。

すると以下のようなダイアログが表示されますので、32ビット or 64ビットをクリックしてダウンロードします。
(どうでもいい話ですがMacの場合は64ビットだけです。)

ダウンロードが完了したら適当な場所に解凍してください。解凍で生成されたフォルダのstsをクリックすれば起動します。

起動時の画像は以下のようになります。

Gradle IDE Packプラグインのインストール

ビルドツールはMavenではなくGradleを利用します。まだまだMavenの方がメジャーですがGradleの方が色々できて生産性に寄与すると言えます。

Eclipse marketplaceを起動してgradeで検索します。

一覧に表示された「Gradle IDE Pack」プラグインをインストールします。

STSと言ってもEclipseをベースに開発されていますので、プラグインのインストールはEclipseと全く同じです。
インストール後にSTSを再起動すると「Gradle IDE Pack」プラグインが利用可能となります。

2. 画面を表示するだけの画面の作成とテストの実装

プロジェクトの作成

パッケージエクスプローラで右クリックメニューを表示し
[New]-[Other…]をクリックします。

[Gradle(STS)]-[Gradle(STS) Project]を選択し「Next」ボタンをクリックします。

「Project name」にSpringMvcSampleを入力し、「Sample project」は「Java QuickStart」を選択し「Finish」をクリックします。

Gradleですので、必要なライブラリのダウンロードが必要となり処理には少々時間を要します。
終了するとパッケージエクスプローラにSpringMvcSampleが表示されます。

なお、自動で生成されたorg.gradleパッケージは利用しないため削除しておきます。

build.gradleの修正

Spring Frameworkは5.0を利用します。(2017年6月17日時点では5.0.0.RC2)
Spring Framework 5.0ではJDK 8以上が必須になっています。
Spring Framework 4系はJDK 6と7が利用できるのですが、4.3は2019年までサポートが切れることが予告されていますので、今後の開発では5.0以降を利用するべきです。

プロジェクト直下のbuild.gradleを以下のように変更します。

変更内容はコメントに記載しているとおりですが
idkのバージョンは1.8でspring-webmvcの依存関係を追加しているだけとなります。
なお、本設定変更だけではWebアプリのプロジェクトとして認識されず、STSに標準で搭載されている「Pivotai tc Server」で実行できませんが、その部分については後述させていただきます。

記載内容を反映します。
パッケージエクスプローラのSpringMvcSampleを選択した状態で右クリックメニューを表示し、
[Gradle(STS)]-[Refresh Dependencies]をクリックします。

プロジェクトのJDKの設定変更

プロジェクトのJava Compilerを1.8に変更し「OK」ボタンをクリックします。

以上で基本的な環境設定は完了となります。

2. 画面を表示するだけの画面の作成とテストの実装

月並みですが、Hello World!を実装します。
Controllerにリクエストを行うとHTMLが返却される例となります。

web.xmlの作成

まずはSpringがリクエストを処理するための設定を行うweb.xmlの作成を行います。
src/main/webapp/WEB-INFにweb.xmlファイルを作成し、内容を以下のようにしてください。

ApplicaiotnContextが利用する設定ファイルの作成

SpringのApplicaiotnContextが利用する設定ファイルを作成します。
これはweb.xmlでclasspath:/META-INF/spring/contextConfigLocation.xmlと指定したファイルとなります。

Springでは本設定はJavaクラスでも行えるのですが、今回は一番オーソドックスなxmlで作成します。
src/main/resources配下にMETA-INF/spring/contextConfigLocation.xmlを作成します。

ファイルの中身は以下のようになります。

こちらもコメントに記載しているとおりですが、コンポーネントスキャン対象のパッケージとviweの定義がポイントとなります。

Controllerの作成

HelloWorldControllerを以下の内容で作成します。

・6行目

SpringのDIコンテナにHelloWorldControllerをコントローラとして認識してもらうためのアノテーションを付与しています。
コントローラはStrutsのActionに相当します。

DIコンテナにに登録するクラスの指定には@Component、@Service、@Repository、@Controllerが指定可能です。
詳細につきましては次回以降で説明させていただきます。

・7行目

アプリケーションコンテキストのルートパスがHelloWorldControllerにマッピングされるように指定しています。
@RequestMappingはコントローラクラスとそのメソッドに指定可能となります。

・9行目

helloWorldメソッドにはGETで有効とのアノテーションを付与しています。
クラスとメソッドに指定された@RequestMappingによって、アプリケーションコンテキストのルートパスへのGET命令がhelloWorldメソッドにマッピングされます。

・11行目

文字列”index”を返却しています。この文字列によってコンテーキスルートのindex.jspが描画されます。
contextConfigLocation.xmlでJSPの格納場所は/WEB-INF/views/jsp/に設定しているので
/WEB-INF/views/jsp/index.jspが実際に対応するファイルとなります。

jspの作成

src/main/webapp/WEB-INF/views/jsp配下にindex.jspを作成します。

内容は以下のとおりです。

プロジェクトをwtpプロジェクトに変換

この状態では、Webアプリのプロジェクトとして認識されず、STSに標準で搭載されている「Pivotai tc Server」に配備できませんのでwtpプロジェクトに変換します。

build.gradleの3行目に以下の記載を追記します。

次にパッケージエクスプローラでSpringMvcSampleを選択した状態で右クリックメニューを表示し
[Gradle(STS)]-[Tasks Quick Launcher]をクリックします。

表示されたダイアログでeclipseと入力リターンボタンを押下します。

実行が成功すると以下のようなログが出力されます。

サーブレットAPIが必要になりますので依存ライブラリに
compile ‘javax.servlet:javax.servlet-api:3.1.0’
を追加して、パッケージエクスプローラのSpringMvcSampleを選択した状態で右クリックメニューを表示し、
[Gradle(STS)]-[Refresh Dependencies]をクリックします。

「Pivotai tc Server」で実行

「Pivotai tc Server」で実行してみます。
エクスプローラのSpringMvcSampleを選択した状態で右クリックメニューを表示し、
[Run As]-[Run on Server]をクリックします。

以下の画面が表示されるので「Next」をクリックします。

SpringMvcSampleがConfiguredの一覧に表示されていることを確認してます。
Configuredの一覧に表示されていない場合は、Availableの一覧に表示されているSpringMvcSampleを選択し「Add」ボタンをクリックし
「Finish」をクリックします。

Eclipseの組み込みブラウザでコンテキストルートが表示さました。

表示内容も想定どうりです。

ユニットテストの実装

これではイマイチちゃんと動作しているか不明確なのでテストを実装してみます。
Springはテストが効率的に行える仕組みが提供されています。Webアプリも当然対象です。
まあSAStrutsもテストを実装できるのですが、モックはEasyMockですし、テストを考慮したDI設定なども結構煩雑ですよね。
と書きつつ、昔は私もStrutsとEasyMockでテスト実装していたので時代が違うだけなのかとも思います。

依存関係の追加

まずは必要な依存関係の追加を行います。
spring-testとmockitoを追加します。
build.gradleのdependencies以下のようになりました。

パッケージエクスプローラのSpringMvcSampleを選択した状態で右クリックメニューを表示し、
[Gradle(STS)]-[Refresh Dependencies]をクリックします。

テストの実装と実行

HelloWorldControllerTestをsrc/test/javaに作成します。
内容は以下のとおりです。

ポイントとしは
@ContextConfiguration(locationsでspringの設定ファイルの指定を指定している部分と
WebApplicationContextを@Autowiredを付与して宣言し、springによってインジェクションされた@Autowiredを利用してMockMvcを生成しテストに利用するところです。簡単にテストが実装できるようによく考えられていますよね!

早速実行してみます。
HelloWorldControllerTestを選択して右クリックメニューを表示し
[Run as]-[JUnit-Test]をクリックします。

成功しました。

3. 入力項目を有する画面の作成とテストの実装(第一弾)

シンプルなログイン画面風のものを作成します。
最終的には入力画面にありがちな入力チェックとログイン成功時の画面遷移まで実装するのですが
第一弾としては入力部分と分岐のない画面遷移だけとなります。

LoginFormの作成

LoginFormを作成します。ログイン画面ですのでloginNameとloginPasswordを保持するPOJOとなります。

LoginControllerの作成

/login/indexにアクセスするとログイン画面を表示
ログインが成功したらlogin/successに遷移
ログインが失敗したらlogin/indexに遷移する
コントローラを作成します。まずはログイン失敗は実装しませんが・・・

ポイントと言うほどではないですが、LoginControllerの@RequestMappingには”/login”を指定しており
indexメソッドでは”index”、loginでは”login”を指定することで
/login/indexはindexメソッドにマッピング
/login/loginはloginメソッドにマッピングとなります。

index.jpsの作成

src/main/webapp/WEB-INF/views/jsp/loginにindex.jspを作成します。

index.jspの内容は以下のとおりです。

テストの実装

ほぼ中身がない状態ですので、ブラウザで確認する方が早いのですがテストを実装してみます。
基本的な部分はHelloWorldControllerTestと同様です。

/login/indexにアクセスした時のテストを含んだLoginControllerTestは以下のようになります。

ここではHelloWorldControllerTestとほぼ同じで、パスが異なるだけです。

/login/loginのテストを追加してみます。

追加したテストメソッドだけ記載しておりますが、今回はget命令ですので

を追加する必要があります。

.param(“loginName”, “userName”)でloginFormのloginNameに”userName”
.param(“loginPassword”, “loginPassword”)でloginFormのloginPasswordに”password”
がセットされて、このloginFormがHelloWorldController.loginの引数として渡されます。

この部分の確認用の検証項目を追加すると以下のようになります。
(import文の説明を記載すると無駄に説明が長くなりますので省略させていただきます。クラス全体は最後に記載させていただいていますので、そちらを参照ください。)

「第一弾」としてはこれで完成です。

4. 入力項目を有する画面の作成とテストの実装(第二弾)

入力チェック部分を実装してみます。
と言っても、LoginFormにアノテーションを追加するだけです。

hibernate-validatorの依存関係の追加

SpringではFormのバリデーションにhibernate-validatorを利用していますので
build.gradleにhibernate-validatorとvalidation-apiの依存関係を追加します。

LoginFormへバリデーション用のアノテーションを追加

LoginFormは以下のようになります。

loginNameはNotEmpty
loginPasswordはNotEmptyかつ10文字以上16文字以下かつ英数字で構成
とのチェックが行われるように指定しています。

LoginControllerへバリデーション用のアノテーションを追加

コントローラでは、LoginFormのバリデーションを有効にするためのアノテーションを付与する必要があります。

具体的にはloginメソッドの引数のloginFormに@Validatedを付与することで実現します。

では、どこにバリデーション結果が保持されるの?、となると思います。
この値はBindingResultに格納されます。

具体的にはloginメソッドの引数にBindingResultを追加することで、バリデーション結果を受け取ることができるようになります。

結果は受け取れるようになりましたのでエラーチェックを追加します。
エラーチェックはBindingResult.hasErrors()で行えます。

上記の例ではバリデーションエラーが存在する場合は/login/indexに遷移するようになります。
この時点でHelloWorldControllerTestを実行してみます。
“testIndex”は成功し、”loginの正常系”は失敗するようになるはずです。

あれれ・・・、両方とも成功してしまいました。
“loginの正常系”はpasswordを8文字指定しており、バリデーションのエラーが発生するのでlogin/indexに遷移するようになり失敗するはずなのですが・・・

色々調べた結果ライブラリの組み合わせでバリデーションがうまく動作しないようです。
Spring 4以前だとうまく動いていたのですが・・・

と色々調べながら試行錯誤していくとglassfishのjavax.elを依存関係に追加するとうまくいくことがわかりました。3時間以上悩みました。

ライブラリの組み合わせを変えながら試行錯誤した時に
Caused by: java.lang.ClassNotFoundException: com.sun.el.ExpressionFactoryImpl
が発生したことが問題解決の糸口でした。

テストを実行すると期待する結果となりました。

LoginControllerTestの修正

loginの正常系の修正

バリデーションにかからないようにuserNameを10桁、passwordを16桁に変更します。

テストを実行すると成功しました。

バリデーションのテストを追加

ユーザIDが空のときのテストを追加します。

詳細はコメントを記載しておりますので追加での説明は不要かと思います。

テストしたい内容とは関係ないコードが非常に多いですが、実現できること自体がすごいですよね。
まあその辺はバリエーションテストになるので共通化すれば良いだけです。

かなりスッキリしました!
あとはバリエーションを淡々と追加していくだけですので
loginの異常系_パスワードの文字種が不正
だけ実装してみます。

うんうん、テスト実行して結果は・・・
失敗しました。なんでやねん!、と思ったらcheckErrorsメソッドの
List errors = bindingResult.getFieldErrors(“loginName”);
が間違えてますね・・・
正しくは
List errors = bindingResult.getFieldErrors(targetMemberName);
となります。

再度実行すると成功しました。バリデーション時のメッセージのカスタマイズと多言語対応までいこかと
思っていたのですが長くなりそうですので次回とさせていただきます。

最後に
LoginController.javaとHelloWorldControllerTest.javaを記載させていただきます。


スポンサードリンク



関連記事

お勧め本紹介[新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)]

リファクタリング―プログラムの体質改善テクニック (Object Technology Series

記事を読む

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の増加が見込まれます。 とは言

記事を読む

Eclipse4.4(Java)における自動ビルド設定の変更方法の説明

Eclipse4.4における自動ビルド設定の変更方法を説明させていただきます。 自動ビルド設定の変

記事を読む

Eclipse4.3のチュートリアル機能で”Hello World”アプリケーションの作成方法を説明する。

Eclipseのインストールが終了したので、各画面エリアの名称の説明、各画面エリアの使い方の説明を

記事を読む

JDK8(java 8)の新機能のラムダ式の利用方法[その1:概要]

「JDT betaを利用してJDK8対応のEclipse開発環境を作成する」では、「Eclipse」

記事を読む

Java8の新機能について

オラクルは2014年3月18日(日本時間3月19日早朝)に「Java 8」を正式に公開しました。

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[ビルド・クラスパスの順序およびエクスポート設定]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上の「ビルド・クラスパスの順序および

記事を読む

Eclipse(4.4)でJava言語のリファクタリング機能の使い方[「メソッド・シグニチャーの変更」と基本的な抽出処理、及び「インライン化」、「定数の抽出」]

本エントリーでは、Eclipse(4.3)でJava言語のリファクタリング機能の使い方に引き続き

記事を読む

Selenium入門その4[Selenium WebDriver(Java/Junit4)の基本コマンド]

前回はEclipse環境でSelenium WebDriverでJava/Junit4を利用したテス

記事を読む

「HyperSQL」の環境を作成し、Eclipseの「DBViewer」プラグインを利用してSQLを発行してみる

Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Spring5入門[STS(Spring Tool Suite)で簡単なWebアプリの典型的なユニットテストの実現方法]

前回は「Spring入門」で、Spring MVCを利用した簡単なWe

Spring5入門[STS(Spring Tool Suite)の環境作成と簡単なWebアプリの作成]

Struts1ももう過去の遺物になり、SAStrutsもEOLとなりも

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にS

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようにな

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑