13

テンプレートをさまざまなパスからベロシティで取得できるかどうかは誰にもわかりませんか? 初期化後、Velocity は「file.resource.loader.path」の変更を拒否します。

これは私のコードです:

public Generator(){         
    Properties p = new Properties();
        p.setProperty("resource.loader", "file");
        p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
        p.setProperty("file.resource.loader.path", "");

    Velocity.init(p);
}

テンプレートはさまざまな場所に配置できます (ユーザーはファイル ダイアログで選択できます)。したがって、速度からテンプレートを取得すると、このコードがあります

private Template fetch (String templatePath) {
    out_println("Initializing Velocity core...");
    int end = templatePath.lastIndexOf(File.separator); 

    Properties p = new Properties();
        p.setProperty("file.resource.loader.path", templatePath.substring(0, end));
    Velocity.init(p);

    return Velocity.getTemplate(templatePath.substring(end+1));
}

これは機能していません。Velocity が初期化されると、別のプロパティでリセットできないようです。この問題を解決する方法について何か提案はありますか?

考えられるプログラムの流れ:

  1. ユーザーは、テンプレートに入力する必要があるグループを選択します
  2. ユーザーは使用するテンプレートを選択します (hdd のどこにでも配置できます)
  3. ユーザープレス生成
4

4 に答える 4

24

Velocityは、シングルトンモデルまたは個別のインスタンスモデルの2つの方法で使用できます。現在、JVM内のVelocityエンジンのインスタンスが1つだけ許可されているシングルトンモデルを使用しています。

代わりに、異なるテンプレートディレクトリをサポートするために、同じJVMでVelocityの複数のインスタンスを作成できる個別のインスタンスモデルを使用する必要があります。

VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "path/to/templates");
ve.init();
Template t = ve.getTemplate("foo.vm");
于 2012-10-01T08:07:14.163 に答える
2

上記のポイントに追加:

VelocityEngine非シングルトンモデル、つまりオブジェクトを使用している場合でも。プロパティにカンマ区切りの値を指定することで、複数のパスを構成できます。

[file.resource.loader.class=path1,path2]

このような場合、速度エンジンは最初にパス 1 でテンプレートを検索し、次にパス 2 でテンプレートを検索します。

于 2016-02-15T17:53:54.367 に答える
2

ステップ 3 の前に、新しいVelocityEngineVelocityを作成して初期化するシングルトン クラスを使用する代わりに検討してください。

于 2012-10-01T08:03:39.417 に答える
0

私の場合、Eclipse 動的 Web プロジェクトで Velocity とサーブレットを使用しています。
実際にパスをリセットすることはできませんでしたが、/WebContent フォルダーの下にサブディレクトリを配置して、そのようにテンプレートを整理することはできました...さらに、サブディレクトリをネストすることもできました。

RequestDispatcher requestDispatcher = 
 request.getRequestDispatcher("/velocity_templates/index.vm");

この単純な解決策は私が必要としていたすべてでした.web.xmlのvelocity.propertiesをいじったり、プログラムで設定したりする必要はありませんでした.

#parse(..) コマンドでテンプレート インクルードを行う場合、サーブレットのサンプル コードで行ったのと同じパス プレフィックスをテンプレート .vm ファイル内で使用する必要があることに注意してください。

于 2013-07-04T22:34:14.737 に答える