假设有以下字符串模板,会得到一个 Java Bean 对象列表:
<ul>$people:{p|<li>$p.name$ $p.email</li>}$</ul>
Run Code Online (Sandbox Code Playgroud)
即人员列表可能包含Person您可能或可能没有能力增强/扩展的对象:
class Person {
....
public getName() { ... }
public getEmail() { ... }
}
Run Code Online (Sandbox Code Playgroud)
该getName()和getEmail()方法不返回消毒(编码的HTML实体)。你如何解决这个问题?
如果数组不为空,如何使用StringTemplate检查?
下面的示例不起作用:
<if(teams.length > 0)>
<ul>
<teams:{team | <li><team></li> }>
</ul>
<endif>
Run Code Online (Sandbox Code Playgroud)
其他(无效)示例:
String content = "<if(teams)>list: <teams;separator=\", \"><endif>";
ST template = new ST(content);
template.add("teams", new Long[]{123L, 124L});
System.out.println(template.render());
System.out.println("--------");
content = "<if(teams)>list: <teams;separator=\", \"><endif>";
template = new ST(content);
template.add("teams", new Long[]{});
System.out.println(template.render());
Run Code Online (Sandbox Code Playgroud)
输出:
list: 123, 124
--------
list:
Run Code Online (Sandbox Code Playgroud) 以下StringTemplate给出了一个"无效字符'}'"异常,因为之后的大括号return null;:
$StatementList:{statement |
public T $statement$(X x) { return null; } }$
Run Code Online (Sandbox Code Playgroud)
我希望有一个输出像:
public T statement1(X x) {return null; }
public T statement2(X x) {return null; }
Run Code Online (Sandbox Code Playgroud)
我怎么能逃脱这个闭合的大括号?
我在StringTemplate 4中生成了一个Javascript数组,但我在跳过最后一个元素之后的尾随昏迷时遇到了麻烦.每个项目都是使用模板生成的,然后我想用comas将它们分开,以便在表单中创建一个数组:
[ item1, item2, item3, item4 ]
Run Code Online (Sandbox Code Playgroud)
目前,我生成此阵列的最佳方法是:
array(elems) ::= <<
[
$first(elems):elem_noComa()$
$rest(elems):elem()$
]
>>
elem_noComa(el) ::= << { ...element generation... } >>
elem(el) ::= <<
, $elem_noComa(el)$
>>
Run Code Online (Sandbox Code Playgroud)
有没有办法更容易/更短的形式?
是否有任何原因或我做错了什么,为什么 RazorEngine 仅解析 100 个不同的模板就这么慢?我正在研究 StringTemplate,并执行了两个测试进行比较,如下所示。
[Test]
public void TestStringTemplate()
{
CsStopwatch stopwatch = new CsStopwatch();
stopwatch.Start();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++)
{
string template = @"Hello there my name is <Name> <Surname> " + i;
TextParseTests.TestModel model = new TextParseTests.TestModel();
model.Name = "Karl";
model.Surname = "Cassar";
Template t = new Template(template);
t.Add("Name", model.Name);
t.Add("Surname", model.Surname);
var result = t.Render();
sb.AppendLine(result);
}
stopwatch.Stop();
var ms = stopwatch.ElapsedMilliseconds;
int k = 5; …Run Code Online (Sandbox Code Playgroud) 我正在使用StringTemplate 4生成一些Java源文件.
模板非常简单,例如:
QueryHandler(method) ::="
public class Obtenir<method.name>Handler extends QueryHandler\<List\<<method.name>Db>> implements IQueryHandler\<List\<<method.name>>>{
private IQuery\<List\<<method.name>Db>> query;
private <method.name>Converter converter;
@Inject
public Obtenir<method.name>Handler(IQuery\<List\<<method.name>Db>> query, <method.name>Converter converter, IStatisticsCollecter theStatsCollecter){
super(theStatsCollecter);
if(query == null){
throw new IllegalArgumentException(\"The query argument cannot be null\");
}
if(converter == null){
throw new IllegalArgumentException(\"Illegal argument for converter(null)\");
}
this.query = query;
this.converter = converter;
}
public List\<<method.name>> handle(Object... params) throws JdbcException {
final String method = \"obtenir<method.name>\";
DaoQueryStatusCallable status = new DaoQueryStatusCallable();
List\<<method.name>Db> result = invoke(query, status, method);
return …Run Code Online (Sandbox Code Playgroud) 版本3中的StringTemplate实例有一个.reset()方法.
我在for/each循环内部生成并希望在每个循环结束时将实例重置为其默认状态.我搜索了JavaDoc,但无法找到如何重置实例ST以重用它.
ST实例StringTemplate4?