Seasar2のサンプルアプリ作成

サンプルアプリの概要
「diconファイルによって注入するクラスを切り替え、その切り替えにより男性用の挨拶文、もしくは女性用の挨拶文を出力するサンプルアプリです。」

[開発環境]

[用意するもの]

  • 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>