5

プロパティー・ファイルを JSF 2.0 にロードするには、2 つの方法があります。

  1. グローバル リソース バンドル プロパティ ファイルをグローバルにロードして、すべての jsf ページがメッセージにアクセスできるようにします。「faces-config.xml」ファイルを作成し、プロパティ ファイルを明示的に宣言できます。

顔-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
     <application>
      <resource-bundle>
        <base-name>com.mkyong.messages</base-name>
        <var>msg</var>
       </resource-bundle>
     </application>
</faces-config>

オプション 2:ローカル リソース バンドル プロパティ ファイルをローカルにロードするか、指定したページのみにロードします。<f:loadBundle />messages.properties 内のメッセージにアクセスする必要があるページ内のタグを宣言します。

これらの 2 つのうち、どちらがパフォーマンスを向上させますか?

最初のオプションを使用するとします。これは、アプリケーションの起動時にすべてのバンドルが読み込まれることを意味しますか、それとも遅延読み込みですか? (オンデマンド)

2 番目のオプションを選択した場合、各 ViewRoot に対してバンドルが複数回読み込まれる可能性はありますか?

Java ResourceBundle は、サーブレット コンテナ内でシングルトン オブジェクトを提供するファクトリ クラスですか?

getBundle メソッドは、常にシングルトン オブジェクトを作成するファクトリ メソッドですか?

ResourceBundle myResources =
      ResourceBundle.getBundle("MyResources", currentLocale);

ページ abc.xhtml があり、f:loadBundle を使用していて、このページに 1000 人のユーザーがアクセスしているとします。これは、1000 個の resouceBundle オブジェクトが作成されることを意味しますか? それともすべてのページインスタンスで共有されているのはオブジェクトだけですか?

4

3 に答える 3

3

これらの 2 つのうち、どちらがパフォーマンスを向上させますか?

私はパフォーマンスについて心配することはありません。はResourceBundleすでにそれらを内部的にキャッシュしています。


ページ abc.xhtml があり、f:loadBundle を使用していて、このページに 1000 人のユーザーがアクセスしているとします。これは、1000 個の resouceBundle オブジェクトが作成されることを意味しますか? それともすべてのページインスタンスで共有されているのはオブジェクトだけですか?

デフォルトでは、1 つだけ作成されます。API ドキュメントも参照してResourceBundleください。

キャッシュ管理

getBundle ファクトリ メソッドによって作成されたリソース バンドル インスタンスは、デフォルトでキャッシュされます。ファクトリ メソッドは、キャッシュされている場合、同じリソース バンドル インスタンスを複数回返します。getBundle クライアントは、キャッシュをクリアしたり、存続時間の値を使用してキャッシュされたリソース バンドル インスタンスの有効期間を管理したり、リソース バンドル インスタンスをキャッシュしないように指定したりできます。詳細については、ファクトリ メソッド、、、、およびの説明を参照getBundleてください。clearCacheResourceBundle.Control.getTimeToLiveResourceBundle.Control.needsReload

インスタンスのハッシュコードを見ることで、デバッガーで自分自身を簡単に証明できます。


ちなみに、この<application>宣言には、バンドルがマネージド Bean にも .xml によって注入可能であるという追加の利点があり@ManagedProperty("#{msg}")ます。とりわけ、この Q&A: Read resource bundle properties in a managed Beanも参照してください。

于 2013-01-16T13:48:59.257 に答える
0

回答から、1 つのグローバル リソース バンドルで十分であることがわかりました。パフォーマンスについて:

2 種類の標準 ResourceBundle インスタンスがあります。

  • PropertyResourceBundle - *[_LOCALE].properties ファイル、および
  • ListResourceBundle、Java クラス (パッケージ名に「.」を使用) - *[_LOCALE].class.

ListResourceBundle の場合:

すべてのロケール Java クラスは、共有 (!) キーとローカライズされたテキストを含む文字列の配列を作成します。JVM でキー文字列を共有するのは便利です。また、すべての文字列が早期にロードされます。

そのため、ListResourceBundle を配信する価値があるかもしれません。

ただし、翻訳の場合は、Java 以外の翻訳メモリ、tmx、xliff などを維持する必要があります。そして、ビルド プロセスで Java を生成します。

于 2013-01-16T14:23:42.480 に答える
-1

1 番目のオプション - アプリケーション スコープであり、起動時にロードされるため

于 2013-01-16T13:28:11.423 に答える