Seasar2のサンプルアプリ作成
サンプルアプリの概要
「diconファイルによって注入するクラスを切り替え、その切り替えにより男性用の挨拶文、もしくは女性用の挨拶文を出力するサンプルアプリです。」
[開発環境]
- JDK1.5.0_13
- eclipse3.2
- Tomcat5.5.25(Seasar2はスタンドアローンアプリでも動くのでスタンドアローンアプリの場合は不要)
- Seasar2 2.4.20
- S2.4.20.zipを解凍し、各jarファイルにクラスパスを通す(詳細設定は他サイトを参考にして下さい)。
[用意するもの]
- S2コンテナ(Seasar2のコンテナ)と連携するためのサーブレットアプリもしくはスタンドアローンアプリ
- S2コンテナで注入(インジェクション)するクラス…挨拶文を生成します。
- 自作diconファイル(男性パートタイム社員用:workMan.dicon)
- 自作diconファイル(女性パートタイム社員用:workWoman.dicon)
- 自作diconファイルを切り替えることで、男性社員用、女性社員用の挨拶文を切り替えることができます。
[処理の流れ]
1.社員名入力画面から新規社員名を入力。
↓
2.入力した社員の挨拶が次画面に表示される。社員がどのような挨拶をするかはdiconファイルにより切り替える。男性用と女性用の二パターンを用意。
サーブレットアプリ(プレゼンテーション層の抜粋)
サーブレットを呼び出し、社員を登録します。 <form action="doCallServlet" method="POST"> 社員名:<input type="text" value="" name="message" /> <input type="submit" name="submitmsg" value="社員を登録" /> </form>
サーブレットアプリ(ビジネス層の抜粋)…リクエストとして受け取った社員名を処理します。
public class Manager { // 自作diconファイルの切り替えは、ここの記述を"workMan.dicon"もしくは // "workWoman.dicon"に変えることで行います。 private static final String PATH = "jp/co/infonic/workMan.dicon"; //private static final String PATH = "jp/co/infonic/workWoman.dicon"; /** * @param name ユーザが入力した社員名 */ public String execute(String name) { // S2コンテナからコンポーネントの取得 S2Container container = S2ContainerFactory.create(PATH); PartTimeWorker person = (PartTimeWorker) container.getComponent("worker"); // コンポーネントに社員名をセット person.setName(name); // 社員の挨拶文を取得 String rollMessage = person.getGreeting(); return rollMessage; } }
S2コンテナで注入(インジェクション)するクラス…挨拶文を生成します。
public interface PartTimeWorker { /** * パートタイム労働者の名前をセットします。 * @param name */ public void setName(String name); /** * * 仕事の役割をセットします。 * @param roll 役割名 */ public void setRoll(String roll); /** * 挨拶文を返します。 * @return 挨拶文 */ public String getGreeting(); }
/**
* 男性パートタイム社員を表すクラスです。
*/
public class ManWorker implements PartTimeWorker {
private String name;
private String roll;
// 男性パートタイム社員用の挨拶文を返す。
public String getGreeting() {
return "俺は \"" + this.name + "\" だ。仕事場は \"" + this.roll + "\" だ。よろしく。";
}
public void setName(String name) {
this.name = name;
}
public void setRoll(String roll) {
this.roll = roll;
}
}
/**
* 女性パートタイム社員を表すクラスです。
*/
public class WomanWorker implements PartTimeWorker {
private String name;
private String roll;
public String getGreeting() {
return "私の名前は \"" + this.name + "\" です。私の仕事場は \"" + this.roll + "\" です。";
}
public void setName(String name) {
this.name = name;
}
public void setRoll(String roll) {
this.roll = roll;
}
}
自作diconファイル(男性社員用:workMan.dicon)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd"> <components> <component name="worker" class="jp.co.infonic.worker.ManWorker"> <property name="name">"デフォルト男性社員名"</property>★ManWorkerインスタンスのnameプロパティに注入される。 <property name="roll">"洗い場"</property>★ManWorkerインスタンスのrollプロパティに注入される。 </component> </components>
自作diconファイル(女性社員用:workWoman.dicon)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd"> <components> <component name="worker" class="jp.co.infonic.worker.WomanWorker"> <property name="name">"デフォルト女性社員名"</property>★WomanWorkerインスタンスのnameプロパティに注入される。 <property name="roll">"接客"</property>★WomanWorkerインスタンスのrollプロパティに注入される。 </component> </components>
おまけ:テスト用のモック(実装クラスがなくてもこのdiconファイルがあればテストが可能です)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd"> <components> <component name="worker" class="jp.co.infonic.worker.PartTimeWorker"><!--★インタフェースも可能 --> <aspect> <component class="org.seasar.framework.aop.interceptors.MockInterceptor"> <initMethod name="setReturnValue"> <arg>"getRoll"</arg><!-- メソッド名を指定 --> <arg>"テスト用のダミー挨拶文です。dummy。"</arg> </initMethod> </component> </aspect> </component> </components>