-S06: 車に色を塗る
コンポーネントをコンテナに登録して、後に取得することができました。次の段階として、コンポーネントの設定について説明していきます。Seasar2はコンポーネントの設定がとても柔軟なことに特徴があります。コンポーネントの設定方法には、以下の3通りがあります。
まずは一番初めのプロパティを利用した設定を見ていきましょう。
list06-1. BodyColorプロパティを持つPaintedCar.java package tutorial.org.seasar.console; public class PaintedCar implements Car { private String color = "blue"; public void setBodyColor(String color) { this.color = color; } public void run() { System.out.println("My body color is " + color); } }
Carインターフェイスを実装したPaintedCarクラスは、BodyColorプロパティを持っています。list06-1ではセッターメソッドだけですから、書き込みのみのプロパティです。
list06-2. プロパティ設定を行うcar.xml修正版 <?xml version="1.0" encoding="UTF-8"?> <components> <component class="tutorial.org.seasar.console.PaintedCar"> <property name="bodyColor">'red'</property> </component> </components>
設定XMLでは、<component>エレメントの子要素として<property>が新たに登場しました。この<property>エレメントはプロパティの設定のために用いるもので、その属性nameにプロパティ名、エレメントボディに設定値を記述します。list06-2の場合、"bodyColor"プロパティに"'red'"を設定しています。
実行結果は以下のとおりです。
My body color is red
<property>エレメントボディの設定を変えれば、実行結果も変わることを確認してみてください。
エレメントボディにはSeasar2の式言語であるSel(Seasar expression language)の記法を用います。ここではプロパティ型のStringを表記するため、シングルクォート(「'」)で文字列を囲っています。シングルクォートで囲わないと以下の例外が発生です。
org.seasar.framework.container.IllegalPropertyRuntimeException: [ESSR0059]クラス(tutorial.org.seasar.console.PaintedCar)のプロパティ(bodyColor)の設定に失敗しました。理由はorg.seasar.framework.container.ComponentNotFoundRuntimeException: [ESSR0046]コンポーネント(red)が見つかりません
Selがシングルクォートで囲っていない"red"を他のコンポーネントだと解釈しているためです。コンテナには"red"という名前のコンポーネントを登録してませんので、ComponentNotFoundRuntimeException例外が発生しています。