当前位置: 首页 > 知识库问答 >
问题:

Freemarker模板错误:空或丢失

季炯
2023-03-14
public static void main(String[] args) throws IOException {
    port(8080);

    Configuration config  = new Configuration(Configuration.VERSION_2_3_26);
    config.setDirectoryForTemplateLoading(new File("PATH_NAME"));



    get("/test", (req,res) ->{
        StringWriter writer = new StringWriter();
        Template temp = config.getTemplate("loginform.ftl");
        temp.process(null, writer);
        return writer;
    });


    post("/select", (req,res) -> {
        String city = req.queryParams("city");
        String state = req.queryParams("state");


        Map<String, Object> data = new HashMap<>();

        data.put("Hello", "Your not null!");

        StringWriter writer = new StringWriter();
        Template temp = config.getTemplate("result.ftl");

        temp.process(data, writer);

        return writer;

        });

}

以上是我正在开发的Spark应用程序的主要方法。它涉及两个模板:loginform.ftl和result.ftl。ftl是一个简单的html表单,它向服务器发送post请求,由上面代码中的post处理程序处理。当我填写表单并发送请求时,我得到一个500内部服务器错误。这个错误与result.ftl有关,我现在用它来测试模板的制作。我将一个HashMap传递给result.ftl模板。我得到的错误是:

FreeMarker template error:
The following has evaluated to null or missing:
==> data  [in template "result.ftl" at line 2, column 8]


FTL stack trace ("~" means nesting-related):
    - Failed at: #list data as key, value  [in template "result.ftl" at line 
2, column 1]
---- 
<form action= "/select" method= "POST" accept-charset="utf-8">

  City Name: <input type= "text"  name = "city">

  State(2 letter format):<input type= "text"  name = "state">

 <input type= "submit" id = "submitButton">

</form>

结果。FTL

<html>
  <#list data as key, value>
    ${key} = ${value};
  </#list>
</html>

共有1个答案

马国源
2023-03-14

错误消息是正确的。在Java代码中,data被用作数据模型根。根本身不是顶级变量,而是顶级变量的容器。因此,例如${Hello}可以工作,并打印“您的not null!”。(还要注意,“data”只是一个局部变量名,在Java编译过程中没有,而且您永远不会将“data”变量名传递给FreeMarker。)因此,您应该创建一个映射(或bean),将数据映射(或bean)放入其中,并将传递给template.process

update:也就是说,现在您有temp.process(data,writer);,您应该有:

Map<String, object> root = new HashMap<>();
root.put("data", data);

temp.process(root, writer);
 类似资料:
  • 当我点击登录按钮并通过数据库成功登录后,它被重定向到hello.ftl页面。但是ftl页面显示此错误 FreeMarker模板错误(调试模式;在生产中使用RETHROW!):以下内容的计算结果为null或missing:==>var[在模板“hello.ftl”第8行,第32列]----提示:如果已知失败的表达式在法律上引用了有时为null或missing的内容,可以指定默认值,如myoption

  • 我得到以下异常: FreeMarker模板错误:以下内容已计算为null或缺少:==>log.stepname[在模板“extent.offline.ftl”中,第297行,第93列]

  • 在我的应用程序中,所有freemarker模板都位于/templates/ftl/中,因此在应用程序部署期间,我加载了一个类,我调用了一个扩展FreemarkerManager并具有方法的类 这样,当我需要加载模板文件时,我可以这样做: 仅在一种特定情况下,我需要获得一个来自完全不同路径的模板(而不是/templates/ftl/)。 如何在这个特定的时刻声明模板加载的第二个目录,而不破坏所有调用

  • 我正在使用freemarker模板生成电子邮件。我将freemarker与spring结合使用。我很难用参数替换来实现国际化。我用它来代替一个参数。例子: 消息你好=你好,{0} 在fm模板中,我有 然而,我无法弄清楚如何进行多参数替换。 消息你好{0},欢迎来到{1} 我如何在模板中表示这一点?当我尝试以下方法时: 它不起作用。你能帮忙吗?当做

  • 我面临的错误太奇怪了。一切看起来都很好,但是当浏览器向服务器发送get请求时,我得到了这个错误。我要做的实际上是捕获HTTP参数,将它们保存在一个对象中,该对象保存在ArrayList中,发送给Freemarker模板。 你能帮帮我吗?多谢.