H2の起動

データをデータベースに保存できるようにしましょう。

今回はデータベースとしてH2を利用します。

ちなみにGlassFishにはJava DB(中身はDerby)が付属しているので、こちらを利用することもできます。

zipをダウンロードしたら、適当な場所に展開し、次のようにして起動します。

% cd bin
% java -cp h2-1.4.180.jar org.h2.tools.Server &
TCP server running at tcp://XXX.XXX.XXX.XXX:9092 (only local connections)
PG server running at pg://XXX.XXX.XXX.XXX:5435 (only local connections)
Web Console server running at http://XXX.XXX.XXX.XXX:8082 (only local connections)

ブラウザが自動的に開いてH2コンソールが表示されます。各項目を入力して[保存]をクリックします。

設定名
MyFirstSpringApp (Server)
ドライバクラス
org.h2.Driver
JDBC URL
jdbc:h2:tcp://localhost/~/tmp/myfirstspringapp
ユーザ名
sa
パスワード
password

H2console

設定名はなんでもOKです。JDBC URLはアプリケーションからアクセスするときに使うURLです。この場合、起動したユーザのホームディレクトリ(~)のtmpディレクトリに、myfirstspringapp.mv.dbというファイルに保存されるということになります。ユーザ名・パスワードは任意に設定できます。

[接続]もしくは[接続テスト]をクリックして、接続できるか確かめておきます。

ライブラリのアップデート

Spring Framework 4.0.6がリリースされました。バグフィックスも行われているので、アップデートしておきましょう。

dependenciesの追加と同様に、build.gradleの「4.0.5」(2箇所)を「4.0.6」に書き換えて、更新ボタンをクリックします。

注意しなければならないのは、「Artifactの設定は自動的に変わらない」ということです。

Artifact2

赤く表示されている古いライブラリを削除して、Available Elementsにある新しいライブラリを追加します。

パラメータを受け取りコントローラで処理する

パラメータ(HTMLのformで送ることができる値)を受け取ってみましょう。

ここでは例として「足し算」を行います。2つの数値をフォームから送信し、その数値を足し算してページに表示します。

HTMLによるフォームは次のようになります。数値を入力して送信ボタンを押すと、actionで指定したURLにパラメータとともにリクエストされます。input要素のname属性で参照のための名前(ここでは「a」と「b」)を指定します。formのmethod属性では、getかpostが指定できます。getの場合はURLに「?a=1.2&b=3.4」といった形でパラメータが付加されます。

足し算した結果を表示するページは次のようにします。

コントローラは次のようにします。

受け取りたいパラメータは、@RequestParamアノテーションをつけてメソッドの仮引数として指定します。@RequestParamの後ろのカッコ内には、input要素のname属性と対応するように指定します。このようにすることで、パラメータを普通のメソッドの引数と同じように扱うことができます。

実行例
Sample3a

Sample3b

もちろん、仮引数の型がdoubleなので、doubleと解釈できない文字列の場合はエラーになります。ビュー側で数値以外が入力できないようにしたり、コントローラではStringで受け取って適切なエラー処理をする等といった処理を(必要に応じて)行うとよいでしょう。

コントローラからビューに値を渡す

コントローラからビューに値を渡す方法(の1つ)に、ModelMapを使う方法があります。

メソッドの仮引数に、ModelMapを指定することで使えるようになります。

ModelMapのaddAttributeメソッドで、名前と値を指定します。ここでは、messageという名前で「こんにちは」を、diceという名前で1〜6の範囲の乱数をビューに渡します。

ビューでは、要素の属性としてth:textを追加します。属性の値は${名前}で指定します。これにより、要素の子要素(タグで囲まれた部分)がコントローラーから渡された値で置き換わります。

Sample2

Glassfishへのdeployと実行

メニューの[Run]→[Edit Configurations]から、 Glassfishへのdeployと実行の設定をします。

+をクリックして、[Glassfish Server]→[Local]を選択します。

Run1

Before launchのBuildは、次でArtifactを設定すると自動的に追加されます。

Run2

設定済みのArtifactを指定します。OKをクリックして設定完了です。

メニューから[Run]→[Run ‘アプリケーションサーバ名’]をクリックすると、Glassfishが起動し、WARファイルがdeployされます。deployが成功するとブラウザが開きますが、そこはまだ設定がされてないのでエラーになります。URLをhttp://localhost:8080/myfirstspringapp/sample1にすると、ページが表示されます。

Sample1 2

Artifactの設定

Artifactとは、プロジェクトの出力の設定や出力そのものを指します。

GlassfishにDeployするWARファイルを出力するArtifactを設定します。

Artifact

+をクリックして、「Web Application: Archive」を選択します。

Available Elementsに、出力できるものの一覧があるので、すべて選択し、右クリックから「Put into Default Locations」をクリックします。

最後にOKをクリックしてArtifactの設定は完了です。

コントローラの作成

リクエストを処理するコントローラを作成します。

パッケージを作成して、その中にTopControllerクラスを作成します。

Controller

9行目: TopControllerクラスがコントローラであることを示します。

10行目: どのURLを処理するか指定します。「/」と指定すると、全てのURLを処理することになります。

12行目: sample1メソッドが、10行目で指定したURLのうちどのURLを処理するか指定します。つまり「/sample1」に対する処理を行うことになります。

13行目: メソッド名はJavaの文法に合っていればなんでもOKです。Springの設定に関わるといったことはありません。

14行目: 戻り値はViewの名前で、WEB-INF/templates/sample1.htmlを指定したことになります。

テンプレートの作成

テンプレートは、TymeleafConfigで指定したパスに作成します。

Sample1

2行目: Thymeleafのネームスペースが必要です。

TymeleafはHTMLテンプレートエンジンとはいっても、well-formedな文書しか処理ができません。つまり、HTML5で許されている閉じタグの省略ができません。例えば4行目のように単独で現れるタグは「/>」で終わらせるようにします。

このテンプレートではまだTymeleafConfigの機能を使っていません。まずはこのテンプレートがそのまま表示されるようにします。

Thymeleafの設定

ThymeleafはHTMLテンプレートエンジンで、Viewとして利用します。

Springでは、ViewResolverを実装したBeanを登録することでViewとして利用できます。ThymeleafViewResolverがそのクラスになります。

パッケージを作成し、その中にTymeleafConfigクラスを作成します。

12行目: @Configurationは、このクラスで設定を行うことを示します。mvc-dispatcher-servlet.xmlに記述する代わりに、Javaで設定していくことになります。

14行目: @Beanで、Bean登録を行うメソッドであることを示します。

17行目: テンプレートの置き場所を指定します。

30行目: 戻り値となるインスタンスが登録されます。

ThymeleafConfig
※↑はクラス名にtypoがあります。ThymeleafConfig.javaが正しいです。ただ、クラス名に特に意味は無い(@Configurationがついていれば設定用のクラスになる)ため、このままでも動作します。