p>基本
構成は、アプリケーションレベルに一般的な構成情報と、テンプレートで使用できるグローバル共有変数を保存するオブジェクトです。また、テンプレートインスタンスの作成とキャッシュを担当しています。構成は、実際には、freemarker.template.configurationオブジェクトのインスタンスであり、そのコンストラクターを使用して作成されています。通常、アプリケーションは共有単一のインスタンス構成オブジェクトを使用します。
構成オブジェクトは、テンプレートオブジェクトメソッドで使用できます。各テンプレートインスタンスは、構成インスタンスに関連付けられています。テンプレートコンストラクターに関連付けられています。通常、このメソッドを使用して、configuration.getTemplateでテンプレートオブジェクトを取得します。
共有変数
共有変数は、すべてのテンプレートで使用するために定義されている変数です。構成オブジェクトのSetSharedVariableメソッドを介して共有変数を追加できます。
構成cfg = new Configuration(); ... cfg.setsharedVariable( "wrap"、new rapdirective()); cfg.setsharedvariable( "company"、 "foo inc。"); // objectWrapper.default_wrapperを使用します
この構成オブジェクトに関連付けられているすべてのテンプレートインスタンスは、to_upperコンバーター、会社を取得することで文字列を取得できます。したがって、これらの変数を何度も根付かせる必要はありません。ルートに同じ名前の変数を追加すると、新しく追加された変数は以前の共有変数を上書きします。
警告!
構成オブジェクトがマルチスレッドと呼ばれている場合、サーブレットベースのWebサイトなどの非スレッドセーフであるため、TemplateModel実装クラスを共有変数として使用しないでください。
構成オブジェクトは、いくつかの共有コンバーター変数で既に初期化されています。
名前クラス
構成パラメーター
構成パラメーターは、FreeMarkerの運用動作に影響を与える可能性のある名前のパラメーターです。たとえば、locale、number_format。
構成パラメーターは構成インスタンスに保存され、テンプレートインスタンスによって変更できます。たとえば、構成の「EN_US」に等しいロケールを設定すると、SetLocaleメソッドを使用して単一のテンプレートインスタンスでデフォルトの構成を変更しない限り、すべてのテンプレートオブジェクトが「EN_US」を使用します。したがって、構成によって設定されたパラメーターは、デフォルトのパラメーターと見なすことができます。これは、テンプレートの最初のレベルで設定されたパラメーターによって上書きされ、両方で設定されたパラメーター情報は、次のように環境で設定されたパラメーター(つまり、テンプレートファイル命令セット)で上書きすることができます。
$ {1.2} <#[locale = "en_us"> $ {1.2}の設定この呼び出し方式は、3層(構成オブジェクトレイヤー、テンプレートレイヤー、および実行環境レイヤー)として想像できます。次の表は、各レイヤーのパラメーターの設定を示しています。
次に、構成パラメーターの最終結果は次のとおりです。a= 1、b = 2、c = 3、d = 1、e =2。fパラメーターはnullである可能性があります。
設定できるパラメーターのリストをクエリしたい場合は、Freemarker APIドキュメントの次の2つの部分を参照できます。
構成のすべてのレイヤー
freemarker.core.configurable.setsetting(string、string)
構成レイヤー構成
freemarker.template.configuration.setsetting(string、string)
ロードテンプレート
テンプレートローダー
テンプレートローダーは、抽象的なパス(「index.ftl」または「catalog.ftl」)に基づいて元のデータをロードするオブジェクトであり、どのような種類のリソース(ディレクトリのファイルデータまたはデータベースのデータがロードされます)は、特定のローダーの実装によって異なります。 CFG.getTemplateを呼び出すと、FreeMarkerはファイルのロードを担当する構成オブジェクトに構成したテンプレートローダーを尋ねます。
ビルトインテンプレートローダー<BR />次の3つの方法を使用してテンプレートのロードを設定できます
void setDirectoryortemplateLoading(ファイルdir);
または
void setclassfortemplateloading(クラスCL、文字列プレフィックス);
または
void setservletcontextfortemplateloading(object servletcontext、string path);
上記の最初のメソッドは、ファイルシステム内のディレクトリを指定します。 Freemarkerは、このディレクトリにテンプレートを記録します。言うまでもなく、このディレクトリが存在する必要があります。または、例外がスローされます。
2番目の方法では、クラスを入力パラメーターとして使用します。クラスローダーを使用してテンプレートをロードする場合は、この方法を使用できます。この方法は、テンプレートファイルを見つけるために呼び出されます。同時に、このテンプレートロード方法は、特に生産システムでは、以前のテンプレートよりも安定しています。リソースファイル、アイコンなどを.jarファイルに簡単にパッケージ化できます。
3番目の方法は、Webアプリケーションのコンテキストとベースパス(Wen-INFの親パスに対する)をパラメーターとして取得します。このメソッドのテンプレートローダーは、Webアプリケーションのコンテキストからテンプレートをロードします。
複数の場所からテンプレートを読み込みます
複数の場所からテンプレートをロードする場合は、異なる場所に対応する単一のテンプレートローダーを作成し、次にそれらをMultiTemplateloaderと呼ばれるテンプレートローダーにラップし、最後にメソッドSetemplateloader(テンプルレロデアローダー)を介して構成オブジェクトに設定できます。 2つの異なる場所からテンプレートを読み込む例は次のとおりです。
freemarker.cache。*; //テンプレートローダーはこのパッケージに住んでいます... filetemplateloader ftl1 = new filetemplateloader(new file( "/tmp/templates")); FileTemplateloader FTL2 = new FileTemPlateloader(new File( "/usr/data/templates")); clasSystemPlateloader CTL = new ClasSystemPlateloader(getClass()、 ""); Templateloader [] Loaders = new Templateloader [] {ftl1、ftl2、ctl}; MultiTemplateloader mtl = new MultiTemplateloader(Loaders); cfg.settemplateloader(mtl);Freemarkerは、最初にPath /TMP /Templatesでテンプレートファイルを検索します。発見されていない場合は、パス/usr/data/テンプレートに戻ります。見つからない場合は、クラスローダーにロードしてみてください。
他のリソースからテンプレートファイルを取得します
これらのビルトインテンプレートローダーが要件を満たしていない場合は、テンプレートローダーを自分でカスタマイズし、freemarker.cache.templateloaderインターフェイスを実装してから、メソッドSetemplateloader(Templateloaderローダー)を介して構成オブジェクトに渡すことができます。
キャッシュテンプレート
Freemarker Cachesテンプレートとは、GetTemplateメソッドを介してテンプレートを取得すると、FreeMarkerがテンプレートオブジェクトを返すだけでなく、オブジェクトをキャッシュすることを意味します。次回同じパスでテンプレートを要求すると、キャッシュ内のテンプレートオブジェクトが返されます。テンプレートファイルを変更すると、次にテンプレートを取得するときに、FreeMarkerがテンプレートを自動的にリロードして再配分します。それにもかかわらず、ファイルが変更されたかどうかを直接決定するのに時間がかかる操作である場合、FreeMarkerは構成オブジェクトレベルで構成パラメーター「更新遅延」を提供します。このパラメーターは、Freemarkerがテンプレートのバージョンを決定するのにどれくらいの時間がかかるかを意味します。デフォルト設定は5秒です。つまり、5秒ごとにテンプレートが変更されたかどうかが判断されます。リアルタイムの判断を下す場合は、このパラメーターを0に設定します。注意すべきもう1つのことは、すべてのローダーがこの判断方法をサポートしているわけではないということです。たとえば、クラスローダーに基づいたテンプレートローダーは、テンプレートファイルを変更したことがわかりません。
これは、FreeMarkerがキャッシュ内のテンプレートを削除する方法であり、構成オブジェクトメソッドClearTemPlateCacheを使用して、キャッシュ内のテンプレートオブジェクトを手動で明確にすることができます。実際、キャッシュ部品はコンポーネントとしてFreeMarkerに追加できます(つまり、サードパーティのキャッシュスキームを使用できます)。 cache_storageパラメーターを設定することで、実現できます。ほとんどの開発者がfreemarker.cache.mrucachestorageを実装するだけで十分です。このキャッシュは、最近使用されたポリシーの2つのレベルを使用します。最初のレベルでは、すべてのキャッシュエントリが強力な参照を使用します。エントリはJVMによって明確ではなく、比較的弱い参照である柔らかい参照です。最大時間に達するまで、最近使用されていないエントリはセカンダリキャッシュに移動されます。このレベルでは、エントリはすべてが有効期限に達するまで参照されます。たとえば、参照された参照領域のサイズをコンストラクターに設定できる場合、たとえば、強い参照領域を20に、弱い参照領域を250に設定する場合は、次のコードを使用できます。
cfg.setCachestorage(新しいfreemarker.cache.mrucachestorage(20、250))
MrucacheStorageはデフォルトのキャッシュの実装であるため、次のように設定することもできます。
cfg.setsetting(configuration.cache_storage_key、 "strong:20、soft:250");
新しい構成を作成すると、MrucacheStorageキャッシュを使用してデフォルトで実装され、デフォルト値maxstrongsizeは0に等しく、maxsoftsizeはinteger.max_value(つまり、理論的最大値)に等しくなります。ただし、高負荷システムの場合は、MaxStrongsizeを非0値に設定することをお勧めします。そうしないと、テンプレートの頻繁なリロードと再配分を引き起こします。
例外処理
考えられる例外
Freemarkerによって生成された例外は、通常、次のカテゴリに分類できます。
Freemarkerの初期化段階で生成された例外:通常、アプリケーションで1回FreeMarkerを初期化するだけで、この期間に生成された例外は初期化例外と呼ばれます。
荷重と解析中の例外テンプレート:configuration.getTemplate()メソッドを介してテンプレートを取得すると(テンプレートが以前にキャッシュされていない場合)、2種類の例外が生成されます。
IOException:テンプレートが見つからないため、またはファイルを読み取る許可がないなど、テンプレートを読み取るときに他のIOの例外が発生するためです。 freemarker.core.parseexceptionテンプレートファイルの構文が正しくないためです。
実行中の例外: Template.Process(...)メソッドを呼び出すと、2種類の例外がスローされます。
IOException出力でデータを書き込むときに発生するエラー。 freemarker.template.templatexceptionランタイム中に生成されるその他の例外、最も一般的なエラーなど、テンプレートは存在しない変数を指すことです。