検索

第1章 アプリケーションの開発

download PDF

1.1. はじめに

1.1.1. Red Hat JBoss Enterprise Application Platform 7 について

Red Hat JBoss Enterprise Application Platform 7 (JBoss EAP) は、オープンな標準に基いて構築され、Java Enterprise Edition 7 の仕様に準拠するミドルウェアプラットフォームです。メッセージングや高可用性クラスタリングなどの技術と WildFly Application Server 10 が統合されます。

JBoss EAP には、必要な場合にだけサービスを有効にできるモジュール構造が含まれ、サービスの起動時間が短縮されます。

管理コンソールと管理コマンドラインインターフェース (CLI) では、XML 設定ファイルの編集が不要になり、タスクをスクリプト化および自動化する機能が追加されました。

JBoss EAP は、JBoss EAP インスタンスに対してスタンドアロンサーバーと管理対象ドメインの 2 つの操作モードを提供します。スタンドアロンサーバー操作モードでは、実行している JBoss EAP を 1 つのサーバーインスタンスとして表します。管理対象ドメイン操作モードでは、1 つの制御ポイントから複数の JBoss EAP インスタンスを管理できます。

また、JBoss EAP には、セキュアでスケーラブルな Java EE アプリケーションの迅速な開発を可能にする API と開発フレームワークが含まれます。

1.2. Java Enterprise Edition 7 について

1.2.1. EE 7 プロファイルの概要

Java Enterprise Edition 7 (EE 7) には、複数のプロファイルのサポート (つまり、API のサブセット) が含まれます。EE 7 の仕様で定義されるプロファイルは、Full Profile と Web Profile の 2 つのみです。

EE 7 の Full Profile には、EE 7 の仕様に含まれるすべての API と仕様が含まれます。EE 7 の Web Profile には、Web 開発者に役立つよう設計された特別な API のサブセットが含まれます。

JBoss EAP は、Java Enterprise Edition 7 の Full Profile および Web Profile 仕様の認定実装です。

Java Enterprise Edition 7 の Web Profile

Web Profile は、Java Enterprise Edition 7 仕様で定義されている 2 つのプロファイルの 1 つであり、Web アプリケーション開発向けに設計されています。Web Profile は以下の API をサポートします。

  • Java EE 7 Web Profile の要件:

    • Java Platform、Enterprise Edition 7
  • Java Web テクノロジー:

    • Servlet 3.1 (JSR 340)
    • JSP 2.3
    • Expression Language (EL) 3.0
    • JavaServer Faces (JSF) 2.2 (JSR 344)
    • JSP 1.2 向け Java Standard Tag Library (JSTL)
    • 他言語のデバッグサポート 1.0 (JSR 45)
  • エンタープライズアプリケーションテクノロジー:

    • Contexts and Dependency Injection (CDI) 1.1 (JSR 346)
    • Dependency Injection for Java 1.0 (JSR 330)
    • Enterprise JavaBeans 3.2 Lite (JSR 345)
    • Java Persistence API 2.1 (JSR 338)
    • Java Platform 1.1 向けの共通アノテーション (JSR 250)
    • Java Transaction API (JTA) 1.2 (JSR 907)
    • Bean Validation 1.1 (JSR 349)

Java EE 7 の仕様で定義されている他のプロファイルは Full Profile であり、他の複数の API を含みます。

Java Enterprise Edition 7 の Full Profile

Java Enterprise Edition 7 (EE 7) の仕様により、プロファイルの概念が定義され、それらのプロファイルの 2 つが仕様の一部として定義されます。Full Profile は次の API と、Java Enterprise Edition 7 Web Profile でサポートされいている API をサポートします。

  • EE 7 Full Profile に含まれる API:

    • Batch 1.0
    • JSON-P 1.0
    • Concurrency 1.0
    • WebSocket 1.1
    • JMS 2.0
    • JPA 2.1
    • JCA 1.7
    • JAX-RS 2.0
    • JAX-WS 2.2
    • Servlet 3.1
    • JSF 2.2
    • JSP 2.3
    • EL 3.0
    • CDI 1.1
    • CDI Extensions
    • JTA 1.2
    • Interceptors 1.2
    • Common Annotations 1.1
    • Managed Beans 1.0
    • EJB 3.2
    • Bean Validation 1.1

1.3. 開発環境のセットアップ

1.3.1. JBoss Developer Studio のダウンロード

JBoss Developer Studio は Red Hat カスタマーポータルからダウンロードできます。

  1. Red Hat カスタマーポータルにログインします。
  2. ダウンロードをクリックします。
  3. 製品のダウンロードリストで Red Hat JBoss Developer Studio をクリックします。
  4. Version ドロップダウンメニューで希望のバージョンを選択します。

    注記

    JBoss Developer Studio バージョン 9.1 以上の使用が推奨されます。

  5. 表で Red Hat JBoss Developer Studio 9.x.x Stand-alone Installer を見つけ、Download をクリックします。
  6. JAR ファイルを希望のディレクトリーに保存します。

1.3.2. JBoss Developer Studio のインストール

  1. ターミナルを開き、ダウンロードした JAR ファイルが含まれるディレクトリーに移動します。
  2. 次のコマンドを実行して GUI インストールプログラムを起動します。

    $ java -jar jboss-devstudio-BUILD_VERSION-installer-standalone.jar
    注記

    または、JAR ファイルをダブルクリックしてインストールプログラムを起動することもできます。

  3. Next をクリックしてインストールプロセスを開始します。
  4. I accept the terms of this license agreement (ライセンス契約の内容に同意します) を選択し、Next をクリックします。
  5. インストールパスを調整し、Next をクリックします。

    注記

    インストールパスフォルダーが存在しない場合は、メッセージが表示されます。OK をクリックしてフォルダーを作成します。

  6. JVM を選択するか、デフォルトの JVM を選択したままにし、Next をクリックします。
  7. プラットフォームとサーバーの選択を要求されたら、Next をクリックします。
  8. インストールの詳細を確認し、Next をクリックします。
  9. インストールプロセスが完了したら Next をクリックします。
  10. JBoss Developer Studio のデスクトップショートカットを設定し、Next をクリックします。
  11. Done をクリックします。

1.3.3. JBoss Developer Studio の起動

JBoss Developer Studio を起動するには、インストール中に作成されたデスクトップショートカットをダブルクリックするか、コマンドラインから起動します。コマンドラインを使用して JBoss Developer Studio を起動するには、以下の手順に従います。

  1. ターミナルを開き、JBoss Developer Studio インストールディレクトリーに移動します。
  2. 次のコマンドを実行して JBoss Developer Studio を起動します。

    $ ./jbdevstudio
    注記

    Windows Server の場合は jbdevstudio.bat ファイルを使用します。

1.3.4. JBoss EAP サーバーを JBoss Developer Studio へ追加

この手順では、JBoss EAP サーバーが JBoss Developer Studio に追加されていないことを前提とします。以下の手順に従い、Define New Server ウィザードを使用して JBoss EAP サーバーを追加します。

  1. Servers タブを開きます。

    注記

    Servers タブが表示されていない場合は、Window Show View Servers と選択してパネルに追加します。

  2. No servers are available. Click this link to create a new server (使用できるサーバーがありません。このリンクをクリックして新しいサーバーを作成してください) のリンクをクリックします。

    図1.1 新しいサーバーの追加

    The *Servers* tab when no servers are available.
  3. Red Hat JBoss Middleware を展開し、JBoss Enterprise Application Platform 7.0 を選択します。サーバー名 (例: JBoss EAP 7.0) を入力し、Next をクリックします。

    図1.2 新しいサーバーの定義

    The *Define a New Server* window.
  4. サーバーアダプターを作成し、サーバーの起動と停止を管理します。デフォルトの値のままにし、Next をクリックします。

    図1.3 新しいサーバーアダプターの作成

    The *Create a New Server Adapter* window.
  5. 名前 (例: JBoss EAP 7.0 Runtime) を入力します。Home Directory の横にある Browse をクリックし、JBoss EAP のインストールディレクトリーに移動します。次に、Next をクリックします。

    図1.4 新しいサーバーランタイム環境の追加

    The *JBoss Runtime* window.
    注記

    一部のクイックスタートでは、異なるプロファイルまたは追加の引数を使用してサーバーを起動する必要があります。たとえば、full プロファイルが必要なクイックスタートをデプロイするには、新しいサーバーを定義し、Configuration file フィールドで standalone-full.xml を指定する必要があります。新しいサーバーにはその内容を表す名前を付けてください。

  6. 新しいサーバーの既存プロジェクトを設定します。この時点ではプロジェクトは存在しないため Finish をクリックします。

    図1.5 新しいサーバーのリソースの変更

    The *Add and Remove Resources* window.

JBoss EAP 7.0 サーバーが Servers タブにリストされます。

図1.6 サーバーリスト

The *Servers* tab when the `JBoss EAP 7.0` server is listed.

1.4. クイックスタートサンプルの使用

1.4.1. Maven について

Apache Maven は、ソフトウェアプロジェクトの作成、管理、および構築を行う Java アプリケーションの開発で使用される分散型ビルド自動化ツールです。Maven は Project Object Model (POM) と呼ばれる標準の設定ファイルを利用して、プロジェクトの定義や構築プロセスの管理を行います。POM はモジュールやコンポーネントの依存関係、ビルドの順番、結果となるプロジェクトパッケージングのターゲットを定義し、XML ファイルを使用して出力します。この結果、プロジェクトが適切かつ統一された状態で構築されるようになります。

Maven は、リポジトリーを使用してアーカイブを行います。Maven リポジトリーには Java ライブラリー、プラグイン、およびその他のビルドアーティファクトが格納されています。デフォルトのパブリックリポジトリーは Maven 2 Central Repository ですが、複数の開発チームの間で共通のアーティファクトを共有する目的で、社内のプライベートおよび内部リポジトリーとすることが可能です。また、サードパーティーのリポジトリーも利用できます。詳細については、Apache Maven プロジェクトおよび Introduction to Repositories ガイドを参照してください。

JBoss EAP には、Java EE 開発者が JBoss EAP 6 でアプリケーションを構築する際に一般的に使用する要件の多くを含む Maven リポジトリーが含まれます。

詳細については、Using Maven with JBoss EAP を参照してください。

1.4.1.1. クイックスタートを用いた Maven の使用

アプリケーションをビルドし、JBoss EAP 7 にデプロイするのに必要なアーティファクトと依存関係はパブリックリポジトリーでホストされます。JBoss EAP 7 のクイックスタートでは、Maven settings.xml ファイルを設定して、クイックスタートをビルドするときにこれらのリポジトリーを使用する必要がなくなりました。Maven リポジトリーはクイックスタートプロジェクト POM ファイルに設定されるようになりました。この設定方法は、クイックスタートを容易に使えるようにするために提供されますが、ビルドの処理が遅くなる可能性があるため、通常は本番プロジェクトでの使用は推奨されません。

Red Hat JBoss Developer Studio には Maven が含まれるため、個別にダウンロードおよびインストールする必要はありません。JBoss Developer Studio バージョン 9.1 以上を使用することが推奨されます。

Maven コマンドラインを使用してアプリケーションをビルドおよびデプロイする場合は、最初に Apache Maven プロジェクトから Maven をダウンロードし、Maven のドキュメントに記載されている手順に従ってインストールします。

1.4.2. クイックスタートコードサンプルのダウンロードおよび実行

1.4.2.1. クイックスタートのダウンロード

JBoss EAP には、さまざまな Java EE 7 の技術を使用してアプリケーションを作成するのに役立つ包括的なクイックスタートコードサンプルセットが含まれています。クイックスタートは Red Hat カスタマーポータルからダウンロードできます。

  1. Red Hat カスタマーポータルにログインします。
  2. ダウンロードをクリックします。
  3. 製品のダウンロードリストで Red Hat JBoss Enterprise Application Platform をクリックします。
  4. Version ドロップダウンメニューで希望のバージョンを選択します。
  5. 表で Red Hat JBoss Enterprise Application Platform 7.0.0 Quickstarts を見つけ、Download をクリックします。
  6. ZIP ファイルを希望のディレクトリーに保存します。
  7. Zip ファイルを展開します。

1.4.2.2. JBoss Developer Studio でのクイックスタートの実行

クイックスタートがダウンロードされたら、JBoss Developer Studio にインポートし、JBoss EAP にデプロイできます。

クイックスタートの JBoss Developer Studio へのインポート

各クイックスタートには、プロジェクトおよび設定情報が含まれる POM ファイルが同梱されています。この POM ファイルを使用すると、簡単にクイックスタートを JBoss Developer Studio にインポートできます。

重要

JBoss Developer Studio へのインポート時にクイックスタートプロジェクトフォルダーが IDE ワークスペース内にある場合は、IDE により無効なプロジェクト名と WAR アーカイブ名が生成されます。作業を開始する前に、クイックスタートプロジェクトフォルダーが IDE ワークスペースの外部にあることを確認してください。

  1. JBoss Developer Studio を起動します。
  2. File Import と選択します。
  3. Maven Existing Maven Projects と選択し、Next をクリックします。

    図1.7 既存の Maven プロジェクトのインポート

    The *Import* window.
  4. 希望のクイックスタートのディレクトリー (helloworld など) を参照し、OK をクリックします。Projects リストボックスに、選択したクイックスタートプロジェクトの pom.xml ファイルが示されます。

    図1.8 Maven プロジェクトの選択

    The *Maven Projects* selection window.
  5. Finish をクリックします。

helloworld クイックスタートの実行

helloworld クイックスタートを実行すると、JBoss EAP サーバーが適切に設定および実行されたことを簡単に検証できます。

  1. サーバーを定義していない場合は、JBoss EAP サーバーを JBoss Developer Studio へ追加します。
  2. Project Explorer タブの jboss-helloworld プロジェクトを右クリックし、Run As Run on Server と選択します。

    図1.9 Run As - Run on Server

    The *Run As* -> *Run on Server* screen capture.
  3. リストから JBoss EAP 7.0 を選択し、Next をクリックします。

    図1.10 Run on Server

    The *Run on Server* window.
  4. jboss-helloworld クイックスタートはすでにリストされ、サーバー上で設定できる状態です。Finish をクリックしてクイックスタートをデプロイします。

    図1.11 サーバーで設定されたリソースの変更

    The *Add and Remove Resources* window.
  5. 結果を検証します。

    • Server タブで、JBoss EAP 7.0 サーバーの状態が Started に変わります。
    • Console タブに、JBoss EAP サーバーの起動と helloworld クイックスタートのデプロイメントに関するメッセージが表示されます。

      WFLYUT0021: Registered web context: /jboss-helloworld
      WFLYSRV0010: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
    • helloworld アプリケーションは http://localhost:8080/jboss-helloworld で使用でき、Hello World! というテキストが表示されます。

bean-validation クイックスタートの実行

bean-validation などの一部のクイックスタートは、機能のデモを行うためにユーザーインターフェースレイヤーの代わりに Arquillian テストを提供します。

  1. bean-validation クイックスタートを JBoss Developer Studio にインポートします。
  2. Servers サーバータブでサーバーを右クリックし、Start を選択して JBoss EAP サーバーを起動します。Servers タブが表示されない場合や、サーバーが定義されていない場合は、JBoss EAP サーバーを Red Hat JBoss Developer Studio へ追加してください。
  3. Project Explorer タブで jboss-bean-validation プロジェクトを右クリックし、Run As Maven Build と選択します。
  4. 以下の内容を Goals 入力フィールドに入力し、Run を実行します。

    clean test -Parq-wildfly-remote

    図1.12 設定の編集

    The *Edit Configuration* window.
  5. 結果を検証します。

    Console タブに bean-validation Arquillian テストの結果が表示されます。

    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running org.jboss.as.quickstarts.bean_validation.test.MemberValidationTest
    Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.189 sec
    
    Results :
    
    Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
    
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------

1.4.2.3. コマンドラインでのクイックスタートの実行

Maven を使用すると、コマンドラインから簡単にクイックスタートをビルドおよびデプロイできます。Maven がインストールされていない場合は Apache Maven プロジェクトを参照し、ダウンロードとインストールを行ってください。

README.md ファイルは、システム要件、Maven の設定、ユーザーの追加、およびクイックスタートの実行に関する一般的な情報が含まれるクイックスタートのルートディレクトリーにあります。

各クイックスタートには、クイックスタートを実行するための特定の手順と Maven コマンドを提供する独自の README.md ファイルも含まれます。

コマンドラインでの helloworld クイックスタートの実行

  1. helloworld クイックスタートのルートディレクトリーにある README.md ファイルを確認します。
  2. JBoss EAP サーバーを起動します。

    $ EAP_HOME/bin/standalone.sh
  3. helloworld クイックスタートディレクトリーへ移動します。
  4. クイックスタートの README.md ファイルにある Maven コマンドを使用して、クイックスタートをビルドおよびデプロイします。

    mvn clean install wildfly:deploy
  5. helloworld アプリケーションは http://localhost:8080/jboss-helloworld で使用でき、Hello World! というテキストが表示されます。

1.4.3. クイックスタートチュートリアルの確認

1.4.3.1. helloworld クイックスタート

helloworld クイックスタートは JBoss EAP に単純なサーブレットをデプロイする方法を示します。ビジネスロジックは CDI (Contexts and Dependency Injection: コンテキストと依存関係の挿入) Bean として提供されるサービスにカプセル化され、サーブレットに挿入されます。このクイックスタートに基づいて、サーバーを適切に設定および起動することができます。

コマンドラインを使用してこのクイックスタートをビルドしデプロイする手順の詳細については、helloworld クイックスタートディレクトリーのルートにある README.html ファイルを参照してください。このトピックでは、Red Hat JBoss Developer Studio を使用してクイックスタートを実行する方法を説明します (Red Hat JBoss Developer Studio がインストールされ、Maven が設定された状態で helloworld クイックスタートがインポートされ、正常に実行されたことを前提とします)。

前提条件
ディレクトリー構造の確認

helloworld クイックスタートのコードは QUICKSTART_HOME/helloworld ディレクトリーにあります。helloworld クイックスタートはサーブレットと CDI Bean によって構成されます。また、バージョン番号が 1.1 であり、bean-discovery-modeall であるアプリケーションの WEB-INF ディレクトリーに beans.xml ファイルが含まれます。このマーカーファイルにより、WAR が Bean アーカイブとして識別され、JBoss EAP がこのアプリケーションで Bean を検索し、CDI をアクティベートするよう指示されます。

src/main/webapp/ ディレクトリーには、クイックスタートのファイルが含まれます。このサンプルのすべての設定ファイルは、src/main/webapp/ 内の WEB-INF/ ディレクトリー (beans.xml ファイルが含まれる) にあります。また、src/main/webapp/ ディレクトリーには、http://localhost:8080/jboss-helloworld/HelloWorld にあるサーブレットにユーザーのブラウザーをリダイレクトするために単純なメタ更新を使用する index.html ファイルも含まれます。クイックスタートは web.xml ファイルを必要としません。

コードの確認

パッケージの宣言とインポートはこれらのリストには含まれていません。完全なリストはクイックスタートのソースコードにあります。

  1. HelloWorldServlet コードを確認します。

    HelloWorldServlet.java ファイルは src/main/java/org/jboss/as/quickstarts/helloworld/ ディレクトリーにあります。このサーブレットが情報をブラウザーに送ります。

    HelloWorldServlet クラスコードサンプル

    42 @SuppressWarnings("serial")
    43 @WebServlet("/HelloWorld")
    44 public class HelloWorldServlet extends HttpServlet {
    45
    46     static String PAGE_HEADER = "<html><head><title>helloworld</title></head><body>";
    47
    48     static String PAGE_FOOTER = "</body></html>";
    49
    50     @Inject
    51	   HelloService helloService;
    52
    53     @Override
    54     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    55         resp.setContentType("text/html");
    56         PrintWriter writer = resp.getWriter();
    57         writer.println(PAGE_HEADER);
    58         writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>");
    59         writer.println(PAGE_FOOTER);
    60         writer.close();
    61     }
    62
    63 }

    表1.1 HelloWorldServlet の詳細
    注記

    43

    必要な作業は @WebServlet アノテーションを追加し、サーブレットにアクセスするために使用する URL にマッピングを提供するだけです。

    46〜48

    各 Web ページには適切な形式の HTML が必要になります。本クイックスタートは静的な文字列を使用して最低限のヘッダーとフッターの出力を書き出します。

    50〜51

    これらの行は、実際のメッセージを生成する HelloService CDI Bean を挿入します。HelloService の API を変更しない限り、ビューレイヤーを変更せずに HelloService の実装を後で変更することが可能です。

    58

    この行はサービスを呼び出し、「Hello World」というメッセージを生成して HTTP 要求へ書き出します。

  2. HelloService コードを確認します。

    HelloService.java ファイルは src/main/java/org/jboss/as/quickstarts/helloworld/ ディレクトリーにあります。このサービスは単にメッセージを返します。XML やアノテーションの登録は必要ありません。

    HelloService クラスコードサンプル

    public class HelloService {
    
        String createHelloMessage(String name) {
            return "Hello " + name + "!";
        }
    }

1.4.3.2. numberguess クイックスタート

numberguess クイックスタートは単純な非永続アプリケーションを作成し、JBoss EAP にデプロイする方法を示します。情報は JSF ビューを使用して表示され、ビジネスロジックは 2 つの CDI Bean にカプセル化されます。numberguess クイックスタートでは 1 から 100 までの数字を当てるチャンスが 10 回与えられます。数字を選択した後、その数字が正解の数字よりも大きいかまたは小さいかが表示されます。

numberguess クイックスタートのコードは QUICKSTART_HOME/numberguess ディレクトリーにあります (QUICKSTART_HOME は JBoss EAP クイックスタートをダウンロードし、展開したディレクトリー)。numberguess クイックスタートは複数の Bean、設定ファイル、および Facelets (JSF) ビューによって構成され、 WAR モジュールとしてパッケージ化されます。

コマンドラインを使用してこのクイックスタートをビルドしデプロイする手順の詳細については、numberguess クイックスタートディレクトリーのルートにある README.html ファイルを参照してください。以下の例では、Red Hat JBoss Developer Studio を使用してクイックスタートを実行します。

前提条件
設定ファイルの確認

この例のすべての設定ファイルは、クイックスタートの QUICKSTART_HOME/numberguess/src/main/webapp/WEB-INF/ ディレクトリーにあります。

  1. faces-config.xml ファイルを確認します。

    本クイックスタートは faces-config.xml ファイル名の JSF 2.2 バージョンを使用します。Facelets の標準的なバージョンが JSF 2.2 のデフォルトのビューハンドラーであるため、設定は必要ありません。このファイルはルート要素のみで構成され、JSF をアプリケーションで有効にする必要があることを示すマーカーファイルにすぎません。

    <faces-config version="2.2"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
          http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
    
    </faces-config>
  2. beans.xml ファイルを確認します。

    beans.xml ファイルには、1.1 のバージョン番号と allbean-discovery-mode が含まれます。このファイルは、WAR を Bean アーカイブとして識別し、JBoss EAP がこのアプリケーションで Bean を検索し、CDI をアクティベートするよう指示するマーカーファイルです。

    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
          http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
        bean-discovery-mode="all">
    </beans>
注記

このクイックスタートは web.xml ファイルを必要としません。

1.4.3.2.1. JSF コードの確認

JSF はソースファイルに .xhtml ファイル拡張子を使用しますが、レンダリングされたビューは .jsf 拡張子で提供されます。home.xhtml ファイルは src/main/webapp/ ディレクトリーにあります。

JSF ソースコード

19<html xmlns="http://www.w3.org/1999/xhtml"
20	xmlns:ui="http://java.sun.com/jsf/facelets"
21	xmlns:h="http://java.sun.com/jsf/html"
22	xmlns:f="http://java.sun.com/jsf/core">
23
24	<head>
25	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
26	<title>Numberguess</title>
27	</head>
28
29	<body>
30	<div id="content">
31		<h1>Guess a number...</h1>
32		<h:form id="numberGuess">
33
34		<!-- Feedback for the user on their guess -->
35	<div style="color: red">
36		<h:messages id="messages" globalOnly="false" />
37		<h:outputText id="Higher" value="Higher!"
38 		  rendered="#{game.number gt game.guess and game.guess ne 0}" />
39		<h:outputText id="Lower" value="Lower!"
40		   rendered="#{game.number lt game.guess and game.guess ne 0}" />
41	</div>
42
43	<!-- Instructions for the user -->
44	<div>
45	I'm thinking of a number between <span
46	id="numberGuess:smallest">#{game.smallest}</span> and <span
47	id="numberGuess:biggest">#{game.biggest}</span>. You have
48	#{game.remainingGuesses} guesses remaining.
49	</div>
50
51	<!-- Input box for the users guess, plus a button to submit, and reset -->
52	<!-- These are bound using EL to our CDI beans -->
53	<div>
54	Your guess:
55	<h:inputText id="inputGuess" value="#{game.guess}"
56		required="true" size="3"
57		disabled="#{game.number eq game.guess}"
58		validator="#{game.validateNumberRange}" />
59		<h:commandButton id="guessButton" value="Guess"
60			action="#{game.check}"
61			disabled="#{game.number eq game.guess}" />
62	</div>
63	<div>
64	<h:commandButton id="restartButton" value="Reset"
65	action="#{game.reset}" immediate="true" />
66	</div>
67	</h:form>
68
69	</div>
70
71	<br style="clear: both" />
72
73	</body>
74</html>

以下の行番号は、JBoss Developer Studio でファイルを表示するときに示されるものに対応します。

表1.2 JSF の詳細
注記

36〜40

これらはユーザーに送信できるメッセージ、「Higher」(より大きい) と「Lower」(より小さい) です。

45〜48

ユーザーが数を選択するごとに数字の範囲が狭まります。有効な数の範囲が分かるようにこの文章は変更されます。

55〜58

この入力フィールドは値式を使用して Bean プロパティーにバインドされます。

58

ユーザーが誤って範囲外の数字を入力しないようにバリデーターのバインディングが使用されます。バリデーターがないと、ユーザーが範囲外の数字を使用する可能性があります。

59〜61

ユーザーの選択した数字をサーバーに送る方法がなければなりません。ここでは、Bean 上のアクションメソッドをバインドします。

1.4.3.2.2. クラスファイルの確認

numberguess クイックスタートのソースファイルはすべて QUICKSTART_HOME/numberguess/src/main/java/org/jboss/as/quickstarts/numberguess/ ディレクトリーにあります。パッケージの宣言とインポートはリストには含まれていません。完全なリストはクイックスタートのソースコードにあります。

  1. Random.java 修飾子コードの検証

    型に基づき挿入の対象となる 2 つの Bean を明確に区別するために修飾子が使用されます。修飾子の詳細については、修飾子を使用したあいまいな挿入の解決を参照してください。 ランダムな数字を挿入するには @Random 修飾子が使用されます。

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface Random {
    
    }
  2. MaxNumber.java 修飾子コードの検証

    @MaxNumber qualifier は最大許可数の挿入に使用されます。

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    @Retention(RUNTIME)
    @Documented
    @Qualifier
    public @interface MaxNumber {
    }
  3. Generator.java コードの検証

    Generator クラスは、producer メソッドを介して乱数を作成し、producer メソッドを介して最大可能数を公開します。このクラスはアプリケーションスコープであるため、毎回異なる乱数になることはありません。

    @SuppressWarnings("serial")
    @ApplicationScoped
    public class Generator implements Serializable {
    
        private java.util.Random random = new java.util.Random(System.currentTimeMillis());
    
        private int maxNumber = 100;
    
        java.util.Random getRandom() {
            return random;
        }
    
        @Produces
        @Random
        int next() {
            // a number between 1 and 100
            return getRandom().nextInt(maxNumber - 1) + 1;
        }
    
        @Produces
        @MaxNumber
        int getMaxNumber() {
            return maxNumber;
        }
    }
  4. Game.java コードの検証

    セッションスコープのクラス Game は、アプリケーションのプライマリーエントリーポイントであり、ゲームの設定や再設定、ユーザーが選択する数字のキャプチャーや検証、FacesMessage によるユーザーへのフィードバック提供を行います。コンストラクト後の lifecycle メソッドを使用し、@Random Instance`<Integer>` Bean から乱数を取得することによりゲームを初期化します。

    このクラスの @Named アノテーションを見てください。このアノテーションは式言語 (EL) を使用して Bean が JSF ビューにアクセスできるようにしたい場合のみ必要です。この場合 #{game} が EL になります。

    @SuppressWarnings("serial")
    @Named
    @SessionScoped
    public class Game implements Serializable {
    
        /**
         * The number that the user needs to guess
         */
        private int number;
    
        /**
         * The users latest guess
         */
        private int guess;
    
        /**
         * The smallest number guessed so far (so we can track the valid guess range).
         */
        private int smallest;
    
        /**
         * The largest number guessed so far
         */
        private int biggest;
    
        /**
         * The number of guesses remaining
         */
        private int remainingGuesses;
    
        /**
         * The maximum number we should ask them to guess
         */
        @Inject
        @MaxNumber
        private int maxNumber;
    
        /**
         * The random number to guess
         */
        @Inject
        @Random
        Instance<Integer> randomNumber;
    
        public Game() {
        }
    
        public int getNumber() {
            return number;
        }
    
        public int getGuess() {
            return guess;
        }
    
        public void setGuess(int guess) {
            this.guess = guess;
        }
    
        public int getSmallest() {
            return smallest;
        }
    
        public int getBiggest() {
            return biggest;
        }
    
        public int getRemainingGuesses() {
            return remainingGuesses;
        }
    
        /**
         * Check whether the current guess is correct, and update the biggest/smallest guesses as needed. Give feedback to the user
         * if they are correct.
         */
        public void check() {
            if (guess > number) {
                biggest = guess - 1;
            } else if (guess < number) {
                smallest = guess + 1;
            } else if (guess == number) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Correct!"));
            }
            remainingGuesses--;
        }
    
        /**
         * Reset the game, by putting all values back to their defaults, and getting a new random number. We also call this method
         * when the user starts playing for the first time using {@linkplain PostConstruct @PostConstruct} to set the initial
         * values.
         */
        @PostConstruct
        public void reset() {
            this.smallest = 0;
            this.guess = 0;
            this.remainingGuesses = 10;
            this.biggest = maxNumber;
            this.number = randomNumber.get();
        }
    
        /**
         * A JSF validation method which checks whether the guess is valid. It might not be valid because there are no guesses left,
         * or because the guess is not in range.
         *
         */
        public void validateNumberRange(FacesContext context, UIComponent toValidate, Object value) {
            if (remainingGuesses <= 0) {
                FacesMessage message = new FacesMessage("No guesses left!");
                context.addMessage(toValidate.getClientId(context), message);
                ((UIInput) toValidate).setValid(false);
                return;
            }
            int input = (Integer) value;
    
            if (input < smallest || input > biggest) {
                ((UIInput) toValidate).setValid(false);
    
                FacesMessage message = new FacesMessage("Invalid guess");
                context.addMessage(toValidate.getClientId(context), message);
            }
        }
    }

1.5. デフォルトの Welcome Web アプリケーションの設定

JBoss EAP には、デフォルトでポート 8080 のルートコンテキストで表示される Welcome アプリケーションが含まれます。

このデフォルトの Welcome アプリケーションは、独自の Web アプリケーションで置き換えることができます。これは、以下の 2 つのいずれかの方法で設定できます。

Welcome コンテンツを無効にすることもできます。

welcome-content ファイルハンドラーの変更

新しいデプロイメントを参照する、既存の welcome-content ファイルハンドラーのパスを変更します。

/subsystem=undertow/configuration=handler/file=welcome-content:write-attribute(name=path,value="/path/to/content")
注記

または、サーバーのルートにより使用される異なるファイルハンドラーを作成することもできます。

/subsystem=undertow/configuration=handler/file=NEW_FILE_HANDLER:add(path="/path/to/content")
/subsystem=undertow/server=default-server/host=default-host/location=\/:write-attribute(name=handler,value=NEW_FILE_HANDLER)

変更を反映するためにサーバーをリロードします。

reload

default-web-module の変更

デプロイされた Web アプリケーションをサーバーのルートにマップします。

/subsystem=undertow/server=default-server/host=default-host:write-attribute(name=default-web-module,value=hello.war)

変更を反映するためにサーバーをリロードします。

reload

デフォルトの Welcome Web アプリケーションの無効化

default-hostlocation エントリー (/) を削除して welcome アプリケーションを無効にします。

/subsystem=undertow/server=default-server/host=default-host/location=\/:remove

変更を反映するためにサーバーをリロードします。

reload
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.