2012-10-01 8 views
10

速度と異なるパスからテンプレートを取得することが可能であるならば誰でも知っていますか?初期化後、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. ユーザ押下使用するテンプレートを選択するテンプレートに充填する必要があるグループを選択します生成する

答えて

18

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

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

VelocityEngine ve = new VelocityEngine(); 
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "path/to/templates"); 
ve.init(); 
Template t = ve.getTemplate("foo.vm"); 
+0

に私はそれはそれと同じくらい簡単です。..直後にこれを発見しました。ありがとうございました! – Arninja

2

シングルトンを使用する代わりに、Velocityクラスを作成して初期化することをお勧めします。:ステップの前に3

0

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

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

この簡単な解決策は、私は必要なすべてのだった... web.xmlのvelocity.propertiesで混乱するか、プログラムにそれらを設定する必要はありませんでした(私が試したときに、それぞれの場合に、どちらのアプローチが、残念ながら私のために働いていました) 。私が行うときにテンプレートがです。#parse(..)コマンドを使用して含まれていることを

注、私は私のサーブレットのコード例で行ったようにテンプレート.vmファイル内に同じパスプレフィックスを使用する必要があります。

2

上記の点に追加する:一つはVelocityEngineオブジェクトを使用して、すなわち非シングルトンモデルを使用している場合でも

。カンマ区切りの値をプロパティに付けることで、複数のパスを設定できます。このような場合に速度エンジンで

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

は、最初のパス1でテンプレートを探します、その後、パス2