春だからSpringをはじめよう (2)

ということで、Spring BootのチュートリアルにあったWebアプリケーションのコードを見ていきます。

取り上げるチュートリアルはServing Web Content with Spring MVC <https://spring.io/guides/gs/serving-web-content/>。Hello Worldを表示するHTMLページにhttpリクエストのクエリーから文字列を取り出して埋め込むという簡単なプログラム例で、ThymeleafというWebテンプレートを使用してHTMLページを作成しています。

Spring Toolsのウィザードを使用してWebアプリケーションプロジェクトを作成すると、mainメソッドを有するServingwebcontentApplicationクラスが生成されます (いうまでもありませんが、Servingwebcontentの部分はウィザードで指定したアプリケーション名です)。

ServingwebcontentApplicationクラスには@SpringBootApplicationアノテーションが付加されています。Spring Bootの実行系はアプリケーションの構成などをアプリケーションクラスのアノテーションから取得するようで、@SpringBootApplicationアノテーションが指定されていると、Spring Bootの実行系はSpring Bootアプリケーションを標準的な構成で実行するようです。なお、リファレンスには自動コンフィグレーションとパッケージ内のスキャンが有効になると書かれていますが、詳細はまだ確認できていません。

一昔前の作り方であれば、ServingwebcontentApplicationをSpringBootApplicationのサブクラスとして定義し、コンフィグレーションなどの初期設定はスーパークラスの初期化を通して実行していたと思いますが、アノテーションを使用することでコードの見通しが良くなっているように思います。

ServingwebcontentApplicationクラスではJavaの処理系が起動時に呼び出すmainメソッドだけが定義されています。

mainメソッドは以下のようなコードが書かれています。

SpringApplication.runを呼び出すことでSpring Bootの実行系を起動しています。ここでServingwebcontentApplicationクラスを引数として与えることで、SpringApplicationクラスがアプリケーションのコンフィグレーションや必要な情報をリフレクションで取得できるようにしているようです。

httpリクエストに対する動作は実行時にServingwebcontentApplicationクラスが属するパッケージをSpring Bootの実行系がスキャンして自動的に収集するので、このクラスでhttpリクエストに関する宣言などを行う必要はありません。これがウィザードが生成したコードがそのまま利用できる理由になります。

次にhttpリクエストを処理するコードを見てみます。これはウィザードが自動的に生成してくれるものではないので、自分でコーディングする必要があります (といっても、以下はチュートリアルにあるそのままですけど)。

クラス名についている@Controllerアノテーションはこのクラスがコントローラ、UIからの入力に基づいてモデルを操作するオブジェクトであることを示します。

greetingメソッドに付けられている@GetMappingアノテーションは、/greetingへのhttp-getリクエストを検出するとgreetingメソッドが起動することを示しています。

greetingメソッドの2個の引数の1個目は@RequestParamアノテーションが付けられているので、httpリクエストのクエリ文字列の解釈結果が設定される引数になります。なお、ここの@RequestParamアノテーションはnameというクエリが省略可能で、省略時にはWorldが設定されることを示しています。

2個目の引数は実体としてよくわからないものですが、モデルの属性を保持するものだそうです。チュートリアルの説明を見る限りはビューテンプレート (thymeleaf) から参照できる属性を保持するもののようです。リファレンスに書かれているModelインタフェースの説明でも連想配列として属性を保持するものと書かれています。

いかんせんthymeleafとの接続はブラックボックスの中なので、ここではそういうものとしておきます。

さて、コード本体の1行目は"name"属性にname引数で与えられた値を設定しています。Webテンプレートはこの値を参照してページを生成しているので、modelを通してWebテンプレートとの通信が行われていることがわかります。

2行目のreturn文は使用するテンプレートファイルを指示しているようです。文字列"greeting”を返しているので、thymeleafはこれをgreeting.htmlと解釈してテンプレートファイルを読み出しているようです。

以上、最も簡単なWebアプリケーションチュートリアルを見てみました。

とりあえず脊髄反射で動作するWebアプリケーション、例えば現在時刻を表示するといったものであれば本当に簡単に作れそうということがわかりました。

また、httpリクエストとメソッドの結合は実行時に行われるので、httpリクエストごとに別々に開発するといったことが可能になっている事もわかりました。

もちろん、きちんとしたWebアプリケーションを作るには例えばデータベースへのアクセスとか、表示デバイスに合わせた最適化といった対応が必要になるので、世の中そう簡単ではないとは思いますが…。


bewise.jp

Be Wise: 賢くなろうということ

0コメント

  • 1000 / 1000