2

アプリケーションでは、Velocityを使用してテンプレート内のプレースホルダーをマージしています。したがって、$ {firstname}は、VelocityContext Hashmapにマージする前に追加するため、ユーザーの名にマージされます。

コード:

public static String evaluateTemplate(final VelocityContext context, final String template){
    try {
        velocityEngine.init();
        StringWriter writer = new StringWriter();
        velocityEngine.evaluate(context, writer, "", template);
        return writer.toString();
    } catch (Exception e) {
        ...
    }           
}

これは非常に単純な例であり、テンプレートで使用されていない場合でも、常に名をVelocityContextに追加することは、ユーザープロパティフィールド(Hibernateエンティティからの取得者)がほとんどの場合必要な場合に必要なため、コストのかかる操作ではありません。テンプレートの評価(テンプレートは個人用ページまたは電子メールにすることができます)。ただし、一部の特殊なケースでは、より「高価な」データが必要になります。たとえば、他のアプリケーションからのデータはWebサービスによって取得されます。また、テンプレートに情報を要求するプレースホルダーがない場合でも、テンプレートが読み込まれ、毎回コンテキストハッシュマップに配置されます。

だから私の質問は、必要なときに必要なコンテンツをロードするテンプレートエンジン(「Freemarker」と「Stringtemplate」も知っています)としての代替手段はありますか?オーバーヘッドの少ない、ある種の遅延読み込みテンプレートエンジン

4

3 に答える 3

3

いくつかのコンテキストをチェーン化する可能性があります。たとえば、安価なものは標準のコンテキストマップに送られ、そこから提供され、高価なもの(Webサービス呼び出しなど)はカスタムコンテキストに委任されます。このようにして、遅延読み込みを提供できます。

Velocity自体には、オーバーヘッドがほとんどありません。

于 2013-02-06T08:14:59.533 に答える
3

必要になる可能性のあるすべて/すべての値をコンテキストに入れる必要はありません。ゲッターを含むある種のオブジェクト(または静的メソッドを使用する場合はクラス)を入れて、値を取得するだけです$myObject.getFirstname()。高価なものについては、必要なときに電話をかけることができます$myObject.getExpensiveData()。遅延読み込みはメソッド内で行われるgetExpensiveData()必要があるため、テンプレートがそのようなものを必要としない場合は、そのメソッドを呼び出さないため、読み込みは行われません。

于 2013-02-06T08:42:59.193 に答える
0

これも質問したので、FreeMarkerではテンプレートコンテキスト(そこではデータモデルと呼ばれます)はTemplateHashModelインターフェイス(またはjava.util.Map)を実装するだけで済みます。したがって、カスタムget(String)実装では、テンプレートで最初に必要になるまで変数値の解決を延期できます。

于 2013-02-06T19:17:04.013 に答える