Насколько я знаю, это невозможно, поскольку StringTemplate касается строгого разделения модели.
Вместо этого, я думаю, вам будет лучше иметь геттер в контроллере, который возвращает форматированную строку.
Вы могли бы найти этот вопрос полезный: embed java code inside a template
На самом деле, я нашел простой способ сделать это, который позволяет избежать необходимости отформатированной строки добытчиков:
Вам нужно создать новый 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());
}
Тогда вы можете вызвать функцию форматирования, как вы делали раньше, но передать «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>
FYI:
Here's the original StringRenderer code
More info on Renderers