在模板中嵌入java代码

时间:2014-09-16 08:37:26

标签: java stringtemplate stringtemplate-4

是否可以在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函数。

2 个答案:

答案 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”作为格式字符串

传递

See my answer here for more info

相关问题