hello1 のソースファイル
この記事では hello1 プロジェクトのソースファイルの内容を理解する。
対象とするのは下記のファイルとする。
・webapp/WEB-INF の中の web.xml
・webapp の中の index.xhtml と response.xhtml
・src/main/java の下にある Hello.java
hello1 ディレクトリのルートにある pom.xml は、プロジェクト管理ツールとして使用している Maven で使う設定ファイルなのでここでは説明を省く。
web.xml
Jakarta Face のアプリケーションは、Jakarta サーブレットの仕様が定めるウェブアプリケーションに対する要求にも従う。そのため、hell1 プロジェクトにもウェブアプリケーションのリソース配置を記述するXML ドキュメントである web.xml ファイルが含まれている。
hello1 の web.xml ファイルで使われているエレメントをそれぞれ説明していく。
<context-param>
<param-name>jakarta.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
context-param エレメントではアプリケーションの設定に使う各パラメータの値の設定を行う。使用できるパラメータ名はJakarta Faces の仕様書に記載されている。
サブエレメントの <param-name> でパラメータ名を設定する。
サブエレメントの <param-value> でパラメータ値を設定する。
jakarta.faces.PROJECT_STAGE というパラメータは、このアプリケーションが開発サイクルのどの段階にあるのかを示す。
可能な値は Development, UnitTest, SystemTest, Production のいずれか。ここでは Development に設定されている。
この値はJava ソースファイルや、xhtmlウェブページの中で参照して使用することができる。
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
servlet エレメントでは jakarta.faces.webapp.FacesServlet クラスを指定している。このサーブレットクラスは Jakarta Faces アプリケーションのリクエスト処理のライフサイクルを管理するために使われる。
servlet-name は任意の名前で良い。
load-on-startup はウェブコンポーネントの中で初期化される順番を決める。(1から順番に初期化される)
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
servlet-mapping エレメントでは上で定義した Faces Servlet サーブレットがマップされる URL パターンを設定している。
ここでは全ての xhtml ファイルを Jakarta Faces のウェブページとするために *.xhtml としている。
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
セッションがタイムアウトするまでの時間の設定。単位は分。
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
アプリケーションの URL: localhost:8080/hello1/ にアクセスしたときの表示ページの指定。
index.xhtml と response.xhtml
Faces アプリケーションのウェブページはコンポーネントタグを使って記述される。
それぞれのコンポーネントタグはそのタグが属するタグライブラリで定義されている。
この index.xhtml ファイルで使用しているのは「Jakarta Faces 標準HTMLタグライブラリ」のみで、タグに付いている h プレフィックスがこのライブラリのタグであることを表している。
特定のタグライブラリを使うためにはその名前空間を宣言する必要がある。
名前空間に対してプレフィックスを定義する。
標準HTMLタグライブラリの名前空間名は jakarta.faces.html なので、ルートエレメントの xmlns 属性でこの名前空間とプレフィックスを定義している。
(Jakarta Faces の3.0 まではタグライブラリの名前空間名として URL が使われていたが、4.0 ではこのような URN を使うよう変更されている )
プレフィックスなしのデフォルト名前空間に宣言しているのは、このファイルを XHTML ドキュメントとするためのもので、コンポーネントタグとは関係ない。
プレフィックスの付いていないタグは何も処理されずに、そのままレスポンスページに含まれる。(名前空間の宣言方法自体はXMLの仕様に従うものなので、不明点があればそちらを参照のこと)
使用しているコンポーネントタグをそれぞれ見ていく。
<h:head>
レスポンスページの中で <head> エレメントとなる。
<h:body>
レスポンスページの中で <body> エレメントとなる。
<h:form>
レスポンスページの中で <form> エレメントとなる。
method 属性は "post" となる。
<h:graphicImage>
レスポンスページの中で <img> エレメントとなる。
<h:graphicImage url="#{resource['images:duke.waving.gif']}"
alt="Duke waving his hand"/>
url 属性で取得するリソースのURL を設定するが、ここで使用している #{ } の中の
resource はビルドでできるアプリケーションディレクトリのルートにある resouces ディレクトリに対応し、images:duke.waving.gif でその中にある images/duke.waving.gif ファイルを指定している。
<h:inputText>
レスポンスページの中で、type 属性が type="text" の <input> エレメントとなる。
(詳細については下の Hello.java の説明の中で合わせて説明する)
<h:commandButton>
レスポンスページの中で <input> エレメントとなる。
type 属性で "submit"、"button"、 "reset" のいずれかを指定する。(デフォルトは "submit")
1つ目のボタンは action 属性の値を "response" としているので、クリックすると response.xhtml ページに移動する。
<h:commandButton id="submit" value="Submit" action="response" />
<h:messages>
レスポンスページの中でエラーメッセージを表示する。表示するエラーの種類やスタイルを設定できる。
<h:inputText> の required 属性を "true" にしているので、フォームフィールドが空のまま Submit ボタンを押すとエラーとなる。
メッセージは requiredMessage 属性で "Error: A name is required." を設定している。
レスポンスページは HTML
Faces アプリケーションのウェブページは XHTML ファイルとして作成されるが、ブラウザなどのクライアントからのリクエストに対して返されるレスポンスは、デフォルトでは HTML となる(Content-Type ヘッダーはデフォルトでは text/html)。
この index.xhtml ファイルの場合は先頭に下記のようなXHTML の DOCTYPE 宣言が含まれている。
この部分はレスポンスページではHTML5のDOCTYPE宣言である
<!DOCTYPE html>
で置き換えられる。
Hello.java
Hello.java では Hello クラスを定義している。このクラスのオブジェクトは、フォームで入力されるデータをサーバー側で保持するために使われる。
アノテーションの Named はこのクラスのマネージド ビーン(Managed Bean) としての名前の設定に使用する。Named( ) の引数として名前を与えることができるが、ここでは引数なしでデフォルトの名前 (クラス名の最初の文字を小文字にした名前)を設定している。
RequestScoped アノテーションはこのオブジェクトが利用可能なスコープ(範囲)をRequestScoped スコープに設定している。この設定ではオブジェクトが1つのリクエストとそのレスポンス内でのみ保持される。
Java のクラスがマネージド ビーンとなるための条件は、"Jakarta Contexts and Dependency Injection" という仕様書で定義されている。
Jakarta Faces のウェブページ (.xhtml ファイル) 内では、このオブジェクトのプロパティ(メンバ変数のこと) を参照することができる。
参照して値を読み込むためにはそのメンバ変数のセッターメソッドが定義されている必要があり、値を書き込むためにはゲッターメソッドが定義されている必要がある。
(そうしたJava クラスを JavaBeans という)
メソッドの名前に関するルールなどは "JavaBeans" の仕様書 (バージョン 1.01)に記載がある。下記のようにプロパティ名の先頭を大文字にして、get あるいは set をメソッド名に付加する。
プロパティ: name
ゲッターメソッド: getName()
セッターメソッド: setName()
index.xhtml ファイルでは下記の h:inputText タグの value 属性の値として#{ } を使用して参照している。(Expression Language のシンタックス)
<h:inputText id="username"
title="My name is: "
value="#{hello.name}"
required="true"
requiredMessage="Error: A name is required."
maxlength="25" />
#{ } で参照するときは #{クラス名(最初の文字を小文字にする).プロパティ名} の形式を使う。
index.xhtml ページに最初にアクセスしたときには hello オブジェクトの name プロパティの値が読み込まれて使われる。オブジェクトの生成時には値が null なので、レスポンスページでは value="" となり、フォームフィールドは空白となる。
フォームに文字列を入力して Submit ボタンで送信すると response.xhtml に移動するが、その際に入力文字列が hello オブジェクトの name プロパティの値として上書きされる。
response.xhtml では下記のように name プロパティを参照しているので、レスポンスページでは上書きされた文字列に置き換わり表示される。
<h2>Hello, #{hello.name}!</h2>
コメント: 記事内の情報は著者が個人的に調べた範囲で理解しているものです。必要に応じて訂正する場合があります。
記事中に含まれるURL はプロトコルを含めると禁止ワードに引っ掛かるので省いています。
著者・投稿者: ENARTS05
編集履歴:
2023/10/12 作成