是否可以在ST4模板中嵌入可执行的java代码?例如,如果我想将一个字符串传递给我的模板,有时会按原样打印字符串,有时会将其打印成大写字母,所以我想要一个java代码来进行必要的转换。如果没有此功能,我会看到3种方法来实现相同的功能:
(1)预先计算java中的替代值,并一次性将它们全部传递给模板(但这可能导致参数太多):
// in the below code, if the template can compute DESCRIPTION_CAPS from DESCRIPTION, using embedded java code, that reduces one argument
test(DESCRIPTION, DESCRIPTION_CAPS) ::= <<
this is original <DESCRIPTION>
this is caps <DESCRIPTION_CAPS>
>>
(2)如果有太多这样的论点,另一种选择是将temlpate拆分成更小的部分,但这会使代码难看且不可读:
test1(DESCRIPTION) ::= <<
this is original <DESCRIPTION>
>>
test2(DESCRIPTION_CAPS) ::= <<
this is caps <DESCRIPTION_CAPS>
>>
(3)预先计算一个类中的所有相关值,让模板调用getter函数(不带参数)来简单地从类中获取相关值。
test() ::= <<
this is original <values.description>
this is caps <values.description_caps>
>>
截至目前(如果嵌入的java类不可用),第3个选项看起来是最佳解决方案。请告知是否存在更好的解决方案。
注意:在上面的例子中,我仅使用CAPS作为示例,可能还需要更复杂的java函数。
答案 0 :(得分:1)
不,不打算/不提供嵌入到模板中的Java代码。这样可以更容易地防止视图和模型/逻辑的混乱/混合。
在您的情况下,您可以轻松地将计算出的东西放入java属性getter函数中,StringTemplate可以将其作为一种bean属性进行引用和评估。
e.g。
输入您的模板组文件MyTemplate.stg
:
myTemplate(f) ::= <<
...
Blabla <f.message> blabla
...
>>
输入您的Java源代码:
class MyClass() {
...
private String internal_message;
public getMessage() {
return internal_message;
}
...
}
调用模板:
STGroupFile stg = new STGroupFile("MyTemplate.stg");
ST templ = stg.getInstanceOf("myTemplate");
templ.add("f", new MyClass());
使用此方法,模板逻辑<f.message>
将调用您的java对象实例getMessage()
的{{1}}。
答案 1 :(得分:1)
正如@Hartmut所说,你不能在模板中嵌入java代码,但你可以创建一个自定义StringRenderer,你可以用它来按照你想要的方式格式化字符串。
然后,您可以将自定义格式字符串传递给渲染器,如下所示:
test(description) ::= <<
this is original <description>
this is caps <description; format="upper">
this is custom format <description; format="my-format-string">
>>
P.S如果您只是想更改文本案例,您可能不需要自己动手,只需添加对StringTemplate捆绑的StringRenderer的引用:
templateGroup.registerRenderer(String.class, new StringRenderer());
并将“upper”,“lower”或“cap”作为格式字符串
传递