FreeMarker - 读取包含文件“./common/header.txt”时出错:

时间:2013-08-06 07:48:18

标签: java runtime-error freemarker

我尝试使用FreeMarker创建html file

但是当我运行程序时会抛出错误:

Error reading included file "./common/header.ftl":
Template "./common/header.ftl" not found.

The failing instruction:
==> #include "./common/header.ftl"  [in template "helloworld.ftl" at line 1, column 1]

helloworld.ftl:

<#include "./common/header.ftl"> 
<#if container??>
  <div ="${container}">
<#else>
  <div ="default">
</#if>

<ul>
<#list systems as system>
<li>${system_index + 1}.${system.getName()}</li>
</#list>
</ul>

<h1>${exampleObject.getName()}</h1>

</div>

<#include "./common/footer.ftl"> 

代码片段:

  public static void main(String[] args) {

    // Configuration
    Writer file = null;
    Configuration cfg = new Configuration();

    try {
      // Set Directory for templates
      cfg.setDirectoryForTemplateLoading(new File("templates"));
      // load template
      Template template = cfg.getTemplate("helloworld.ftl");

      // data-model
      Map<String, Object> input = new HashMap<String, Object>();
      input.put("message", "vogella example");
      input.put("container", "test");

      // create list
      List<ValueExampleObject> systems = new ArrayList<ValueExampleObject>();

内部文件header.ftlfooter.ftl进入template/common(进入template正好是helloworld.ftl和常见文件)。

- 为什么会这样?   - 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

它应该像这样工作。如果您有common VS commons.txt vs .ftl等疏忽,请仔细检查。或者,也许您有两个templates目录,并且都有一个helloworld.ftl但其中一个目录中没有common?我问,因为你的模板目录(new File("templates"))是相对于当前工作目录的,这可能是很多混乱的根源。永远不要这样做,它非常脆弱。使用绝对File

与问题无关,,但该示例包含严重丑陋的内容:

此:

<#if container??>
  <div class="${container}">
<#else>
  <div class="default">
</#if>

可以简单地写成:

 <div class="${container!'default'}">

此外,${system.getName()}等(即getter方法调用)可以写成${system.name}