1

是否可以在 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) 如果这样的参数太多,另一种选择是将模板分解成更小的部分,但这会使代码变得丑陋且不可读:

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 类不可用),第三个选项看起来是最好的解决方案。请告知是否存在更好的解决方案。

注意:在上面的示例中,我仅使用 CAPS 作为示例,可能还需要更复杂的 java 函数。

4

2 回答 2

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">
>>

PS如果您只是对更改文本大小写感兴趣,您可能不需要自己滚动,只需添加对与 StringTemplate 捆绑在一起的 StringRenderer 的引用,使用:

templateGroup.registerRenderer(String.class, new StringRenderer());

并将“upper”、“lower”或“cap”作为格式字符串传递

请在此处查看我的答案以获取更多信息

于 2014-12-04T10:42:17.953 回答
1

不,不打算/不提供嵌入到模板中的 java 代码。这使得防止视图和模型/逻辑的混乱/混合变得更容易。

在您的情况下,您可以轻松地将计算的内容放入 java 属性 getter 函数中,StringTemplate 可以将其作为一种 bean 属性引用和评估。

例如

放入您的模板组文件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>就会调用getMessage()您的 java 对象实例f

于 2014-11-15T14:25:14.260 回答