2017-04-21 6 views
1

私はfreemarker 2.3.xを使用しています。すべての変数が定義されているとは限りません。そして、そのまま出力する必要があります。たとえば、テンプレートは変数が見つからない場合、FreeMarkerは元の値を保持できますか?

${a} 
${b} 

です。データモデルはa=nameです。その後、出力はTemplateExceptionHandler.IGNORE_HANDLERを使用することにより

name 
${b} 

ことが予想され、出力は今、私は、データモデルに新しいエントリb=${b}を追加していため${b}

は含まれません。それは動作しますが、それは一種の回避策です。そして、私はいくつの未定義変数があるのか​​を正確に知る必要がありますが、それは限界です。

設定や方法はありますか?

答えて

1

これを解決する最も恐ろしい方法は、データ・モデル・レベルです。あなたは "b = $ {b}"などを手動で追加するのではなく、自動的にデータモデル( "ルート")としてカスタムTemplateHashModelExを使用する必要があります。 (これは設定レベルの共有変数があれば、データモデルのルートによって隠されるという厄介な副作用があります)。

とにかく、理論的にも、正しく解決することは全く不可能です。あなたが${a + b}を持っていて、aが存在し、bがない場合はどうでしょうか?さて、それは${123 + b}と表示されるかもしれませんが、あなたは何かが関わってくるのを見ます。広告その後、あなたは、aが存在している${a(b)}はなくb、およびその後の反復でaが欠落しているが、bが存在している...

TemplateExceptionHandler -sのAsを持っている場合は、可能性がありながら、どのような再印刷InvalidReferenceExceptionの場合には、out.write("${" + te.getBlamedExpressionString() + "}");という表現に失敗しましたが、それは簡単な補間では機能しません。 ${a + b}の例の場合と同様に、を黙って削除して、${b}と表示します。

+0

$ {a + b}のケースでは機能しませんが大きな問題はありません。あなたのソリューションに感謝します。失敗した表現を再印刷すると、私にとっては十分な解決策になります。 – DeepNightTwo

2

私は同じ質問をして、データモデルにない変数をスキップする別の方法を発見しました。

このテンプレートは、$ {B}を印刷する必要があります:

${a} 
${r"${b}"} 

結果:

name 
${b} 

https://stackoverflow.com/a/5207658/2618186

私はあなたの再印刷機能はしかしどのように見えるかを正確に見てみたいです。より良いかもしれない。