在模板中嵌入java代码
是否可以在ST4模板中嵌入可执行的Java代码? 例如,如果我想将一个字符串传递给我的模板,有时会按原样打印字符串,有时会将其打印成大写字母,所以我想要一个java代码来进行必要的转换。 如果没有此function,我会看到3种方法来实现相同的function:
(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 this is caps >>
(2)如果有太多这样的参数,另一个选择是将temlpate拆分成更小的部分,但这会使代码变得丑陋且难以理解:
test1(DESCRIPTION) ::= << this is original >> test2(DESCRIPTION_CAPS) ::= << this is caps >>
(3)预先计算类中的所有相关值,并让模板调用getter函数(不带参数)来简单地从类中获取相关值。
test() ::= << this is original this is caps >>
截至目前(如果嵌入的java类不可用),第3个选项看起来是最好的解决方案。 请告知是否存在更好的解决方案。
注意:在上面的例子中,我仅使用CAPS作为示例,可能还需要更复杂的java函数。
不,不打算/不提供嵌入到模板中的Java代码。 这样可以更容易地防止视图和模型/逻辑的混乱/混合。
在您的情况下,您可以轻松地将计算出的东西放入java属性getter函数中,该函数可以由StringTemplate作为一种bean属性进行引用和评估。
例如
放入模板组文件MyTemplate.stg
:
myTemplate(f) ::= << ... Blabla 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());
这样,模板逻辑
调用您的java对象实例f
getMessage()
。
正如@Hartmut所说,你不能在模板中嵌入java代码,但你可以创建一个自定义的StringRenderer ,你可以用它来按照你想要的方式格式化字符串。
然后,您可以将自定义格式字符串传递给渲染器,如下所示:
test(description) ::= << this is original this is caps this is custom format >>
PS如果您只是想更改文本案例,您可能不需要自己动手,只需添加对StringTemplate捆绑的StringRenderer的引用:
templateGroup.registerRenderer(String.class, new StringRenderer());
并将“upper”,“lower”或“cap”作为格式字符串传递
有关详细信息,请参阅我的答案