public abstract class ResourceHandler extends ObjectSE
ResourceHandler は、UIComponent および Renderer インスタンス、および ViewDeclarationLanguage が Resource インスタンスを参照できるランタイム API です。このクラスの実装はスレッドセーフでなければなりません。
パッケージングリソース
ResourceHandler は、リソースのパスベースのパッケージ化規則を定義します。
ResourceHandlerのデフォルト実装は、クラスパスまたは Web アプリケーションルートでのリソースのパッケージ化をサポートする必要があります。パッケージ化リソースの標準仕様については、概要概要にリンクされている仕様ドキュメントの 2.6.1 セクションを参照してください。簡単に言えば、デフォルトの実装は、パスの Web アプリケーションルートでパッケージ化リソースをサポートする必要があります
resources/<resourceIdentifier>Web アプリのルートに対して相対的です。「リソース」はデフォルトの場所ですが、この場所は
WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME<context-param>の値によって変更できます。デフォルトの実装では、クラスパスにパッケージ化されたリソースは JAR エントリ名に存在する必要があります
META-INF/resources/<resourceIdentifier>jar ファイル内にパッケージ化された Faces Flow の場合、クラスパスにパッケージ化されたリソースは jar エントリ名に存在する必要があります
META-INF/flows/<resourceIdentifier>
<resourceIdentifier>は、次のように指定されたいくつかのセグメントで構成されています。
[localePrefix/][libraryName/][libraryVersion/]resourceName[/resourceVersion]resourceIdentifier 内のセグメントはいずれも、"../otherLibraryName" などの相対パスであってはなりません。実装では、JAR パッケージ化の場合、
libraryVersionおよびresourceVersionセグメントをサポートする必要はありません。必須のセグメントは resourceName のみであることに注意してください。
エンコーディングリソース
ビューリクエストの処理中に、Jakarta Server Face ランタイムが呼び出されて、後続のリソースリクエストを行うようにユーザーエージェントに指示するような方法でリソースをエンコードすることができます。この動作は、リソースレンダラーの 1 つ(
ScriptRenderer、StylesheetRenderer、ImageRenderer)によって調整されます。ScriptRenderer、StylesheetRenderer、ImageRendererはすべてResource.getRequestPath()を呼び出して、リソースのエンコードされた URI を取得します。完全な仕様については、Resource.getRequestPath()および標準 HTML RenderKit 仕様を参照してください。このリソースの使用は、VDL リソースに対応するリソースには適用されません。
リソースのデコード
リソースリクエストの処理中に、Jakarta Server Faces ランタイムが呼び出され、リソースのバイトをユーザーエージェントに提供するようにリソースをデコードします。この動作は、
Resource.getInputStream()を呼び出してリソースのバイトを取得するhandleResourceRequest(jakarta.faces.context.FacesContext)によって調整されます。完全な仕様については、handleResourceRequest(jakarta.faces.context.FacesContext)を参照してください。このリソースの使用は、VDL リソースに対応するリソースには適用されません。
| 修飾子と型 | フィールドと説明 |
|---|---|
static StringSE | JSF_SCRIPT_LIBRARY_NAMEJakarta Server Faces スクリプトリソースのライブラリ名。 |
static StringSE | JSF_SCRIPT_RESOURCE_NAMEJakarta Server Faces スクリプトリソースのリソース名。 |
static StringSE | LOCALE_PREFIX
|
static StringSE | RESOURCE_CONTRACT_XML このファイルは、リソースライブラリ契約を含む jar ファイルの |
static StringSE | RESOURCE_EXCLUDES_DEFAULT_VALUE
|
static StringSE | RESOURCE_EXCLUDES_PARAM_NAME
|
static StringSE | RESOURCE_IDENTIFIER
|
static StringSE | WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME
|
static StringSE | WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME
|
| コンストラクターと説明 |
|---|
ResourceHandler() |
| 修飾子と型 | メソッドと説明 |
|---|---|
abstract Resource | createResource(StringSE resourceName) 引数 |
abstract Resource | createResource(StringSE resourceName, StringSE libraryOrContractName) 引数 |
abstract Resource | createResource(StringSE resourceName, StringSE libraryName, StringSE contentType) 引数 |
Resource | createResourceFromId(StringSE resourceId) 引数 |
ViewResource | createViewResource(FacesContext context, StringSE resourceName) 引数 |
abstract StringSE | getRendererTypeForResourceName(StringSE resourceName) このリソースをレンダリングできる |
StreamSE<StringSE> | getViewResources(FacesContext facesContext, StringSE path, int maxDepth, ResourceVisitOption... options) 指定された初期パスをルートとするリソースツリーをたどることによって、遅延して入力された可能性がある |
StreamSE<StringSE> | getViewResources(FacesContext facesContext, StringSE path, ResourceVisitOption... options) 指定された初期パスをルートとするリソースツリーをたどることによって、遅延して入力された可能性がある |
abstract void | handleResourceRequest(FacesContext context)このメソッドは、リソースリクエストを満たすための規約を指定します。 |
boolean | isResourceRendered(FacesContext context, StringSE resourceName, StringSE libraryName)指定されたリソースとライブラリ名で識別されるリソースがレンダリングされているかどうかを返します。 |
abstract boolean | isResourceRequest(FacesContext context) 現在のリクエストがリソースリクエストである場合は、 |
boolean | isResourceURL(StringSE url) 引数 |
abstract boolean | libraryExists(StringSE libraryName) 引数 |
void | markResourceRendered(FacesContext context, StringSE resourceName, StringSE libraryName)指定されたリソースとライブラリ名で識別されるリソースをレンダリング済みとしてマークします。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEpublic static final StringSE RESOURCE_IDENTIFIER
Resource.getRequestPath() は、この定数の値を URI のプレフィックスとして返します。handleResourceRequest(jakarta.faces.context.FacesContext) は、リクエスト URI 内でこの定数の値を検索して、リクエストがリソースリクエストであるかビューリクエストであるかを判別します。
public static final StringSE JSF_SCRIPT_RESOURCE_NAME
Jakarta Server Faces スクリプトリソースのリソース名。
public static final StringSE JSF_SCRIPT_LIBRARY_NAME
Jakarta Server Faces スクリプトリソースのライブラリ名。
public static final StringSE RESOURCE_CONTRACT_XML
このファイルは、リソースライブラリ契約を含む jar ファイルの META-INF/contracts/<contractName>/ に配置する必要があります。<contractName> は契約の名前です。jar ファイルに複数の契約が含まれている場合は、マーカーファイルがそれぞれに存在する必要があります。その場所に配置する必要のあるファイルの名前については、「定数フィールド値」を参照してください。
public static final StringSE WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME
WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME の値と等しいパラメーター名を持つ <context-param> が存在する場合、ランタイムはその値を、リソースが配置される Web アプリルートを基準としたパスとして解釈する必要があります。このパラメーター値は "/" で始まることはできませんが、"/" 文字が含まれている場合があります。そのような <context-param> が存在しない場合、またはその値が無効な場合は、引用符なしの値 "resources" をランタイムで値として使用する必要があります。
public static final StringSE WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME
WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME の値と等しいパラメーター名を持つ <context-param> が存在する場合、ランタイムはその値を、リソースライブラリ契約が配置される Web アプリルートを基準としたパスとして解釈する必要があります。このパラメーター値は "/" で始まることはできませんが、"/" 文字が含まれている場合があります。そのような <context-param> が存在しない場合、またはその値が無効である場合、値 "contracts" は、引用符なしで、ランタイムによって値として使用される必要があります。
public static final StringSE LOCALE_PREFIX
Application.getMessageBundle() からの戻り値で指定されたアプリケーションメッセージバンドル内のキーの名前。その値は、createResource(java.lang.String)(またはそのバリアントの 1 つ)から返すパッケージ化されたリソースを見つけるために使用されるロケールプレフィックスです。
public static final StringSE RESOURCE_EXCLUDES_PARAM_NAME
handleResourceRequest(jakarta.faces.context.FacesContext) が参照する ServletContext init パラメーターは、リソースリクエストにレスポンスして決して提供されてはならないリソースの種類を示します。このパラメーターの値は、先頭の "." を含む、ファイル拡張子の単一のスペースで区切られたリストです。文字(引用符なし)。指定しない場合、RESOURCE_EXCLUDES_DEFAULT_VALUE 定数の値で指定されたデフォルト値が使用されます。手動で指定した場合、指定された値はデフォルトの値を完全に上書きし、補足しません。
public static final StringSE RESOURCE_EXCLUDES_DEFAULT_VALUE
RESOURCE_EXCLUDES_PARAM_NAME init param のデフォルト値。
public abstract Resource createResource(StringSE resourceName)
引数 resourceName を指定して ViewResource のインスタンスを作成します。リソースのコンテンツ型は、resourceName を ExternalContext.getMimeType(java.lang.String) に渡すことによって導出されます。
Resource を作成するには、概要概要にリンクされている仕様散文ドキュメントのセクション 2.6.1.4 で指定されたアルゴリズムを実行する必要があります。新しい要件は、仕様のバージョン 2.2 で導入されました。歴史的な理由から、このメソッドは、引数 resourceName が libraryName/resourceName の形式である場合、resourceName に '/' 文字が含まれている場合でも正しく動作します。
resourceName - リソースの名前。Resource インスタンス。指定されたリソースのエンコードまたはデコードでの使用に適しています。NullPointerExceptionSE - resourceName が null の場合。public ViewResource createViewResource(FacesContext context, StringSE resourceName)
引数 resourceName を指定して Resource のインスタンスを作成します。これには、"/" 文字を含めることができます。ViewDeclarationLanguage は、ファイルシステムなどの永続ストアからビューをロードする必要がある場合にこのメソッドを呼び出します。このメソッドは createResource(java.lang.String) と同等の機能ですが、VDL ビューをロードする必要があるすべてのコールサイトはこのメソッドを使用する必要があります。これにより、ビューのロードのみに影響を与えるために ResourceHandler を装飾するクラスは、他の種類の処理に影響を与えることなくそうすることができます。スクリプトやスタイルシートなどのリソース。このメソッドを呼び出す前に、FacesContext が存在している必要があります。仕様の以前のリビジョンとの互換性を維持するには、createResource(java.lang.String) を呼び出すデフォルトの実装を提供する必要があります。
デフォルトの実装では、次の場所でこの順序でリソースを検索する必要があります。
リソースライブラリ契約を検討します(「リクエスト処理ライフサイクル」の章の「仕様書」セクションの「リソースライブラリ契約」で指定されている場所)。
Web アプリのルートを検討します。
面の流れを検討します(仕様書のセクション「 Web アプリケーションでの Jakarta Server Faces の使用」の 面の流れで指定された場所)。
FacesContext.getResourceLibraryContracts() を呼び出します。結果が非 null で空でない場合は、リスト内の各値について、その値をリソースライブラリ契約の名前として扱います。引数 resoureName がリソースライブラリ契約のリソースとして存在する場合は、それを返します。それ以外の場合は、見つかった場合は、リソース(リソースライブラリ契約にない)を返します。それ以外の場合は、null を返します。
context - このリクエストの FacesContextresourceName - ViewDeclarationLanguage によってビューとして解釈されるリソースの名前。ViewResource インスタンス。ViewDeclarationLanguage での使用に適しています。NullPointerExceptionSE - resourceName が null の場合。public StreamSE<StringSE> getViewResources(FacesContext facesContext, StringSE path, int maxDepth, ResourceVisitOption... options)
指定された初期パスをルートとするリソースツリーをウォークすることにより、おそらく遅延して入力された Stream を返します。リソースツリーは幅優先でトラバースされます。ストリーム内の要素は、resourceName パラメーターとして createViewResource(jakarta.faces.context.FacesContext, java.lang.String) に渡されたときに ViewResource を生成するビューリソース名です。
maxDepth パラメーターは、常にアクセスされる初期パスを超えてアクセスするディレクトリレベルの最大深度です。値は、指定された初期パスではなく、ルート(/)を基準にしています。たとえば、maxDepth = 3 および初期パス /foo/ が与えられた場合、訪問は /foo/bar/ まで進みます。ここで、/ は深さ 1 としてカウントされ、/foo/ は深さ 2 としてカウントされ、/foo/bar/ は深さ 3 としてカウントされます。初期パスの深さ以下の値は、初期パスのみが訪問されることを意味します。MAX_VALUESE の値を使用して、すべてのレベルにアクセスする必要があることを示すことができます。
facesContext - このリクエストの FacesContext。path - ビューリソースの検索を開始する最初のパス maxDepth - ルート(/)から数えた、アクセスするネストされたディレクトリの絶対最大深度。options - トラバーサルに影響を与えるオプション。これらの詳細については、ResourceVisitOption を参照してください。StreamSEpublic StreamSE<StringSE> getViewResources(FacesContext facesContext, StringSE path, ResourceVisitOption... options)
指定された初期パスをルートとするリソースツリーをウォークすることにより、おそらく遅延して入力された Stream を返します。リソースツリーは幅優先でトラバースされます。ストリーム内の要素は、resourceName パラメーターとして createViewResource(jakarta.faces.context.FacesContext, java.lang.String) に渡されたときに ViewResource を生成するビューリソース名です。
このメソッドは、それを呼び出すことは式を評価することと同等であるかのように機能します。
言い換えると、リソースツリーのすべてのレベルにアクセスします。getViewResources(facesContext, start, Integer.MAX_VALUE, options)
facesContext - このリクエストの FacesContext。path - ビューリソースの検索を開始する最初のパス options - トラバーサルに影響を与えるオプション。これらの詳細については、ResourceVisitOption を参照してください。StreamSEpublic Resource createResourceFromId(StringSE resourceId)
引数 resourceId を指定して Resource のインスタンスを作成します。リソースのコンテンツ型は、resourceName を ExternalContext.getMimeType(java.lang.String) に渡すことによって導出されます。
リソースは、概要サマリーにリンクされている仕様書の 2.6.1.3 の仕様に従って識別される必要があります。仕様のバージョン 2.2 で新しい要件が導入されました。
resourceId - リソースのリソース識別子。Resource インスタンス。指定されたリソースのエンコードまたはデコードでの使用に適しています。NullPointerExceptionSE - resourceId が null の場合。public abstract Resource createResource(StringSE resourceName, StringSE libraryOrContractName)
引数 libraryName で指定されたライブラリのメンバーである引数 resourceName の値によって指定された resourceName を使用して、Resource のインスタンスを作成します。リソースのコンテンツ型は、resourceName を ExternalContext.getMimeType(java.lang.String) に渡すことによって導出されます。
Resource を作成するには、概要サマリーにリンクされている仕様書のセクション 2.6.1.4 で指定されたアルゴリズムを実行する必要があります。仕様のバージョン 2.2 で新しい要件が導入されました。
resourceName - リソースの名前。libraryOrContractName - このリソースが存在するライブラリ (または契約) の名前は null の場合があります。リソースライブラリの名前とリソースライブラリ契約が競合する場合は、リソースライブラリが優先されます。"../" などの相対パスを含めることはできません。Resource インスタンス。指定されたリソースのエンコードまたはデコードでの使用に適しています。NullPointerExceptionSE - resourceName が null の場合 public abstract Resource createResource(StringSE resourceName, StringSE libraryName, StringSE contentType)
引数 content-type によって指定されたコンテンツ型を持つと主張する引数 libraryName によって指定されたライブラリのメンバーである引数 resourceName の値によって指定された resourceName を使用して、Resource のインスタンスを作成します。
Resource を作成するには、概要サマリーにリンクされている仕様書のセクション 2.6.1.4 で指定されたアルゴリズムを実行する必要があります。仕様のバージョン 2.2 で新しい要件が導入されました。
resourceName - リソースの名前。libraryName - このリソースが存在するライブラリの名前。null の場合があります。 "../" などの相対パスを含めることはできません。contentType - この Resource インスタンスが Resource.getContentType() から返す MIME コンテンツ。値が null の場合、リソースのコンテンツ型は resourceName を ExternalContext.getMimeType(java.lang.String) に渡すことによって導出されます。Resource インスタンス。指定されたリソースのエンコードまたはデコードでの使用に適しています。NullPointerExceptionSE - resourceName が null の場合。public abstract boolean libraryExists(StringSE libraryName)
引数 libraryName で指定されたリソースライブラリが見つかった場合は、true を返します。LOCALE_PREFIX で定義されているように、このアプリケーションに localePrefix がある場合は、まずそのプレフィックスを持つライブラリを探します。該当するライブラリが見つからない場合は、プレフィックスのないライブラリを探します。これにより、開発者はファイルの重複を避けることができます。例: 開発者が、ローカライズされたイメージリソースとローカライズされていないスクリプトリソースを含むリソースライブラリを必要とする場合を考えてみましょう。セクション 2.6.1.4 のその他の仕様変更とともに、両方の場所でライブラリの存在を確認することで、このシナリオが有効になります。
libraryName - ライブラリ名。true、それ以外の場合は false。public abstract void handleResourceRequest(FacesContext context) throws IOExceptionSE
このメソッドは、リソースリクエストを満たすための契約を指定します。このメソッドは、isResourceRequest(jakarta.faces.context.FacesContext) を呼び出すことにより、現在のリクエストがリソースリクエストであると判断した後、FacesServlet.service(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) から呼び出されます。handleResourceRequest は、現在のリクエストがリソースリクエストであると想定する場合があります。
デフォルトの実装では、次のアルゴリズムと意味的に同一のアルゴリズムを実装する必要があります。
議論のために、ステータスコードが設定されるすべての場合において、この仕様は Jakarta Servlet API のみを使用して話しますが、ポートレット環境では適切な同等の API を使用する必要があることを理解しています。resourceIdentifier が RESOURCE_EXCLUDES_PARAM_NAME 初期化パラメーターの値にリストされているいずれかの拡張子で終了する場合、HttpServletRequest.SC_NOT_FOUND を HttpServletResponse.setStatus() に渡し、その後 handleResourceRequest を直ちに返す必要があります。
リクエストパラメーターマップで引用符なしのキー "ln" のエントリを検索して、リクエストから libraryName を抽出します。見つかった場合は、その値を libraryName として使用します。
resourceName と libraryName が存在する場合は、createResource(String, String) を呼び出して Resource を作成します。resourceName のみが存在する場合は、createResource(String) を呼び出して Resource を作成します。Resource を正常に作成できない場合は、HttpServletRequest.SC_NOT_FOUND を HttpServletResponse.setStatus() に渡し、handleResourceRequest をすぐに戻す必要があります。
Resource.userAgentNeedsUpdate(jakarta.faces.context.FacesContext) を呼び出します。このメソッドが false を返す場合、HttpServletRequest.SC_NOT_MODIFIED を HttpServletResponse.setStatus() に渡す必要があり、次に handleResourceRequest をすぐに返す必要があります。
Resource.getContentType() の結果を HttpServletResponse.setContentType. に渡します
Resource.getResponseHeaders() を呼び出します。この Map の各エントリについて、HttpServletResponse.setHeader() を呼び出し、最初の引数としてキーを渡し、2 番目の引数として値を渡します。
Resource.getInputStream() を呼び出し、リソースのバイトをレスポンスに提供します。
リソースのバイトカウントを渡して HttpServletResponse.setContentLength() を呼び出します。
前のいずれかの手順で IOException がスローされた場合は、resourceName および libraryName (存在する場合) を含む、説明的でローカライズされたメッセージをログに記録します。次に、HttpServletRequest.SC_NOT_FOUND を HttpServletResponse.setStatus() に渡し、handleResourceRequest をすぐに戻す必要があります。
このメソッドのすべての場合において、このメソッドが戻る前に、ストリーム、チャネル、ソケット、その他の IO リソースを閉じる必要があります。
context - このリクエストの FacesContextIOExceptionSE - I/O エラーが発生したとき。public abstract boolean isResourceRequest(FacesContext context)
現在のリクエストがリソースリクエストの場合は、true を返します。このメソッドは FacesServlet.service(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) によって呼び出され、このリクエストがビューリクエストであるかリソースリクエストであるかを判別します。
context - このリクエストの FacesContexttrue、それ以外の場合は false。public boolean isResourceURL(StringSE url)
引数 url に定数 RESOURCE_IDENTIFIER の値で指定された文字列が含まれている場合は、true を返します。それ以外の場合は、false を返します。
url - RESOURCE_IDENTIFIER の存在をインスペクションする URL。true、それ以外の場合は false。NullPointerExceptionSE - 引数の URL が null の場合。public abstract StringSE getRendererTypeForResourceName(StringSE resourceName)
このリソースをレンダリングできる Renderer の renderer-type を返します。デフォルトの実装は、次の表に従って値を返す必要があります。renderer-type を判別できない場合は、null を返却する必要があります。
| リソース名の例 | renderer-type |
|---|---|
| mycomponent.js | jakarta.faces.resource.Script |
| mystyle.css | jakarta.faces.resource.Stylesheet |
resourceName - リソース名。public void markResourceRendered(FacesContext context, StringSE resourceName, StringSE libraryName)
指定されたリソースとライブラリ名で識別されるリソースをレンダリング済みとしてマークします。デフォルトの実装では、現在のビューのレンダリングレスポンスフェーズ中にリソースがすでにレンダリングされている場合に、isResourceRendered(FacesContext, String, String) が true を返すようにする必要があります。
context - このリクエストの FacesContext。resourceName - リソースの名前。libraryName - リソースが存在するライブラリの名前は、null の場合があります。public boolean isResourceRendered(FacesContext context, StringSE resourceName, StringSE libraryName)
指定されたリソースとライブラリ名で識別されるリソースがレンダリングされているかどうかを返します。デフォルトの実装では、リソースが markResourceRendered(FacesContext, String, String) を介してレンダリングされたとマークされている場合、現在のビューのレンダリングレスポンスフェーズで true を返す必要があります。
context - このリクエストの FacesContext。resourceName - リソースの名前。libraryName - このリソースが存在するライブラリの名前は、null の場合があります。Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.