在模板中嵌入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”作为格式字符串传递

有关详细信息,请参阅我的答案