StringTemplate はモデルとビューの厳密な分離に関するものであるため、私が知る限り、これは不可能です。
代わりに、書式設定された文字列を返すコントローラーにゲッターを用意したほうがよいと思います。
この質問は役に立つかもしれません:テンプレート内に Java コードを埋め込む
実際、フォーマットされた文字列ゲッターの必要性を回避する簡単な方法を見つけました。
必要な方法で文字列をフォーマットできる新しい StringRenderer を作成する必要があります。
public class MyStringRenderer extends StringRenderer
{
@Override
public String toString(Object o, String formatString, Locale locale) {
if (!("upperAndUnder".equals(formatString)))
return super.toString(o, formatString, locale);
// we want upper case words with underscores instead of spaces
return ((String) o).replaceAll(" ", "_").toUpperCase(locale);
}
}
次に、テンプレート グループに新しいレンダラーについて知らせる必要があります。
public static void main(String[] args) {
STGroup templates = new STGroupFile("test.stg");
templates.registerRenderer(String.class, new MyStringRenderer());
ST renderTemplate = templates.getInstanceOf("render");
renderTemplate.add("attributes", new String[]{"blahh blahh I'm a string", "I'm another string"});
System.out.println(renderTemplate.render());
}
次に、前と同じように format 関数を呼び出すことができますが、パラメーターとして「upperAndUnder」を渡します。
group test;
delimiters "$","$"
render(attributes) ::= <<
<html>
$attributes:{ attribute | <div> $customFormat(attribute)$</div>}; separator="\n"$
</html>
>>
customFormat(name) ::= <<
$name; format="upperAndUnder"$
>>
これは次を印刷します:
<html>
<div> BLAHH_BLAHH_I'M_A_STRING</div>
<div> I'M_ANOTHER_STRING</div>
</html>
ご参考までに:
これが元の StringRenderer コードです
レンダラーの詳細