ManagedBeanの作成
まずは、これらの機能を実装するManagedBeanを作成します。
package sample.beans;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Named;
// ManagedBean宣言。名前を指定していない場合はクラス名。
@Named(value = "number") …(1)
// セッションスコープ。このManagedBeanはセッション管理になる。
@SessionScoped …(2)
public class NumberGame implements Serializable {
// 定数定義。メッセージ用定義をしている。
public static final String MESSAGE_CORRECT = "正解です!";
public static final String MESSAGE_WRONG = "違います";
/** 正解となる番号 */
private int number;
/** 予想で入力した値 */
private int guess;
/** 入力できる最小値 */
private int smallest;
/** 入力できる最大値 */
private int biggest;
/** 結果メッセージ */
private String message;
/** 残り解答回数 */
private int remainingGuesses;
/** 初期最大値。限定子MaxNumberによってDIされる。 */
@MaxNumber …(3)
@Inject …(3)
private int maxNumber;
/** 乱数値。限定子RandomによってDIされる。 */
@Random …(4)
@Inject …(4)
Instance<Integer> randomNumber;
/**
* 予想された入力値が当たっているかをチェックする。
* @throws InterruptedException
*/
public void check() throws InterruptedException { …(5)
if (guess > number) {
// 予想値が正解より大きかったときは、
// 次回入力可能な最大値=予想値-1とする。
biggest = guess - 1;
}
if (guess < number) {
// 予想値が正解より小さかったときは、
// 次回入力可能な最小値=予想値+1とする。
smallest = guess + 1;
}
if (guess == number) {
// 予想があたったので、正解メッセージを返す
message = MESSAGE_CORRECT;
} else {
// 予想が間違っていたので残り予想回数を-1して、
// 間違いのメッセージを返す。
remainingGuesses--;
message = MESSAGE_WRONG;
}
// 初期化処理。
if (NumberGame.MESSAGE_CORRECT.equals(message)) {
// 正解したのでリセット
reset();
} else if (getRemainingGuesses() == 0) {
// 回答回数が0になった場合の処理
message = "残り回数がなくなりました。正解は" + getNumber() + "でした。";
reset();
}
}
/**
* リセット時の処理。PostConstructで、
* ManagedBeanが設定されたスコープで、
* 初回リクエストを受けて起動する際の初期化処理として動く。
*/
@PostConstruct …(6)
public void reset() {
this.smallest = 0;
this.guess = 0;
this.remainingGuesses = 10;
this.biggest = maxNumber;
this.number = randomNumber.get();
}
// 以降、フィールドのget/set
public int getNumber() {
return number;
}
…(省略)…
}
(1)@Named(value="number")と宣言することでCDI管理のManagedBeanとなります。参照する際にはvalue属性で指定したnumberの名前で指定します。実際に指定する方法については画面を作成するところで解説します。
(2)ManagedBeanのスコープを設定します。@SessionScopedで指定しているためセッション管理になり、クライアントのセッション単位で動作します。
(3)(4)にて、フィールドの値を@Injectで外部クラスから取得するよう宣言します。さらに@MaxNumberや@Randomの2つのアノテーションは限定子を指定しています。
(5)入力された値と乱数値があっているかを判定するメソッドです。もし不正解だった場合には、入力された値に応じて次に入力する最小値や最大値を変化させます。
(6)@PostConstructはこのManagedBeanの初期化処理を実行するメソッドを指定するアノテーションです。
