2017-05-28 55 views
0
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 handler处理的服务器。当我填写表单并发送请求时,我收到500内部服务器错误。该错误与result.ftl有关,目前我正在使用它来测试模板制作。我将一个HashMap传递给result.ftl模板。我得到的错误是:Freemarker template error:null or missing

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

该错误消息是正确的。在您的Java代码中使用data作为数据模型根。根本身不是顶级变量,而是顶级变量的容器。因此,例如${Hello}将工作,并打印“你不是空!”。 (还要注意,“data”只是一个局部变量名,在Java编译过程中这个变量名已经不存在了,并且你永远不会将“data”变量名传递给FreeMarker。)所以你应该制作一个rootMap(或者bean),把dataMap(或豆),并通过rootTemplate.process

更新:也就是说,在现在你有temp.process(data, writer);,你应该有:

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

temp.process(root, writer); 
+0

你介意给一个小例子吗? –

+0

好的,请参阅更新。 – ddekany

+0

但是,当我试图对地图数据中的所有键进行排序时,这会对我有帮助吗?列表属性是否仍然只通过数据映射中的键和值运行? –

相关问题