0

我尝试使用 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 和常见的)。

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

4

1 回答 1

1

它应该像这样工作。仔细检查您是否有commonVScommons.txtvs之类的疏忽.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}.

于 2013-08-06T11:09:00.563 回答