SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java EE 6 開発入門

CDIを利用したサンプルアプリーケションの作成

JavaEE6 開発入門(7)


ManagedBeanの作成

 まずは、これらの機能を実装するManagedBeanを作成します。

[リスト1]番号合わせアプリケーションのロジックを実装する NumberGame.java
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の初期化処理を実行するメソッドを指定するアノテーションです。

次のページ
アノテーションを詳しく理解しよう

この記事は参考になりましたか?

Java EE 6 開発入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6593 2012/06/10 12:16

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー