Tech Sketch Bucket of Technical Chips by TIS Inc.

初めてのSpring Roo

Pocket

この記事はeXcale Developer's Blogから移転されたものです。

eXcale開発チームの西谷です。
今回はJava開発者のためのRADツールであるSpring Rooを使った簡単なWebアプリ開発を紹介します。

Spring Rooとは

Spring RooはオープンソースのJavaフレームワークであるSpring Frameworkの開発元、Spring Sourceによって提供されているRAD(Rapid Application Development)ツールです。Spring Frameworkベースのアプリケーションをコマンドラインで簡単に自動生成できるRuby on Railsのようなツールです。

Spring Rooで行える代表的な操作は以下のようなものです。

  • Mavenプロジェクトの作成と依存関係の管理
  • DB関連のセットアップ(JPA、MongoDB)
  • エンティティクラスの自動生成(getter/setterの自動生成)
  • JUnitのセットアップ
  • Spring MVCベースのセットアップと自動生成(Scaffold)
  • setter&getter,toStirng()の自動メンテナンス
  • ロギングのセットアップ

その他にもいろいろありますが、今回はひとまずRooを使った簡単なWebアプリの作り方を紹介します。個々の項目の詳細などはSpring Rooのドキュメントなどを参照してください。

インストール

Spring Rooを実行するには以下が必要となりますので事前にインストールしておいてください。

  • Java 6 JDK
  • Apache Maven

Spring Rooをインストールします。インストールはここから最新版をダウンロードして任意のディレクトリで解凍するだけです。解凍後はディレクトリ内のbinディレクトリにパスを通しておくことをおすすめします。

※ROO_INSTALL_DIRは解凍したディレクトリへのパスに読み替えてください

なお、Spring RooのインストールはSTSに含まれるものを利用してもどちらでもいいです。
※STSはSpring Frameworkを利用した開発者向けにSpring Sourceが提供しているEclipseベースのIDE(Spring Tool Suite)です

STSを利用する場合はここから自分の環境にあったSTSの最新版をダウンロードしてインストールしてください。
ベースとなるEclipseのバージョンによって2種類用意してますがお好みで。

以降の操作はすべてRooシェル上で行います。
では早速簡単にDBを利用したCRUD画面の作成を試していきます。

Roo Shellの起動

コマンドライン上でRooコマンドを実行するだけです。まずはSpringRooSampleというディレクトリを作成し、移動します。移動したらroo.sh(Windowsの場合はroo.bat)を実行すると以下のようなプロンプトが表示されます。この状態でhintというコマンドを実行すると次にすべきことをガイドしてくれます。

STSを利用している場合はプロジェクトを選択して右クリック→Spring Tools→Open Roo Shellで表示されます。

プロジェクトの作成

今回はSpringRooSampleというプロジェクト名で作成しますがプロジェクト名やトップレベルパッケージの名前は好きなものを指定してください。
実行するとRooを起動したディレクトリに各種ディレクトリやMaven用のpom.xmlファイルなどが自動で作成されます。

※STS上で作成する場合はNew→Spring Roo Projectで必要な情報を入力してください

DB設定

続いてデータベースを利用するための設定をしていきます。今回はサンプルなのでデータベースにH2_IN_MEMORY、JPAプロバイダとしてHibernateを利用します。
コマンドを実行することで必要なライブラリのpom.xmlへの追記やファイルの生成が自動で行われます。
また、Tabキーでコマンドラインの補完も行われます。利用可能なデータベースやデータベースのユーザ、パスワードの指定オプションもTabキーで表示されるので必要であれば指定してください

※H2_IN_MEMORYを指定するとPure Javaの簡易データベースであるH2が利用されます

エンティティクラスの作成

entityコマンドを実行するとコンテキストが指定したクラスに切り替わります。

※"~."はルートパッケージの指定。ここではChildが実際に作成されるクラス名(=エンティティ名)になります

フィールド追加

続いて、作成したエンティティにフィールドを追加していきます。
フィールドの追加はfieldコマンドで行えます。

fieldコマンドに続いてそのフィールドの型を指定します。-fieldNameでフィールド名を指定します。また、各種制約もオプションで指定することができます。(今回はnot null制約を指定しています)。
fieldの型として数値を指定する場合はnumberを指定した上で-typeオプションで実際に使用する型を指定します。また、エンティティの作成当初はコンテキストが自動的に作成したクラスに切り替わっているため、特にクラス指定しなくても大丈夫ですが異なる操作をした場合などは--classオプションで対象クラスを指定する必要があります。

その他にも指定可能なオプションは数多くありますが、ここでは説明しないのでリファレンス等を参照してください。
必要なフィールド分fieldコマンドを繰り返し実行します。

CRUD作成

最後にエンティティクラスをもとにしたコントローラクラスとビューファイルを生成します。
まず、プロジェクトにSpring MVCをセットアップした後 、Scaffoldで生成します。
ここでは生成するコントローラクラスのパッケージ名を指定する必要があります。今回は<ルートパッケージ>.controllerを指定しています。

※entityと同じく、"~."はルートパッケージを指定する際の省略形です

以上で、Childというエンティティに対するCRUD画面がセットアップされました。
最後にwarファイルを作成してtomcatで実行します。
perform packageでカレントディレクトリのtargetというディレクトリ内にwarファイルが作成されます。
その際、依存関係は自動的に解決され必要なファイルはダウンロードされた上でwarファイル内のWEB-INF/libに配置されています。
※performコマンドは ここで指定しているpackageもそうですがその他を指定した場合でも裏でmavanによる依存ライブラリのダウンロード等が行われるため完了にはしばらく時間がかかります。

Rooを終了したら最後にtomcatを起動します。
プロジェクトのあるディレクトリ内で以下のコマンドを実行します。

※今回はmavenでtomcatを起動していますがSTSを利用している場合はプロジェクトを選択して右クリック→Run As→Run on Serverを実行するとSTSに付属するtcServerで実行できます。

ブラウザからhttp://localhost:8080/SpringRooSample/にアクセスしてみてください。

以下のようなページが表示されChildというエンティティに対する一連の操作が行えるページが出来上がっています。

Rooが生成するコードについて

RooはAspectJのITDという技術をベースにしており、実際に生成されるのはJavaクラスとAspectJのファイルです。
Javaクラスにはほとんど実体がなく、コントローラクラスの場合などはクラス定義くらいしかありません。
各クラスの実体はajファイルの方に存在し、コンパイル時にウィービングされます。

具体的にはEntityクラスをRooで作成すると以下のようなファイルができあがります。

XX.java
XX_Roo_Configurable.aj
XX_Roo_JavaBean.aj
XX_Roo_Jpa_ActiveRecord.aj
XX_Roo_Jpa_Entity.aj
XX_Roo_ToString.aj

※XXはエンティティ名とします

エンティティの場合、XX.javaにはフィールドしか定義されず、@RooJpaActiveRecord、@RooJavaBean、@RooToStringというアノテーションが指定されています。なお、各ファイルはそれぞれ以下のようになっています。

XX_Roo_Configurable.aj @Configurableアノテーションを付加
XX_Roo_JavaBean.aj setter/getterメソッドが定義されている
XX_Roo_Jpa_ActiveRecord.aj JPA関連のメソッドなどが定義されている。findメソッドなど。
XX_Roo_Jpa_Entity.aj JPA関連のメソッドなどが定義されている。findメソッドなど。
XX_Roo_ToString.aj toStringメソッドが定義されている

ajファイルはRooが管理するため開発者は直接編集しないことが推奨されています。また、同名メソッドで独自に実装したい場合はjavaクラスに実装することで自動的に検知され、適宜生成コードが修正されます。

なお、コントローラの場合は以下のメソッドが自動で作られてURLとマッピングされます。

create POST /xxs エンティティの保存
createForm GET /xxs?form 新規入力フォーム描画
show GET /xxs/(id) 一件表示
list GET /xxs?page=m&size=n 一覧表示
update PUT /xxs 更新
updateForm GET /xxs/(id)?form 更新フォーム描画
delete DELETE /xxs/(id) 削除

同時に作られるビューはTilesベースで作成されますがJSPではなく、JSPXという拡張子のファイルが生成されます。JSPXとはJSPをXMLで記述する際の形式です。
なお、ビューもRooの管理下にあるため編集するにはそれなりのルールがありますが詳細はリファレンスを参照してください。

最終的なフォルダ構造は以下のようになっています。

/styles スタイルシート
/images 画像
/WEB-INF/classes/*.properties
/WEB-INF/config/*.xml Web関連のSpring設定ファイル
/WEB-INF/i18n/*.properties 国際化メッセージプロパティ
/WEB-INF/layout/layout.jspx Tilesのマスターレイアウト
/WEB-INF/tags/*.tagx XML形式で記述されたカスタムタグ
/WEB-INF/viwes/**/* Tilesで使用する各JSP(jspx)の定義

独自メソッドの追加(Controllerクラス直書き編)

最後にRooで作成されたコントローラに独自のメソッドを追加してみます。といってもAspectJなどは気にせずにコントローラクラスに好きなメソッドを追加するだけです。

気をつける点として、先述した通りRooで作られたプロジェクトはビューのresolverとしてTilesが使われてためview.xmlにレンダリングするjspなりjspxを指定する必要あります。

エンティティCartを元に作られたコントローラで試しにメソッドを追加してみます。
まずはCartControllerクラスに新たにメソッドを追加して新しく作ったビューを指定します。
なお、今回のサンプルではビューとしてhome.jspを用意しました。

追加前:

追加後:

続いて、ビューを/WEB-INF/views/carts/にhome.jspという名前で用意した上でviews.xmlに追記します。home.jspの中身は何でも構いません。

ちなみにSpringMVCを利用する場合、標準のResolverとしてInternalResourceViewResolverが使われます。また、servlet-context.xmlでプレフィックスとサフィックスが指定されおり、そこで指定された値によってjspのパスを解決されます。servlet-context.xmlはSpringMVCで使われるDispatcherServletの設定ファイルで、DispatcherServletはベースとなるコントローラクラスです。

独自メソッドの追加(AspectJで追加編)

続いて、AspectJを利用してメソッドを追加してみます。とは言っても結論から言うとControllerクラスに直接追加する場合とほとんど変わりません。CartController.javaではなく、CartController_Roo_Controller.ajに同様のメソッドを追加するだけです。

ただし、先述したように基本的にこのファイルはRooの管理下にあるのでこちらを編集する場合は注意が必要です。

独自コントローラの追加

もちろん、Rooで生成せずに個別にコントローラクラスを用意することも可能です。す。SpringMVCを使った場合と同様のControllerクラスを手動で作成するだけです。
※もちろん描画するページによってディレクトリとかviews.xmlは適宜作成する必要があります。

最後に

作成したプロジェクトをSTSもしくはEclipseで取り込むには次のコマンドを実行した後、Eclipseでインポートしてください。

エンジニア採用中!私たちと一緒に働いてみませんか?