我在ftl中有以下代码:
<#macro field label name value="" type="text">
${name}
${name!"print if null"}
<div class="field">
<div class="clearfix" id="${name}_field">
<label for="${name}">${label}</label>
<div class="input">
<input type="${type}" id="${name}" name="${name}" value="${value}">
<span class="help-inline"></span>
<span class="help-block"></span>
</div>
</div>
</div>
</#macro>
<@field label="label" name="test" />
这是打印这个:
foo-test
test
<div class="field">
<div class="clearfix" id="foo-test_field">
<label for="foo-test">label</label>
<div class="input">
<input type="text" id="foo-test" name="foo-test" value="">
<span class="help-inline"></span>
<span class="help-block"></span>
</div>
</div>
</div>
foo-test
是我的应用程序的名称,但无法理解为什么要在那里打印..只是使用ctrl + f搜索foo-test
并且它在ftl或控制器......
除此之外,让我们假设name
是一个具有我的应用程序名称的变量。那么为什么第二个打印只打印我传递给我的宏的正确值?这真的很奇怪......
我使用Maven和spark,所以我有这种依赖:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-freemarker</artifactId>
<version>2.0.0</version>
</dependency>
插件是这样的:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<mainClass>com.example.foo.foo-test</mainClass>
</configuration>
</plugin>
</plugins>
</build>
我的控制器看起来像这样:
.....
import spark.ModelAndView;
import spark.Spark;
import spark.template.freemarker.FreeMarkerEngine;
......
Spark.get("/foo", (request, response) -> {
Map<String, Object> attributes = new HashMap<>();
return new ModelAndView(attributes, "test.ftl");
}, new FreeMarkerEngine());
答案 0 :(得分:1)
很奇怪......它应该有用,对我有用。我怀疑在FreeMarker解析它之前搜索并替换该模板中的${name}
(例如,自定义TemplateLoader
- s可以这样做)。比如,如果你写${name<#-- just a comment -->}
而不是${name}
会怎么样?
答案 1 :(得分:1)
这种情况正在发生,因为您已配置maven来过滤资源,它会用${name}
占位符替换项目名称。
从您的pom中删除<resources>
,或者如果您确实需要资源过滤,则可以排除ftl-s文件。
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
BTW关于resource filtering的maven-resources-plugin
文档证明了${name}
占位符的确切行为。 :)