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。 Loginform.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]
----
我认为这意味着在生成模板时数据为空,但很明显不是。我不知道这是怎么回事。我的模板文件如下 loginform.ftl
<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>
result.ftl
<html>
<#list data as key, value>
${key} = ${value};
</#list>
</html>
答案 0 :(得分:0)
错误消息是正确的。在您的Java代码中,data
用作数据模型根。根本身不是顶级变量,而是顶级变量的容器。因此,例如${Hello}
可以工作,并打印“你的不是空!”。 (另请注意,“data”只是一个局部变量名,在Java编译过程中消失了,你永远不会将“数据”变量名称传递给FreeMarker。)所以你应该创建一个root
Map
(或bean),将data
Map
(或bean)放入其中,并将root
传递给Template.process
。
更新:也就是说,现在你有temp.process(data, writer);
,你应该:
Map<String, object> root = new HashMap<>();
root.put("data", data);
temp.process(root, writer);