如何在 JTwig 中调用自定义函数?
How to invoke custom functions in JTwig?
是否可以从 JTwig 模板调用自定义函数(比如静态方法)?
例如,在 Thymeleaf 框架中,我可以通过其 class 的全名调用任何静态方法。所以我正在为 JTwig 寻找类似的东西。
我找到了以下解决方案:
1) 通过扩展 org.jtwig.functions.SimpleJtwigFunction
创建自己的函数
2) 在扩展中注册org.jtwig.environment.EnvironmentConfiguration
3) 为扩展配置构造自定义 bean 并将其传递到 JtwigViewResolver
:
<bean id="jtwigDec" class="...ExtendedEnvironmentConfiguration"/>
<bean id="jtwigRenderer" class="org.jtwig.web.servlet.JtwigRenderer">
<constructor-arg ref="jtwigDec"/>
</bean>
<bean class="org.jtwig.spring.JtwigViewResolver">
...
<property name="renderer" ref="jtwigRenderer"/>
</bean>
这没有很好的记录,但这里有一个纯 Java:
的片段
final SimpleJtwigFunction myFunction = new SimpleJtwigFunction() {
@Override
public String name() {
return "get_type";
}
@Override
public Object execute(FunctionRequest functionRequest) {
return "toto";
}
};
final EnvironmentConfiguration configuration = EnvironmentConfigurationBuilder
.configuration()
.functions()
.add(myFunction)
.and()
.build();
final JtwigTemplate template = JtwigTemplate.classpathTemplate("hive_create_table.sql.twig", configuration);
和模板:
CREATE EXTERNAL TABLE sample2(
{% for field in fields%}{% if field.name != "serialVersionUID" %}
`{{ field.name }}`:{{ field.type | get_type | upper }},{% endif %}{% endfor %}
)
我在理解第一个答案时遇到了一些问题,所以我稍微修改了一下...
final SimpleJtwigFunction myFunction = new SimpleJtwigFunction() {
@Override
public String name() {
return "translate";
}
@Override
public Object execute(FunctionRequest request) {
String value1 = "a Problem";
if (request.getNumberOfArguments() == 1) {
if (request.get(0) instanceof String) {
value1 = request.getEnvironment().getValueEnvironment().getStringConverter().convert(request.get(0));
}
}
return ("This is: "+value1);
}
};
final EnvironmentConfiguration configuration = EnvironmentConfigurationBuilder
.configuration()
.functions()
.add(myFunction)
.and()
.build();
String templatenamex = defaultpath + templatename;
JtwigTemplate template = JtwigTemplate.classpathTemplate(templatename,configuration);
JtwigModel model = JtwigModel.newModel();
for (String key : map.keySet()) {
model.with(key, map.get(key));// .replace("\"", "\\""));
}
String resultx = template.render(model);
并在模板中
{{ 翻译("go") }}
创建:
这是:去
是否可以从 JTwig 模板调用自定义函数(比如静态方法)?
例如,在 Thymeleaf 框架中,我可以通过其 class 的全名调用任何静态方法。所以我正在为 JTwig 寻找类似的东西。
我找到了以下解决方案:
1) 通过扩展 org.jtwig.functions.SimpleJtwigFunction
2) 在扩展中注册org.jtwig.environment.EnvironmentConfiguration
3) 为扩展配置构造自定义 bean 并将其传递到 JtwigViewResolver
:
<bean id="jtwigDec" class="...ExtendedEnvironmentConfiguration"/>
<bean id="jtwigRenderer" class="org.jtwig.web.servlet.JtwigRenderer">
<constructor-arg ref="jtwigDec"/>
</bean>
<bean class="org.jtwig.spring.JtwigViewResolver">
...
<property name="renderer" ref="jtwigRenderer"/>
</bean>
这没有很好的记录,但这里有一个纯 Java:
的片段final SimpleJtwigFunction myFunction = new SimpleJtwigFunction() {
@Override
public String name() {
return "get_type";
}
@Override
public Object execute(FunctionRequest functionRequest) {
return "toto";
}
};
final EnvironmentConfiguration configuration = EnvironmentConfigurationBuilder
.configuration()
.functions()
.add(myFunction)
.and()
.build();
final JtwigTemplate template = JtwigTemplate.classpathTemplate("hive_create_table.sql.twig", configuration);
和模板:
CREATE EXTERNAL TABLE sample2(
{% for field in fields%}{% if field.name != "serialVersionUID" %}
`{{ field.name }}`:{{ field.type | get_type | upper }},{% endif %}{% endfor %}
)
我在理解第一个答案时遇到了一些问题,所以我稍微修改了一下...
final SimpleJtwigFunction myFunction = new SimpleJtwigFunction() {
@Override
public String name() {
return "translate";
}
@Override
public Object execute(FunctionRequest request) {
String value1 = "a Problem";
if (request.getNumberOfArguments() == 1) {
if (request.get(0) instanceof String) {
value1 = request.getEnvironment().getValueEnvironment().getStringConverter().convert(request.get(0));
}
}
return ("This is: "+value1);
}
};
final EnvironmentConfiguration configuration = EnvironmentConfigurationBuilder
.configuration()
.functions()
.add(myFunction)
.and()
.build();
String templatenamex = defaultpath + templatename;
JtwigTemplate template = JtwigTemplate.classpathTemplate(templatename,configuration);
JtwigModel model = JtwigModel.newModel();
for (String key : map.keySet()) {
model.with(key, map.get(key));// .replace("\"", "\\""));
}
String resultx = template.render(model);
并在模板中
{{ 翻译("go") }}
创建:
这是:去